#include "postgres.h"
#include "access/htup_details.h"
#include "access/reloptions.h"
#include "access/twophase.h"
#include "access/xact.h"
#include "catalog/catalog.h"
#include "catalog/namespace.h"
#include "catalog/toasting.h"
#include "commands/alter.h"
#include "commands/async.h"
#include "commands/cluster.h"
#include "commands/comment.h"
#include "commands/collationcmds.h"
#include "commands/conversioncmds.h"
#include "commands/copy.h"
#include "commands/createas.h"
#include "commands/dbcommands.h"
#include "commands/defrem.h"
#include "commands/discard.h"
#include "commands/event_trigger.h"
#include "commands/explain.h"
#include "commands/extension.h"
#include "commands/matview.h"
#include "commands/lockcmds.h"
#include "commands/portalcmds.h"
#include "commands/prepare.h"
#include "commands/proclang.h"
#include "commands/schemacmds.h"
#include "commands/seclabel.h"
#include "commands/sequence.h"
#include "commands/tablecmds.h"
#include "commands/tablespace.h"
#include "commands/trigger.h"
#include "commands/typecmds.h"
#include "commands/user.h"
#include "commands/vacuum.h"
#include "commands/view.h"
#include "miscadmin.h"
#include "parser/parse_utilcmd.h"
#include "postmaster/bgwriter.h"
#include "rewrite/rewriteDefine.h"
#include "rewrite/rewriteRemove.h"
#include "storage/fd.h"
#include "tcop/pquery.h"
#include "tcop/utility.h"
#include "utils/acl.h"
#include "utils/guc.h"
#include "utils/syscache.h"
Go to the source code of this file.
Functions | |
static void | ProcessUtilitySlow (Node *parsetree, const char *queryString, ProcessUtilityContext context, ParamListInfo params, DestReceiver *dest, char *completionTag) |
static void | ExecDropStmt (DropStmt *stmt, bool isTopLevel) |
void | CheckRelationOwnership (RangeVar *rel, bool noCatalogs) |
bool | CommandIsReadOnly (Node *parsetree) |
static void | check_xact_readonly (Node *parsetree) |
void | PreventCommandIfReadOnly (const char *cmdname) |
void | PreventCommandDuringRecovery (const char *cmdname) |
static void | CheckRestrictedOperation (const char *cmdname) |
void | ProcessUtility (Node *parsetree, const char *queryString, ProcessUtilityContext context, ParamListInfo params, DestReceiver *dest, char *completionTag) |
void | standard_ProcessUtility (Node *parsetree, const char *queryString, ProcessUtilityContext context, ParamListInfo params, DestReceiver *dest, char *completionTag) |
bool | UtilityReturnsTuples (Node *parsetree) |
TupleDesc | UtilityTupleDescriptor (Node *parsetree) |
Query * | UtilityContainsQuery (Node *parsetree) |
static const char * | AlterObjectTypeCommandTag (ObjectType objtype) |
const char * | CreateCommandTag (Node *parsetree) |
LogStmtLevel | GetCommandLogLevel (Node *parsetree) |
Variables | |
ProcessUtility_hook_type | ProcessUtility_hook = NULL |
static const char* AlterObjectTypeCommandTag | ( | ObjectType | objtype | ) | [static] |
Definition at line 1566 of file utility.c.
References OBJECT_AGGREGATE, OBJECT_ATTRIBUTE, OBJECT_CAST, OBJECT_COLLATION, OBJECT_COLUMN, OBJECT_CONSTRAINT, OBJECT_CONVERSION, OBJECT_DATABASE, OBJECT_DOMAIN, OBJECT_EVENT_TRIGGER, OBJECT_EXTENSION, OBJECT_FDW, OBJECT_FOREIGN_SERVER, OBJECT_FOREIGN_TABLE, OBJECT_FUNCTION, OBJECT_INDEX, OBJECT_LANGUAGE, OBJECT_LARGEOBJECT, OBJECT_MATVIEW, OBJECT_OPCLASS, OBJECT_OPERATOR, OBJECT_OPFAMILY, OBJECT_ROLE, OBJECT_RULE, OBJECT_SCHEMA, OBJECT_SEQUENCE, OBJECT_TABLE, OBJECT_TABLESPACE, OBJECT_TRIGGER, OBJECT_TSCONFIGURATION, OBJECT_TSDICTIONARY, OBJECT_TSPARSER, OBJECT_TSTEMPLATE, OBJECT_TYPE, and OBJECT_VIEW.
Referenced by CreateCommandTag().
{ const char *tag; switch (objtype) { case OBJECT_AGGREGATE: tag = "ALTER AGGREGATE"; break; case OBJECT_ATTRIBUTE: tag = "ALTER TYPE"; break; case OBJECT_CAST: tag = "ALTER CAST"; break; case OBJECT_COLLATION: tag = "ALTER COLLATION"; break; case OBJECT_COLUMN: tag = "ALTER TABLE"; break; case OBJECT_CONSTRAINT: tag = "ALTER TABLE"; break; case OBJECT_CONVERSION: tag = "ALTER CONVERSION"; break; case OBJECT_DATABASE: tag = "ALTER DATABASE"; break; case OBJECT_DOMAIN: tag = "ALTER DOMAIN"; break; case OBJECT_EXTENSION: tag = "ALTER EXTENSION"; break; case OBJECT_FDW: tag = "ALTER FOREIGN DATA WRAPPER"; break; case OBJECT_FOREIGN_SERVER: tag = "ALTER SERVER"; break; case OBJECT_FOREIGN_TABLE: tag = "ALTER FOREIGN TABLE"; break; case OBJECT_FUNCTION: tag = "ALTER FUNCTION"; break; case OBJECT_INDEX: tag = "ALTER INDEX"; break; case OBJECT_LANGUAGE: tag = "ALTER LANGUAGE"; break; case OBJECT_LARGEOBJECT: tag = "ALTER LARGE OBJECT"; break; case OBJECT_OPCLASS: tag = "ALTER OPERATOR CLASS"; break; case OBJECT_OPERATOR: tag = "ALTER OPERATOR"; break; case OBJECT_OPFAMILY: tag = "ALTER OPERATOR FAMILY"; break; case OBJECT_ROLE: tag = "ALTER ROLE"; break; case OBJECT_RULE: tag = "ALTER RULE"; break; case OBJECT_SCHEMA: tag = "ALTER SCHEMA"; break; case OBJECT_SEQUENCE: tag = "ALTER SEQUENCE"; break; case OBJECT_TABLE: tag = "ALTER TABLE"; break; case OBJECT_TABLESPACE: tag = "ALTER TABLESPACE"; break; case OBJECT_TRIGGER: tag = "ALTER TRIGGER"; break; case OBJECT_EVENT_TRIGGER: tag = "ALTER EVENT TRIGGER"; break; case OBJECT_TSCONFIGURATION: tag = "ALTER TEXT SEARCH CONFIGURATION"; break; case OBJECT_TSDICTIONARY: tag = "ALTER TEXT SEARCH DICTIONARY"; break; case OBJECT_TSPARSER: tag = "ALTER TEXT SEARCH PARSER"; break; case OBJECT_TSTEMPLATE: tag = "ALTER TEXT SEARCH TEMPLATE"; break; case OBJECT_TYPE: tag = "ALTER TYPE"; break; case OBJECT_VIEW: tag = "ALTER VIEW"; break; case OBJECT_MATVIEW: tag = "ALTER MATERIALIZED VIEW"; break; default: tag = "???"; break; } return tag; }
static void check_xact_readonly | ( | Node * | parsetree | ) | [static] |
Definition at line 170 of file utility.c.
References CreateCommandTag(), nodeTag, PreventCommandIfReadOnly(), T_AlterDatabaseSetStmt, T_AlterDatabaseStmt, T_AlterDefaultPrivilegesStmt, T_AlterDomainStmt, T_AlterEnumStmt, T_AlterEventTrigStmt, T_AlterExtensionContentsStmt, T_AlterExtensionStmt, T_AlterFdwStmt, T_AlterForeignServerStmt, T_AlterFunctionStmt, T_AlterObjectSchemaStmt, T_AlterOpFamilyStmt, T_AlterOwnerStmt, T_AlterRoleSetStmt, T_AlterRoleStmt, T_AlterSeqStmt, T_AlterTableSpaceOptionsStmt, T_AlterTableStmt, T_AlterTSConfigurationStmt, T_AlterTSDictionaryStmt, T_AlterUserMappingStmt, T_CommentStmt, T_CompositeTypeStmt, T_CreateCastStmt, T_CreateConversionStmt, T_CreatedbStmt, T_CreateDomainStmt, T_CreateEnumStmt, T_CreateEventTrigStmt, T_CreateExtensionStmt, T_CreateFdwStmt, T_CreateForeignServerStmt, T_CreateForeignTableStmt, T_CreateFunctionStmt, T_CreateOpClassStmt, T_CreateOpFamilyStmt, T_CreatePLangStmt, T_CreateRangeStmt, T_CreateRoleStmt, T_CreateSchemaStmt, T_CreateSeqStmt, T_CreateStmt, T_CreateTableAsStmt, T_CreateTableSpaceStmt, T_CreateTrigStmt, T_CreateUserMappingStmt, T_DefineStmt, T_DropdbStmt, T_DropOwnedStmt, T_DropRoleStmt, T_DropStmt, T_DropTableSpaceStmt, T_DropUserMappingStmt, T_GrantRoleStmt, T_GrantStmt, T_IndexStmt, T_ReassignOwnedStmt, T_RefreshMatViewStmt, T_RenameStmt, T_RuleStmt, T_SecLabelStmt, T_TruncateStmt, T_ViewStmt, and XactReadOnly.
Referenced by standard_ProcessUtility().
{ if (!XactReadOnly) return; /* * Note: Commands that need to do more complicated checking are handled * elsewhere, in particular COPY and plannable statements do their own * checking. However they should all call PreventCommandIfReadOnly to * actually throw the error. */ switch (nodeTag(parsetree)) { case T_AlterDatabaseStmt: case T_AlterDatabaseSetStmt: case T_AlterDomainStmt: case T_AlterFunctionStmt: case T_AlterRoleStmt: case T_AlterRoleSetStmt: case T_AlterObjectSchemaStmt: case T_AlterOwnerStmt: case T_AlterSeqStmt: case T_AlterTableStmt: case T_RenameStmt: case T_CommentStmt: case T_DefineStmt: case T_CreateCastStmt: case T_CreateEventTrigStmt: case T_AlterEventTrigStmt: case T_CreateConversionStmt: case T_CreatedbStmt: case T_CreateDomainStmt: case T_CreateFunctionStmt: case T_CreateRoleStmt: case T_IndexStmt: case T_CreatePLangStmt: case T_CreateOpClassStmt: case T_CreateOpFamilyStmt: case T_AlterOpFamilyStmt: case T_RuleStmt: case T_CreateSchemaStmt: case T_CreateSeqStmt: case T_CreateStmt: case T_CreateTableAsStmt: case T_RefreshMatViewStmt: case T_CreateTableSpaceStmt: case T_CreateTrigStmt: case T_CompositeTypeStmt: case T_CreateEnumStmt: case T_CreateRangeStmt: case T_AlterEnumStmt: case T_ViewStmt: case T_DropStmt: case T_DropdbStmt: case T_DropTableSpaceStmt: case T_DropRoleStmt: case T_GrantStmt: case T_GrantRoleStmt: case T_AlterDefaultPrivilegesStmt: case T_TruncateStmt: case T_DropOwnedStmt: case T_ReassignOwnedStmt: case T_AlterTSDictionaryStmt: case T_AlterTSConfigurationStmt: case T_CreateExtensionStmt: case T_AlterExtensionStmt: case T_AlterExtensionContentsStmt: case T_CreateFdwStmt: case T_AlterFdwStmt: case T_CreateForeignServerStmt: case T_AlterForeignServerStmt: case T_CreateUserMappingStmt: case T_AlterUserMappingStmt: case T_DropUserMappingStmt: case T_AlterTableSpaceOptionsStmt: case T_CreateForeignTableStmt: case T_SecLabelStmt: PreventCommandIfReadOnly(CreateCommandTag(parsetree)); break; default: /* do nothing */ break; } }
Definition at line 88 of file utility.c.
References ACL_KIND_CLASS, aclcheck_error(), ACLCHECK_NOT_OWNER, allowSystemTableMods, elog, ereport, errcode(), errmsg(), ERROR, GETSTRUCT, GetUserId(), HeapTupleIsValid, IsSystemClass(), NoLock, ObjectIdGetDatum, pg_class_ownercheck(), RangeVarGetRelid, ReleaseSysCache(), RangeVar::relname, RELOID, and SearchSysCache1.
Referenced by ProcessUtilitySlow().
{ Oid relOid; HeapTuple tuple; /* * XXX: This is unsafe in the presence of concurrent DDL, since it is * called before acquiring any lock on the target relation. However, * locking the target relation (especially using something like * AccessExclusiveLock) before verifying that the user has permissions is * not appealing either. */ relOid = RangeVarGetRelid(rel, NoLock, false); tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relOid)); if (!HeapTupleIsValid(tuple)) /* should not happen */ elog(ERROR, "cache lookup failed for relation %u", relOid); if (!pg_class_ownercheck(relOid, GetUserId())) aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS, rel->relname); if (noCatalogs) { if (!allowSystemTableMods && IsSystemClass((Form_pg_class) GETSTRUCT(tuple))) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied: \"%s\" is a system catalog", rel->relname))); } ReleaseSysCache(tuple); }
static void CheckRestrictedOperation | ( | const char * | cmdname | ) | [static] |
Definition at line 300 of file utility.c.
References ereport, errcode(), errmsg(), ERROR, and InSecurityRestrictedOperation().
Referenced by standard_ProcessUtility().
{ if (InSecurityRestrictedOperation()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), /* translator: %s is name of a SQL command, eg PREPARE */ errmsg("cannot execute %s within security-restricted operation", cmdname))); }
Definition at line 134 of file utility.c.
References CMD_DELETE, CMD_INSERT, CMD_SELECT, CMD_UPDATE, PlannedStmt::commandType, elog, PlannedStmt::hasModifyingCTE, IsA, NIL, PlannedStmt::rowMarks, and WARNING.
Referenced by _SPI_execute_plan(), init_execution_state(), and SPI_cursor_open_internal().
{ if (IsA(parsetree, PlannedStmt)) { PlannedStmt *stmt = (PlannedStmt *) parsetree; switch (stmt->commandType) { case CMD_SELECT: if (stmt->rowMarks != NIL) return false; /* SELECT FOR [KEY] UPDATE/SHARE */ else if (stmt->hasModifyingCTE) return false; /* data-modifying CTE */ else return true; case CMD_UPDATE: case CMD_INSERT: case CMD_DELETE: return false; default: elog(WARNING, "unrecognized commandType: %d", (int) stmt->commandType); break; } } /* For now, treat all utility commands as read/write */ return false; }
const char* CreateCommandTag | ( | Node * | parsetree | ) |
Definition at line 1697 of file utility.c.
References AlterObjectTypeCommandTag(), Assert, CMD_DELETE, CMD_INSERT, CMD_SELECT, CMD_UPDATE, CMD_UTILITY, Query::commandType, PlannedStmt::commandType, CreateCommandTag(), DISCARD_ALL, DISCARD_PLANS, DISCARD_TEMP, elog, GrantRoleStmt::is_grant, GrantStmt::is_grant, IsA, FetchStmt::ismove, TransactionStmt::kind, LCS_FORKEYSHARE, LCS_FORNOKEYUPDATE, LCS_FORSHARE, LCS_FORUPDATE, linitial, DeallocateStmt::name, NIL, nodeTag, NULL, OBJECT_AGGREGATE, OBJECT_CAST, OBJECT_COLLATION, OBJECT_CONVERSION, OBJECT_DOMAIN, OBJECT_EVENT_TRIGGER, OBJECT_EXTENSION, OBJECT_FDW, OBJECT_FOREIGN_SERVER, OBJECT_FOREIGN_TABLE, OBJECT_FUNCTION, OBJECT_INDEX, OBJECT_LANGUAGE, OBJECT_MATVIEW, OBJECT_OPCLASS, OBJECT_OPERATOR, OBJECT_OPFAMILY, OBJECT_RULE, OBJECT_SCHEMA, OBJECT_SEQUENCE, OBJECT_TABLE, OBJECT_TRIGGER, OBJECT_TSCONFIGURATION, OBJECT_TSDICTIONARY, OBJECT_TSPARSER, OBJECT_TSTEMPLATE, OBJECT_TYPE, OBJECT_VIEW, ClosePortalStmt::portalname, ROW_MARK_COPY, ROW_MARK_EXCLUSIVE, ROW_MARK_KEYSHARE, ROW_MARK_NOKEYEXCLUSIVE, ROW_MARK_REFERENCE, ROW_MARK_SHARE, Query::rowMarks, PlannedStmt::rowMarks, T_AlterDatabaseSetStmt, T_AlterDatabaseStmt, T_AlterDefaultPrivilegesStmt, T_AlterDomainStmt, T_AlterEnumStmt, T_AlterEventTrigStmt, T_AlterExtensionContentsStmt, T_AlterExtensionStmt, T_AlterFdwStmt, T_AlterForeignServerStmt, T_AlterFunctionStmt, T_AlterObjectSchemaStmt, T_AlterOpFamilyStmt, T_AlterOwnerStmt, T_AlterRoleSetStmt, T_AlterRoleStmt, T_AlterSeqStmt, T_AlterTableSpaceOptionsStmt, T_AlterTableStmt, T_AlterTSConfigurationStmt, T_AlterTSDictionaryStmt, T_AlterUserMappingStmt, T_CheckPointStmt, T_ClosePortalStmt, T_ClusterStmt, T_CommentStmt, T_CompositeTypeStmt, T_ConstraintsSetStmt, T_CopyStmt, T_CreateCastStmt, T_CreateConversionStmt, T_CreatedbStmt, T_CreateDomainStmt, T_CreateEnumStmt, T_CreateEventTrigStmt, T_CreateExtensionStmt, T_CreateFdwStmt, T_CreateForeignServerStmt, T_CreateForeignTableStmt, T_CreateFunctionStmt, T_CreateOpClassStmt, T_CreateOpFamilyStmt, T_CreatePLangStmt, T_CreateRangeStmt, T_CreateRoleStmt, T_CreateSchemaStmt, T_CreateSeqStmt, T_CreateStmt, T_CreateTableAsStmt, T_CreateTableSpaceStmt, T_CreateTrigStmt, T_CreateUserMappingStmt, T_DeallocateStmt, T_DeclareCursorStmt, T_DefineStmt, T_DeleteStmt, T_DiscardStmt, T_DoStmt, T_DropdbStmt, T_DropOwnedStmt, T_DropRoleStmt, T_DropStmt, T_DropTableSpaceStmt, T_DropUserMappingStmt, T_ExecuteStmt, T_ExplainStmt, T_FetchStmt, T_GrantRoleStmt, T_GrantStmt, T_IndexStmt, T_InsertStmt, T_ListenStmt, T_LoadStmt, T_LockStmt, T_NotifyStmt, T_PlannedStmt, T_PrepareStmt, T_Query, T_ReassignOwnedStmt, T_RefreshMatViewStmt, T_ReindexStmt, T_RenameStmt, T_RuleStmt, T_SecLabelStmt, T_SelectStmt, T_TransactionStmt, T_TruncateStmt, T_UnlistenStmt, T_UpdateStmt, T_VacuumStmt, T_VariableSetStmt, T_VariableShowStmt, T_ViewStmt, TRANS_STMT_BEGIN, TRANS_STMT_COMMIT, TRANS_STMT_COMMIT_PREPARED, TRANS_STMT_PREPARE, TRANS_STMT_RELEASE, TRANS_STMT_ROLLBACK, TRANS_STMT_ROLLBACK_PREPARED, TRANS_STMT_ROLLBACK_TO, TRANS_STMT_SAVEPOINT, TRANS_STMT_START, Query::utilityStmt, PlannedStmt::utilityStmt, VACOPT_VACUUM, VAR_RESET, VAR_RESET_ALL, VAR_SET_CURRENT, VAR_SET_DEFAULT, VAR_SET_MULTI, VAR_SET_VALUE, and WARNING.
Referenced by _SPI_execute_plan(), _SPI_prepare_oneshot_plan(), _SPI_prepare_plan(), check_xact_readonly(), CreateCommandTag(), EventTriggerCommonSetup(), exec_parse_message(), exec_simple_query(), ExecCheckXactReadOnly(), init_execution_state(), PrepareQuery(), and SPI_cursor_open_internal().
{ const char *tag; switch (nodeTag(parsetree)) { /* raw plannable queries */ case T_InsertStmt: tag = "INSERT"; break; case T_DeleteStmt: tag = "DELETE"; break; case T_UpdateStmt: tag = "UPDATE"; break; case T_SelectStmt: tag = "SELECT"; break; /* utility statements --- same whether raw or cooked */ 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: { ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree; if (stmt->portalname == NULL) tag = "CLOSE CURSOR ALL"; else 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_AlterTableSpaceOptionsStmt: tag = "ALTER TABLESPACE"; break; case T_CreateExtensionStmt: tag = "CREATE EXTENSION"; break; case T_AlterExtensionStmt: tag = "ALTER EXTENSION"; break; case T_AlterExtensionContentsStmt: tag = "ALTER EXTENSION"; break; case T_CreateFdwStmt: tag = "CREATE FOREIGN DATA WRAPPER"; break; case T_AlterFdwStmt: tag = "ALTER FOREIGN DATA WRAPPER"; break; case T_CreateForeignServerStmt: tag = "CREATE SERVER"; break; case T_AlterForeignServerStmt: tag = "ALTER SERVER"; break; case T_CreateUserMappingStmt: tag = "CREATE USER MAPPING"; break; case T_AlterUserMappingStmt: tag = "ALTER USER MAPPING"; break; case T_DropUserMappingStmt: tag = "DROP USER MAPPING"; break; case T_CreateForeignTableStmt: tag = "CREATE FOREIGN 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_MATVIEW: tag = "DROP MATERIALIZED 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_COLLATION: tag = "DROP COLLATION"; break; case OBJECT_CONVERSION: tag = "DROP CONVERSION"; break; case OBJECT_SCHEMA: tag = "DROP SCHEMA"; break; case OBJECT_TSPARSER: tag = "DROP TEXT SEARCH PARSER"; break; case OBJECT_TSDICTIONARY: tag = "DROP TEXT SEARCH DICTIONARY"; break; case OBJECT_TSTEMPLATE: tag = "DROP TEXT SEARCH TEMPLATE"; break; case OBJECT_TSCONFIGURATION: tag = "DROP TEXT SEARCH CONFIGURATION"; break; case OBJECT_FOREIGN_TABLE: tag = "DROP FOREIGN TABLE"; break; case OBJECT_EXTENSION: tag = "DROP EXTENSION"; break; case OBJECT_FUNCTION: tag = "DROP FUNCTION"; break; case OBJECT_AGGREGATE: tag = "DROP AGGREGATE"; break; case OBJECT_OPERATOR: tag = "DROP OPERATOR"; break; case OBJECT_LANGUAGE: tag = "DROP LANGUAGE"; break; case OBJECT_CAST: tag = "DROP CAST"; break; case OBJECT_TRIGGER: tag = "DROP TRIGGER"; break; case OBJECT_EVENT_TRIGGER: tag = "DROP EVENT TRIGGER"; break; case OBJECT_RULE: tag = "DROP RULE"; break; case OBJECT_FDW: tag = "DROP FOREIGN DATA WRAPPER"; break; case OBJECT_FOREIGN_SERVER: tag = "DROP SERVER"; break; case OBJECT_OPCLASS: tag = "DROP OPERATOR CLASS"; break; case OBJECT_OPFAMILY: tag = "DROP OPERATOR FAMILY"; break; default: tag = "???"; } break; case T_TruncateStmt: tag = "TRUNCATE TABLE"; break; case T_CommentStmt: tag = "COMMENT"; break; case T_SecLabelStmt: tag = "SECURITY LABEL"; break; case T_CopyStmt: tag = "COPY"; break; case T_RenameStmt: tag = AlterObjectTypeCommandTag(((RenameStmt *) parsetree)->renameType); break; case T_AlterObjectSchemaStmt: tag = AlterObjectTypeCommandTag(((AlterObjectSchemaStmt *) parsetree)->objectType); break; case T_AlterOwnerStmt: tag = AlterObjectTypeCommandTag(((AlterOwnerStmt *) parsetree)->objectType); break; case T_AlterTableStmt: tag = AlterObjectTypeCommandTag(((AlterTableStmt *) parsetree)->relkind); 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_AlterDefaultPrivilegesStmt: tag = "ALTER DEFAULT PRIVILEGES"; 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; case OBJECT_TSPARSER: tag = "CREATE TEXT SEARCH PARSER"; break; case OBJECT_TSDICTIONARY: tag = "CREATE TEXT SEARCH DICTIONARY"; break; case OBJECT_TSTEMPLATE: tag = "CREATE TEXT SEARCH TEMPLATE"; break; case OBJECT_TSCONFIGURATION: tag = "CREATE TEXT SEARCH CONFIGURATION"; break; case OBJECT_COLLATION: tag = "CREATE COLLATION"; break; default: tag = "???"; } break; case T_CompositeTypeStmt: tag = "CREATE TYPE"; break; case T_CreateEnumStmt: tag = "CREATE TYPE"; break; case T_CreateRangeStmt: tag = "CREATE TYPE"; break; case T_AlterEnumStmt: tag = "ALTER 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_DoStmt: tag = "DO"; 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)->options & VACOPT_VACUUM) tag = "VACUUM"; else tag = "ANALYZE"; break; case T_ExplainStmt: tag = "EXPLAIN"; break; case T_CreateTableAsStmt: switch (((CreateTableAsStmt *) parsetree)->relkind) { case OBJECT_TABLE: if (((CreateTableAsStmt *) parsetree)->is_select_into) tag = "SELECT INTO"; else tag = "CREATE TABLE AS"; break; case OBJECT_MATVIEW: tag = "CREATE MATERIALIZED VIEW"; break; default: tag = "???"; } break; case T_RefreshMatViewStmt: tag = "REFRESH MATERIALIZED VIEW"; break; case T_VariableSetStmt: switch (((VariableSetStmt *) parsetree)->kind) { case VAR_SET_VALUE: case VAR_SET_CURRENT: case VAR_SET_DEFAULT: case VAR_SET_MULTI: tag = "SET"; break; case VAR_RESET: case VAR_RESET_ALL: tag = "RESET"; break; default: tag = "???"; } break; case T_VariableShowStmt: tag = "SHOW"; break; case T_DiscardStmt: switch (((DiscardStmt *) parsetree)->target) { case DISCARD_ALL: tag = "DISCARD ALL"; break; case DISCARD_PLANS: tag = "DISCARD PLANS"; break; case DISCARD_TEMP: tag = "DISCARD TEMP"; break; default: tag = "???"; } break; case T_CreateTrigStmt: tag = "CREATE TRIGGER"; break; case T_CreateEventTrigStmt: tag = "CREATE EVENT TRIGGER"; break; case T_AlterEventTrigStmt: tag = "ALTER EVENT TRIGGER"; break; case T_CreatePLangStmt: tag = "CREATE 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_DropOwnedStmt: tag = "DROP OWNED"; break; case T_ReassignOwnedStmt: tag = "REASSIGN OWNED"; 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_CreateOpClassStmt: tag = "CREATE OPERATOR CLASS"; break; case T_CreateOpFamilyStmt: tag = "CREATE OPERATOR FAMILY"; break; case T_AlterOpFamilyStmt: tag = "ALTER OPERATOR FAMILY"; break; case T_AlterTSDictionaryStmt: tag = "ALTER TEXT SEARCH DICTIONARY"; break; case T_AlterTSConfigurationStmt: tag = "ALTER TEXT SEARCH CONFIGURATION"; break; case T_PrepareStmt: tag = "PREPARE"; break; case T_ExecuteStmt: tag = "EXECUTE"; break; case T_DeallocateStmt: { DeallocateStmt *stmt = (DeallocateStmt *) parsetree; if (stmt->name == NULL) tag = "DEALLOCATE ALL"; else tag = "DEALLOCATE"; } break; /* already-planned queries */ case T_PlannedStmt: { PlannedStmt *stmt = (PlannedStmt *) parsetree; switch (stmt->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 (stmt->utilityStmt != NULL) { Assert(IsA(stmt->utilityStmt, DeclareCursorStmt)); tag = "DECLARE CURSOR"; } else if (stmt->rowMarks != NIL) { /* not 100% but probably close enough */ switch (((PlanRowMark *) linitial(stmt->rowMarks))->markType) { case ROW_MARK_EXCLUSIVE: tag = "SELECT FOR UPDATE"; break; case ROW_MARK_NOKEYEXCLUSIVE: tag = "SELECT FOR NO KEY UPDATE"; break; case ROW_MARK_SHARE: tag = "SELECT FOR SHARE"; break; case ROW_MARK_KEYSHARE: tag = "SELECT FOR KEY SHARE"; break; case ROW_MARK_REFERENCE: case ROW_MARK_COPY: tag = "SELECT"; break; default: tag = "???"; break; } } else tag = "SELECT"; break; case CMD_UPDATE: tag = "UPDATE"; break; case CMD_INSERT: tag = "INSERT"; break; case CMD_DELETE: tag = "DELETE"; break; default: elog(WARNING, "unrecognized commandType: %d", (int) stmt->commandType); tag = "???"; break; } } break; /* parsed-and-rewritten-but-not-planned queries */ case T_Query: { Query *stmt = (Query *) parsetree; switch (stmt->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 (stmt->utilityStmt != NULL) { Assert(IsA(stmt->utilityStmt, DeclareCursorStmt)); tag = "DECLARE CURSOR"; } else if (stmt->rowMarks != NIL) { /* not 100% but probably close enough */ switch (((RowMarkClause *) linitial(stmt->rowMarks))->strength) { case LCS_FORKEYSHARE: tag = "SELECT FOR KEY SHARE"; break; case LCS_FORSHARE: tag = "SELECT FOR SHARE"; break; case LCS_FORNOKEYUPDATE: tag = "SELECT FOR NO KEY UPDATE"; break; case LCS_FORUPDATE: tag = "SELECT FOR UPDATE"; break; default: tag = "???"; break; } } 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(stmt->utilityStmt); break; default: elog(WARNING, "unrecognized commandType: %d", (int) stmt->commandType); tag = "???"; break; } } break; default: elog(WARNING, "unrecognized node type: %d", (int) nodeTag(parsetree)); tag = "???"; break; } return tag; }
Definition at line 1357 of file utility.c.
References DropStmt::concurrent, OBJECT_FOREIGN_TABLE, OBJECT_INDEX, OBJECT_MATVIEW, OBJECT_SEQUENCE, OBJECT_TABLE, OBJECT_VIEW, PreventTransactionChain(), RemoveObjects(), RemoveRelations(), and DropStmt::removeType.
Referenced by ProcessUtilitySlow(), and standard_ProcessUtility().
{ switch (stmt->removeType) { case OBJECT_INDEX: if (stmt->concurrent) PreventTransactionChain(isTopLevel, "DROP INDEX CONCURRENTLY"); /* fall through */ case OBJECT_TABLE: case OBJECT_SEQUENCE: case OBJECT_VIEW: case OBJECT_MATVIEW: case OBJECT_FOREIGN_TABLE: RemoveRelations(stmt); break; default: RemoveObjects(stmt); break; } }
LogStmtLevel GetCommandLogLevel | ( | Node * | parsetree | ) |
Definition at line 2451 of file utility.c.
References analyze(), CMD_DELETE, CMD_INSERT, CMD_SELECT, CMD_UPDATE, CMD_UTILITY, Query::commandType, PlannedStmt::commandType, defGetBoolean(), DefElem::defname, elog, FetchPreparedStatement(), GetCommandLogLevel(), lfirst, ExecuteStmt::name, nodeTag, ExplainStmt::options, PreparedStatement::plansource, ExplainStmt::query, PrepareStmt::query, CachedPlanSource::raw_parse_tree, T_AlterDatabaseSetStmt, T_AlterDatabaseStmt, T_AlterDefaultPrivilegesStmt, T_AlterDomainStmt, T_AlterEnumStmt, T_AlterEventTrigStmt, T_AlterExtensionContentsStmt, T_AlterExtensionStmt, T_AlterFdwStmt, T_AlterForeignServerStmt, T_AlterFunctionStmt, T_AlterObjectSchemaStmt, T_AlterOpFamilyStmt, T_AlterOwnerStmt, T_AlterRoleSetStmt, T_AlterRoleStmt, T_AlterSeqStmt, T_AlterTableSpaceOptionsStmt, T_AlterTableStmt, T_AlterTSConfigurationStmt, T_AlterTSDictionaryStmt, T_AlterUserMappingStmt, T_CheckPointStmt, T_ClosePortalStmt, T_ClusterStmt, T_CommentStmt, T_CompositeTypeStmt, T_ConstraintsSetStmt, T_CopyStmt, T_CreateCastStmt, T_CreateConversionStmt, T_CreatedbStmt, T_CreateDomainStmt, T_CreateEnumStmt, T_CreateEventTrigStmt, T_CreateExtensionStmt, T_CreateFdwStmt, T_CreateForeignServerStmt, T_CreateForeignTableStmt, T_CreateFunctionStmt, T_CreateOpClassStmt, T_CreateOpFamilyStmt, T_CreatePLangStmt, T_CreateRangeStmt, T_CreateRoleStmt, T_CreateSchemaStmt, T_CreateSeqStmt, T_CreateStmt, T_CreateTableAsStmt, T_CreateTableSpaceStmt, T_CreateTrigStmt, T_CreateUserMappingStmt, T_DeallocateStmt, T_DeclareCursorStmt, T_DefineStmt, T_DeleteStmt, T_DiscardStmt, T_DoStmt, T_DropdbStmt, T_DropOwnedStmt, T_DropRoleStmt, T_DropStmt, T_DropTableSpaceStmt, T_DropUserMappingStmt, T_ExecuteStmt, T_ExplainStmt, T_FetchStmt, T_GrantRoleStmt, T_GrantStmt, T_IndexStmt, T_InsertStmt, T_ListenStmt, T_LoadStmt, T_LockStmt, T_NotifyStmt, T_PlannedStmt, T_PrepareStmt, T_Query, T_ReassignOwnedStmt, T_RefreshMatViewStmt, T_ReindexStmt, T_RenameStmt, T_RuleStmt, T_SecLabelStmt, T_SelectStmt, T_TransactionStmt, T_TruncateStmt, T_UnlistenStmt, T_UpdateStmt, T_VacuumStmt, T_VariableSetStmt, T_VariableShowStmt, T_ViewStmt, Query::utilityStmt, and WARNING.
Referenced by check_log_statement(), and GetCommandLogLevel().
{ LogStmtLevel lev; switch (nodeTag(parsetree)) { /* raw plannable queries */ case T_InsertStmt: case T_DeleteStmt: case T_UpdateStmt: lev = LOGSTMT_MOD; break; case T_SelectStmt: if (((SelectStmt *) parsetree)->intoClause) lev = LOGSTMT_DDL; /* SELECT INTO */ else lev = LOGSTMT_ALL; break; /* utility statements --- same whether raw or cooked */ case T_TransactionStmt: lev = LOGSTMT_ALL; break; case T_DeclareCursorStmt: lev = LOGSTMT_ALL; break; case T_ClosePortalStmt: lev = LOGSTMT_ALL; break; case T_FetchStmt: lev = LOGSTMT_ALL; break; case T_CreateSchemaStmt: lev = LOGSTMT_DDL; break; case T_CreateStmt: case T_CreateForeignTableStmt: lev = LOGSTMT_DDL; break; case T_CreateTableSpaceStmt: case T_DropTableSpaceStmt: case T_AlterTableSpaceOptionsStmt: lev = LOGSTMT_DDL; break; case T_CreateExtensionStmt: case T_AlterExtensionStmt: case T_AlterExtensionContentsStmt: lev = LOGSTMT_DDL; break; case T_CreateFdwStmt: case T_AlterFdwStmt: case T_CreateForeignServerStmt: case T_AlterForeignServerStmt: case T_CreateUserMappingStmt: case T_AlterUserMappingStmt: case T_DropUserMappingStmt: lev = LOGSTMT_DDL; break; case T_DropStmt: lev = LOGSTMT_DDL; break; case T_TruncateStmt: lev = LOGSTMT_MOD; break; case T_CommentStmt: lev = LOGSTMT_DDL; break; case T_SecLabelStmt: lev = LOGSTMT_DDL; break; case T_CopyStmt: if (((CopyStmt *) parsetree)->is_from) lev = LOGSTMT_MOD; else lev = LOGSTMT_ALL; break; case T_PrepareStmt: { PrepareStmt *stmt = (PrepareStmt *) parsetree; /* Look through a PREPARE to the contained stmt */ lev = GetCommandLogLevel(stmt->query); } break; case T_ExecuteStmt: { ExecuteStmt *stmt = (ExecuteStmt *) parsetree; PreparedStatement *ps; /* Look through an EXECUTE to the referenced stmt */ ps = FetchPreparedStatement(stmt->name, false); if (ps) lev = GetCommandLogLevel(ps->plansource->raw_parse_tree); else lev = LOGSTMT_ALL; } break; case T_DeallocateStmt: lev = LOGSTMT_ALL; break; case T_RenameStmt: lev = LOGSTMT_DDL; break; case T_AlterObjectSchemaStmt: lev = LOGSTMT_DDL; break; case T_AlterOwnerStmt: lev = LOGSTMT_DDL; break; case T_AlterTableStmt: lev = LOGSTMT_DDL; break; case T_AlterDomainStmt: lev = LOGSTMT_DDL; break; case T_GrantStmt: lev = LOGSTMT_DDL; break; case T_GrantRoleStmt: lev = LOGSTMT_DDL; break; case T_AlterDefaultPrivilegesStmt: lev = LOGSTMT_DDL; break; case T_DefineStmt: lev = LOGSTMT_DDL; break; case T_CompositeTypeStmt: lev = LOGSTMT_DDL; break; case T_CreateEnumStmt: lev = LOGSTMT_DDL; break; case T_CreateRangeStmt: lev = LOGSTMT_DDL; break; case T_AlterEnumStmt: lev = LOGSTMT_DDL; break; case T_ViewStmt: lev = LOGSTMT_DDL; break; case T_CreateFunctionStmt: lev = LOGSTMT_DDL; break; case T_AlterFunctionStmt: lev = LOGSTMT_DDL; break; case T_IndexStmt: lev = LOGSTMT_DDL; break; case T_RuleStmt: lev = LOGSTMT_DDL; break; case T_CreateSeqStmt: lev = LOGSTMT_DDL; break; case T_AlterSeqStmt: lev = LOGSTMT_DDL; break; case T_DoStmt: lev = LOGSTMT_ALL; break; case T_CreatedbStmt: lev = LOGSTMT_DDL; break; case T_AlterDatabaseStmt: lev = LOGSTMT_DDL; break; case T_AlterDatabaseSetStmt: lev = LOGSTMT_DDL; break; case T_DropdbStmt: lev = LOGSTMT_DDL; break; case T_NotifyStmt: lev = LOGSTMT_ALL; break; case T_ListenStmt: lev = LOGSTMT_ALL; break; case T_UnlistenStmt: lev = LOGSTMT_ALL; break; case T_LoadStmt: lev = LOGSTMT_ALL; break; case T_ClusterStmt: lev = LOGSTMT_DDL; break; case T_VacuumStmt: lev = LOGSTMT_ALL; break; case T_ExplainStmt: { ExplainStmt *stmt = (ExplainStmt *) parsetree; bool analyze = false; ListCell *lc; /* Look through an EXPLAIN ANALYZE to the contained stmt */ foreach(lc, stmt->options) { DefElem *opt = (DefElem *) lfirst(lc); if (strcmp(opt->defname, "analyze") == 0) analyze = defGetBoolean(opt); /* don't "break", as explain.c will use the last value */ } if (analyze) return GetCommandLogLevel(stmt->query); /* Plain EXPLAIN isn't so interesting */ lev = LOGSTMT_ALL; } break; case T_CreateTableAsStmt: lev = LOGSTMT_DDL; break; case T_RefreshMatViewStmt: lev = LOGSTMT_DDL; break; case T_VariableSetStmt: lev = LOGSTMT_ALL; break; case T_VariableShowStmt: lev = LOGSTMT_ALL; break; case T_DiscardStmt: lev = LOGSTMT_ALL; break; case T_CreateTrigStmt: lev = LOGSTMT_DDL; break; case T_CreateEventTrigStmt: lev = LOGSTMT_DDL; break; case T_AlterEventTrigStmt: lev = LOGSTMT_DDL; break; case T_CreatePLangStmt: lev = LOGSTMT_DDL; break; case T_CreateDomainStmt: lev = LOGSTMT_DDL; break; case T_CreateRoleStmt: lev = LOGSTMT_DDL; break; case T_AlterRoleStmt: lev = LOGSTMT_DDL; break; case T_AlterRoleSetStmt: lev = LOGSTMT_DDL; break; case T_DropRoleStmt: lev = LOGSTMT_DDL; break; case T_DropOwnedStmt: lev = LOGSTMT_DDL; break; case T_ReassignOwnedStmt: lev = LOGSTMT_DDL; break; case T_LockStmt: lev = LOGSTMT_ALL; break; case T_ConstraintsSetStmt: lev = LOGSTMT_ALL; break; case T_CheckPointStmt: lev = LOGSTMT_ALL; break; case T_ReindexStmt: lev = LOGSTMT_ALL; /* should this be DDL? */ break; case T_CreateConversionStmt: lev = LOGSTMT_DDL; break; case T_CreateCastStmt: lev = LOGSTMT_DDL; break; case T_CreateOpClassStmt: lev = LOGSTMT_DDL; break; case T_CreateOpFamilyStmt: lev = LOGSTMT_DDL; break; case T_AlterOpFamilyStmt: lev = LOGSTMT_DDL; break; case T_AlterTSDictionaryStmt: lev = LOGSTMT_DDL; break; case T_AlterTSConfigurationStmt: lev = LOGSTMT_DDL; break; /* already-planned queries */ case T_PlannedStmt: { PlannedStmt *stmt = (PlannedStmt *) parsetree; switch (stmt->commandType) { case CMD_SELECT: lev = LOGSTMT_ALL; break; case CMD_UPDATE: case CMD_INSERT: case CMD_DELETE: lev = LOGSTMT_MOD; break; default: elog(WARNING, "unrecognized commandType: %d", (int) stmt->commandType); lev = LOGSTMT_ALL; break; } } break; /* parsed-and-rewritten-but-not-planned queries */ case T_Query: { Query *stmt = (Query *) parsetree; switch (stmt->commandType) { case CMD_SELECT: lev = LOGSTMT_ALL; break; case CMD_UPDATE: case CMD_INSERT: case CMD_DELETE: lev = LOGSTMT_MOD; break; case CMD_UTILITY: lev = GetCommandLogLevel(stmt->utilityStmt); break; default: elog(WARNING, "unrecognized commandType: %d", (int) stmt->commandType); lev = LOGSTMT_ALL; break; } } break; default: elog(WARNING, "unrecognized node type: %d", (int) nodeTag(parsetree)); lev = LOGSTMT_ALL; break; } return lev; }
void PreventCommandDuringRecovery | ( | const char * | cmdname | ) |
Definition at line 282 of file utility.c.
References ereport, errcode(), errmsg(), ERROR, and RecoveryInProgress().
Referenced by LockTableCommand(), pg_notify(), standard_ProcessUtility(), and txid_current().
{ if (RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION), /* translator: %s is name of a SQL command, eg CREATE */ errmsg("cannot execute %s during recovery", cmdname))); }
void PreventCommandIfReadOnly | ( | const char * | cmdname | ) |
Definition at line 263 of file utility.c.
References ereport, errcode(), errmsg(), ERROR, and XactReadOnly.
Referenced by check_xact_readonly(), do_setval(), DoCopy(), ExecCheckXactReadOnly(), and nextval_internal().
{ if (XactReadOnly) ereport(ERROR, (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION), /* translator: %s is name of a SQL command, eg CREATE */ errmsg("cannot execute %s in a read-only transaction", cmdname))); }
void ProcessUtility | ( | Node * | parsetree, | |
const char * | queryString, | |||
ProcessUtilityContext | context, | |||
ParamListInfo | params, | |||
DestReceiver * | dest, | |||
char * | completionTag | |||
) |
Definition at line 333 of file utility.c.
References Assert, NULL, ProcessUtility_hook, and standard_ProcessUtility().
Referenced by _SPI_execute_plan(), ConvertTriggerToFK(), CreateSchemaCommand(), execute_sql_string(), PortalRunUtility(), postquel_getnext(), and ProcessUtilitySlow().
{ Assert(queryString != NULL); /* required as of 8.4 */ /* * We provide a function hook variable that lets loadable plugins get * control when ProcessUtility is called. Such a plugin would normally * call standard_ProcessUtility(). */ if (ProcessUtility_hook) (*ProcessUtility_hook) (parsetree, queryString, context, params, dest, completionTag); else standard_ProcessUtility(parsetree, queryString, context, params, dest, completionTag); }
static void ProcessUtilitySlow | ( | Node * | parsetree, | |
const char * | queryString, | |||
ProcessUtilityContext | context, | |||
ParamListInfo | params, | |||
DestReceiver * | dest, | |||
char * | completionTag | |||
) | [static] |
Definition at line 885 of file utility.c.
References AlterDomainAddConstraint(), AlterDomainDefault(), AlterDomainDropConstraint(), AlterDomainNotNull(), AlterDomainValidateConstraint(), AlterEnum(), AlterForeignDataWrapper(), AlterForeignServer(), AlterFunction(), AlterOpFamily(), AlterSequence(), AlterTable(), AlterTableCreateToastTable(), AlterTableGetLockLevel(), AlterTableLookupRelation(), AlterTSConfiguration(), AlterTSDictionary(), AlterUserMapping(), DefineStmt::args, Assert, AlterDomainStmt::behavior, CheckRelationOwnership(), AlterTableStmt::cmds, CompositeTypeStmt::coldeflist, CommandCounterIncrement(), IndexStmt::concurrent, CreateCast(), CreateConversionCommand(), CreateExtension(), CreateForeignDataWrapper(), CreateForeignServer(), CreateForeignTable(), CreateFunction(), CreateProceduralLanguage(), CreateSchemaCommand(), CreateTrigger(), CreateUserMapping(), AlterDomainStmt::def, DefineAggregate(), DefineCollation(), DefineCompositeType(), DefineDomain(), DefineEnum(), DefineIndex(), DefineOpClass(), DefineOperator(), DefineOpFamily(), DefineRange(), DefineRelation(), DefineRule(), DefineSequence(), DefineTSConfiguration(), DefineTSDictionary(), DefineTSParser(), DefineTSTemplate(), DefineType(), DefineView(), DefineStmt::definition, DefineStmt::defnames, DropOwnedObjects(), elog, ereport, errmsg(), ERROR, EventTriggerBeginCompleteQuery(), EventTriggerDDLCommandEnd(), EventTriggerDDLCommandStart(), EventTriggerEndCompleteQuery(), EventTriggerSQLDrop(), ExecAlterDefaultPrivilegesStmt(), ExecAlterExtensionContentsStmt(), ExecAlterExtensionStmt(), ExecAlterObjectSchemaStmt(), ExecAlterOwnerStmt(), ExecCreateTableAs(), ExecDropStmt(), ExecRefreshMatView(), ExecRenameStmt(), heap_reloptions(), InvalidOid, IsA, DefineStmt::kind, lfirst, lnext, AlterDomainStmt::missing_ok, AlterDomainStmt::name, NIL, nodeTag, None_Receiver, NOTICE, NULL, OBJECT_AGGREGATE, OBJECT_COLLATION, OBJECT_OPERATOR, OBJECT_TSCONFIGURATION, OBJECT_TSDICTIONARY, OBJECT_TSPARSER, OBJECT_TSTEMPLATE, OBJECT_TYPE, OidIsValid, DefineStmt::oldstyle, PG_CATCH, PG_END_TRY, PG_RE_THROW, PG_TRY, PreventTransactionChain(), PROCESS_UTILITY_SUBCOMMAND, ProcessUtility(), IndexStmt::relation, AlterTableStmt::relation, RELKIND_FOREIGN_TABLE, RELKIND_RELATION, RELKIND_TOASTVALUE, RangeVar::relname, RemoveUserMapping(), AlterDomainStmt::subtype, T_AlterDefaultPrivilegesStmt, T_AlterDomainStmt, T_AlterEnumStmt, T_AlterExtensionContentsStmt, T_AlterExtensionStmt, T_AlterFdwStmt, T_AlterForeignServerStmt, T_AlterFunctionStmt, T_AlterObjectSchemaStmt, T_AlterOpFamilyStmt, T_AlterOwnerStmt, T_AlterSeqStmt, T_AlterTableStmt, T_AlterTSConfigurationStmt, T_AlterTSDictionaryStmt, T_AlterUserMappingStmt, T_CompositeTypeStmt, T_CreateCastStmt, T_CreateConversionStmt, T_CreateDomainStmt, T_CreateEnumStmt, T_CreateExtensionStmt, T_CreateFdwStmt, T_CreateForeignServerStmt, T_CreateForeignTableStmt, T_CreateFunctionStmt, T_CreateOpClassStmt, T_CreateOpFamilyStmt, T_CreatePLangStmt, T_CreateRangeStmt, T_CreateSchemaStmt, T_CreateSeqStmt, T_CreateStmt, T_CreateTableAsStmt, T_CreateTrigStmt, T_CreateUserMappingStmt, T_DefineStmt, T_DropOwnedStmt, T_DropStmt, T_DropUserMappingStmt, T_IndexStmt, T_RefreshMatViewStmt, T_RenameStmt, T_RuleStmt, T_ViewStmt, transformAlterTableStmt(), transformCreateStmt(), transformIndexStmt(), transformRelOptions(), AlterDomainStmt::typeName, and CompositeTypeStmt::typevar.
Referenced by standard_ProcessUtility().
{ bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL); bool isCompleteQuery = (context <= PROCESS_UTILITY_QUERY); bool needCleanup; /* All event trigger calls are done only when isCompleteQuery is true */ needCleanup = isCompleteQuery && EventTriggerBeginCompleteQuery(); /* PG_TRY block is to ensure we call EventTriggerEndCompleteQuery */ PG_TRY(); { if (isCompleteQuery) EventTriggerDDLCommandStart(parsetree); switch (nodeTag(parsetree)) { /* * relation and attribute manipulation */ case T_CreateSchemaStmt: CreateSchemaCommand((CreateSchemaStmt *) parsetree, queryString); break; case T_CreateStmt: case T_CreateForeignTableStmt: { List *stmts; ListCell *l; Oid relOid; /* Run parse analysis ... */ stmts = transformCreateStmt((CreateStmt *) parsetree, queryString); /* ... and do it */ foreach(l, stmts) { Node *stmt = (Node *) lfirst(l); if (IsA(stmt, CreateStmt)) { Datum toast_options; static char *validnsps[] = HEAP_RELOPT_NAMESPACES; /* Create the table itself */ relOid = DefineRelation((CreateStmt *) stmt, RELKIND_RELATION, InvalidOid); /* * Let AlterTableCreateToastTable decide if this * one needs a secondary relation too. */ CommandCounterIncrement(); /* * parse and validate reloptions for the toast * table */ toast_options = transformRelOptions((Datum) 0, ((CreateStmt *) stmt)->options, "toast", validnsps, true, false); (void) heap_reloptions(RELKIND_TOASTVALUE, toast_options, true); AlterTableCreateToastTable(relOid, toast_options); } else if (IsA(stmt, CreateForeignTableStmt)) { /* Create the table itself */ relOid = DefineRelation((CreateStmt *) stmt, RELKIND_FOREIGN_TABLE, InvalidOid); CreateForeignTable((CreateForeignTableStmt *) stmt, relOid); } else { /* Recurse for anything else */ ProcessUtility(stmt, queryString, PROCESS_UTILITY_SUBCOMMAND, params, None_Receiver, NULL); } /* Need CCI between commands */ if (lnext(l) != NULL) CommandCounterIncrement(); } } break; case T_AlterTableStmt: { AlterTableStmt *atstmt = (AlterTableStmt *) parsetree; Oid relid; List *stmts; ListCell *l; LOCKMODE lockmode; /* * Figure out lock mode, and acquire lock. This also does * basic permissions checks, so that we won't wait for a * lock on (for example) a relation on which we have no * permissions. */ lockmode = AlterTableGetLockLevel(atstmt->cmds); relid = AlterTableLookupRelation(atstmt, lockmode); if (OidIsValid(relid)) { /* Run parse analysis ... */ stmts = transformAlterTableStmt(atstmt, queryString); /* ... and do it */ foreach(l, stmts) { Node *stmt = (Node *) lfirst(l); if (IsA(stmt, AlterTableStmt)) { /* Do the table alteration proper */ AlterTable(relid, lockmode, (AlterTableStmt *) stmt); } else { /* Recurse for anything else */ ProcessUtility(stmt, queryString, PROCESS_UTILITY_SUBCOMMAND, params, None_Receiver, NULL); } /* Need CCI between commands */ if (lnext(l) != NULL) CommandCounterIncrement(); } } else ereport(NOTICE, (errmsg("relation \"%s\" does not exist, skipping", atstmt->relation->relname))); } 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, stmt->missing_ok); break; case 'V': /* VALIDATE CONSTRAINT */ AlterDomainValidateConstraint(stmt->typeName, stmt->name); break; default: /* oops */ elog(ERROR, "unrecognized alter domain type: %d", (int) stmt->subtype); break; } } break; /* * ************* object creation / destruction ************** */ case T_DefineStmt: { DefineStmt *stmt = (DefineStmt *) parsetree; switch (stmt->kind) { case OBJECT_AGGREGATE: DefineAggregate(stmt->defnames, stmt->args, stmt->oldstyle, stmt->definition); break; case OBJECT_OPERATOR: Assert(stmt->args == NIL); DefineOperator(stmt->defnames, stmt->definition); break; case OBJECT_TYPE: Assert(stmt->args == NIL); DefineType(stmt->defnames, stmt->definition); break; case OBJECT_TSPARSER: Assert(stmt->args == NIL); DefineTSParser(stmt->defnames, stmt->definition); break; case OBJECT_TSDICTIONARY: Assert(stmt->args == NIL); DefineTSDictionary(stmt->defnames, stmt->definition); break; case OBJECT_TSTEMPLATE: Assert(stmt->args == NIL); DefineTSTemplate(stmt->defnames, stmt->definition); break; case OBJECT_TSCONFIGURATION: Assert(stmt->args == NIL); DefineTSConfiguration(stmt->defnames, stmt->definition); break; case OBJECT_COLLATION: Assert(stmt->args == NIL); DefineCollation(stmt->defnames, stmt->definition); break; default: elog(ERROR, "unrecognized define stmt type: %d", (int) stmt->kind); break; } } break; case T_IndexStmt: /* CREATE INDEX */ { IndexStmt *stmt = (IndexStmt *) parsetree; if (stmt->concurrent) PreventTransactionChain(isTopLevel, "CREATE INDEX CONCURRENTLY"); CheckRelationOwnership(stmt->relation, true); /* Run parse analysis ... */ stmt = transformIndexStmt(stmt, queryString); /* ... and do it */ DefineIndex(stmt, InvalidOid, /* no predefined OID */ false, /* is_alter_table */ true, /* check_rights */ false, /* skip_build */ false); /* quiet */ } break; case T_CreateExtensionStmt: CreateExtension((CreateExtensionStmt *) parsetree); break; case T_AlterExtensionStmt: ExecAlterExtensionStmt((AlterExtensionStmt *) parsetree); break; case T_AlterExtensionContentsStmt: ExecAlterExtensionContentsStmt((AlterExtensionContentsStmt *) parsetree); break; case T_CreateFdwStmt: CreateForeignDataWrapper((CreateFdwStmt *) parsetree); break; case T_AlterFdwStmt: AlterForeignDataWrapper((AlterFdwStmt *) parsetree); break; case T_CreateForeignServerStmt: CreateForeignServer((CreateForeignServerStmt *) parsetree); break; case T_AlterForeignServerStmt: AlterForeignServer((AlterForeignServerStmt *) parsetree); break; case T_CreateUserMappingStmt: CreateUserMapping((CreateUserMappingStmt *) parsetree); break; case T_AlterUserMappingStmt: AlterUserMapping((AlterUserMappingStmt *) parsetree); break; case T_DropUserMappingStmt: RemoveUserMapping((DropUserMappingStmt *) parsetree); break; case T_CompositeTypeStmt: /* CREATE TYPE (composite) */ { CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree; DefineCompositeType(stmt->typevar, stmt->coldeflist); } break; case T_CreateEnumStmt: /* CREATE TYPE AS ENUM */ DefineEnum((CreateEnumStmt *) parsetree); break; case T_CreateRangeStmt: /* CREATE TYPE AS RANGE */ DefineRange((CreateRangeStmt *) parsetree); break; case T_AlterEnumStmt: /* ALTER TYPE (enum) */ AlterEnum((AlterEnumStmt *) parsetree, isTopLevel); break; case T_ViewStmt: /* CREATE VIEW */ DefineView((ViewStmt *) parsetree, queryString); break; case T_CreateFunctionStmt: /* CREATE FUNCTION */ CreateFunction((CreateFunctionStmt *) parsetree, queryString); break; case T_AlterFunctionStmt: /* ALTER FUNCTION */ AlterFunction((AlterFunctionStmt *) parsetree); break; case T_RuleStmt: /* CREATE RULE */ DefineRule((RuleStmt *) parsetree, queryString); break; case T_CreateSeqStmt: DefineSequence((CreateSeqStmt *) parsetree); break; case T_AlterSeqStmt: AlterSequence((AlterSeqStmt *) parsetree); break; case T_CreateTableAsStmt: ExecCreateTableAs((CreateTableAsStmt *) parsetree, queryString, params, completionTag); break; case T_RefreshMatViewStmt: ExecRefreshMatView((RefreshMatViewStmt *) parsetree, queryString, params, completionTag); break; case T_CreateTrigStmt: (void) CreateTrigger((CreateTrigStmt *) parsetree, queryString, InvalidOid, InvalidOid, false); break; case T_CreatePLangStmt: CreateProceduralLanguage((CreatePLangStmt *) parsetree); break; case T_CreateDomainStmt: DefineDomain((CreateDomainStmt *) parsetree); break; case T_CreateConversionStmt: CreateConversionCommand((CreateConversionStmt *) parsetree); break; case T_CreateCastStmt: CreateCast((CreateCastStmt *) parsetree); break; case T_CreateOpClassStmt: DefineOpClass((CreateOpClassStmt *) parsetree); break; case T_CreateOpFamilyStmt: DefineOpFamily((CreateOpFamilyStmt *) parsetree); break; case T_AlterOpFamilyStmt: AlterOpFamily((AlterOpFamilyStmt *) parsetree); break; case T_AlterTSDictionaryStmt: AlterTSDictionary((AlterTSDictionaryStmt *) parsetree); break; case T_AlterTSConfigurationStmt: AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree); break; case T_DropStmt: ExecDropStmt((DropStmt *) parsetree, isTopLevel); break; case T_RenameStmt: ExecRenameStmt((RenameStmt *) parsetree); break; case T_AlterObjectSchemaStmt: ExecAlterObjectSchemaStmt((AlterObjectSchemaStmt *) parsetree); break; case T_AlterOwnerStmt: ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree); break; case T_DropOwnedStmt: DropOwnedObjects((DropOwnedStmt *) parsetree); break; case T_AlterDefaultPrivilegesStmt: ExecAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt *) parsetree); break; default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(parsetree)); break; } if (isCompleteQuery) { EventTriggerSQLDrop(parsetree); EventTriggerDDLCommandEnd(parsetree); } } PG_CATCH(); { if (needCleanup) EventTriggerEndCompleteQuery(); PG_RE_THROW(); } PG_END_TRY(); if (needCleanup) EventTriggerEndCompleteQuery(); }
void standard_ProcessUtility | ( | Node * | parsetree, | |
const char * | queryString, | |||
ProcessUtilityContext | context, | |||
ParamListInfo | params, | |||
DestReceiver * | dest, | |||
char * | completionTag | |||
) |
Definition at line 369 of file utility.c.
References AfterTriggerSetState(), AlterDatabase(), AlterDatabaseSet(), AlterEventTrigger(), AlterRole(), AlterRoleSet(), AlterTableSpaceOptions(), DefElem::arg, Assert, Async_Listen(), Async_Notify(), Async_Unlisten(), Async_UnlistenAll(), BeginTransactionBlock(), check_xact_readonly(), CHECKPOINT_FORCE, CHECKPOINT_IMMEDIATE, CHECKPOINT_WAIT, CheckRestrictedOperation(), closeAllVfds(), cluster(), CommentObject(), COMPLETION_TAG_BUFSIZE, UnlistenStmt::conditionname, ListenStmt::conditionname, NotifyStmt::conditionname, createdb(), CreateEventTrigger(), CreateRole(), CreateTableSpace(), DropdbStmt::dbname, DeallocateQuery(), DefineSavepoint(), DefElem::defname, DiscardCommand(), ReindexStmt::do_system, ReindexStmt::do_user, DoCopy(), dropdb(), DropRole(), DropTableSpace(), elog, EndTransactionBlock(), ereport, errcode(), errmsg(), ERROR, EventTriggerSupportsObjectType(), ExecAlterObjectSchemaStmt(), ExecAlterOwnerStmt(), ExecDropStmt(), ExecRenameStmt(), ExecSecLabelStmt(), ExecSetVariableStmt(), ExecuteDoStmt(), ExecuteGrantStmt(), ExecuteQuery(), ExecuteTruncate(), ExplainQuery(), LoadStmt::filename, FinishPreparedTransaction(), GetPGVariable(), TransactionStmt::gid, GrantRole(), InvalidOid, IsA, ReindexStmt::kind, TransactionStmt::kind, lfirst, list_make1, load_file(), LockTableCommand(), DropdbStmt::missing_ok, ReindexStmt::name, VariableShowStmt::name, name, nodeTag, NULL, OBJECT_DATABASE, OBJECT_INDEX, OBJECT_MATVIEW, OBJECT_TABLE, AlterOwnerStmt::objectType, AlterObjectSchemaStmt::objectType, VacuumStmt::options, TransactionStmt::options, NotifyStmt::payload, PerformCursorOpen(), PerformPortalClose(), PerformPortalFetch(), PointerIsValid, ClosePortalStmt::portalname, PrepareQuery(), PrepareTransactionBlock(), PreventCommandDuringRecovery(), PreventTransactionChain(), ProcessUtilitySlow(), ReassignOwnedObjects(), RecoveryInProgress(), ReindexDatabase(), ReindexIndex(), ReindexTable(), ReindexStmt::relation, ReleaseSavepoint(), DropStmt::removeType, RenameStmt::renameType, RequestCheckpoint(), RequireTransactionChain(), RollbackToSavepoint(), SetPGVariable(), snprintf(), strVal, superuser(), T_AlterDatabaseSetStmt, T_AlterDatabaseStmt, T_AlterEventTrigStmt, T_AlterObjectSchemaStmt, T_AlterOwnerStmt, T_AlterRoleSetStmt, T_AlterRoleStmt, T_AlterTableSpaceOptionsStmt, T_CheckPointStmt, T_ClosePortalStmt, T_ClusterStmt, T_CommentStmt, T_ConstraintsSetStmt, T_CopyStmt, T_CreatedbStmt, T_CreateEventTrigStmt, T_CreateRoleStmt, T_CreateTableSpaceStmt, T_DeallocateStmt, T_DiscardStmt, T_DoStmt, T_DropdbStmt, T_DropRoleStmt, T_DropStmt, T_DropTableSpaceStmt, T_ExecuteStmt, T_ExplainStmt, T_FetchStmt, T_GrantRoleStmt, T_GrantStmt, T_ListenStmt, T_LoadStmt, T_LockStmt, T_NotifyStmt, T_PlannedStmt, T_PrepareStmt, T_ReassignOwnedStmt, T_ReindexStmt, T_RenameStmt, T_SecLabelStmt, T_TransactionStmt, T_TruncateStmt, T_UnlistenStmt, T_VacuumStmt, T_VariableSetStmt, T_VariableShowStmt, TRANS_STMT_BEGIN, TRANS_STMT_COMMIT, TRANS_STMT_COMMIT_PREPARED, TRANS_STMT_PREPARE, TRANS_STMT_RELEASE, TRANS_STMT_ROLLBACK, TRANS_STMT_ROLLBACK_PREPARED, TRANS_STMT_ROLLBACK_TO, TRANS_STMT_SAVEPOINT, TRANS_STMT_START, UserAbortTransactionBlock(), PlannedStmt::utilityStmt, VACOPT_VACUUM, and vacuum().
Referenced by pgss_ProcessUtility(), ProcessUtility(), and sepgsql_utility_command().
{ bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL); check_xact_readonly(parsetree); if (completionTag) completionTag[0] = '\0'; switch (nodeTag(parsetree)) { /* * ******************** transactions ******************** */ case T_TransactionStmt: { TransactionStmt *stmt = (TransactionStmt *) parsetree; switch (stmt->kind) { /* * START TRANSACTION, as defined by SQL99: Identical * to BEGIN. Same code for both. */ case TRANS_STMT_BEGIN: case TRANS_STMT_START: { ListCell *lc; BeginTransactionBlock(); foreach(lc, stmt->options) { DefElem *item = (DefElem *) lfirst(lc); if (strcmp(item->defname, "transaction_isolation") == 0) SetPGVariable("transaction_isolation", list_make1(item->arg), true); else if (strcmp(item->defname, "transaction_read_only") == 0) SetPGVariable("transaction_read_only", list_make1(item->arg), true); else if (strcmp(item->defname, "transaction_deferrable") == 0) SetPGVariable("transaction_deferrable", list_make1(item->arg), true); } } break; case TRANS_STMT_COMMIT: if (!EndTransactionBlock()) { /* report unsuccessful commit in completionTag */ if (completionTag) strcpy(completionTag, "ROLLBACK"); } break; case TRANS_STMT_PREPARE: PreventCommandDuringRecovery("PREPARE TRANSACTION"); if (!PrepareTransactionBlock(stmt->gid)) { /* report unsuccessful commit in completionTag */ if (completionTag) strcpy(completionTag, "ROLLBACK"); } break; case TRANS_STMT_COMMIT_PREPARED: PreventTransactionChain(isTopLevel, "COMMIT PREPARED"); PreventCommandDuringRecovery("COMMIT PREPARED"); FinishPreparedTransaction(stmt->gid, true); break; case TRANS_STMT_ROLLBACK_PREPARED: PreventTransactionChain(isTopLevel, "ROLLBACK PREPARED"); PreventCommandDuringRecovery("ROLLBACK PREPARED"); FinishPreparedTransaction(stmt->gid, false); break; case TRANS_STMT_ROLLBACK: UserAbortTransactionBlock(); break; case TRANS_STMT_SAVEPOINT: { ListCell *cell; char *name = NULL; RequireTransactionChain(isTopLevel, "SAVEPOINT"); foreach(cell, stmt->options) { DefElem *elem = lfirst(cell); if (strcmp(elem->defname, "savepoint_name") == 0) name = strVal(elem->arg); } Assert(PointerIsValid(name)); DefineSavepoint(name); } break; case TRANS_STMT_RELEASE: RequireTransactionChain(isTopLevel, "RELEASE SAVEPOINT"); ReleaseSavepoint(stmt->options); break; case TRANS_STMT_ROLLBACK_TO: RequireTransactionChain(isTopLevel, "ROLLBACK TO SAVEPOINT"); RollbackToSavepoint(stmt->options); /* * CommitTransactionCommand is in charge of * re-defining the savepoint again */ break; } } break; /* * Portal (cursor) manipulation * * Note: DECLARE CURSOR is processed mostly as a SELECT, and * therefore what we will get here is a PlannedStmt not a bare * DeclareCursorStmt. */ case T_PlannedStmt: { PlannedStmt *stmt = (PlannedStmt *) parsetree; if (stmt->utilityStmt == NULL || !IsA(stmt->utilityStmt, DeclareCursorStmt)) elog(ERROR, "non-DECLARE CURSOR PlannedStmt passed to ProcessUtility"); PerformCursorOpen(stmt, params, queryString, isTopLevel); } break; case T_ClosePortalStmt: { ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree; CheckRestrictedOperation("CLOSE"); PerformPortalClose(stmt->portalname); } break; case T_FetchStmt: PerformPortalFetch((FetchStmt *) parsetree, dest, completionTag); break; case T_DoStmt: ExecuteDoStmt((DoStmt *) parsetree); break; case T_CreateTableSpaceStmt: /* no event triggers for global objects */ PreventTransactionChain(isTopLevel, "CREATE TABLESPACE"); CreateTableSpace((CreateTableSpaceStmt *) parsetree); break; case T_DropTableSpaceStmt: /* no event triggers for global objects */ PreventTransactionChain(isTopLevel, "DROP TABLESPACE"); DropTableSpace((DropTableSpaceStmt *) parsetree); break; case T_AlterTableSpaceOptionsStmt: /* no event triggers for global objects */ AlterTableSpaceOptions((AlterTableSpaceOptionsStmt *) parsetree); break; case T_TruncateStmt: ExecuteTruncate((TruncateStmt *) parsetree); break; case T_CommentStmt: CommentObject((CommentStmt *) parsetree); break; case T_SecLabelStmt: ExecSecLabelStmt((SecLabelStmt *) parsetree); break; case T_CopyStmt: { uint64 processed; DoCopy((CopyStmt *) parsetree, queryString, &processed); if (completionTag) snprintf(completionTag, COMPLETION_TAG_BUFSIZE, "COPY " UINT64_FORMAT, processed); } break; case T_PrepareStmt: CheckRestrictedOperation("PREPARE"); PrepareQuery((PrepareStmt *) parsetree, queryString); break; case T_ExecuteStmt: ExecuteQuery((ExecuteStmt *) parsetree, NULL, queryString, params, dest, completionTag); break; case T_DeallocateStmt: CheckRestrictedOperation("DEALLOCATE"); DeallocateQuery((DeallocateStmt *) parsetree); break; case T_GrantStmt: /* no event triggers for global objects */ ExecuteGrantStmt((GrantStmt *) parsetree); break; case T_GrantRoleStmt: /* no event triggers for global objects */ GrantRole((GrantRoleStmt *) parsetree); break; case T_CreatedbStmt: /* no event triggers for global objects */ PreventTransactionChain(isTopLevel, "CREATE DATABASE"); createdb((CreatedbStmt *) parsetree); break; case T_AlterDatabaseStmt: /* no event triggers for global objects */ AlterDatabase((AlterDatabaseStmt *) parsetree, isTopLevel); break; case T_AlterDatabaseSetStmt: /* no event triggers for global objects */ AlterDatabaseSet((AlterDatabaseSetStmt *) parsetree); break; case T_DropdbStmt: { DropdbStmt *stmt = (DropdbStmt *) parsetree; /* no event triggers for global objects */ PreventTransactionChain(isTopLevel, "DROP DATABASE"); dropdb(stmt->dbname, stmt->missing_ok); } break; /* Query-level asynchronous notification */ case T_NotifyStmt: { NotifyStmt *stmt = (NotifyStmt *) parsetree; PreventCommandDuringRecovery("NOTIFY"); Async_Notify(stmt->conditionname, stmt->payload); } break; case T_ListenStmt: { ListenStmt *stmt = (ListenStmt *) parsetree; PreventCommandDuringRecovery("LISTEN"); CheckRestrictedOperation("LISTEN"); Async_Listen(stmt->conditionname); } break; case T_UnlistenStmt: { UnlistenStmt *stmt = (UnlistenStmt *) parsetree; PreventCommandDuringRecovery("UNLISTEN"); CheckRestrictedOperation("UNLISTEN"); if (stmt->conditionname) Async_Unlisten(stmt->conditionname); else Async_UnlistenAll(); } break; case T_LoadStmt: { LoadStmt *stmt = (LoadStmt *) parsetree; closeAllVfds(); /* probably not necessary... */ /* Allowed names are restricted if you're not superuser */ load_file(stmt->filename, !superuser()); } break; case T_ClusterStmt: /* we choose to allow this during "read only" transactions */ PreventCommandDuringRecovery("CLUSTER"); cluster((ClusterStmt *) parsetree, isTopLevel); break; case T_VacuumStmt: { VacuumStmt *stmt = (VacuumStmt *) parsetree; /* we choose to allow this during "read only" transactions */ PreventCommandDuringRecovery((stmt->options & VACOPT_VACUUM) ? "VACUUM" : "ANALYZE"); vacuum(stmt, InvalidOid, true, NULL, false, isTopLevel); } break; case T_ExplainStmt: ExplainQuery((ExplainStmt *) parsetree, queryString, params, dest); break; case T_VariableSetStmt: ExecSetVariableStmt((VariableSetStmt *) parsetree); break; case T_VariableShowStmt: { VariableShowStmt *n = (VariableShowStmt *) parsetree; GetPGVariable(n->name, dest); } break; case T_DiscardStmt: /* should we allow DISCARD PLANS? */ CheckRestrictedOperation("DISCARD"); DiscardCommand((DiscardStmt *) parsetree, isTopLevel); break; case T_CreateEventTrigStmt: /* no event triggers on event triggers */ CreateEventTrigger((CreateEventTrigStmt *) parsetree); break; case T_AlterEventTrigStmt: /* no event triggers on event triggers */ AlterEventTrigger((AlterEventTrigStmt *) parsetree); break; /* * ******************************** ROLE statements **** */ case T_CreateRoleStmt: /* no event triggers for global objects */ CreateRole((CreateRoleStmt *) parsetree); break; case T_AlterRoleStmt: /* no event triggers for global objects */ AlterRole((AlterRoleStmt *) parsetree); break; case T_AlterRoleSetStmt: /* no event triggers for global objects */ AlterRoleSet((AlterRoleSetStmt *) parsetree); break; case T_DropRoleStmt: /* no event triggers for global objects */ DropRole((DropRoleStmt *) parsetree); break; case T_ReassignOwnedStmt: /* no event triggers for global objects */ ReassignOwnedObjects((ReassignOwnedStmt *) parsetree); break; case T_LockStmt: /* * Since the lock would just get dropped immediately, LOCK TABLE * outside a transaction block is presumed to be user error. */ RequireTransactionChain(isTopLevel, "LOCK TABLE"); 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"))); /* * You might think we should have a PreventCommandDuringRecovery() * here, but we interpret a CHECKPOINT command during recovery as * a request for a restartpoint instead. We allow this since it * can be a useful way of reducing switchover time when using * various forms of replication. */ RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_WAIT | (RecoveryInProgress() ? 0 : CHECKPOINT_FORCE)); break; case T_ReindexStmt: { ReindexStmt *stmt = (ReindexStmt *) parsetree; /* we choose to allow this during "read only" transactions */ PreventCommandDuringRecovery("REINDEX"); switch (stmt->kind) { case OBJECT_INDEX: ReindexIndex(stmt->relation); break; case OBJECT_TABLE: case OBJECT_MATVIEW: ReindexTable(stmt->relation); break; case OBJECT_DATABASE: /* * This cannot run inside a user transaction block; if * we were inside a transaction, then its commit- and * start-transaction-command calls would not have the * intended effect! */ PreventTransactionChain(isTopLevel, "REINDEX DATABASE"); ReindexDatabase(stmt->name, stmt->do_system, stmt->do_user); break; default: elog(ERROR, "unrecognized object type: %d", (int) stmt->kind); break; } } break; /* * The following statements are supported by Event Triggers only * in some cases, so we "fast path" them in the other cases. */ case T_DropStmt: { DropStmt *stmt = (DropStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->removeType)) ProcessUtilitySlow(parsetree, queryString, context, params, dest, completionTag); else ExecDropStmt(stmt, isTopLevel); } break; case T_RenameStmt: { RenameStmt *stmt = (RenameStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->renameType)) ProcessUtilitySlow(parsetree, queryString, context, params, dest, completionTag); else ExecRenameStmt(stmt); } break; case T_AlterObjectSchemaStmt: { AlterObjectSchemaStmt *stmt = (AlterObjectSchemaStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->objectType)) ProcessUtilitySlow(parsetree, queryString, context, params, dest, completionTag); else ExecAlterObjectSchemaStmt(stmt); } break; case T_AlterOwnerStmt: { AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->objectType)) ProcessUtilitySlow(parsetree, queryString, context, params, dest, completionTag); else ExecAlterOwnerStmt(stmt); } break; default: /* All other statement types have event trigger support */ ProcessUtilitySlow(parsetree, queryString, context, params, dest, completionTag); break; } }
Definition at line 1533 of file utility.c.
References Assert, CMD_UTILITY, Query::commandType, IsA, nodeTag, T_CreateTableAsStmt, T_ExplainStmt, UtilityContainsQuery(), and Query::utilityStmt.
Referenced by AcquireExecutorLocks(), AcquirePlannerLocks(), extract_query_dependencies_walker(), ResetPlanCache(), and UtilityContainsQuery().
{ Query *qry; switch (nodeTag(parsetree)) { case T_ExplainStmt: qry = (Query *) ((ExplainStmt *) parsetree)->query; Assert(IsA(qry, Query)); if (qry->commandType == CMD_UTILITY) return UtilityContainsQuery(qry->utilityStmt); return qry; case T_CreateTableAsStmt: qry = (Query *) ((CreateTableAsStmt *) parsetree)->query; Assert(IsA(qry, Query)); if (qry->commandType == CMD_UTILITY) return UtilityContainsQuery(qry->utilityStmt); return qry; default: return NULL; } }
Definition at line 1390 of file utility.c.
References FetchPreparedStatement(), GetPortalByName(), FetchStmt::ismove, ExecuteStmt::name, nodeTag, PreparedStatement::plansource, PortalIsValid, FetchStmt::portalname, CachedPlanSource::resultDesc, T_ExecuteStmt, T_ExplainStmt, T_FetchStmt, T_VariableShowStmt, and PortalData::tupDesc.
Referenced by ChoosePortalStrategy().
{ 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; entry = FetchPreparedStatement(stmt->name, false); if (!entry) return false; /* not our business to raise error */ if (entry->plansource->resultDesc) return true; return false; } case T_ExplainStmt: return true; case T_VariableShowStmt: return true; default: return false; } }
Definition at line 1440 of file utility.c.
References CreateTupleDescCopy(), ExplainResultDesc(), FetchPreparedStatement(), FetchPreparedStatementResultDesc(), GetPGVariableResultDesc(), GetPortalByName(), FetchStmt::ismove, VariableShowStmt::name, ExecuteStmt::name, nodeTag, PortalIsValid, FetchStmt::portalname, T_ExecuteStmt, T_ExplainStmt, T_FetchStmt, T_VariableShowStmt, and PortalData::tupDesc.
Referenced by PlanCacheComputeResultDesc(), and PortalStart().
{ 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; 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; } }
Definition at line 69 of file utility.c.
Referenced by _PG_fini(), _PG_init(), and ProcessUtility().