bdr: be more specific in ALTER TABLE rejections
authorChristoph Moench-Tegeder <cmt@burggraben.net>
Tue, 26 Aug 2014 15:24:41 +0000 (17:24 +0200)
committerAndres Freund <andres@anarazel.de>
Mon, 8 Sep 2014 15:49:58 +0000 (17:49 +0200)
try to reject unsupported/unsafe ALTER TABLE statements with
some info about what exactly is unsupported/unsafe.

RT-#37879

bdr_commandfilter.c

index c5375675324c4eaef0cf2e13a04a02eee2ed9e10..c8c5c6a899125529725a3a1151a5e631f04cd322 100644 (file)
@@ -252,6 +252,42 @@ filter_AlterTableStmt(Node *parsetree,
                case AT_ValidateConstraint: /* VALIDATE CONSTRAINT */
                    break;
 
+               case AT_AlterConstraint:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... ALTER CONSTRAINT",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
+               case AT_AddIndexConstraint:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... ADD CONSTRAINT USING INDEX",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
+               case AT_AlterColumnType:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... ALTER COLUMN TYPE",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
+               case AT_AlterColumnGenericOptions:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... ALTER COLUMN OPTIONS",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
+               case AT_AddOids:
+               case AT_DropOids:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... SET WITH[OUT] OIDS",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
                case AT_EnableTrig:
                case AT_EnableAlwaysTrig:
                case AT_EnableReplicaTrig:
@@ -262,6 +298,48 @@ filter_AlterTableStmt(Node *parsetree,
                case AT_DisableTrigUser:
                    break;
 
+               case AT_EnableRule:
+               case AT_EnableAlwaysRule:
+               case AT_EnableReplicaRule:
+               case AT_DisableRule:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... ENABLE|DISABLE [ALWAYS|REPLICA] RULE",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
+               case AT_AddInherit:
+               case AT_DropInherit:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... ADD|DROP INHERIT",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
+               case AT_AddOf:
+               case AT_DropOf:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... [NOT] OF",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
+               case AT_SetStatistics:
+               case AT_SetOptions:
+               case AT_ResetOptions:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... ALTER COLUMN SET STATISTICS|(...)",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
+               case AT_GenericOptions:
+                   error_on_persistent_rv(astmt->relation,
+                                          "ALTER TABLE ... SET (...)",
+                                          AlterTableGetLockLevel(astmt->cmds),
+                                          astmt->missing_ok);
+                   break;
+
                default:
                    hasInvalid = true;
                    break;
@@ -271,7 +349,7 @@ filter_AlterTableStmt(Node *parsetree,
 
    if (hasInvalid)
        error_on_persistent_rv(astmt->relation,
-                              "ALTER TABLE",
+                              "This variant of ALTER TABLE",
                               AlterTableGetLockLevel(astmt->cmds),
                               astmt->missing_ok);
 }