]> granicus.if.org Git - postgresql/commitdiff
Clarify policy on marking inherited constraints as valid.
authorRobert Haas <rhaas@postgresql.org>
Thu, 15 Sep 2016 21:24:54 +0000 (17:24 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 15 Sep 2016 21:24:54 +0000 (17:24 -0400)
Amit Langote and Robert Haas

doc/src/sgml/ref/alter_table.sgml
src/backend/commands/tablecmds.c

index 6f51cbc8962cc674bbaccbf51315cfcc0ed14701..e48ccf21e4fbd35d1ae4ac75af0dcf25741bab3c 100644 (file)
@@ -1028,11 +1028,15 @@ ALTER TABLE ALL IN TABLESPACE <replaceable class="PARAMETER">name</replaceable>
 
    <para>
     If a table has any descendant tables, it is not permitted to add,
-    rename, or change the type of a column, or rename an inherited constraint
-    in the parent table without doing
-    the same to the descendants.  That is, <command>ALTER TABLE ONLY</command>
-    will be rejected.  This ensures that the descendants always have
-    columns matching the parent.
+    rename, or change the type of a column in the parent table without doing
+    same to the descendants.  This ensures that the descendants always have
+    columns matching the parent.  Similarly, a constraint cannot be renamed
+    in the parent without also renaming it in all descendents, so that
+    constraints also match between the parent and its descendents.
+    Also, because selecting from the parent also selects from its descendents,
+    a constraint on the parent cannot be marked valid unless it is also marked
+    valid for those descendents.  In all of these cases, <command>ALTER TABLE
+    ONLY</command> will be rejected.  
    </para>
 
    <para>
index 86e98148c1667e1b5cf04146e4945f1f5b5c8b42..d31276284ce9e3f302c9531f396842acfe7153c0 100644 (file)
@@ -6908,7 +6908,8 @@ ATExecValidateConstraint(Relation rel, char *constrName, bool recurse,
 
                                /*
                                 * If we are told not to recurse, there had better not be any
-                                * child tables; else the addition would put them out of step.
+                                * child tables, because we can't mark the constraint on the
+                                * parent valid unless it is valid for all child tables.
                                 */
                                if (!recurse)
                                        ereport(ERROR,