standard_ProcessUtility函数本身只支持处理没有提供事件触发器的utility命令。而支持提供事件触发器的utility命令需要传递给ProcessUtilitySlow继续执行。具体utility命令的分类如下所示:
| 节点类型 | 描述 | 调用函数 | 
| T_TransactionStmt | transactions | |
| T_DeclareCursorStmt | cursor | PerformCursorOpen | 
| T_ClosePortalStmt | PerformPortalClose | |
| T_FetchStmt | PerformPortalFetch | |
| T_DoStmt | ExecuteDoStmt | |
| T_CreateTableSpaceStmt | table space | CreateTableSpace | 
| T_DropTableSpaceStmt | table space | DropTableSpace | 
| T_AlterTableSpaceOptionsStmt | table space | AlterTableSpaceOptions | 
| T_TruncateStmt | ExecuteTruncate | |
| T_CopyStmt | DoCopy | |
| T_PrepareStmt | PrepareQuery | |
| T_ExecuteStmt | ExecuteQuery | |
| T_DeallocateStmt | DeallocateQuery | |
| T_GrantRoleStmt | role | GrantRole | 
| T_CreatedbStmt | database | createdb | 
| T_AlterDatabaseStmt | database | AlterDatabase | 
| T_AlterDatabaseSetStmt | database | AlterDatabaseSet | 
| T_DropdbStmt | dropdb | |
| T_NotifyStmt | Query-level asynchronous notification | Async_Notify | 
| T_ListenStmt | Async_Listen | |
| T_UnlistenStmt | Async_Unlisten/Async_UnlistenAll | |
| T_LoadStmt | load_file | |
| T_CallStmt | ExecuteCallStmt | |
| T_ClusterStmt | cluster | |
| T_VacuumStmt | ExecVacuum | |
| T_ExplainStmt | ExplainQuery | |
| T_AlterSystemStmt | AlterSystemSetConfigFile | |
| T_VariableSetStmt | ExecSetVariableStmt | |
| T_VariableShowStmt | GetPGVariable | |
| T_DiscardStmt | DiscardCommand | |
| T_CreateEventTrigStmt | event trigger | CreateEventTrigger | 
| T_AlterEventTrigStmt | event trigger | AlterEventTrigger | 
| T_CreateRoleStmt | role | CreateRole | 
| T_AlterRoleStmt | role | AlterRole | 
| T_AlterRoleSetStmt | role | AlterRoleSet | 
| T_DropRoleStmt | role | DropRole | 
| T_ReassignOwnedStmt | role | ReassignOwnedObjects | 
| T_LockStmt | LockTableCommand | |
| T_ConstraintsSetStmt | AfterTriggerSetState | |
| T_CheckPointStmt | RequestCheckpoint | |
| T_ReindexStmt | reindex | |
| T_GrantStmt | grant | |
| T_DropStmt | drop | |
| T_RenameStmt | rename | |
| T_AlterObjectDependsStmt | alter object depend | |
| T_AlterObjectSchemaStmt | alter object schema | |
| T_AlterOwnerStmt | alter owner | |
| T_CommentStmt | comment | |
| T_SecLabelStmt | sec label | |
| default | ProcessUtilitySlow | 
比较复杂的处理分支如下所示:
transactions
TRANS_STMT_BEGIN/TRANS_STMT_START BeginTransactionBlock()
 TRANS_STMT_COMMIT EndTransactionBlock
 TRANS_STMT_PREPARE PrepareTransactionBlock
 TRANS_STMT_COMMIT_PREPARED FinishPreparedTransaction
 TRANS_STMT_ROLLBACK_PREPARED FinishPreparedTransaction
 TRANS_STMT_ROLLBACK UserAbortTransactionBlock
 TRANS_STMT_SAVEPOINT RequireTransactionBlock、DefineSavepoint
 TRANS_STMT_RELEASE RequireTransactionBlock、ReleaseSavepoint
 TRANS_STMT_ROLLBACK_TO RequireTransactionBlock、RollbackToSavepoint
reindex
REINDEX_OBJECT_INDEX ReindexIndex
 REINDEX_OBJECT_TABLE ReindexTable
 REINDEX_OBJECT_SCHEMA/REINDEX_OBJECT_SYSTEM/REINDEX_OBJECT_DATABASE ReindexMultipleTables
grant
*stmt = (GrantStmt *) parsetree;
if (EventTriggerSupportsObjectType(stmt->objtype))
ProcessUtilitySlow(pstate, pstmt, queryString, context, params, queryEnv, dest, completionTag);
else
ExecuteGrantStmt(stmt);
drop
*stmt = (DropStmt *) parsetree;
if (EventTriggerSupportsObjectType(stmt->removeType))
ProcessUtilitySlow(pstate, pstmt, queryString, context, params, queryEnv, dest, completionTag);
else
ExecDropStmt(stmt, isTopLevel);
rename
*stmt = (RenameStmt *) parsetree;
if (EventTriggerSupportsObjectType(stmt->renameType))
ProcessUtilitySlow(pstate, pstmt, queryString,context, params, queryEnv, dest, completionTag);
else
ExecRenameStmt(stmt);
alter object depend
*stmt = (AlterObjectDependsStmt *) parsetree;
if (EventTriggerSupportsObjectType(stmt->objectType))
ProcessUtilitySlow(pstate, pstmt, queryString,
context, params, queryEnv,
dest, completionTag);
else
ExecAlterObjectDependsStmt(stmt, NULL);
alter object schema
*stmt = (AlterObjectSchemaStmt *) parsetree;
if (EventTriggerSupportsObjectType(stmt->objectType))
ProcessUtilitySlow(pstate, pstmt, queryString,
context, params, queryEnv,
dest, completionTag);
else
ExecAlterObjectSchemaStmt(stmt, NULL);
alter owner
*stmt = (AlterOwnerStmt *) parsetree;
if (EventTriggerSupportsObjectType(stmt->objectType))
ProcessUtilitySlow(pstate, pstmt, queryString,
context, params, queryEnv,
dest, completionTag);
else
ExecAlterOwnerStmt(stmt);
comment
*stmt = (CommentStmt *) parsetree;
if (EventTriggerSupportsObjectType(stmt->objtype))
ProcessUtilitySlow(pstate, pstmt, queryString,
context, params, queryEnv,
dest, completionTag);
else
CommentObject(stmt);
sec label
*stmt = (SecLabelStmt *) parsetree;
if (EventTriggerSupportsObjectType(stmt->objtype))
ProcessUtilitySlow(pstate, pstmt, queryString,
context, params, queryEnv,
dest, completionTag);
else
ExecSecLabelStmt(stmt);
                









