ProcessUtilitySlow主要用于处理event triggers支持的语句,所以执行真正处理函数之前都需要执行event triggers支持相关的调用。如果传入参数不为PROCESS_UTILITY_SUBCOMMAND,就需要执行event triggers支持相关的调用。

static void ProcessUtilitySlow(ParseState *pstate,  PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context,
ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, char *completionTag) {
Node *parsetree = pstmt->utilityStmt;
bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
bool isCompleteQuery = (context != PROCESS_UTILITY_SUBCOMMAND);
bool needCleanup;
bool commandCollected = false;
ObjectAddress address;
ObjectAddress secondaryObject = InvalidObjectAddress;

/* All event trigger calls are done only when isCompleteQuery is true */
needCleanup = isCompleteQuery && EventTriggerBeginCompleteQuery();

/* PG_TRY block is to ensure we call EventTriggerEndCompleteQuery */
PG_TRY();
{
if (isCompleteQuery) EventTriggerDDLCommandStart(parsetree);
switch (nodeTag(parsetree))
...
/* Remember the object so that ddl_command_end event triggers have access to it. */
if (!commandCollected) EventTriggerCollectSimpleCommand(address, secondaryObject, parsetree);

if (isCompleteQuery) {
EventTriggerSQLDrop(parsetree);
EventTriggerDDLCommandEnd(parsetree);
}
}
PG_CATCH();
{
if (needCleanup) EventTriggerEndCompleteQuery();
PG_RE_THROW();
}
PG_END_TRY();

if (needCleanup)
EventTriggerEndCompleteQuery();
}

event triggers支持相关的调用流程如下所示,后续博客讲解。

EventTriggerBeginCompleteQuery
EventTriggerDDLCommandStart
EventTriggerSQLDrop
EventTriggerDDLCommandEnd
EventTriggerEndCompleteQuery

真正处理的情况

T_CreateSchemaStmt
T_CreateStmt
T_CreateForeignTableStmt
T_AlterTableStmt
T_AlterDomainStmt
T_DefineStmt
T_IndexStmt
T_CreateExtensionStmt
T_AlterExtensionStmt
T_AlterExtensionContentsStmt
T_CreateFdwStmt
T_AlterFdwStmt
T_CreateForeignServerStmt
T_AlterForeignServerStmt
T_CreateUserMappingStmt
T_AlterUserMappingStmt
T_DropUserMappingStmt
T_ImportForeignSchemaStmt
T_CompositeTypeStmt
T_CreateEnumStmt
T_CreateRangeStmt
T_AlterEnumStmt: /* ALTER TYPE (enum) /
T_ViewStmt: /
CREATE VIEW /
T_CreateFunctionStmt /
CREATE FUNCTION /
T_AlterFunctionStmt /
ALTER FUNCTION /
T_RuleStmt /
CREATE RULE /
T_CreateSeqStmt
T_AlterSeqStmt
T_CreateTableAsStmt
T_RefreshMatViewStmt
T_CreateTrigStmt
T_CreatePLangStmt
T_CreateDomainStmt
T_CreateConversionStmt
T_CreateCastStmt
T_CreateOpClassStmt
T_CreateOpFamilyStmt
T_CreateTransformStmt
T_AlterOpFamilyStmt
T_AlterTSDictionaryStmt
T_AlterTSConfigurationStmt
T_AlterTableMoveAllStmt
T_DropStmt:
T_RenameStmt
T_AlterObjectDependsStmt
T_AlterObjectSchemaStmt
T_AlterOwnerStmt
T_AlterOperatorStmt
T_CommentStmt
T_GrantStmt
T_DropOwnedStmt
T_AlterDefaultPrivilegesStmt
T_CreatePolicyStmt /
CREATE POLICY /
T_AlterPolicyStmt /
ALTER POLICY */
T_SecLabelStmt
T_CreateAmStmt
T_CreatePublicationStmt
T_AlterPublicationStmt
T_CreateSubscriptionStmt
T_AlterSubscriptionStmt
T_DropSubscriptionStmt
T_CreateStatsStmt
T_AlterCollationStmt