{
Oid childrelid = lfirst_oid(child);
Relation childrel;
+ HeapTuple copy_tuple;
/* find_inheritance_children already got lock */
childrel = heap_open(childrelid, NoLock);
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);
}