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);
