📄 utility.c
字号:
* but now it's done inside performDeletion(). */ } } break; case T_TruncateStmt: { TruncateStmt *stmt = (TruncateStmt *) parsetree; ExecuteTruncate(stmt->relations); } break; case T_CommentStmt: CommentObject((CommentStmt *) parsetree); break; case T_CopyStmt: DoCopy((CopyStmt *) parsetree); break; case T_PrepareStmt: PrepareQuery((PrepareStmt *) parsetree); break; case T_ExecuteStmt: ExecuteQuery((ExecuteStmt *) parsetree, dest, completionTag); break; case T_DeallocateStmt: DeallocateQuery((DeallocateStmt *) parsetree); break; /* * schema */ case T_RenameStmt: ExecRenameStmt((RenameStmt *) parsetree); break; case T_AlterObjectSchemaStmt: ExecAlterObjectSchemaStmt((AlterObjectSchemaStmt *) parsetree); break; case T_AlterOwnerStmt: ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree); break; case T_AlterTableStmt: AlterTable((AlterTableStmt *) parsetree); break; case T_AlterDomainStmt: { AlterDomainStmt *stmt = (AlterDomainStmt *) parsetree; /* * Some or all of these functions are recursive to cover * inherited things, so permission checks are done there. */ switch (stmt->subtype) { case 'T': /* ALTER DOMAIN DEFAULT */ /* * Recursively alter column default for table and, if * requested, for descendants */ AlterDomainDefault(stmt->typename, stmt->def); break; case 'N': /* ALTER DOMAIN DROP NOT NULL */ AlterDomainNotNull(stmt->typename, false); break; case 'O': /* ALTER DOMAIN SET NOT NULL */ AlterDomainNotNull(stmt->typename, true); break; case 'C': /* ADD CONSTRAINT */ AlterDomainAddConstraint(stmt->typename, stmt->def); break; case 'X': /* DROP CONSTRAINT */ AlterDomainDropConstraint(stmt->typename, stmt->name, stmt->behavior); break; default: /* oops */ elog(ERROR, "unrecognized alter domain type: %d", (int) stmt->subtype); break; } } break; case T_GrantStmt: ExecuteGrantStmt((GrantStmt *) parsetree); break; case T_GrantRoleStmt: GrantRole((GrantRoleStmt *) parsetree); break; /* * ******************************** object creation / destruction ******************************** * */ case T_DefineStmt: { DefineStmt *stmt = (DefineStmt *) parsetree; switch (stmt->kind) { case OBJECT_AGGREGATE: DefineAggregate(stmt->defnames, stmt->definition); break; case OBJECT_OPERATOR: DefineOperator(stmt->defnames, stmt->definition); break; case OBJECT_TYPE: DefineType(stmt->defnames, stmt->definition); break; default: elog(ERROR, "unrecognized define stmt type: %d", (int) stmt->kind); break; } } break; case T_CompositeTypeStmt: /* CREATE TYPE (composite) */ { CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree; DefineCompositeType(stmt->typevar, stmt->coldeflist); } break; case T_ViewStmt: /* CREATE VIEW */ { ViewStmt *stmt = (ViewStmt *) parsetree; DefineView(stmt->view, stmt->query, stmt->replace); } break; case T_CreateFunctionStmt: /* CREATE FUNCTION */ CreateFunction((CreateFunctionStmt *) parsetree); break; case T_AlterFunctionStmt: /* ALTER FUNCTION */ AlterFunction((AlterFunctionStmt *) parsetree); break; case T_IndexStmt: /* CREATE INDEX */ { IndexStmt *stmt = (IndexStmt *) parsetree; CheckRelationOwnership(stmt->relation, true); DefineIndex(stmt->relation, /* relation */ stmt->idxname, /* index name */ InvalidOid, /* no predefined OID */ stmt->accessMethod, /* am name */ stmt->tableSpace, stmt->indexParams, /* parameters */ (Expr *) stmt->whereClause, stmt->rangetable, stmt->unique, stmt->primary, stmt->isconstraint, false, /* is_alter_table */ true, /* check_rights */ false, /* skip_build */ false); /* quiet */ } break; case T_RuleStmt: /* CREATE RULE */ DefineQueryRewrite((RuleStmt *) parsetree); break; case T_CreateSeqStmt: DefineSequence((CreateSeqStmt *) parsetree); break; case T_AlterSeqStmt: AlterSequence((AlterSeqStmt *) parsetree); break; case T_RemoveAggrStmt: RemoveAggregate((RemoveAggrStmt *) parsetree); break; case T_RemoveFuncStmt: RemoveFunction((RemoveFuncStmt *) parsetree); break; case T_RemoveOperStmt: RemoveOperator((RemoveOperStmt *) parsetree); break; case T_CreatedbStmt: createdb((CreatedbStmt *) parsetree); break; case T_AlterDatabaseStmt: AlterDatabase((AlterDatabaseStmt *) parsetree); break; case T_AlterDatabaseSetStmt: AlterDatabaseSet((AlterDatabaseSetStmt *) parsetree); break; case T_DropdbStmt: { DropdbStmt *stmt = (DropdbStmt *) parsetree; dropdb(stmt->dbname); } break; /* Query-level asynchronous notification */ case T_NotifyStmt: { NotifyStmt *stmt = (NotifyStmt *) parsetree; Async_Notify(stmt->relation->relname); } break; case T_ListenStmt: { ListenStmt *stmt = (ListenStmt *) parsetree; Async_Listen(stmt->relation->relname); } break; case T_UnlistenStmt: { UnlistenStmt *stmt = (UnlistenStmt *) parsetree; Async_Unlisten(stmt->relation->relname); } break; case T_LoadStmt: { LoadStmt *stmt = (LoadStmt *) parsetree; if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to do LOAD"))); closeAllVfds(); /* probably not necessary... */ load_file(stmt->filename); } break; case T_ClusterStmt: cluster((ClusterStmt *) parsetree); break; case T_VacuumStmt: vacuum((VacuumStmt *) parsetree, NIL); break; case T_ExplainStmt: ExplainQuery((ExplainStmt *) parsetree, dest); break; case T_VariableSetStmt: { VariableSetStmt *n = (VariableSetStmt *) parsetree; /* * Special cases for special SQL syntax that effectively sets * more than one variable per statement. */ if (strcmp(n->name, "TRANSACTION") == 0) { ListCell *head; foreach(head, n->args) { DefElem *item = (DefElem *) lfirst(head); if (strcmp(item->defname, "transaction_isolation") == 0) SetPGVariable("transaction_isolation", list_make1(item->arg), n->is_local); else if (strcmp(item->defname, "transaction_read_only") == 0) SetPGVariable("transaction_read_only", list_make1(item->arg), n->is_local); } } else if (strcmp(n->name, "SESSION CHARACTERISTICS") == 0) { ListCell *head; foreach(head, n->args) { DefElem *item = (DefElem *) lfirst(head); if (strcmp(item->defname, "transaction_isolation") == 0) SetPGVariable("default_transaction_isolation", list_make1(item->arg), n->is_local); else if (strcmp(item->defname, "transaction_read_only") == 0) SetPGVariable("default_transaction_read_only", list_make1(item->arg), n->is_local); } } else SetPGVariable(n->name, n->args, n->is_local); } break; case T_VariableShowStmt: { VariableShowStmt *n = (VariableShowStmt *) parsetree; GetPGVariable(n->name, dest); } break; case T_VariableResetStmt: { VariableResetStmt *n = (VariableResetStmt *) parsetree; ResetPGVariable(n->name); } break; case T_CreateTrigStmt: CreateTrigger((CreateTrigStmt *) parsetree, false); break; case T_DropPropertyStmt: { DropPropertyStmt *stmt = (DropPropertyStmt *) parsetree; Oid relId; relId = RangeVarGetRelid(stmt->relation, false); switch (stmt->removeType) { case OBJECT_RULE: /* RemoveRewriteRule checks permissions */ RemoveRewriteRule(relId, stmt->property, stmt->behavior); break; case OBJECT_TRIGGER: /* DropTrigger checks permissions */ DropTrigger(relId, stmt->property, stmt->behavior); break; default: elog(ERROR, "unrecognized object type: %d", (int) stmt->removeType); break; } } break; case T_CreatePLangStmt: CreateProceduralLanguage((CreatePLangStmt *) parsetree); break; case T_DropPLangStmt: DropProceduralLanguage((DropPLangStmt *) parsetree); break; /* * ******************************** DOMAIN statements **** */ case T_CreateDomainStmt: DefineDomain((CreateDomainStmt *) parsetree); break; /* * ******************************** ROLE statements **** */ case T_CreateRoleStmt: CreateRole((CreateRoleStmt *) parsetree); break; case T_AlterRoleStmt: AlterRole((AlterRoleStmt *) parsetree); break; case T_AlterRoleSetStmt: AlterRoleSet((AlterRoleSetStmt *) parsetree); break; case T_DropRoleStmt: DropRole((DropRoleStmt *) parsetree); break; case T_LockStmt: LockTableCommand((LockStmt *) parsetree); break; case T_ConstraintsSetStmt: AfterTriggerSetState((ConstraintsSetStmt *) parsetree); break; case T_CheckPointStmt: if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to do CHECKPOINT"))); RequestCheckpoint(true, false); break; case T_ReindexStmt: { ReindexStmt *stmt = (ReindexStmt *) parsetree; switch (stmt->kind) { case OBJECT_INDEX: ReindexIndex(stmt->relation); break; case OBJECT_TABLE: ReindexTable(stmt->relation); break; case OBJECT_DATABASE: ReindexDatabase(stmt->name, stmt->do_system, stmt->do_user); break; default: elog(ERROR, "unrecognized object type: %d", (int) stmt->kind); break; } break; } break; case T_CreateConversionStmt: CreateConversionCommand((CreateConversionStmt *) parsetree); break; case T_CreateCastStmt: CreateCast((CreateCastStmt *) parsetree); break; case T_DropCastStmt: DropCast((DropCastStmt *) parsetree); break; case T_CreateOpClassStmt: DefineOpClass((CreateOpClassStmt *) parsetree); break; case T_RemoveOpClassStmt: RemoveOpClass((RemoveOpClassStmt *) parsetree); break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(parsetree)); break; }}/* * UtilityReturnsTuples * Return "true" if this utility statement will send output to the * destination. * * Generally, there should be a case here for each case in ProcessUtility * 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -