diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index cc10c5e..1c4f12d 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -1657,6 +1657,10 @@ EventTriggerCollectSimpleCommand(ObjectAddress address, MemoryContext oldcxt; CollectedCommand *command; + /* ignore if no objects to operate on */ + if (ObjectAddressEq(address, InvalidObjectAddress)) + return; + /* ignore if event trigger context not set, or collection disabled */ if (!currentEventTriggerState || currentEventTriggerState->commandCollectionInhibited) diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 0dabcc1..21aa7dc 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -912,8 +912,7 @@ ProcessUtilitySlow(Node *parsetree, bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL); bool isCompleteQuery = (context <= PROCESS_UTILITY_QUERY); bool needCleanup; - bool commandCollected = false; - ObjectAddress address; + ObjectAddress address = InvalidObjectAddress; ObjectAddress secondaryObject = InvalidObjectAddress; /* All event trigger calls are done only when isCompleteQuery is true */ @@ -938,7 +937,6 @@ ProcessUtilitySlow(Node *parsetree, * EventTriggerCollectSimpleCommand called by * CreateSchemaCommand */ - commandCollected = true; break; case T_CreateStmt: @@ -1026,9 +1024,9 @@ ProcessUtilitySlow(Node *parsetree, /* * The multiple commands generated here are stashed - * individually, so disable collection below. + * individually, so collection is disabled. */ - commandCollected = true; + address = InvalidObjectAddress; } break; @@ -1106,7 +1104,6 @@ ProcessUtilitySlow(Node *parsetree, } /* ALTER TABLE stashes commands internally */ - commandCollected = true; break; case T_AlterDomainStmt: @@ -1272,7 +1269,7 @@ ProcessUtilitySlow(Node *parsetree, */ EventTriggerCollectSimpleCommand(address, secondaryObject, parsetree); - commandCollected = true; + address = InvalidObjectAddress; EventTriggerAlterTableEnd(); } break; @@ -1317,13 +1314,11 @@ ProcessUtilitySlow(Node *parsetree, case T_DropUserMappingStmt: RemoveUserMapping((DropUserMappingStmt *) parsetree); /* no commands stashed for DROP */ - commandCollected = true; break; case T_ImportForeignSchemaStmt: ImportForeignSchema((ImportForeignSchemaStmt *) parsetree); /* commands are stashed inside ImportForeignSchema */ - commandCollected = true; break; case T_CompositeTypeStmt: /* CREATE TYPE (composite) */ @@ -1353,7 +1348,7 @@ ProcessUtilitySlow(Node *parsetree, EventTriggerCollectSimpleCommand(address, secondaryObject, parsetree); /* stashed internally */ - commandCollected = true; + address = InvalidObjectAddress; EventTriggerAlterTableEnd(); break; @@ -1430,7 +1425,6 @@ ProcessUtilitySlow(Node *parsetree, case T_CreateOpClassStmt: DefineOpClass((CreateOpClassStmt *) parsetree); /* command is stashed in DefineOpClass */ - commandCollected = true; break; case T_CreateOpFamilyStmt: @@ -1444,7 +1438,6 @@ ProcessUtilitySlow(Node *parsetree, case T_AlterOpFamilyStmt: AlterOpFamily((AlterOpFamilyStmt *) parsetree); /* commands are stashed in AlterOpFamily */ - commandCollected = true; break; case T_AlterTSDictionaryStmt: @@ -1458,13 +1451,11 @@ ProcessUtilitySlow(Node *parsetree, case T_AlterTableMoveAllStmt: AlterTableMoveAll((AlterTableMoveAllStmt *) parsetree); /* commands are stashed in AlterTableMoveAll */ - commandCollected = true; break; case T_DropStmt: ExecDropStmt((DropStmt *) parsetree, isTopLevel); /* no commands stashed for DROP */ - commandCollected = true; break; case T_RenameStmt: @@ -1488,19 +1479,16 @@ ProcessUtilitySlow(Node *parsetree, case T_GrantStmt: ExecuteGrantStmt((GrantStmt *) parsetree); /* commands are stashed in ExecGrantStmt_oids */ - commandCollected = true; break; case T_DropOwnedStmt: DropOwnedObjects((DropOwnedStmt *) parsetree); /* no commands stashed for DROP */ - commandCollected = true; break; case T_AlterDefaultPrivilegesStmt: ExecAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt *) parsetree); EventTriggerCollectAlterDefPrivs((AlterDefaultPrivilegesStmt *) parsetree); - commandCollected = true; break; case T_CreatePolicyStmt: /* CREATE POLICY */ @@ -1525,9 +1513,8 @@ ProcessUtilitySlow(Node *parsetree, * Remember the object so that ddl_command_end event triggers have * access to it. */ - if (!commandCollected) - EventTriggerCollectSimpleCommand(address, secondaryObject, - parsetree); + EventTriggerCollectSimpleCommand(address, secondaryObject, + parsetree); if (isCompleteQuery) { diff --git a/src/include/catalog/objectaddress.h b/src/include/catalog/objectaddress.h index 37808c0..de8015d 100644 --- a/src/include/catalog/objectaddress.h +++ b/src/include/catalog/objectaddress.h @@ -40,6 +40,11 @@ extern const ObjectAddress InvalidObjectAddress; #define ObjectAddressSet(addr, class_id, object_id) \ ObjectAddressSubSet(addr, class_id, object_id, 0) +#define ObjectAddressEq(addr, addr2) \ + ((addr).classId == (addr2).classId && \ + (addr).objectId == (addr2).objectId && \ + (addr).objectSubId == (addr2).objectSubId) + extern ObjectAddress get_object_address(ObjectType objtype, List *objname, List *objargs, Relation *relp, LOCKMODE lockmode, bool missing_ok);