event_trigger_infos.6.alvherre1.patch

text/plain

Filename: event_trigger_infos.6.alvherre1.patch
Type: text/plain
Part: 0
Message: Re: Event Triggers: adding information

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/backend/commands/createas.c 16 0
src/backend/commands/event_trigger.c 24 0
src/backend/tcop/utility.c 101 0
src/include/commands/createas.h 1 1
src/include/commands/event_trigger.h 2 0
*** a/src/backend/commands/createas.c
--- b/src/backend/commands/createas.c
***************
*** 50,55 **** typedef struct
--- 50,58 ----
  	BulkInsertState bistate;	/* bulk insert state */
  } DR_intorel;
  
+ /* the OID of the created table, for ExecCreateTableAs consumption */
+ static Oid	CreateAsRelid = InvalidOid;
+ 
  static void intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo);
  static void intorel_receive(TupleTableSlot *slot, DestReceiver *self);
  static void intorel_shutdown(DestReceiver *self);
***************
*** 59,71 **** static void intorel_destroy(DestReceiver *self);
  /*
   * ExecCreateTableAs -- execute a CREATE TABLE AS command
   */
! void
  ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
  				  ParamListInfo params, char *completionTag)
  {
  	Query	   *query = (Query *) stmt->query;
  	IntoClause *into = stmt->into;
  	DestReceiver *dest;
  	List	   *rewritten;
  	PlannedStmt *plan;
  	QueryDesc  *queryDesc;
--- 62,75 ----
  /*
   * ExecCreateTableAs -- execute a CREATE TABLE AS command
   */
! Oid
  ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
  				  ParamListInfo params, char *completionTag)
  {
  	Query	   *query = (Query *) stmt->query;
  	IntoClause *into = stmt->into;
  	DestReceiver *dest;
+ 	Oid			relOid;
  	List	   *rewritten;
  	PlannedStmt *plan;
  	QueryDesc  *queryDesc;
***************
*** 88,94 **** ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
  
  		ExecuteQuery(estmt, into, queryString, params, dest, completionTag);
  
! 		return;
  	}
  	Assert(query->commandType == CMD_SELECT);
  
--- 92,100 ----
  
  		ExecuteQuery(estmt, into, queryString, params, dest, completionTag);
  
! 		relOid = CreateAsRelid;
! 		CreateAsRelid = InvalidOid;
! 		return relOid;
  	}
  	Assert(query->commandType == CMD_SELECT);
  
***************
*** 156,161 **** ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
--- 162,172 ----
  	FreeQueryDesc(queryDesc);
  
  	PopActiveSnapshot();
+ 
+ 	relOid = CreateAsRelid;
+ 	CreateAsRelid = InvalidOid;
+ 
+ 	return relOid;
  }
  
  /*
***************
*** 353,358 **** intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
--- 364,372 ----
  	myState->rel = intoRelationDesc;
  	myState->output_cid = GetCurrentCommandId(true);
  
+ 	/* and remember the new relation's OID for ExecCreateTableAs */
+ 	CreateAsRelid = RelationGetRelid(myState->rel);
+ 
  	/*
  	 * We can skip WAL-logging the insertions, unless PITR or streaming
  	 * replication is in use. We can skip the FSM in any case.
*** a/src/backend/commands/event_trigger.c
--- b/src/backend/commands/event_trigger.c
***************
*** 81,87 **** typedef enum
  	EVENT_TRIGGER_COMMAND_TAG_NOT_RECOGNIZED
  } event_trigger_command_tag_check_result;
  
! static event_trigger_support_data event_trigger_support[] = {
  	{ "AGGREGATE", true },
  	{ "CAST", true },
  	{ "CONSTRAINT", true },
--- 81,88 ----
  	EVENT_TRIGGER_COMMAND_TAG_NOT_RECOGNIZED
  } event_trigger_command_tag_check_result;
  
! static event_trigger_support_data event_trigger_support[] =
! {
  	{ "AGGREGATE", true },
  	{ "CAST", true },
  	{ "CONSTRAINT", true },
***************
*** 121,127 **** static void AlterEventTriggerOwner_internal(Relation rel,
  											HeapTuple tup,
  											Oid newOwnerId);
  static event_trigger_command_tag_check_result check_ddl_tag(const char *tag);
- static void error_duplicate_filter_variable(const char *defname);
  static Datum filter_list_to_array(List *filterlist);
  static Oid insert_event_trigger_tuple(char *trigname, char *eventname,
  									  Oid evtOwner, Oid funcoid,
--- 122,127 ----
***************
*** 164,176 **** CreateEventTrigger(CreateEventTrigStmt *stmt)
  			 errhint("Must be superuser to create an event trigger.")));
  
  	/* Validate event name. */
