📄 utility.c
字号:
* utility to get a string representation of the * command operation, given a raw (un-analyzed) parsetree. * * This must handle all raw command types, but since the vast majority * of 'em are utility commands, it seems sensible to keep it here. * * NB: all result strings must be shorter than COMPLETION_TAG_BUFSIZE. * Also, the result must point at a true constant (permanent storage). */const char *CreateCommandTag(Node *parsetree){ const char *tag; switch (nodeTag(parsetree)) { case T_InsertStmt: tag = "INSERT"; break; case T_DeleteStmt: tag = "DELETE"; break; case T_UpdateStmt: tag = "UPDATE"; break; case T_SelectStmt: tag = "SELECT"; break; case T_TransactionStmt: { TransactionStmt *stmt = (TransactionStmt *) parsetree; switch (stmt->kind) { case TRANS_STMT_BEGIN: tag = "BEGIN"; break; case TRANS_STMT_START: tag = "START TRANSACTION"; break; case TRANS_STMT_COMMIT: tag = "COMMIT"; break; case TRANS_STMT_ROLLBACK: case TRANS_STMT_ROLLBACK_TO: tag = "ROLLBACK"; break; case TRANS_STMT_SAVEPOINT: tag = "SAVEPOINT"; break; case TRANS_STMT_RELEASE: tag = "RELEASE"; break; case TRANS_STMT_PREPARE: tag = "PREPARE TRANSACTION"; break; case TRANS_STMT_COMMIT_PREPARED: tag = "COMMIT PREPARED"; break; case TRANS_STMT_ROLLBACK_PREPARED: tag = "ROLLBACK PREPARED"; break; default: tag = "???"; break; } } break; case T_DeclareCursorStmt: tag = "DECLARE CURSOR"; break; case T_ClosePortalStmt: tag = "CLOSE CURSOR"; break; case T_FetchStmt: { FetchStmt *stmt = (FetchStmt *) parsetree; tag = (stmt->ismove) ? "MOVE" : "FETCH"; } break; case T_CreateDomainStmt: tag = "CREATE DOMAIN"; break; case T_CreateSchemaStmt: tag = "CREATE SCHEMA"; break; case T_CreateStmt: tag = "CREATE TABLE"; break; case T_CreateTableSpaceStmt: tag = "CREATE TABLESPACE"; break; case T_DropTableSpaceStmt: tag = "DROP TABLESPACE"; break; case T_DropStmt: switch (((DropStmt *) parsetree)->removeType) { case OBJECT_TABLE: tag = "DROP TABLE"; break; case OBJECT_SEQUENCE: tag = "DROP SEQUENCE"; break; case OBJECT_VIEW: tag = "DROP VIEW"; break; case OBJECT_INDEX: tag = "DROP INDEX"; break; case OBJECT_TYPE: tag = "DROP TYPE"; break; case OBJECT_DOMAIN: tag = "DROP DOMAIN"; break; case OBJECT_CONVERSION: tag = "DROP CONVERSION"; break; case OBJECT_SCHEMA: tag = "DROP SCHEMA"; break; default: tag = "???"; } break; case T_TruncateStmt: tag = "TRUNCATE TABLE"; break; case T_CommentStmt: tag = "COMMENT"; break; case T_CopyStmt: tag = "COPY"; break; case T_RenameStmt: switch (((RenameStmt *) parsetree)->renameType) { case OBJECT_AGGREGATE: tag = "ALTER AGGREGATE"; break; case OBJECT_CONVERSION: tag = "ALTER CONVERSION"; break; case OBJECT_DATABASE: tag = "ALTER DATABASE"; break; case OBJECT_FUNCTION: tag = "ALTER FUNCTION"; break; case OBJECT_INDEX: tag = "ALTER INDEX"; break; case OBJECT_LANGUAGE: tag = "ALTER LANGUAGE"; break; case OBJECT_OPCLASS: tag = "ALTER OPERATOR CLASS"; break; case OBJECT_ROLE: tag = "ALTER ROLE"; break; case OBJECT_SCHEMA: tag = "ALTER SCHEMA"; break; case OBJECT_COLUMN: case OBJECT_TABLE: tag = "ALTER TABLE"; break; case OBJECT_TABLESPACE: tag = "ALTER TABLESPACE"; break; case OBJECT_TRIGGER: tag = "ALTER TRIGGER"; break; default: tag = "???"; break; } break; case T_AlterObjectSchemaStmt: switch (((AlterObjectSchemaStmt *) parsetree)->objectType) { case OBJECT_AGGREGATE: tag = "ALTER AGGREGATE"; break; case OBJECT_DOMAIN: tag = "ALTER DOMAIN"; break; case OBJECT_FUNCTION: tag = "ALTER FUNCTION"; break; case OBJECT_SEQUENCE: tag = "ALTER SEQUENCE"; break; case OBJECT_TABLE: tag = "ALTER TABLE"; break; case OBJECT_TYPE: tag = "ALTER TYPE"; break; default: tag = "???"; break; } break; case T_AlterOwnerStmt: switch (((AlterOwnerStmt *) parsetree)->objectType) { case OBJECT_AGGREGATE: tag = "ALTER AGGREGATE"; break; case OBJECT_CONVERSION: tag = "ALTER CONVERSION"; break; case OBJECT_DATABASE: tag = "ALTER DATABASE"; break; case OBJECT_DOMAIN: tag = "ALTER DOMAIN"; break; case OBJECT_FUNCTION: tag = "ALTER FUNCTION"; break; case OBJECT_OPERATOR: tag = "ALTER OPERATOR"; break; case OBJECT_OPCLASS: tag = "ALTER OPERATOR CLASS"; break; case OBJECT_SCHEMA: tag = "ALTER SCHEMA"; break; case OBJECT_TABLESPACE: tag = "ALTER TABLESPACE"; break; case OBJECT_TYPE: tag = "ALTER TYPE"; break; default: tag = "???"; break; } break; case T_AlterTableStmt: { AlterTableStmt *stmt = (AlterTableStmt *) parsetree; /* * We might be supporting ALTER INDEX here, so set the * completion table appropriately. Catch all other * possibilities with ALTER TABLE */ if (stmt->relkind == OBJECT_INDEX) tag = "ALTER INDEX"; else tag = "ALTER TABLE"; } break; case T_AlterDomainStmt: tag = "ALTER DOMAIN"; break; case T_AlterFunctionStmt: tag = "ALTER FUNCTION"; break; case T_GrantStmt: { GrantStmt *stmt = (GrantStmt *) parsetree; tag = (stmt->is_grant) ? "GRANT" : "REVOKE"; } break; case T_GrantRoleStmt: { GrantRoleStmt *stmt = (GrantRoleStmt *) parsetree; tag = (stmt->is_grant) ? "GRANT ROLE" : "REVOKE ROLE"; } break; case T_DefineStmt: switch (((DefineStmt *) parsetree)->kind) { case OBJECT_AGGREGATE: tag = "CREATE AGGREGATE"; break; case OBJECT_OPERATOR: tag = "CREATE OPERATOR"; break; case OBJECT_TYPE: tag = "CREATE TYPE"; break; default: tag = "???"; } break; case T_CompositeTypeStmt: tag = "CREATE TYPE"; break; case T_ViewStmt: tag = "CREATE VIEW"; break; case T_CreateFunctionStmt: tag = "CREATE FUNCTION"; break; case T_IndexStmt: tag = "CREATE INDEX"; break; case T_RuleStmt: tag = "CREATE RULE"; break; case T_CreateSeqStmt: tag = "CREATE SEQUENCE"; break; case T_AlterSeqStmt: tag = "ALTER SEQUENCE"; break; case T_RemoveAggrStmt: tag = "DROP AGGREGATE"; break; case T_RemoveFuncStmt: tag = "DROP FUNCTION"; break; case T_RemoveOperStmt: tag = "DROP OPERATOR"; break; case T_CreatedbStmt: tag = "CREATE DATABASE"; break; case T_AlterDatabaseStmt: tag = "ALTER DATABASE"; break; case T_AlterDatabaseSetStmt: tag = "ALTER DATABASE"; break; case T_DropdbStmt: tag = "DROP DATABASE"; break; case T_NotifyStmt: tag = "NOTIFY"; break; case T_ListenStmt: tag = "LISTEN"; break; case T_UnlistenStmt: tag = "UNLISTEN"; break; case T_LoadStmt: tag = "LOAD"; break; case T_ClusterStmt: tag = "CLUSTER"; break; case T_VacuumStmt: if (((VacuumStmt *) parsetree)->vacuum) tag = "VACUUM"; else tag = "ANALYZE"; break; case T_ExplainStmt: tag = "EXPLAIN"; break; case T_VariableSetStmt: tag = "SET"; break; case T_VariableShowStmt: tag = "SHOW"; break; case T_VariableResetStmt: tag = "RESET"; break; case T_CreateTrigStmt: tag = "CREATE TRIGGER"; break; case T_DropPropertyStmt: switch (((DropPropertyStmt *) parsetree)->removeType) { case OBJECT_TRIGGER: tag = "DROP TRIGGER"; break; case OBJECT_RULE: tag = "DROP RULE"; break; default: tag = "???"; } break; case T_CreatePLangStmt: tag = "CREATE LANGUAGE"; break; case T_DropPLangStmt: tag = "DROP LANGUAGE"; break; case T_CreateRoleStmt: tag = "CREATE ROLE"; break; case T_AlterRoleStmt: tag = "ALTER ROLE"; break; case T_AlterRoleSetStmt: tag = "ALTER ROLE"; break; case T_DropRoleStmt: tag = "DROP ROLE"; break; case T_LockStmt: tag = "LOCK TABLE"; break; case T_ConstraintsSetStmt: tag = "SET CONSTRAINTS"; break; case T_CheckPointStmt: tag = "CHECKPOINT"; break; case T_ReindexStmt: tag = "REINDEX"; break; case T_CreateConversionStmt: tag = "CREATE CONVERSION"; break; case T_CreateCastStmt: tag = "CREATE CAST"; break; case T_DropCastStmt: tag = "DROP CAST"; break; case T_CreateOpClassStmt: tag = "CREATE OPERATOR CLASS"; break; case T_RemoveOpClassStmt: tag = "DROP OPERATOR CLASS"; break; case T_PrepareStmt: tag = "PREPARE"; break; case T_ExecuteStmt: tag = "EXECUTE"; break; case T_DeallocateStmt: tag = "DEALLOCATE"; break; default: elog(WARNING, "unrecognized node type: %d", (int) nodeTag(parsetree)); tag = "???"; break; } return tag;}/* * CreateQueryTag * utility to get a string representation of a Query operation. * * This is exactly like CreateCommandTag, except it works on a Query * that has already been through parse analysis (and possibly further). */const char *CreateQueryTag(Query *parsetree){ const char *tag; switch (parsetree->commandType) { case CMD_SELECT: /* * We take a little extra care here so that the result will be * useful for complaints about read-only statements */ if (parsetree->into != NULL) tag = "SELECT INTO"; else if (parsetree->rowMarks != NIL) { if (parsetree->forUpdate) tag = "SELECT FOR UPDATE"; else tag = "SELECT FOR SHARE"; } else tag = "SELECT"; break; case CMD_UPDATE: tag = "UPDATE"; break; case CMD_INSERT: tag = "INSERT"; break; case CMD_DELETE: tag = "DELETE"; break; case CMD_UTILITY: tag = CreateCommandTag(parsetree->utilityStmt); break; default: elog(WARNING, "unrecognized commandType: %d", (int) parsetree->commandType); tag = "???"; break; } return tag;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -