diff options
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 99 |
1 files changed, 48 insertions, 51 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 1e8ad2b6716..7b241fd15da 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -6734,6 +6734,7 @@ ATExecDropConstraint(Relation rel, const char *constrName, { Oid childrelid = lfirst_oid(child); Relation childrel; + HeapTuple copy_tuple; /* find_inheritance_children already got lock */ childrel = heap_open(childrelid, NoLock); @@ -6746,83 +6747,79 @@ ATExecDropConstraint(Relation rel, const char *constrName, scan = systable_beginscan(conrel, ConstraintRelidIndexId, true, SnapshotNow, 1, &key); - found = false; - + /* scan for matching tuple - there should only be one */ while (HeapTupleIsValid(tuple = systable_getnext(scan))) { - HeapTuple copy_tuple; - con = (Form_pg_constraint) GETSTRUCT(tuple); /* Right now only CHECK constraints can be inherited */ if (con->contype != CONSTRAINT_CHECK) continue; - if (strcmp(NameStr(con->conname), constrName) != 0) - continue; + if (strcmp(NameStr(con->conname), constrName) == 0) + break; + } - found = true; + if (!HeapTupleIsValid(tuple)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("constraint \"%s\" of relation \"%s\" does not exist", + constrName, + RelationGetRelationName(childrel)))); - if (con->coninhcount <= 0) /* shouldn't happen */ - elog(ERROR, "relation %u has non-inherited constraint \"%s\"", - childrelid, constrName); + copy_tuple = heap_copytuple(tuple); - copy_tuple = heap_copytuple(tuple); - con = (Form_pg_constraint) GETSTRUCT(copy_tuple); + systable_endscan(scan); - if (recurse) - { - /* - * If the child constraint has other definition sources, just - * decrement its inheritance count; if not, recurse to delete - * it. - */ - if (con->coninhcount == 1 && !con->conislocal) - { - /* Time to delete this child constraint, too */ - ATExecDropConstraint(childrel, constrName, behavior, - true, true, - false, lockmode); - } - else - { - /* Child constraint must survive my deletion */ - con->coninhcount--; - simple_heap_update(conrel, ©_tuple->t_self, copy_tuple); - CatalogUpdateIndexes(conrel, copy_tuple); + con = (Form_pg_constraint) GETSTRUCT(copy_tuple); - /* Make update visible */ - CommandCounterIncrement(); - } + if (con->coninhcount <= 0) /* shouldn't happen */ + elog(ERROR, "relation %u has non-inherited constraint \"%s\"", + childrelid, constrName); + + if (recurse) + { + /* + * If the child constraint has other definition sources, just + * decrement its inheritance count; if not, recurse to delete + * it. + */ + if (con->coninhcount == 1 && !con->conislocal) + { + /* Time to delete this child constraint, too */ + ATExecDropConstraint(childrel, constrName, behavior, + true, true, + false, lockmode); } else { - /* - * If we were told to drop ONLY in this table (no recursion), - * we need to mark the inheritors' constraints as locally - * defined rather than inherited. - */ + /* Child constraint must survive my deletion */ con->coninhcount--; - con->conislocal = true; - simple_heap_update(conrel, ©_tuple->t_self, copy_tuple); CatalogUpdateIndexes(conrel, copy_tuple); /* Make update visible */ CommandCounterIncrement(); } - - heap_freetuple(copy_tuple); } + else + { + /* + * If we were told to drop ONLY in this table (no recursion), + * we need to mark the inheritors' constraints as locally + * defined rather than inherited. + */ + con->coninhcount--; + con->conislocal = true; - systable_endscan(scan); + simple_heap_update(conrel, ©_tuple->t_self, copy_tuple); + CatalogUpdateIndexes(conrel, copy_tuple); - if (!found) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("constraint \"%s\" of relation \"%s\" does not exist", - constrName, - RelationGetRelationName(childrel)))); + /* Make update visible */ + CommandCounterIncrement(); + } + + heap_freetuple(copy_tuple); heap_close(childrel, NoLock); } |