! 	if (! (strcmp(stmt->eventname, "ddl_command_start") == 0
! 		   || strcmp(stmt->eventname, "ddl_command_end") == 0
! 		   || strcmp(stmt->eventname, "ddl_command_trace") == 0))
  		ereport(ERROR,
! 			(errcode(ERRCODE_SYNTAX_ERROR),
! 			 errmsg("unrecognized event name \"%s\"",
! 					stmt->eventname)));
  
  	/* Validate filter conditions. */
  	foreach (lc, stmt->whenclause)
--- 164,176 ----
  			 errhint("Must be superuser to create an event trigger.")));
  
  	/* Validate event name. */
! 	if (strcmp(stmt->eventname, "ddl_command_start") != 0 &&
! 		strcmp(stmt->eventname, "ddl_command_end") != 0 &&
! 		strcmp(stmt->eventname, "ddl_command_trace") != 0)
  		ereport(ERROR,
! 				(errcode(ERRCODE_SYNTAX_ERROR),
! 				 errmsg("unrecognized event name \"%s\"",
! 						stmt->eventname)));
  
  	/* Validate filter conditions. */
  	foreach (lc, stmt->whenclause)
***************
*** 179,192 **** CreateEventTrigger(CreateEventTrigStmt *stmt)
  
  		if (strcmp(def->defname, "tag") == 0)
  		{
! 			if (tags != NULL)
! 				error_duplicate_filter_variable(def->defname);
  			tags = (List *) def->arg;
  		}
  		else if (strcmp(def->defname, "context") == 0)
  		{
! 			if (contexts != NULL)
! 				error_duplicate_filter_variable(def->defname);
  			contexts = (List *) def->arg;
  		}
  		else
--- 179,198 ----
  
  		if (strcmp(def->defname, "tag") == 0)
  		{
! 			if (tags != NIL)
! 				ereport(ERROR,
! 						(errcode(ERRCODE_SYNTAX_ERROR),
! 						 errmsg("filter variable \"%s\" specified more than once",
! 								def->defname)));
  			tags = (List *) def->arg;
  		}
  		else if (strcmp(def->defname, "context") == 0)
  		{
! 			if (contexts != NIL)
! 				ereport(ERROR,
! 						(errcode(ERRCODE_SYNTAX_ERROR),
! 						 errmsg("filter variable \"%s\" specified more than once",
! 								def->defname)));
  			contexts = (List *) def->arg;
  		}
  		else
***************
*** 359,388 **** check_ddl_tag(const char *tag)
  }
  
  /*
-  * Complain about a duplicate filter variable.
-  */
- static void
- error_duplicate_filter_variable(const char *defname)
- {
- 	ereport(ERROR,
- 			(errcode(ERRCODE_SYNTAX_ERROR),
- 			 errmsg("filter variable \"%s\" specified more than once",
- 				defname)));
- }
- 
- /*
   * Insert the new pg_event_trigger row and record dependencies.
   */
  static Oid
  insert_event_trigger_tuple(char *trigname, char *eventname, Oid evtOwner,
  						   Oid funcoid, List *taglist, List *contexts)
  {
! 	Relation tgrel;
  	Oid         trigoid;
  	HeapTuple	tuple;
  	Datum		values[Natts_pg_trigger];
  	bool		nulls[Natts_pg_trigger];
! 	ObjectAddress myself, referenced;
  
  	/* Open pg_event_trigger. */
  	tgrel = heap_open(EventTriggerRelationId, RowExclusiveLock);
--- 365,383 ----
  }
  
  /*
   * Insert the new pg_event_trigger row and record dependencies.
   */
  static Oid
  insert_event_trigger_tuple(char *trigname, char *eventname, Oid evtOwner,
  						   Oid funcoid, List *taglist, List *contexts)
  {
! 	Relation	tgrel;
  	Oid         trigoid;
  	HeapTuple	tuple;
  	Datum		values[Natts_pg_trigger];
  	bool		nulls[Natts_pg_trigger];
! 	ObjectAddress myself,
! 				  referenced;
  
  	/* Open pg_event_trigger. */
  	tgrel = heap_open(EventTriggerRelationId, RowExclusiveLock);
***************
*** 922,930 **** EventTriggerDDLCommandStart(Node *parsetree, ProcessUtilityContext context)
  	{
  		EventTriggerCacheItem  *item = lfirst(lc);
  
! 		if (ctag->operation == COMMAND_TAG_DROP
! 			&& filter_event_trigger(context, &tag, item))
! 
  			runlist = lappend_oid(runlist, item->fnoid);
  	}
  
--- 917,924 ----
  	{
  		EventTriggerCacheItem  *item = lfirst(lc);
  
! 		if (ctag->operation == COMMAND_TAG_DROP &&
! 			filter_event_trigger(context, &tag, item))
  			runlist = lappend_oid(runlist, item->fnoid);
  	}
  
***************
*** 1074,1082 **** EventTriggerSupportsObjectType(ObjectType obtype)
  			/* no support for event triggers on event triggers */
  			return false;
  		default:
! 			break;
  	}
