/* *CommandIsReadOnly:isanexecutablequeryread-only? * *ThisisamuchstrictertestthanweapplyforXactReadOnlymode; *thequerymustbe*intruth*read-only,becausethecallerwishes *nottodoCommandCounterIncrementforit. * *Note:currentlynoneedtosupportraworanalyzedquerieshere
*/ bool
CommandIsReadOnly(PlannedStmt *pstmt)
{
Assert(IsA(pstmt, PlannedStmt)); switch (pstmt->commandType)
{ case CMD_SELECT: if (pstmt->rowMarks != NIL) returnfalse; /* SELECT FOR [KEY] UPDATE/SHARE */ elseif (pstmt->hasModifyingCTE) returnfalse; /* data-modifying CTE */ else returntrue; case CMD_UPDATE: case CMD_INSERT: case CMD_DELETE: case CMD_MERGE: returnfalse; case CMD_UTILITY: /* For now, treat all utility commands as read/write */ returnfalse; default:
elog(WARNING, "unrecognized commandType: %d",
(int) pstmt->commandType); break;
} returnfalse;
}
/* *Determinethedegreetowhichautilitycommandisreadonly. * *Notethedefinitionsoftherelevantflagsinsrc/include/tcop/utility.h.
*/ staticint
ClassifyUtilityCommandAsReadOnly(Node *parsetree)
{ switch (nodeTag(parsetree))
{ case T_AlterCollationStmt: case T_AlterDatabaseRefreshCollStmt: case T_AlterDatabaseSetStmt: case T_AlterDatabaseStmt: case T_AlterDefaultPrivilegesStmt: case T_AlterDomainStmt: case T_AlterEnumStmt: case T_AlterEventTrigStmt: case T_AlterExtensionContentsStmt: case T_AlterExtensionStmt: case T_AlterFdwStmt: case T_AlterForeignServerStmt: case T_AlterFunctionStmt: case T_AlterObjectDependsStmt: case T_AlterObjectSchemaStmt: case T_AlterOpFamilyStmt: case T_AlterOperatorStmt: case T_AlterOwnerStmt: case T_AlterPolicyStmt: case T_AlterPublicationStmt: case T_AlterRoleSetStmt: case T_AlterRoleStmt: case T_AlterSeqStmt: case T_AlterStatsStmt: case T_AlterSubscriptionStmt: case T_AlterTSConfigurationStmt: case T_AlterTSDictionaryStmt: case T_AlterTableMoveAllStmt: case T_AlterTableSpaceOptionsStmt: case T_AlterTableStmt: case T_AlterTypeStmt: case T_AlterUserMappingStmt: case T_CommentStmt: case T_CompositeTypeStmt: case T_CreateAmStmt: case T_CreateCastStmt: case T_CreateConversionStmt: case T_CreateDomainStmt: case T_CreateEnumStmt: case T_CreateEventTrigStmt: case T_CreateExtensionStmt: case T_CreateFdwStmt: case T_CreateForeignServerStmt: case T_CreateForeignTableStmt: case T_CreateFunctionStmt: case T_CreateOpClassStmt: case T_CreateOpFamilyStmt: case T_CreatePLangStmt: case T_CreatePolicyStmt: case T_CreatePublicationStmt: case T_CreateRangeStmt: case T_CreateRoleStmt: case T_CreateSchemaStmt: case T_CreateSeqStmt: case T_CreateStatsStmt: case T_CreateStmt: case T_CreateSubscriptionStmt: case T_CreateTableAsStmt: case T_CreateTableSpaceStmt: case T_CreateTransformStmt: case T_CreateTrigStmt: case T_CreateUserMappingStmt: case T_CreatedbStmt: case T_DefineStmt: case T_DropOwnedStmt: case T_DropRoleStmt: case T_DropStmt: case T_DropSubscriptionStmt: case T_DropTableSpaceStmt: case T_DropUserMappingStmt: case T_DropdbStmt: case T_GrantRoleStmt: case T_GrantStmt: case T_ImportForeignSchemaStmt: case T_IndexStmt: case T_ReassignOwnedStmt: case T_RefreshMatViewStmt: case T_RenameStmt: case T_RuleStmt: case T_SecLabelStmt: case T_TruncateStmt: case T_ViewStmt:
{ /* DDL is not read-only, and neither is TRUNCATE. */ return COMMAND_IS_NOT_READ_ONLY;
}
case T_ClosePortalStmt: case T_ConstraintsSetStmt: case T_DeallocateStmt: case T_DeclareCursorStmt: case T_DiscardStmt: case T_ExecuteStmt: case T_FetchStmt: case T_LoadStmt: case T_PrepareStmt: case T_UnlistenStmt: case T_VariableSetStmt:
{ /* *Thesemodifyonlybackend-localstate,sothey'reOKtorun *inaread-onlytransactionoronastandby.However,they *aredisallowedinparallelmode,becausetheyeitherrely *uponormodifybackend-localstatethatmightnotbe *synchronizedamongcooperatingbackends.
*/ return COMMAND_OK_IN_RECOVERY | COMMAND_OK_IN_READ_ONLY_TXN;
}
case T_ClusterStmt: case T_ReindexStmt: case T_VacuumStmt:
{ /* *ThesecommandswriteWAL,sothey'renotstrictly *read-only,andrunningtheminparallelworkersisn't *supported. * *However,theydon'tchangethedatabasestateinawaythat *wouldaffectpg_dumpoutput,soit'sfinetorunthemina *read-onlytransaction.(CLUSTERmightchangetheorderof *rowsondisk,whichcouldaffecttheorderingofpg_dump *output,butthat'snotsemanticallysignificant.)
*/ return COMMAND_OK_IN_READ_ONLY_TXN;
}
case T_CopyStmt:
{
CopyStmt *stmt = (CopyStmt *) parsetree;
case T_TransactionStmt:
{
TransactionStmt *stmt = (TransactionStmt *) parsetree;
/* *PREPARE,COMMITPREPARED,andROLLBACKPREPAREDallwrite *WAL,sothey'renotread-onlyinthestrictsense;butthe *firstandthirddonotchangepg_dumpoutput,sothey'reOK *inaread-onlytransactions. * *WealsoconsiderCOMMITPREPAREDtobeOKinaread-only *transactionenvironment,bywayofexception.
*/ switch (stmt->kind)
{ case TRANS_STMT_BEGIN: case TRANS_STMT_START: case TRANS_STMT_COMMIT: case TRANS_STMT_ROLLBACK: case TRANS_STMT_SAVEPOINT: case TRANS_STMT_RELEASE: case TRANS_STMT_ROLLBACK_TO: return COMMAND_IS_STRICTLY_READ_ONLY;
case TRANS_STMT_PREPARE: case TRANS_STMT_COMMIT_PREPARED: case TRANS_STMT_ROLLBACK_PREPARED: return COMMAND_OK_IN_READ_ONLY_TXN;
}
elog(ERROR, "unrecognized TransactionStmtKind: %d",
(int) stmt->kind); return0; /* silence stupider compilers */
}
/* *PreventCommandIfReadOnly:throwerrorifXactReadOnly * *Thisisusefulpartlytoensureconsistencyoftheerrormessagewording; *somecallershavecheckedXactReadOnlyforthemselves.
*/ void
PreventCommandIfReadOnly(constchar *cmdname)
{ 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)));
}
/* *PreventCommandIfParallelMode:throwerrorifcurrent(sub)transactionis *inparallelmode. * *Thisisusefulpartlytoensureconsistencyoftheerrormessagewording; *somecallershavecheckedIsInParallelMode()forthemselves.
*/ void
PreventCommandIfParallelMode(constchar *cmdname)
{ if (IsInParallelMode())
ereport(ERROR,
(errcode(ERRCODE_INVALID_TRANSACTION_STATE), /* translator: %s is name of a SQL command, eg CREATE */
errmsg("cannot execute %s during a parallel operation",
cmdname)));
}
/* *PreventCommandDuringRecovery:throwerrorifRecoveryInProgress * *ThemajorityofoperationsthatareunsafeinaHotStandby *willberejectedbyXactReadOnlytests.Howeverthereareafew *commandsthatareallowedin"read-only"xactsbutcannotbeallowed *inHotStandbymode.Thosecommandsshouldcallthisfunction.
*/ void
PreventCommandDuringRecovery(constchar *cmdname)
{ 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)));
}
/* *CheckRestrictedOperation:throwerrorforhazardouscommandifwe're *insideasecurityrestrictioncontext. * *Thisisneededtoprotectsession-localstateforwhichthereisnotany *better-definedprotectionmechanism,suchasownership.
*/ staticvoid
CheckRestrictedOperation(constchar *cmdname)
{ 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)));
}
case TRANS_STMT_COMMIT: if (!EndTransactionBlock(stmt->chain))
{ /* report unsuccessful commit in qc */ if (qc)
SetQueryCompletion(qc, CMDTAG_ROLLBACK, 0);
} break;
case TRANS_STMT_PREPARE: if (!PrepareTransactionBlock(stmt->gid))
{ /* report unsuccessful commit in qc */ if (qc)
SetQueryCompletion(qc, CMDTAG_ROLLBACK, 0);
} break;
case TRANS_STMT_COMMIT_PREPARED:
PreventInTransactionBlock(isTopLevel, "COMMIT PREPARED");
FinishPreparedTransaction(stmt->gid, true); break;
case TRANS_STMT_ROLLBACK_PREPARED:
PreventInTransactionBlock(isTopLevel, "ROLLBACK PREPARED");
FinishPreparedTransaction(stmt->gid, false); break;
case TRANS_STMT_ROLLBACK:
UserAbortTransactionBlock(stmt->chain); break;
case TRANS_STMT_SAVEPOINT:
RequireTransactionBlock(isTopLevel, "SAVEPOINT");
DefineSavepoint(stmt->savepoint_name); break;
case TRANS_STMT_RELEASE:
RequireTransactionBlock(isTopLevel, "RELEASE SAVEPOINT");
ReleaseSavepoint(stmt->savepoint_name); break;
case TRANS_STMT_ROLLBACK_TO:
RequireTransactionBlock(isTopLevel, "ROLLBACK TO SAVEPOINT");
RollbackToSavepoint(stmt->savepoint_name);
case T_FetchStmt:
PerformPortalFetch((FetchStmt *) parsetree, dest, qc); break;
case T_DoStmt:
ExecuteDoStmt(pstate, (DoStmt *) parsetree, isAtomicContext); break;
case T_CreateTableSpaceStmt: /* no event triggers for global objects */
PreventInTransactionBlock(isTopLevel, "CREATE TABLESPACE");
CreateTableSpace((CreateTableSpaceStmt *) parsetree); break;
case T_DropTableSpaceStmt: /* no event triggers for global objects */
PreventInTransactionBlock(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_DeallocateStmt:
CheckRestrictedOperation("DEALLOCATE");
DeallocateQuery((DeallocateStmt *) parsetree); break;
case T_GrantRoleStmt: /* no event triggers for global objects */
GrantRole(pstate, (GrantRoleStmt *) parsetree); break;
case T_CreatedbStmt: /* no event triggers for global objects */
PreventInTransactionBlock(isTopLevel, "CREATE DATABASE");
createdb(pstate, (CreatedbStmt *) parsetree); break;
case T_AlterDatabaseStmt: /* no event triggers for global objects */
AlterDatabase(pstate, (AlterDatabaseStmt *) parsetree, isTopLevel); break;
case T_AlterDatabaseRefreshCollStmt: /* no event triggers for global objects */
AlterDatabaseRefreshColl((AlterDatabaseRefreshCollStmt *) parsetree); break;
case T_AlterDatabaseSetStmt: /* no event triggers for global objects */
AlterDatabaseSet((AlterDatabaseSetStmt *) parsetree); break;
case T_DropdbStmt: /* no event triggers for global objects */
PreventInTransactionBlock(isTopLevel, "DROP DATABASE");
DropDatabase(pstate, (DropdbStmt *) parsetree); break;
case T_ListenStmt:
{
ListenStmt *stmt = (ListenStmt *) parsetree;
CheckRestrictedOperation("LISTEN");
/* *Wedon'tallowLISTENinbackgroundprocesses,asthereis *nomechanismforthemtocollectNOTIFYmessages,sothey'd *justblockcleanoutoftheasyncSLRUindefinitely. *(Authorsofcustombackgroundworkerscouldbypassthis *restrictionbycallingAsync_Listendirectly,butthenit's *onthemtoprovidesomemechanismtoprocessthemessage *queue.)NotethereseemsnoreasontoforbidUNLISTEN.
*/ if (MyBackendType != B_BACKEND)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), /* translator: %s is name of a SQL command, eg LISTEN */
errmsg("cannot execute %s within a background process", "LISTEN")));
Async_Listen(stmt->conditionname);
} break;
case T_UnlistenStmt:
{
UnlistenStmt *stmt = (UnlistenStmt *) parsetree;
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_CallStmt:
ExecuteCallStmt(castNode(CallStmt, parsetree), params, isAtomicContext, dest); break;
case T_ClusterStmt:
cluster(pstate, (ClusterStmt *) parsetree, isTopLevel); break;
case T_VacuumStmt:
ExecVacuum(pstate, (VacuumStmt *) parsetree, isTopLevel); break;
case T_ExplainStmt:
ExplainQuery(pstate, (ExplainStmt *) parsetree, params, dest); break;
case T_AlterSystemStmt:
PreventInTransactionBlock(isTopLevel, "ALTER SYSTEM");
AlterSystemSetConfigFile((AlterSystemStmt *) parsetree); break;
case T_VariableSetStmt:
ExecSetVariableStmt((VariableSetStmt *) parsetree, isTopLevel); 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;
/* *********************************ROLEstatements****
*/ case T_CreateRoleStmt: /* no event triggers for global objects */
CreateRole(pstate, (CreateRoleStmt *) parsetree); break;
case T_AlterRoleStmt: /* no event triggers for global objects */
AlterRole(pstate, (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_ConstraintsSetStmt:
WarnNoTransactionBlock(isTopLevel, "SET CONSTRAINTS");
AfterTriggerSetState((ConstraintsSetStmt *) parsetree); break;
case T_CheckPointStmt: if (!has_privs_of_role(GetUserId(), ROLE_PG_CHECKPOINT))
ereport(ERROR,
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), /* translator: %s is name of a SQL command, eg CHECKPOINT */
errmsg("permission denied to execute %s command", "CHECKPOINT"),
errdetail("Only roles with privileges of the \"%s\" role may execute this command.", "pg_checkpoint")));
/* ... and do it */
EventTriggerAlterTableStart(parsetree);
address =
DefineIndex(relid, /* OID of heap relation */
stmt,
InvalidOid, /* no predefined OID */
InvalidOid, /* no parent index */
InvalidOid, /* no parent constraint */
nparts, /* # of partitions, or -1 */
is_alter_table, true, /* check_rights */ true, /* check_not_in_use */ false, /* skip_build */ false); /* quiet */
case T_CreateSubscriptionStmt:
address = CreateSubscription(pstate,
(CreateSubscriptionStmt *) parsetree,
isTopLevel); break;
case T_AlterSubscriptionStmt:
address = AlterSubscription(pstate,
(AlterSubscriptionStmt *) parsetree,
isTopLevel); break;
case T_DropSubscriptionStmt:
DropSubscription((DropSubscriptionStmt *) parsetree, isTopLevel); /* no commands stashed for DROP */
commandCollected = true; break;
case T_CreateStatsStmt:
{
Oid relid;
CreateStatsStmt *stmt = (CreateStatsStmt *) parsetree;
RangeVar *rel = (RangeVar *) linitial(stmt->relations);
if (!IsA(rel, RangeVar))
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("CREATE STATISTICS only supports relation names in the FROM clause")));
/* *DispatchfunctionforDropStmt
*/ staticvoid
ExecDropStmt(DropStmt *stmt, bool isTopLevel)
{ switch (stmt->removeType)
{ case OBJECT_INDEX: if (stmt->concurrent)
PreventInTransactionBlock(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;
}
}
if (stmt->ismove) returnfalse;
portal = GetPortalByName(stmt->portalname); if (!PortalIsValid(portal)) returnfalse; /* not our business to raise error */ return portal->tupDesc ? true : false;
}
entry = FetchPreparedStatement(stmt->name, false); if (!entry) returnfalse; /* not our business to raise error */ if (entry->plansource->resultDesc) returntrue; returnfalse;
}
if (stmt->ismove) return NULL;
portal = GetPortalByName(stmt->portalname); if (!PortalIsValid(portal)) return NULL; /* not our business to raise error */ return CreateTupleDescCopy(portal->tupDesc);
}
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;
}
}
/* *QueryReturnsTuples *Return"true"ifthisQuerywillsendoutputtothedestination.
*/ #ifdef NOT_USED bool
QueryReturnsTuples(Query *parsetree)
{ switch (parsetree->commandType)
{ case CMD_SELECT: /* returns tuples */ returntrue; case CMD_INSERT: case CMD_UPDATE: case CMD_DELETE: case CMD_MERGE: /* the forms with RETURNING return tuples */ if (parsetree->returningList) returntrue; break; case CMD_UTILITY: return UtilityReturnsTuples(parsetree->utilityStmt); case CMD_UNKNOWN: case CMD_NOTHING: /* probably shouldn't get here */ break;
} returnfalse; /* default */
} #endif
switch (objtype)
{ case OBJECT_AGGREGATE:
tag = CMDTAG_ALTER_AGGREGATE; break; case OBJECT_ATTRIBUTE:
tag = CMDTAG_ALTER_TYPE; break; case OBJECT_CAST:
tag = CMDTAG_ALTER_CAST; break; case OBJECT_COLLATION:
tag = CMDTAG_ALTER_COLLATION; break; case OBJECT_COLUMN:
tag = CMDTAG_ALTER_TABLE; break; case OBJECT_CONVERSION:
tag = CMDTAG_ALTER_CONVERSION; break; case OBJECT_DATABASE:
tag = CMDTAG_ALTER_DATABASE; break; case OBJECT_DOMAIN: case OBJECT_DOMCONSTRAINT:
tag = CMDTAG_ALTER_DOMAIN; break; case OBJECT_EXTENSION:
tag = CMDTAG_ALTER_EXTENSION; break; case OBJECT_FDW:
tag = CMDTAG_ALTER_FOREIGN_DATA_WRAPPER; break; case OBJECT_FOREIGN_SERVER:
tag = CMDTAG_ALTER_SERVER; break; case OBJECT_FOREIGN_TABLE:
tag = CMDTAG_ALTER_FOREIGN_TABLE; break; case OBJECT_FUNCTION:
tag = CMDTAG_ALTER_FUNCTION; break; case OBJECT_INDEX:
tag = CMDTAG_ALTER_INDEX; break; case OBJECT_LANGUAGE:
tag = CMDTAG_ALTER_LANGUAGE; break; case OBJECT_LARGEOBJECT:
tag = CMDTAG_ALTER_LARGE_OBJECT; break; case OBJECT_OPCLASS:
tag = CMDTAG_ALTER_OPERATOR_CLASS; break; case OBJECT_OPERATOR:
tag = CMDTAG_ALTER_OPERATOR; break; case OBJECT_OPFAMILY:
tag = CMDTAG_ALTER_OPERATOR_FAMILY; break; case OBJECT_POLICY:
tag = CMDTAG_ALTER_POLICY; break; case OBJECT_PROCEDURE:
tag = CMDTAG_ALTER_PROCEDURE; break; case OBJECT_ROLE:
tag = CMDTAG_ALTER_ROLE; break; case OBJECT_ROUTINE:
tag = CMDTAG_ALTER_ROUTINE; break; case OBJECT_RULE:
tag = CMDTAG_ALTER_RULE; break; case OBJECT_SCHEMA:
tag = CMDTAG_ALTER_SCHEMA; break; case OBJECT_SEQUENCE:
tag = CMDTAG_ALTER_SEQUENCE; break; case OBJECT_TABLE: case OBJECT_TABCONSTRAINT:
tag = CMDTAG_ALTER_TABLE; break; case OBJECT_TABLESPACE:
tag = CMDTAG_ALTER_TABLESPACE; break; case OBJECT_TRIGGER:
tag = CMDTAG_ALTER_TRIGGER; break; case OBJECT_EVENT_TRIGGER:
tag = CMDTAG_ALTER_EVENT_TRIGGER; break; case OBJECT_TSCONFIGURATION:
tag = CMDTAG_ALTER_TEXT_SEARCH_CONFIGURATION; break; case OBJECT_TSDICTIONARY:
tag = CMDTAG_ALTER_TEXT_SEARCH_DICTIONARY; break; case OBJECT_TSPARSER:
tag = CMDTAG_ALTER_TEXT_SEARCH_PARSER; break; case OBJECT_TSTEMPLATE:
tag = CMDTAG_ALTER_TEXT_SEARCH_TEMPLATE; break; case OBJECT_TYPE:
tag = CMDTAG_ALTER_TYPE; break; case OBJECT_VIEW:
tag = CMDTAG_ALTER_VIEW; break; case OBJECT_MATVIEW:
tag = CMDTAG_ALTER_MATERIALIZED_VIEW; break; case OBJECT_PUBLICATION:
tag = CMDTAG_ALTER_PUBLICATION; break; case OBJECT_SUBSCRIPTION:
tag = CMDTAG_ALTER_SUBSCRIPTION; break; case OBJECT_STATISTIC_EXT:
tag = CMDTAG_ALTER_STATISTICS; break; default:
tag = CMDTAG_UNKNOWN; break;
}
switch (nodeTag(parsetree))
{ /* recurse if we're given a RawStmt */ case T_RawStmt:
tag = CreateCommandTag(((RawStmt *) parsetree)->stmt); break;
/* raw plannable queries */ case T_InsertStmt:
tag = CMDTAG_INSERT; break;
case T_DeleteStmt:
tag = CMDTAG_DELETE; break;
case T_UpdateStmt:
tag = CMDTAG_UPDATE; break;
case T_MergeStmt:
tag = CMDTAG_MERGE; break;
case T_SelectStmt:
tag = CMDTAG_SELECT; break;
case T_PLAssignStmt:
tag = CMDTAG_SELECT; break;
/* utility statements --- same whether raw or cooked */ case T_TransactionStmt:
{
TransactionStmt *stmt = (TransactionStmt *) parsetree;
switch (stmt->kind)
{ case TRANS_STMT_BEGIN:
tag = CMDTAG_BEGIN; break;
case TRANS_STMT_START:
tag = CMDTAG_START_TRANSACTION; break;
case TRANS_STMT_COMMIT:
tag = CMDTAG_COMMIT; break;
case TRANS_STMT_ROLLBACK: case TRANS_STMT_ROLLBACK_TO:
tag = CMDTAG_ROLLBACK; break;
case TRANS_STMT_SAVEPOINT:
tag = CMDTAG_SAVEPOINT; break;
case TRANS_STMT_RELEASE:
tag = CMDTAG_RELEASE; break;
case TRANS_STMT_PREPARE:
tag = CMDTAG_PREPARE_TRANSACTION; break;
case TRANS_STMT_COMMIT_PREPARED:
tag = CMDTAG_COMMIT_PREPARED; break;
case TRANS_STMT_ROLLBACK_PREPARED:
tag = CMDTAG_ROLLBACK_PREPARED; break;
default:
tag = CMDTAG_UNKNOWN; break;
}
} break;
case T_DeclareCursorStmt:
tag = CMDTAG_DECLARE_CURSOR; break;
case T_ClosePortalStmt:
{
ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
if (stmt->portalname == NULL)
tag = CMDTAG_CLOSE_CURSOR_ALL; else
tag = CMDTAG_CLOSE_CURSOR;
} break;
case T_FetchStmt:
{
FetchStmt *stmt = (FetchStmt *) parsetree;
tag = (stmt->ismove) ? CMDTAG_MOVE : CMDTAG_FETCH;
} break;
case T_CreateDomainStmt:
tag = CMDTAG_CREATE_DOMAIN; break;
case T_CreateSchemaStmt:
tag = CMDTAG_CREATE_SCHEMA; break;
case T_CreateStmt:
tag = CMDTAG_CREATE_TABLE; break;
case T_CreateTableSpaceStmt:
tag = CMDTAG_CREATE_TABLESPACE; break;
case T_DropTableSpaceStmt:
tag = CMDTAG_DROP_TABLESPACE; break;
case T_AlterTableSpaceOptionsStmt:
tag = CMDTAG_ALTER_TABLESPACE; break;
case T_CreateExtensionStmt:
tag = CMDTAG_CREATE_EXTENSION; break;
case T_AlterExtensionStmt:
tag = CMDTAG_ALTER_EXTENSION; break;
case T_AlterExtensionContentsStmt:
tag = CMDTAG_ALTER_EXTENSION; break;
case T_CreateFdwStmt:
tag = CMDTAG_CREATE_FOREIGN_DATA_WRAPPER; break;
case T_AlterFdwStmt:
tag = CMDTAG_ALTER_FOREIGN_DATA_WRAPPER; break;
case T_CreateForeignServerStmt:
tag = CMDTAG_CREATE_SERVER; break;
case T_AlterForeignServerStmt:
tag = CMDTAG_ALTER_SERVER; break;
case T_CreateUserMappingStmt:
tag = CMDTAG_CREATE_USER_MAPPING; break;
case T_AlterUserMappingStmt:
tag = CMDTAG_ALTER_USER_MAPPING; break;
case T_DropUserMappingStmt:
tag = CMDTAG_DROP_USER_MAPPING; break;
case T_CreateForeignTableStmt:
tag = CMDTAG_CREATE_FOREIGN_TABLE; break;
case T_ImportForeignSchemaStmt:
tag = CMDTAG_IMPORT_FOREIGN_SCHEMA; break;
case T_DropStmt: switch (((DropStmt *) parsetree)->removeType)
{ case OBJECT_TABLE:
tag = CMDTAG_DROP_TABLE; break; case OBJECT_SEQUENCE:
tag = CMDTAG_DROP_SEQUENCE; break; case OBJECT_VIEW:
tag = CMDTAG_DROP_VIEW; break; case OBJECT_MATVIEW:
tag = CMDTAG_DROP_MATERIALIZED_VIEW; break; case OBJECT_INDEX:
tag = CMDTAG_DROP_INDEX; break; case OBJECT_TYPE:
tag = CMDTAG_DROP_TYPE; break; case OBJECT_DOMAIN:
tag = CMDTAG_DROP_DOMAIN; break; case OBJECT_COLLATION:
tag = CMDTAG_DROP_COLLATION; break; case OBJECT_CONVERSION:
tag = CMDTAG_DROP_CONVERSION; break; case OBJECT_SCHEMA:
tag = CMDTAG_DROP_SCHEMA; break; case OBJECT_TSPARSER:
tag = CMDTAG_DROP_TEXT_SEARCH_PARSER; break; case OBJECT_TSDICTIONARY:
tag = CMDTAG_DROP_TEXT_SEARCH_DICTIONARY; break; case OBJECT_TSTEMPLATE:
tag = CMDTAG_DROP_TEXT_SEARCH_TEMPLATE; break; case OBJECT_TSCONFIGURATION:
tag = CMDTAG_DROP_TEXT_SEARCH_CONFIGURATION; break; case OBJECT_FOREIGN_TABLE:
tag = CMDTAG_DROP_FOREIGN_TABLE; break; case OBJECT_EXTENSION:
tag = CMDTAG_DROP_EXTENSION; break; case OBJECT_FUNCTION:
tag = CMDTAG_DROP_FUNCTION; break; case OBJECT_PROCEDURE:
tag = CMDTAG_DROP_PROCEDURE; break; case OBJECT_ROUTINE:
tag = CMDTAG_DROP_ROUTINE; break; case OBJECT_AGGREGATE:
tag = CMDTAG_DROP_AGGREGATE; break; case OBJECT_OPERATOR:
tag = CMDTAG_DROP_OPERATOR; break; case OBJECT_LANGUAGE:
tag = CMDTAG_DROP_LANGUAGE; break; case OBJECT_CAST:
tag = CMDTAG_DROP_CAST; break; case OBJECT_TRIGGER:
tag = CMDTAG_DROP_TRIGGER; break; case OBJECT_EVENT_TRIGGER:
tag = CMDTAG_DROP_EVENT_TRIGGER; break; case OBJECT_RULE:
tag = CMDTAG_DROP_RULE; break; case OBJECT_FDW:
tag = CMDTAG_DROP_FOREIGN_DATA_WRAPPER; break; case OBJECT_FOREIGN_SERVER:
tag = CMDTAG_DROP_SERVER; break; case OBJECT_OPCLASS:
tag = CMDTAG_DROP_OPERATOR_CLASS; break; case OBJECT_OPFAMILY:
tag = CMDTAG_DROP_OPERATOR_FAMILY; break; case OBJECT_POLICY:
tag = CMDTAG_DROP_POLICY; break; case OBJECT_TRANSFORM:
tag = CMDTAG_DROP_TRANSFORM; break; case OBJECT_ACCESS_METHOD:
tag = CMDTAG_DROP_ACCESS_METHOD; break; case OBJECT_PUBLICATION:
tag = CMDTAG_DROP_PUBLICATION; break; case OBJECT_STATISTIC_EXT:
tag = CMDTAG_DROP_STATISTICS; break; default:
tag = CMDTAG_UNKNOWN;
} break;
case T_TruncateStmt:
tag = CMDTAG_TRUNCATE_TABLE; break;
case T_CommentStmt:
tag = CMDTAG_COMMENT; break;
case T_SecLabelStmt:
tag = CMDTAG_SECURITY_LABEL; break;
case T_AlterObjectDependsStmt:
tag = AlterObjectTypeCommandTag(((AlterObjectDependsStmt *) parsetree)->objectType); break;
case T_AlterObjectSchemaStmt:
tag = AlterObjectTypeCommandTag(((AlterObjectSchemaStmt *) parsetree)->objectType); break;
case T_AlterOwnerStmt:
tag = AlterObjectTypeCommandTag(((AlterOwnerStmt *) parsetree)->objectType); break;
case T_AlterTableMoveAllStmt:
tag = AlterObjectTypeCommandTag(((AlterTableMoveAllStmt *) parsetree)->objtype); break;
case T_AlterTableStmt:
tag = AlterObjectTypeCommandTag(((AlterTableStmt *) parsetree)->objtype); break;
case T_AlterDomainStmt:
tag = CMDTAG_ALTER_DOMAIN; break;
case T_AlterFunctionStmt: switch (((AlterFunctionStmt *) parsetree)->objtype)
{ case OBJECT_FUNCTION:
tag = CMDTAG_ALTER_FUNCTION; break; case OBJECT_PROCEDURE:
tag = CMDTAG_ALTER_PROCEDURE; break; case OBJECT_ROUTINE:
tag = CMDTAG_ALTER_ROUTINE; break; default:
tag = CMDTAG_UNKNOWN;
} break;
case T_GrantStmt:
{
GrantStmt *stmt = (GrantStmt *) parsetree;
tag = (stmt->is_grant) ? CMDTAG_GRANT : CMDTAG_REVOKE;
} break;
case T_GrantRoleStmt:
{
GrantRoleStmt *stmt = (GrantRoleStmt *) parsetree;
tag = (stmt->is_grant) ? CMDTAG_GRANT_ROLE : CMDTAG_REVOKE_ROLE;
} break;
case T_AlterDefaultPrivilegesStmt:
tag = CMDTAG_ALTER_DEFAULT_PRIVILEGES; break;
case T_DefineStmt: switch (((DefineStmt *) parsetree)->kind)
{ case OBJECT_AGGREGATE:
tag = CMDTAG_CREATE_AGGREGATE; break; case OBJECT_OPERATOR:
tag = CMDTAG_CREATE_OPERATOR; break; case OBJECT_TYPE:
tag = CMDTAG_CREATE_TYPE; break; case OBJECT_TSPARSER:
tag = CMDTAG_CREATE_TEXT_SEARCH_PARSER; break; case OBJECT_TSDICTIONARY:
tag = CMDTAG_CREATE_TEXT_SEARCH_DICTIONARY; break; case OBJECT_TSTEMPLATE:
tag = CMDTAG_CREATE_TEXT_SEARCH_TEMPLATE; break; case OBJECT_TSCONFIGURATION:
tag = CMDTAG_CREATE_TEXT_SEARCH_CONFIGURATION; break; case OBJECT_COLLATION:
tag = CMDTAG_CREATE_COLLATION; break; case OBJECT_ACCESS_METHOD:
tag = CMDTAG_CREATE_ACCESS_METHOD; break; default:
tag = CMDTAG_UNKNOWN;
} break;
case T_CompositeTypeStmt:
tag = CMDTAG_CREATE_TYPE; break;
case T_CreateEnumStmt:
tag = CMDTAG_CREATE_TYPE; break;
case T_CreateRangeStmt:
tag = CMDTAG_CREATE_TYPE; break;
case T_AlterEnumStmt:
tag = CMDTAG_ALTER_TYPE; break;
case T_ViewStmt:
tag = CMDTAG_CREATE_VIEW; break;
case T_CreateFunctionStmt: if (((CreateFunctionStmt *) parsetree)->is_procedure)
tag = CMDTAG_CREATE_PROCEDURE; else
tag = CMDTAG_CREATE_FUNCTION; break;
case T_IndexStmt:
tag = CMDTAG_CREATE_INDEX; break;
case T_RuleStmt:
tag = CMDTAG_CREATE_RULE; break;
case T_CreateSeqStmt:
tag = CMDTAG_CREATE_SEQUENCE; break;
case T_AlterSeqStmt:
tag = CMDTAG_ALTER_SEQUENCE; break;
case T_DoStmt:
tag = CMDTAG_DO; break;
case T_CreatedbStmt:
tag = CMDTAG_CREATE_DATABASE; break;
case T_AlterDatabaseStmt: case T_AlterDatabaseRefreshCollStmt: case T_AlterDatabaseSetStmt:
tag = CMDTAG_ALTER_DATABASE; break;
case T_DropdbStmt:
tag = CMDTAG_DROP_DATABASE; break;
case T_NotifyStmt:
tag = CMDTAG_NOTIFY; break;
case T_ListenStmt:
tag = CMDTAG_LISTEN; break;
case T_UnlistenStmt:
tag = CMDTAG_UNLISTEN; break;
case T_LoadStmt:
tag = CMDTAG_LOAD; break;
case T_CallStmt:
tag = CMDTAG_CALL; break;
case T_ClusterStmt:
tag = CMDTAG_CLUSTER; break;
case T_VacuumStmt: if (((VacuumStmt *) parsetree)->is_vacuumcmd)
tag = CMDTAG_VACUUM; else
tag = CMDTAG_ANALYZE; break;
case T_ExplainStmt:
tag = CMDTAG_EXPLAIN; break;
case T_CreateTableAsStmt: switch (((CreateTableAsStmt *) parsetree)->objtype)
{ case OBJECT_TABLE: if (((CreateTableAsStmt *) parsetree)->is_select_into)
tag = CMDTAG_SELECT_INTO; else
tag = CMDTAG_CREATE_TABLE_AS; break; case OBJECT_MATVIEW:
tag = CMDTAG_CREATE_MATERIALIZED_VIEW; break; default:
tag = CMDTAG_UNKNOWN;
} break;
case T_RefreshMatViewStmt:
tag = CMDTAG_REFRESH_MATERIALIZED_VIEW; break;
case T_AlterSystemStmt:
tag = CMDTAG_ALTER_SYSTEM; 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 = CMDTAG_SET; break; case VAR_RESET: case VAR_RESET_ALL:
tag = CMDTAG_RESET; break; default:
tag = CMDTAG_UNKNOWN;
} break;
case T_VariableShowStmt:
tag = CMDTAG_SHOW; break;
case T_DiscardStmt: switch (((DiscardStmt *) parsetree)->target)
{ case DISCARD_ALL:
tag = CMDTAG_DISCARD_ALL; break; case DISCARD_PLANS:
tag = CMDTAG_DISCARD_PLANS; break; case DISCARD_TEMP:
tag = CMDTAG_DISCARD_TEMP; break; case DISCARD_SEQUENCES:
tag = CMDTAG_DISCARD_SEQUENCES; break; default:
tag = CMDTAG_UNKNOWN;
} break;
case T_CreateTransformStmt:
tag = CMDTAG_CREATE_TRANSFORM; break;
case T_CreateTrigStmt:
tag = CMDTAG_CREATE_TRIGGER; break;
case T_CreateEventTrigStmt:
tag = CMDTAG_CREATE_EVENT_TRIGGER; break;
case T_AlterEventTrigStmt:
tag = CMDTAG_ALTER_EVENT_TRIGGER; break;
case T_CreatePLangStmt:
tag = CMDTAG_CREATE_LANGUAGE; break;
case T_CreateRoleStmt:
tag = CMDTAG_CREATE_ROLE; break;
case T_AlterRoleStmt:
tag = CMDTAG_ALTER_ROLE; break;
case T_AlterRoleSetStmt:
tag = CMDTAG_ALTER_ROLE; break;
case T_DropRoleStmt:
tag = CMDTAG_DROP_ROLE; break;
case T_DropOwnedStmt:
tag = CMDTAG_DROP_OWNED; break;
case T_ReassignOwnedStmt:
tag = CMDTAG_REASSIGN_OWNED; break;
case T_LockStmt:
tag = CMDTAG_LOCK_TABLE; break;
case T_ConstraintsSetStmt:
tag = CMDTAG_SET_CONSTRAINTS; break;
case T_CheckPointStmt:
tag = CMDTAG_CHECKPOINT; break;
case T_ReindexStmt:
tag = CMDTAG_REINDEX; break;
case T_CreateConversionStmt:
tag = CMDTAG_CREATE_CONVERSION; break;
case T_CreateCastStmt:
tag = CMDTAG_CREATE_CAST; break;
case T_CreateOpClassStmt:
tag = CMDTAG_CREATE_OPERATOR_CLASS; break;
case T_CreateOpFamilyStmt:
tag = CMDTAG_CREATE_OPERATOR_FAMILY; break;
case T_AlterOpFamilyStmt:
tag = CMDTAG_ALTER_OPERATOR_FAMILY; break;
case T_AlterOperatorStmt:
tag = CMDTAG_ALTER_OPERATOR; break;
case T_AlterTypeStmt:
tag = CMDTAG_ALTER_TYPE; break;
case T_AlterTSDictionaryStmt:
tag = CMDTAG_ALTER_TEXT_SEARCH_DICTIONARY; break;
case T_AlterTSConfigurationStmt:
tag = CMDTAG_ALTER_TEXT_SEARCH_CONFIGURATION; break;
case T_CreatePolicyStmt:
tag = CMDTAG_CREATE_POLICY; break;
case T_AlterPolicyStmt:
tag = CMDTAG_ALTER_POLICY; break;
case T_CreateAmStmt:
tag = CMDTAG_CREATE_ACCESS_METHOD; break;
case T_CreatePublicationStmt:
tag = CMDTAG_CREATE_PUBLICATION; break;
case T_AlterPublicationStmt:
tag = CMDTAG_ALTER_PUBLICATION; break;
case T_CreateSubscriptionStmt:
tag = CMDTAG_CREATE_SUBSCRIPTION; break;
case T_AlterSubscriptionStmt:
tag = CMDTAG_ALTER_SUBSCRIPTION; break;
case T_DropSubscriptionStmt:
tag = CMDTAG_DROP_SUBSCRIPTION; break;
case T_AlterCollationStmt:
tag = CMDTAG_ALTER_COLLATION; break;
case T_PrepareStmt:
tag = CMDTAG_PREPARE; break;
case T_ExecuteStmt:
tag = CMDTAG_EXECUTE; break;
case T_CreateStatsStmt:
tag = CMDTAG_CREATE_STATISTICS; break;
case T_AlterStatsStmt:
tag = CMDTAG_ALTER_STATISTICS; break;
case T_DeallocateStmt:
{
DeallocateStmt *stmt = (DeallocateStmt *) parsetree;
if (stmt->name == NULL)
tag = CMDTAG_DEALLOCATE_ALL; else
tag = CMDTAG_DEALLOCATE;
} break;
/* *Wetakealittleextracareheresothattheresult *willbeusefulforcomplaintsaboutread-only *statements
*/ if (stmt->rowMarks != NIL)
{ /* not 100% but probably close enough */ switch (((PlanRowMark *) linitial(stmt->rowMarks))->strength)
{ case LCS_FORKEYSHARE:
tag = CMDTAG_SELECT_FOR_KEY_SHARE; break; case LCS_FORSHARE:
tag = CMDTAG_SELECT_FOR_SHARE; break; case LCS_FORNOKEYUPDATE:
tag = CMDTAG_SELECT_FOR_NO_KEY_UPDATE; break; case LCS_FORUPDATE:
tag = CMDTAG_SELECT_FOR_UPDATE; break; default:
tag = CMDTAG_SELECT; break;
}
} else
tag = CMDTAG_SELECT; break; case CMD_UPDATE:
tag = CMDTAG_UPDATE; break; case CMD_INSERT:
tag = CMDTAG_INSERT; break; case CMD_DELETE:
tag = CMDTAG_DELETE; break; case CMD_MERGE:
tag = CMDTAG_MERGE; break; case CMD_UTILITY:
tag = CreateCommandTag(stmt->utilityStmt); break; default:
elog(WARNING, "unrecognized commandType: %d",
(int) stmt->commandType);
tag = CMDTAG_UNKNOWN; break;
}
} break;
/* *Wetakealittleextracareheresothattheresult *willbeusefulforcomplaintsaboutread-only *statements
*/ if (stmt->rowMarks != NIL)
{ /* not 100% but probably close enough */ switch (((RowMarkClause *) linitial(stmt->rowMarks))->strength)
{ case LCS_FORKEYSHARE:
tag = CMDTAG_SELECT_FOR_KEY_SHARE; break; case LCS_FORSHARE:
tag = CMDTAG_SELECT_FOR_SHARE; break; case LCS_FORNOKEYUPDATE:
tag = CMDTAG_SELECT_FOR_NO_KEY_UPDATE; break; case LCS_FORUPDATE:
tag = CMDTAG_SELECT_FOR_UPDATE; break; default:
tag = CMDTAG_UNKNOWN; break;
}
} else
tag = CMDTAG_SELECT; break; case CMD_UPDATE:
tag = CMDTAG_UPDATE; break; case CMD_INSERT:
tag = CMDTAG_INSERT; break; case CMD_DELETE:
tag = CMDTAG_DELETE; break; case CMD_MERGE:
tag = CMDTAG_MERGE; break; case CMD_UTILITY:
tag = CreateCommandTag(stmt->utilityStmt); break; default:
elog(WARNING, "unrecognized commandType: %d",
(int) stmt->commandType);
tag = CMDTAG_UNKNOWN; break;
}
} break;
switch (nodeTag(parsetree))
{ /* recurse if we're given a RawStmt */ case T_RawStmt:
lev = GetCommandLogLevel(((RawStmt *) parsetree)->stmt); break;
/* raw plannable queries */ case T_InsertStmt: case T_DeleteStmt: case T_UpdateStmt: case T_MergeStmt:
lev = LOGSTMT_MOD; break;
case T_SelectStmt: if (((SelectStmt *) parsetree)->intoClause)
lev = LOGSTMT_DDL; /* SELECT INTO */ else
lev = LOGSTMT_ALL; break;
case T_PLAssignStmt:
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: case T_ImportForeignSchemaStmt:
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;
/* Look through an EXECUTE to the referenced stmt */
ps = FetchPreparedStatement(stmt->name, false); if (ps && ps->plansource->raw_parse_tree)
lev = GetCommandLogLevel(ps->plansource->raw_parse_tree->stmt); else
lev = LOGSTMT_ALL;
} break;
case T_DeallocateStmt:
lev = LOGSTMT_ALL; break;
case T_RenameStmt:
lev = LOGSTMT_DDL; break;
case T_AlterObjectDependsStmt:
lev = LOGSTMT_DDL; break;
case T_AlterObjectSchemaStmt:
lev = LOGSTMT_DDL; break;
case T_AlterOwnerStmt:
lev = LOGSTMT_DDL; break;
case T_AlterOperatorStmt:
lev = LOGSTMT_DDL; break;
case T_AlterTypeStmt:
lev = LOGSTMT_DDL; break;
case T_AlterTableMoveAllStmt: 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: case T_AlterDatabaseRefreshCollStmt: case T_AlterDatabaseSetStmt:
lev = LOGSTMT_DDL; break;
/* 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_AlterSystemStmt:
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_CreateTransformStmt:
lev = LOGSTMT_DDL; break;
case T_AlterOpFamilyStmt:
lev = LOGSTMT_DDL; break;
case T_CreatePolicyStmt:
lev = LOGSTMT_DDL; break;
case T_AlterPolicyStmt:
lev = LOGSTMT_DDL; break;
case T_AlterTSDictionaryStmt:
lev = LOGSTMT_DDL; break;
case T_AlterTSConfigurationStmt:
lev = LOGSTMT_DDL; break;
case T_CreateAmStmt:
lev = LOGSTMT_DDL; break;
case T_CreatePublicationStmt:
lev = LOGSTMT_DDL; break;
case T_AlterPublicationStmt:
lev = LOGSTMT_DDL; break;
case T_CreateSubscriptionStmt:
lev = LOGSTMT_DDL; break;
case T_AlterSubscriptionStmt:
lev = LOGSTMT_DDL; break;
case T_DropSubscriptionStmt:
lev = LOGSTMT_DDL; break;
case T_CreateStatsStmt:
lev = LOGSTMT_DDL; break;
case T_AlterStatsStmt:
lev = LOGSTMT_DDL; break;
case T_AlterCollationStmt:
lev = LOGSTMT_DDL; break;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.