diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 2f6a6ff..ec777fd 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -2307,12 +2307,17 @@ MergeWithExistingConstraint(Relation rel, char *ccname, Node *expr, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("constraint \"%s\" for relation \"%s\" already exists", ccname, RelationGetRelationName(rel)))); - /* OK to update the tuple */ - ereport(NOTICE, - (errmsg("merging constraint \"%s\" with inherited definition", - ccname))); + tup = heap_copytuple(tup); con = (Form_pg_constraint) GETSTRUCT(tup); + + /* If the constraint is "only" then cannot merge */ + if (con->conisonly) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"", + ccname, RelationGetRelationName(rel)))); + if (is_local) con->conislocal = true; else @@ -2322,6 +2327,10 @@ MergeWithExistingConstraint(Relation rel, char *ccname, Node *expr, Assert(is_local); con->conisonly = true; } + /* OK to update the tuple */ + ereport(NOTICE, + (errmsg("merging constraint \"%s\" with inherited definition", + ccname))); simple_heap_update(conDesc, &tup->t_self, tup); CatalogUpdateIndexes(conDesc, tup); break; diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 8473c9e..c615ac0 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8950,6 +8950,10 @@ MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) if (parent_con->contype != CONSTRAINT_CHECK) continue; + /* if ONLY constraint, cannot inherit */ + if (parent_con->conisonly) + continue; + /* Search for a child constraint matching this one */ ScanKeyInit(&child_key, Anum_pg_constraint_conrelid, @@ -8977,6 +8981,13 @@ MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) RelationGetRelationName(child_rel), NameStr(parent_con->conname)))); + /* If the constraint is "only" then cannot merge */ + if (child_con->conisonly) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"", + NameStr(child_con->conname), RelationGetRelationName(child_rel)))); + /* * OK, bump the child constraint's inheritance count. (If we fail * later on, this change will just roll back.)