0
点赞
收藏
分享

微信扫一扫

PostgreSQL数据库查询执行——standard_ProcessUtility


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


举报

相关推荐

0 条评论