aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-10-13 17:05:15 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-10-13 17:05:15 -0400
commit3217ac3a98673b1520d774f2a61fffc237874e47 (patch)
tree3d5f8f2b8a8a4a24a3f80f7f6b2c8c0a6b6df828
parent43d17489d112e19bb51ae418bd3d63cb062afd62 (diff)
downloadpostgresql-3217ac3a98673b1520d774f2a61fffc237874e47.tar.gz
postgresql-3217ac3a98673b1520d774f2a61fffc237874e47.zip
Fix another bug in merging of inherited CHECK constraints.
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>
-rw-r--r--src/backend/catalog/heap.c11
-rw-r--r--src/test/regress/expected/inherit.out3
-rw-r--r--src/test/regress/sql/inherit.sql3
3 files changed, 17 insertions, 0 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 5f3cf97be4c..978725199c8 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2466,6 +2466,17 @@ MergeWithExistingConstraint(Relation rel, char *ccname, Node *expr,
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
*/
diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out
index 46442e89860..ab80804af9b 100644
--- a/src/test/regress/expected/inherit.out
+++ b/src/test/regress/expected/inherit.out
@@ -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
diff --git a/src/test/regress/sql/inherit.sql b/src/test/regress/sql/inherit.sql
index a5e6ecdb868..d65839899c1 100644
--- a/src/test/regress/sql/inherit.sql
+++ b/src/test/regress/sql/inherit.sql
@@ -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