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