utility.c
来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 1,566 行 · 第 1/3 页
C
1,566 行
* where "dest" is passed on. */boolUtilityReturnsTuples(Node *parsetree){ switch (nodeTag(parsetree)) { case T_FetchStmt: { FetchStmt *stmt = (FetchStmt *) parsetree; Portal portal; if (stmt->ismove) return false; portal = GetPortalByName(stmt->portalname); if (!PortalIsValid(portal)) return false; /* not our business to raise error */ return portal->tupDesc ? true : false; } case T_ExecuteStmt: { ExecuteStmt *stmt = (ExecuteStmt *) parsetree; PreparedStatement *entry; if (stmt->into) return false; entry = FetchPreparedStatement(stmt->name, false); if (!entry) return false; /* not our business to raise error */ switch (ChoosePortalStrategy(entry->query_list)) { case PORTAL_ONE_SELECT: return true; case PORTAL_UTIL_SELECT: return true; case PORTAL_MULTI_QUERY: /* will not return tuples */ break; } return false; } case T_ExplainStmt: return true; case T_VariableShowStmt: return true; default: return false; }}/* * UtilityTupleDescriptor * Fetch the actual output tuple descriptor for a utility statement * for which UtilityReturnsTuples() previously returned "true". * * The returned descriptor is created in (or copied into) the current memory * context. */TupleDescUtilityTupleDescriptor(Node *parsetree){ switch (nodeTag(parsetree)) { case T_FetchStmt: { FetchStmt *stmt = (FetchStmt *) parsetree; Portal portal; if (stmt->ismove) return NULL; portal = GetPortalByName(stmt->portalname); if (!PortalIsValid(portal)) return NULL; /* not our business to raise error */ return CreateTupleDescCopy(portal->tupDesc); } case T_ExecuteStmt: { ExecuteStmt *stmt = (ExecuteStmt *) parsetree; PreparedStatement *entry; if (stmt->into) return NULL; entry = FetchPreparedStatement(stmt->name, false); if (!entry) return NULL; /* not our business to raise error */ return FetchPreparedStatementResultDesc(entry); } case T_ExplainStmt: return ExplainResultDesc((ExplainStmt *) parsetree); case T_VariableShowStmt: { VariableShowStmt *n = (VariableShowStmt *) parsetree; return GetPGVariableResultDesc(n->name); } default: return NULL; }}/* * CreateCommandTag * 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: tag = "ROLLBACK"; 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_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_GROUP: tag = "ALTER GROUP"; break; case OBJECT_LANGUAGE: tag = "ALTER LANGUAGE"; break; case OBJECT_OPCLASS: tag = "ALTER OPERATOR CLASS"; break; case OBJECT_SCHEMA: tag = "ALTER SCHEMA"; break; case OBJECT_TRIGGER: tag = "ALTER TRIGGER"; break; case OBJECT_USER: tag = "ALTER USER"; break; default: tag = "ALTER TABLE"; } break; case T_AlterTableStmt: tag = "ALTER TABLE"; break; case T_AlterDomainStmt: tag = "ALTER DOMAIN"; break; case T_GrantStmt: { GrantStmt *stmt = (GrantStmt *) parsetree; tag = (stmt->is_grant) ? "GRANT" : "REVOKE"; } 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_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_CreateUserStmt: tag = "CREATE USER"; break; case T_AlterUserStmt: tag = "ALTER USER"; break; case T_AlterUserSetStmt: tag = "ALTER USER"; break; case T_DropUserStmt: tag = "DROP USER"; break; case T_LockStmt: tag = "LOCK TABLE"; break; case T_ConstraintsSetStmt: tag = "SET CONSTRAINTS"; break; case T_CreateGroupStmt: tag = "CREATE GROUP"; break; case T_AlterGroupStmt: tag = "ALTER GROUP"; break; case T_DropGroupStmt: tag = "DROP GROUP"; 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;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?