]> granicus.if.org Git - postgresql/commitdiff
Fix another bug in merging of inherited CHECK constraints.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 13 Oct 2016 21:05:14 +0000 (17:05 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 13 Oct 2016 21:05:14 +0000 (17:05 -0400)
It's not good for an inherited child constraint to be marked connoinherit;
that would result in the constraint not propagating to grandchild tables,
if any are created later.  The code mostly prevented this from happening
but there was one case that was missed.

This is somewhat related to commit e55a946a8, which also tightened checks
on constraint merging.  Hence, back-patch to 9.2 like that one.  This isn't
so much because there's a concrete feature-related reason to stop there,
as to avoid having more distinct behaviors than we have to in this area.

Amit Langote

Discussion: <b28ee774-7009-313d-dd55-5bdd81242c41@lab.ntt.co.jp>

src/backend/catalog/heap.c
src/test/regress/expected/inherit.out
src/test/regress/sql/inherit.sql

index ea06a5739a815295024040f7f3be0b49d3cf8cb3..0cf7b9eb626b24ae5fdb45b7d04499ac2c4af7e8 100644 (file)
@@ -2462,6 +2462,17 @@ MergeWithExistingConstraint(Relation rel, char *ccname, Node *expr,
                                                 errmsg("constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"",
                                                                ccname, RelationGetRelationName(rel))));
 
+                       /*
+                        * Must not change an existing inherited constraint to "no
+                        * inherit" status.  That's because inherited constraints should
+                        * be able to propagate to lower-level children.
+                        */
+                       if (con->coninhcount > 0 && is_no_inherit)
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+                                                errmsg("constraint \"%s\" conflicts with inherited constraint on relation \"%s\"",
+                                                               ccname, RelationGetRelationName(rel))));
+
                        /*
                         * If the child constraint is "not valid" then cannot merge with a
                         * valid parent constraint
index 9d374fe6c4ae0bf4b9fa2e955b724d1c937725ea..df7cba6614dc31ea48c8110f03016c67b9111bb3 100644 (file)
@@ -645,6 +645,9 @@ Check constraints:
     "p2chk" CHECK (ff1 > 10)
 Inherits: p1
 
+-- Test that child does not override inheritable constraints of the parent
+create table c2 (constraint p2chk check (ff1 > 10) no inherit) inherits (p1);  --fails
+ERROR:  constraint "p2chk" conflicts with inherited constraint on relation "c2"
 drop table p1 cascade;
 NOTICE:  drop cascades to table c1
 -- Tests for casting between the rowtypes of parent and child
index 6b1df754a62d23971ac581fb6f7711353867ab2e..f45aab1ac691076bb57645bbef5cf04a60be3ff3 100644 (file)
@@ -157,6 +157,9 @@ create table c1 () inherits (p1);
 \d p1
 \d c1
 
+-- Test that child does not override inheritable constraints of the parent
+create table c2 (constraint p2chk check (ff1 > 10) no inherit) inherits (p1);  --fails
+
 drop table p1 cascade;
 
 -- Tests for casting between the rowtypes of parent and child