1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-02 04:21:28 +03:00

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>
This commit is contained in:
Tom Lane
2016-10-13 17:05:15 -04:00
parent 6f02092522
commit 6f2db29ecb
3 changed files with 17 additions and 0 deletions

View File

@@ -2344,6 +2344,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