diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 4a9ad9c..2e4c9b9 100644 *** a/src/backend/catalog/dependency.c --- /bsrc/backend/catalog/dependency.c *************** performMultipleDeletions(const ObjectAdd *** 257,262 **** --- 257,263 ---- { Relation depRel; ObjectAddresses *targetObjects; + ObjectAddress *depObject; int i; /* *************** performMultipleDeletions(const ObjectAdd *** 294,305 **** } /* * Check if deletion is allowed, and report about cascaded deletes. */ reportDependentObjects(targetObjects, behavior, NOTICE, ! NULL); /* * Delete all the objects in the proper order. --- 295,312 ---- } /* + * If we are only deleting one object report it like we do + * in performDeletion() + */ + depObject = objects->numrefs == 1 ? objects->refs : NULL; + + /* * Check if deletion is allowed, and report about cascaded deletes. */ reportDependentObjects(targetObjects, behavior, NOTICE, ! depObject); /* * Delete all the objects in the proper order. diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index c3ff499..3e898d9 100644 *** a/src/backend/commands/tablecmds.c --- /bsrc/backend/commands/tablecmds.c *************** DefineRelation(CreateStmt *stmt, char re *** 499,518 **** /* * RemoveRelation * Deletes a relation. */ void ! RemoveRelation(const RangeVar *relation, DropBehavior behavior) { ! Oid relOid; ! ObjectAddress object; ! relOid = RangeVarGetRelid(relation, false); ! object.classId = RelationRelationId; ! object.objectId = relOid; ! object.objectSubId = 0; ! performDeletion(&object, behavior); } /* --- 499,529 ---- /* * RemoveRelation * Deletes a relation. + * Note rels are of the type RangeVar * */ void ! RemoveRelation(List *rels, const DropBehavior behavior) { ! ObjectAddresses *objects; ! ListCell *cell; ! objects = new_object_addresses(); ! foreach(cell, rels) ! { ! RangeVar *rv = lfirst(cell); ! ObjectAddress obj; ! obj.objectId = RangeVarGetRelid(rv, false); ! obj.classId = RelationRelationId; ! obj.objectSubId = 0; ! ! add_exact_object_address(&obj, objects); ! } ! ! performMultipleDeletions(objects, behavior); ! ! free_object_addresses(objects); } /* diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 5d37d57..5cf44a5 100644 *** a/src/backend/tcop/utility.c --- /bsrc/backend/tcop/utility.c *************** ProcessUtility(Node *parsetree, *** 605,610 **** --- 605,616 ---- DropStmt *stmt = (DropStmt *) parsetree; ListCell *arg; + /* + * We aggregate any calls to RemoveRelation + * so that it can use performMultipleDeletions() + */ + List *removeRels = NULL; + foreach(arg, stmt->objects) { List *names = (List *) lfirst(arg); *************** ProcessUtility(Node *parsetree, *** 616,629 **** rel = makeRangeVarFromNameList(names); if (CheckDropPermissions(rel, RELKIND_RELATION, stmt->missing_ok)) ! RemoveRelation(rel, stmt->behavior); break; case OBJECT_SEQUENCE: rel = makeRangeVarFromNameList(names); if (CheckDropPermissions(rel, RELKIND_SEQUENCE, stmt->missing_ok)) ! RemoveRelation(rel, stmt->behavior); break; case OBJECT_VIEW: --- 622,635 ---- rel = makeRangeVarFromNameList(names); if (CheckDropPermissions(rel, RELKIND_RELATION, stmt->missing_ok)) ! removeRels = lappend(removeRels, rel); break; case OBJECT_SEQUENCE: rel = makeRangeVarFromNameList(names); if (CheckDropPermissions(rel, RELKIND_SEQUENCE, stmt->missing_ok)) ! removeRels = lappend(removeRels, rel); break; case OBJECT_VIEW: *************** ProcessUtility(Node *parsetree, *** 694,699 **** --- 700,708 ---- * but now it's done inside performDeletion(). */ } + + if (removeRels) + RemoveRelation(removeRels, stmt->behavior); } break; diff --git a/src/include/commands/tablecmds.h b/src/include/commands/tablecmds.h index d89a356..f8e2ff3 100644 *** a/src/include/commands/tablecmds.h --- /bsrc/include/commands/tablecmds.h *************** *** 20,26 **** extern Oid DefineRelation(CreateStmt *stmt, char relkind); ! extern void RemoveRelation(const RangeVar *relation, DropBehavior behavior); extern void AlterTable(AlterTableStmt *stmt); --- 20,26 ---- extern Oid DefineRelation(CreateStmt *stmt, char relkind); ! extern void RemoveRelation(List *rels, const DropBehavior behavior); extern void AlterTable(AlterTableStmt *stmt); diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out index e3086d2..566c5d3 100644 *** a/src/test/regress/expected/foreign_key.out --- /bsrc/test/regress/expected/foreign_key.out *************** COMMIT; *** 1087,1093 **** ERROR: insert or update on table "fktable" violates foreign key constraint "fktable_fk_fkey" DETAIL: Key (fk)=(200) is not present in table "pktable". DROP TABLE pktable, fktable CASCADE; - NOTICE: drop cascades to constraint fktable_fk_fkey on table fktable -- test notice about expensive referential integrity checks, -- where the index cannot be used because of type incompatibilities. CREATE TEMP TABLE pktable ( --- 1087,1092 ---- *************** FOREIGN KEY (x2,x4,x1) REFERENCES pktabl *** 1157,1172 **** ERROR: foreign key constraint "fk_241_132" cannot be implemented DETAIL: Key columns "x2" and "id1" are of incompatible types: character varying and integer. DROP TABLE pktable, fktable CASCADE; - NOTICE: drop cascades to 9 other objects - DETAIL: drop cascades to constraint fktable_x3_fkey on table fktable - drop cascades to constraint fk_1_3 on table fktable - drop cascades to constraint fktable_x2_fkey on table fktable - drop cascades to constraint fk_4_2 on table fktable - drop cascades to constraint fktable_x1_fkey on table fktable - drop cascades to constraint fk_5_1 on table fktable - drop cascades to constraint fk_123_123 on table fktable - drop cascades to constraint fk_213_213 on table fktable - drop cascades to constraint fk_253_213 on table fktable -- test a tricky case: we can elide firing the FK check trigger during -- an UPDATE if the UPDATE did not change the foreign key -- field. However, we can't do this if our transaction was the one that --- 1156,1161 ---- diff --git a/src/test/regress/expected/truncate.out b/src/test/regress/expected/truncate.out index 520db9d..c9134ee 100644 *** a/src/test/regress/expected/truncate.out --- /bsrc/test/regress/expected/truncate.out *************** SELECT * FROM trunc_e; *** 141,152 **** (0 rows) DROP TABLE truncate_a,trunc_c,trunc_b,trunc_d,trunc_e CASCADE; - NOTICE: drop cascades to 2 other objects - DETAIL: drop cascades to constraint trunc_b_a_fkey on table trunc_b - drop cascades to constraint trunc_e_a_fkey on table trunc_e - NOTICE: drop cascades to 2 other objects - DETAIL: drop cascades to constraint trunc_d_a_fkey on table trunc_d - drop cascades to constraint trunc_e_b_fkey on table trunc_e -- Test ON TRUNCATE triggers CREATE TABLE trunc_trigger_test (f1 int, f2 text, f3 text); CREATE TABLE trunc_trigger_log (tgop text, tglevel text, tgwhen text, --- 141,146 ----