- 	return true;
  }
  
  /*
--- 1068,1075 ----
  			/* no support for event triggers on event triggers */
  			return false;
  		default:
! 			return true;
  	}
  }
  
  /*
*** a/src/backend/tcop/utility.c
--- b/src/backend/tcop/utility.c
***************
*** 340,345 **** ProcessUtility(Node *parsetree,
--- 340,369 ----
  								dest, completionTag, context);
  }
  
+ #define InvokeDDLCommandEventTriggers(parsetree, context, fncall) \
+ 	do { \
+ 		EventTriggerDDLCommandStart(parsetree, context); \
+ 		EventTriggerTargetOid = fncall; \
+ 		EventTriggerDDLCommandEnd(parsetree, context); \
+ 	} while (0)
+ 
+ #define InvokeDDLCommandEventTriggersIfSupported(parsetree, context, fncall, objtype) \
+ 	do { \
+ 		Oid		_targetoid; \
+ 		bool	_supported = EventTriggerSupportsObjectType(objtype); \
+ 		\
+ 		if (_supported) \
+ 		{ \
+ 			EventTriggerDDLCommandStart(parsetree, context); \
+ 		} \
+ 		_targetoid = fncall; \
+ 		if (_supported) \
+ 		{ \
+ 			EventTriggerTargetOid = _targetoid; \
+ 			EventTriggerDDLCommandEnd(parsetree, context); \
+ 		} \
+ 	} while (0)
+ 
  void
  standard_ProcessUtility(Node *parsetree,
  						const char *queryString,
***************
*** 509,518 **** standard_ProcessUtility(Node *parsetree,
  			 * relation and attribute manipulation
  			 */
  		case T_CreateSchemaStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateSchemaCommand((CreateSchemaStmt *) parsetree, queryString);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateStmt:
--- 533,541 ----
  			 * relation and attribute manipulation
  			 */
  		case T_CreateSchemaStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 										  CreateSchemaCommand((CreateSchemaStmt *) parsetree,
! 										 					  queryString));
  			break;
  
  		case T_CreateStmt:
***************
*** 574,579 **** standard_ProcessUtility(Node *parsetree,
--- 597,603 ----
  						CreateForeignTable((CreateForeignTableStmt *) stmt,
  										   relOid);
  
+ 						EventTriggerTargetOid = relOid;
  						EventTriggerDDLCommandEnd(stmt, context);
  					}
  					else
***************
*** 612,685 **** standard_ProcessUtility(Node *parsetree,
  			break;
  
  		case T_CreateExtensionStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateExtension((CreateExtensionStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterExtensionStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				ExecAlterExtensionStmt((AlterExtensionStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterExtensionContentsStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				ExecAlterExtensionContentsStmt(
! 					(AlterExtensionContentsStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
! 
  			break;
  
  		case T_CreateFdwStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateForeignDataWrapper((CreateFdwStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterFdwStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterForeignDataWrapper((AlterFdwStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateForeignServerStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateForeignServer((CreateForeignServerStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterForeignServerStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterForeignServer((AlterForeignServerStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateUserMappingStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateUserMapping((CreateUserMappingStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterUserMappingStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterUserMapping((AlterUserMappingStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_DropUserMappingStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			RemoveUserMapping((DropUserMappingStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_DropStmt:
--- 636,688 ----
  			break;
  
  		case T_CreateExtensionStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 										  CreateExtension((CreateExtensionStmt *) parsetree));
  			break;
  
  		case T_AlterExtensionStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 										 ExecAlterExtensionStmt((AlterExtensionStmt *) parsetree));
  			break;
  
  		case T_AlterExtensionContentsStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 										  ExecAlterExtensionContentsStmt((AlterExtensionContentsStmt *) parsetree));
  			break;
  
  		case T_CreateFdwStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				CreateForeignDataWrapper((CreateFdwStmt *) parsetree));
  			break;
  
  		case T_AlterFdwStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				AlterForeignDataWrapper((AlterFdwStmt *) parsetree));
  			break;
  
  		case T_CreateForeignServerStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				CreateForeignServer((CreateForeignServerStmt *) parsetree));
  			break;
  
  		case T_AlterForeignServerStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				AlterForeignServer((AlterForeignServerStmt *) parsetree));
  			break;
  
  		case T_CreateUserMappingStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				CreateUserMapping((CreateUserMappingStmt *) parsetree));
  			break;
  
  		case T_AlterUserMappingStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				AlterUserMapping((AlterUserMappingStmt *) parsetree));
  			break;
  
  		case T_DropUserMappingStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				RemoveUserMapping((DropUserMappingStmt *) parsetree));
  			break;
  
  		case T_DropStmt:
***************
*** 756,772 **** standard_ProcessUtility(Node *parsetree,
  			 */
  		case T_RenameStmt:
  			{
! 				RenameStmt  *stmt;
  
  				stmt = (RenameStmt *) parsetree;
! 				if (EventTriggerSupportsObjectType(stmt->renameType))
! 					EventTriggerDDLCommandStart(parsetree, context);
! 
! 				/* there's s no harm in setting it in all cases */
! 				EventTriggerTargetOid = ExecRenameStmt(stmt);
! 
! 				if (EventTriggerSupportsObjectType(stmt->renameType))
! 					EventTriggerDDLCommandEnd(parsetree, context);
  				break;
  			}
  
--- 759,770 ----
  			 */
  		case T_RenameStmt:
  			{
! 				RenameStmt *stmt;
  
  				stmt = (RenameStmt *) parsetree;
! 				InvokeDDLCommandEventTriggersIfSupported(parsetree, context,
! 														 stmt->renameType,
! 														 ExecRenameStmt(stmt));
  				break;
  			}
  
***************
*** 775,787 **** standard_ProcessUtility(Node *parsetree,
  				AlterObjectSchemaStmt  *stmt;
  
  				stmt = (AlterObjectSchemaStmt *) parsetree;
! 				if (EventTriggerSupportsObjectType(stmt->objectType))
! 					EventTriggerDDLCommandStart(parsetree, context);
! 
! 				EventTriggerTargetOid = ExecAlterObjectSchemaStmt(stmt);
! 
! 				if (EventTriggerSupportsObjectType(stmt->objectType))
! 					EventTriggerDDLCommandEnd(parsetree, context);
  				break;
  			}
  
--- 773,781 ----
  				AlterObjectSchemaStmt  *stmt;
  
  				stmt = (AlterObjectSchemaStmt *) parsetree;
! 				InvokeDDLCommandEventTriggersIfSupported(parsetree, context,
! 														 ExecAlterObjectSchemaStmt(stmt),
! 														 stmt->objectType);
  				break;
  			}
  
***************
*** 790,802 **** standard_ProcessUtility(Node *parsetree,
  				AlterOwnerStmt  *stmt;
  
  				stmt = (AlterOwnerStmt *) parsetree;
! 				if (EventTriggerSupportsObjectType(stmt->objectType))
! 					EventTriggerDDLCommandStart(parsetree, context);
! 
! 				EventTriggerTargetOid = ExecAlterOwnerStmt(stmt);
! 
! 				if (EventTriggerSupportsObjectType(stmt->objectType))
! 					EventTriggerDDLCommandEnd(parsetree, context);
  				break;
  			}
  
--- 784,792 ----
  				AlterOwnerStmt  *stmt;
  
  				stmt = (AlterOwnerStmt *) parsetree;
! 				InvokeDDLCommandEventTriggersIfSupported(parsetree, context,
! 														 ExecAlterOwnerStmt(stmt),
! 														 stmt->objectType);
  				break;
  			}
  
***************
*** 927,935 **** standard_ProcessUtility(Node *parsetree,
  			break;
  
  		case T_AlterDefaultPrivilegesStmt:
- 			EventTriggerDDLCommandStart(parsetree, context);
  			ExecAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt *) parsetree);
- 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  			/*
--- 917,923 ----
***************
*** 996,1048 **** standard_ProcessUtility(Node *parsetree,
  			{
  				CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree;
  
! 				EventTriggerDDLCommandStart(parsetree, context);
! 				EventTriggerTargetOid =
! 					DefineCompositeType(stmt->typevar, stmt->coldeflist);
! 				EventTriggerDDLCommandEnd(parsetree, context);
  			}
  			break;
  
  		case T_CreateEnumStmt:	/* CREATE TYPE AS ENUM */
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				DefineEnum((CreateEnumStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateRangeStmt:	/* CREATE TYPE AS RANGE */
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				DefineRange((CreateRangeStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterEnumStmt:	/* ALTER TYPE (enum) */
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterEnum((AlterEnumStmt *) parsetree, isTopLevel);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_ViewStmt:		/* CREATE VIEW */
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				DefineView((ViewStmt *) parsetree, queryString);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateFunctionStmt:		/* CREATE FUNCTION */
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateFunction((CreateFunctionStmt *) parsetree, queryString);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterFunctionStmt:		/* ALTER FUNCTION */
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterFunction((AlterFunctionStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_IndexStmt:		/* CREATE INDEX */
--- 984,1022 ----
  			{
  				CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree;
  
! 				InvokeDDLCommandEventTriggers(parsetree, context,
! 					DefineCompositeType(stmt->typevar, stmt->coldeflist));
  			}
  			break;
  
  		case T_CreateEnumStmt:	/* CREATE TYPE AS ENUM */
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 										 DefineEnum((CreateEnumStmt *) parsetree));
  			break;
  
  		case T_CreateRangeStmt:	/* CREATE TYPE AS RANGE */
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 									DefineRange((CreateRangeStmt *) parsetree));
  			break;
  
  		case T_AlterEnumStmt:	/* ALTER TYPE (enum) */
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				AlterEnum((AlterEnumStmt *) parsetree, isTopLevel));
  			break;
  
  		case T_ViewStmt:		/* CREATE VIEW */
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				DefineView((ViewStmt *) parsetree, queryString));
  			break;
  
  		case T_CreateFunctionStmt:		/* CREATE FUNCTION */
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				CreateFunction((CreateFunctionStmt *) parsetree, queryString));
  			break;
  
  		case T_AlterFunctionStmt:		/* ALTER FUNCTION */
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 										 AlterFunction((AlterFunctionStmt *) parsetree));
  			break;
  
  		case T_IndexStmt:		/* CREATE INDEX */
***************
*** 1079,1102 **** standard_ProcessUtility(Node *parsetree,
  			break;
  
  		case T_RuleStmt:		/* CREATE RULE */
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				DefineRule((RuleStmt *) parsetree, queryString);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateSeqStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				DefineSequence((CreateSeqStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  		break;
  
  		case T_AlterSeqStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterSequence((AlterSeqStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_DoStmt:
--- 1053,1070 ----
  			break;
  
  		case T_RuleStmt:		/* CREATE RULE */
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				DefineRule((RuleStmt *) parsetree, queryString));
  			break;
  
  		case T_CreateSeqStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				DefineSequence((CreateSeqStmt *) parsetree));
  		break;
  
  		case T_AlterSeqStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				AlterSequence((AlterSeqStmt *) parsetree));
  			break;
  
  		case T_DoStmt:
***************
*** 1194,1203 **** standard_ProcessUtility(Node *parsetree,
  			break;
  
  		case T_CreateTableAsStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			ExecCreateTableAs((CreateTableAsStmt *) parsetree,
! 							  queryString, params, completionTag);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_VariableSetStmt:
--- 1162,1170 ----
  			break;
  
  		case T_CreateTableAsStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 							ExecCreateTableAs((CreateTableAsStmt *) parsetree,
! 											  queryString, params, completionTag));
  			break;
  
  		case T_VariableSetStmt:
***************
*** 1219,1229 **** standard_ProcessUtility(Node *parsetree,
  			break;
  
  		case T_CreateTrigStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
  				CreateTrigger((CreateTrigStmt *) parsetree, queryString,
! 								 InvalidOid, InvalidOid, false);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateEventTrigStmt:
--- 1186,1194 ----
  			break;
  
  		case T_CreateTrigStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
  				CreateTrigger((CreateTrigStmt *) parsetree, queryString,
! 								 InvalidOid, InvalidOid, false));
  			break;
  
  		case T_CreateEventTrigStmt:
***************
*** 1237,1256 **** standard_ProcessUtility(Node *parsetree,
  			break;
  
  		case T_CreatePLangStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateProceduralLanguage((CreatePLangStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  			/*
  			 * ******************************** DOMAIN statements ****
  			 */
  		case T_CreateDomainStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				DefineDomain((CreateDomainStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  			/*
--- 1202,1217 ----
  			break;
  
  		case T_CreatePLangStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				CreateProceduralLanguage((CreatePLangStmt *) parsetree));
  			break;
  
  			/*
  			 * ******************************** DOMAIN statements ****
  			 */
  		case T_CreateDomainStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				DefineDomain((CreateDomainStmt *) parsetree));
  			break;
  
  			/*
***************
*** 1354,1405 **** standard_ProcessUtility(Node *parsetree,
  			break;
  
  		case T_CreateConversionStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateConversionCommand((CreateConversionStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateCastStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				CreateCast((CreateCastStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateOpClassStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				DefineOpClass((CreateOpClassStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_CreateOpFamilyStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				DefineOpFamily((CreateOpFamilyStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterOpFamilyStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterOpFamily((AlterOpFamilyStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterTSDictionaryStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterTSDictionary((AlterTSDictionaryStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		case T_AlterTSConfigurationStmt:
! 			EventTriggerDDLCommandStart(parsetree, context);
! 			EventTriggerTargetOid =
! 				AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree);
! 			EventTriggerDDLCommandEnd(parsetree, context);
  			break;
  
  		default:
--- 1315,1352 ----
  			break;
  
  		case T_CreateConversionStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				CreateConversionCommand((CreateConversionStmt *) parsetree));
  			break;
  
  		case T_CreateCastStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				CreateCast((CreateCastStmt *) parsetree));
  			break;
  
  		case T_CreateOpClassStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				DefineOpClass((CreateOpClassStmt *) parsetree));
  			break;
  
  		case T_CreateOpFamilyStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				DefineOpFamily((CreateOpFamilyStmt *) parsetree));
  			break;
  
  		case T_AlterOpFamilyStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				AlterOpFamily((AlterOpFamilyStmt *) parsetree));
  			break;
  
  		case T_AlterTSDictionaryStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				AlterTSDictionary((AlterTSDictionaryStmt *) parsetree));
  			break;
  
  		case T_AlterTSConfigurationStmt:
! 			InvokeDDLCommandEventTriggers(parsetree, context,
! 				AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree));
  			break;
  
  		default:
*** a/src/include/commands/createas.h
--- b/src/include/commands/createas.h
***************
*** 19,25 ****
  #include "tcop/dest.h"
  
  
! extern void ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
  				  ParamListInfo params, char *completionTag);
  
  extern int	GetIntoRelEFlags(IntoClause *intoClause);
--- 19,25 ----
  #include "tcop/dest.h"
  
  
! extern Oid	ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
  				  ParamListInfo params, char *completionTag);
  
  extern int	GetIntoRelEFlags(IntoClause *intoClause);
*** a/src/include/commands/event_trigger.h
--- b/src/include/commands/event_trigger.h
***************
*** 44,50 **** typedef enum {
   * split_command_tag which should be the only thing editing those pieces of
   * information.
   */
! typedef struct {
  	const char			*tag;
  	const char			*opname;
  	CommandTagOperation	 operation;
--- 44,51 ----
   * split_command_tag which should be the only thing editing those pieces of
   * information.
   */
! typedef struct CommandTag
! {
  	const char			*tag;
  	const char			*opname;
  	CommandTagOperation	 operation;