1 /*-------------------------------------------------------------------------
4 * Contains functions which control the execution of the POSTGRES utility
5 * commands. At one time acted as an interface between the Lisp and C
8 * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
9 * Portions Copyright (c) 1994, Regents of the University of California
13 * src/backend/tcop/utility.c
15 *-------------------------------------------------------------------------
19 #include "access/htup_details.h"
20 #include "access/reloptions.h"
21 #include "access/twophase.h"
22 #include "access/xact.h"
23 #include "access/xlog.h"
24 #include "catalog/catalog.h"
25 #include "catalog/namespace.h"
26 #include "catalog/toasting.h"
27 #include "commands/alter.h"
28 #include "commands/async.h"
29 #include "commands/cluster.h"
30 #include "commands/comment.h"
31 #include "commands/collationcmds.h"
32 #include "commands/conversioncmds.h"
33 #include "commands/copy.h"
34 #include "commands/createas.h"
35 #include "commands/dbcommands.h"
36 #include "commands/defrem.h"
37 #include "commands/discard.h"
38 #include "commands/event_trigger.h"
39 #include "commands/explain.h"
40 #include "commands/extension.h"
41 #include "commands/matview.h"
42 #include "commands/lockcmds.h"
43 #include "commands/policy.h"
44 #include "commands/portalcmds.h"
45 #include "commands/prepare.h"
46 #include "commands/proclang.h"
47 #include "commands/schemacmds.h"
48 #include "commands/seclabel.h"
49 #include "commands/sequence.h"
50 #include "commands/tablecmds.h"
51 #include "commands/tablespace.h"
52 #include "commands/trigger.h"
53 #include "commands/typecmds.h"
54 #include "commands/user.h"
55 #include "commands/vacuum.h"
56 #include "commands/view.h"
57 #include "miscadmin.h"
58 #include "parser/parse_utilcmd.h"
59 #include "postmaster/bgwriter.h"
60 #include "rewrite/rewriteDefine.h"
61 #include "rewrite/rewriteRemove.h"
62 #include "storage/fd.h"
63 #include "tcop/pquery.h"
64 #include "tcop/utility.h"
65 #include "utils/acl.h"
66 #include "utils/guc.h"
67 #include "utils/syscache.h"
70 /* Hook for plugins to get control in ProcessUtility() */
71 ProcessUtility_hook_type ProcessUtility_hook = NULL;
73 /* local function declarations */
74 static void ProcessUtilitySlow(Node *parsetree,
75 const char *queryString,
76 ProcessUtilityContext context,
80 static void ExecDropStmt(DropStmt *stmt, bool isTopLevel);
84 * CommandIsReadOnly: is an executable query read-only?
86 * This is a much stricter test than we apply for XactReadOnly mode;
87 * the query must be *in truth* read-only, because the caller wishes
88 * not to do CommandCounterIncrement for it.
90 * Note: currently no need to support Query nodes here
93 CommandIsReadOnly(Node *parsetree)
95 if (IsA(parsetree, PlannedStmt))
97 PlannedStmt *stmt = (PlannedStmt *) parsetree;
99 switch (stmt->commandType)
102 if (stmt->rowMarks != NIL)
103 return false; /* SELECT FOR [KEY] UPDATE/SHARE */
104 else if (stmt->hasModifyingCTE)
105 return false; /* data-modifying CTE */
113 elog(WARNING, "unrecognized commandType: %d",
114 (int) stmt->commandType);
118 /* For now, treat all utility commands as read/write */
123 * check_xact_readonly: is a utility command read-only?
125 * Here we use the loose rules of XactReadOnly mode: no permanent effects
126 * on the database are allowed.
129 check_xact_readonly(Node *parsetree)
135 * Note: Commands that need to do more complicated checking are handled
136 * elsewhere, in particular COPY and plannable statements do their own
137 * checking. However they should all call PreventCommandIfReadOnly to
138 * actually throw the error.
141 switch (nodeTag(parsetree))
143 case T_AlterDatabaseStmt:
144 case T_AlterDatabaseSetStmt:
145 case T_AlterDomainStmt:
146 case T_AlterFunctionStmt:
147 case T_AlterRoleStmt:
148 case T_AlterRoleSetStmt:
149 case T_AlterObjectSchemaStmt:
150 case T_AlterOwnerStmt:
152 case T_AlterTableMoveAllStmt:
153 case T_AlterTableStmt:
157 case T_CreateCastStmt:
158 case T_CreateEventTrigStmt:
159 case T_AlterEventTrigStmt:
160 case T_CreateConversionStmt:
162 case T_CreateDomainStmt:
163 case T_CreateFunctionStmt:
164 case T_CreateRoleStmt:
166 case T_CreatePLangStmt:
167 case T_CreateOpClassStmt:
168 case T_CreateOpFamilyStmt:
169 case T_AlterOpFamilyStmt:
171 case T_CreateSchemaStmt:
172 case T_CreateSeqStmt:
174 case T_CreateTableAsStmt:
175 case T_RefreshMatViewStmt:
176 case T_CreateTableSpaceStmt:
177 case T_CreateTrigStmt:
178 case T_CompositeTypeStmt:
179 case T_CreateEnumStmt:
180 case T_CreateRangeStmt:
181 case T_AlterEnumStmt:
185 case T_DropTableSpaceStmt:
188 case T_GrantRoleStmt:
189 case T_AlterDefaultPrivilegesStmt:
191 case T_DropOwnedStmt:
192 case T_ReassignOwnedStmt:
193 case T_AlterTSDictionaryStmt:
194 case T_AlterTSConfigurationStmt:
195 case T_CreateExtensionStmt:
196 case T_AlterExtensionStmt:
197 case T_AlterExtensionContentsStmt:
198 case T_CreateFdwStmt:
200 case T_CreateForeignServerStmt:
201 case T_AlterForeignServerStmt:
202 case T_CreateUserMappingStmt:
203 case T_AlterUserMappingStmt:
204 case T_DropUserMappingStmt:
205 case T_AlterTableSpaceOptionsStmt:
206 case T_CreateForeignTableStmt:
207 case T_ImportForeignSchemaStmt:
209 PreventCommandIfReadOnly(CreateCommandTag(parsetree));
218 * PreventCommandIfReadOnly: throw error if XactReadOnly
220 * This is useful mainly to ensure consistency of the error message wording;
221 * most callers have checked XactReadOnly for themselves.
224 PreventCommandIfReadOnly(const char *cmdname)
228 (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
229 /* translator: %s is name of a SQL command, eg CREATE */
230 errmsg("cannot execute %s in a read-only transaction",
235 * PreventCommandDuringRecovery: throw error if RecoveryInProgress
237 * The majority of operations that are unsafe in a Hot Standby slave
238 * will be rejected by XactReadOnly tests. However there are a few
239 * commands that are allowed in "read-only" xacts but cannot be allowed
240 * in Hot Standby mode. Those commands should call this function.
243 PreventCommandDuringRecovery(const char *cmdname)
245 if (RecoveryInProgress())
247 (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
248 /* translator: %s is name of a SQL command, eg CREATE */
249 errmsg("cannot execute %s during recovery",
254 * CheckRestrictedOperation: throw error for hazardous command if we're
255 * inside a security restriction context.
257 * This is needed to protect session-local state for which there is not any
258 * better-defined protection mechanism, such as ownership.
261 CheckRestrictedOperation(const char *cmdname)
263 if (InSecurityRestrictedOperation())
265 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
266 /* translator: %s is name of a SQL command, eg PREPARE */
267 errmsg("cannot execute %s within security-restricted operation",
274 * general utility function invoker
276 * parsetree: the parse tree for the utility statement
277 * queryString: original source text of command
278 * context: identifies source of statement (toplevel client command,
279 * non-toplevel client command, subcommand of a larger utility command)
280 * params: parameters to use during execution
281 * dest: where to send results
282 * completionTag: points to a buffer of size COMPLETION_TAG_BUFSIZE
283 * in which to store a command completion status string.
285 * Notes: as of PG 8.4, caller MUST supply a queryString; it is not
286 * allowed anymore to pass NULL. (If you really don't have source text,
287 * you can pass a constant string, perhaps "(query not available)".)
289 * completionTag is only set nonempty if we want to return a nondefault status.
291 * completionTag may be NULL if caller doesn't want a status string.
294 ProcessUtility(Node *parsetree,
295 const char *queryString,
296 ProcessUtilityContext context,
297 ParamListInfo params,
301 Assert(queryString != NULL); /* required as of 8.4 */
304 * We provide a function hook variable that lets loadable plugins get
305 * control when ProcessUtility is called. Such a plugin would normally
306 * call standard_ProcessUtility().
308 if (ProcessUtility_hook)
309 (*ProcessUtility_hook) (parsetree, queryString,
311 dest, completionTag);
313 standard_ProcessUtility(parsetree, queryString,
315 dest, completionTag);
319 * standard_ProcessUtility itself deals only with utility commands for
320 * which we do not provide event trigger support. Commands that do have
321 * such support are passed down to ProcessUtilitySlow, which contains the
322 * necessary infrastructure for such triggers.
324 * This division is not just for performance: it's critical that the
325 * event trigger code not be invoked when doing START TRANSACTION for
326 * example, because we might need to refresh the event trigger cache,
327 * which requires being in a valid transaction.
330 standard_ProcessUtility(Node *parsetree,
331 const char *queryString,
332 ProcessUtilityContext context,
333 ParamListInfo params,
337 bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
339 check_xact_readonly(parsetree);
342 completionTag[0] = '\0';
344 switch (nodeTag(parsetree))
347 * ******************** transactions ********************
349 case T_TransactionStmt:
351 TransactionStmt *stmt = (TransactionStmt *) parsetree;
356 * START TRANSACTION, as defined by SQL99: Identical
357 * to BEGIN. Same code for both.
359 case TRANS_STMT_BEGIN:
360 case TRANS_STMT_START:
364 BeginTransactionBlock();
365 foreach(lc, stmt->options)
367 DefElem *item = (DefElem *) lfirst(lc);
369 if (strcmp(item->defname, "transaction_isolation") == 0)
370 SetPGVariable("transaction_isolation",
371 list_make1(item->arg),
373 else if (strcmp(item->defname, "transaction_read_only") == 0)
374 SetPGVariable("transaction_read_only",
375 list_make1(item->arg),
377 else if (strcmp(item->defname, "transaction_deferrable") == 0)
378 SetPGVariable("transaction_deferrable",
379 list_make1(item->arg),
385 case TRANS_STMT_COMMIT:
386 if (!EndTransactionBlock())
388 /* report unsuccessful commit in completionTag */
390 strcpy(completionTag, "ROLLBACK");
394 case TRANS_STMT_PREPARE:
395 PreventCommandDuringRecovery("PREPARE TRANSACTION");
396 if (!PrepareTransactionBlock(stmt->gid))
398 /* report unsuccessful commit in completionTag */
400 strcpy(completionTag, "ROLLBACK");
404 case TRANS_STMT_COMMIT_PREPARED:
405 PreventTransactionChain(isTopLevel, "COMMIT PREPARED");
406 PreventCommandDuringRecovery("COMMIT PREPARED");
407 FinishPreparedTransaction(stmt->gid, true);
410 case TRANS_STMT_ROLLBACK_PREPARED:
411 PreventTransactionChain(isTopLevel, "ROLLBACK PREPARED");
412 PreventCommandDuringRecovery("ROLLBACK PREPARED");
413 FinishPreparedTransaction(stmt->gid, false);
416 case TRANS_STMT_ROLLBACK:
417 UserAbortTransactionBlock();
420 case TRANS_STMT_SAVEPOINT:
425 RequireTransactionChain(isTopLevel, "SAVEPOINT");
427 foreach(cell, stmt->options)
429 DefElem *elem = lfirst(cell);
431 if (strcmp(elem->defname, "savepoint_name") == 0)
432 name = strVal(elem->arg);
435 Assert(PointerIsValid(name));
437 DefineSavepoint(name);
441 case TRANS_STMT_RELEASE:
442 RequireTransactionChain(isTopLevel, "RELEASE SAVEPOINT");
443 ReleaseSavepoint(stmt->options);
446 case TRANS_STMT_ROLLBACK_TO:
447 RequireTransactionChain(isTopLevel, "ROLLBACK TO SAVEPOINT");
448 RollbackToSavepoint(stmt->options);
451 * CommitTransactionCommand is in charge of
452 * re-defining the savepoint again
460 * Portal (cursor) manipulation
462 * Note: DECLARE CURSOR is processed mostly as a SELECT, and
463 * therefore what we will get here is a PlannedStmt not a bare
468 PlannedStmt *stmt = (PlannedStmt *) parsetree;
470 if (stmt->utilityStmt == NULL ||
471 !IsA(stmt->utilityStmt, DeclareCursorStmt))
472 elog(ERROR, "non-DECLARE CURSOR PlannedStmt passed to ProcessUtility");
473 PerformCursorOpen(stmt, params, queryString, isTopLevel);
477 case T_ClosePortalStmt:
479 ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
481 CheckRestrictedOperation("CLOSE");
482 PerformPortalClose(stmt->portalname);
487 PerformPortalFetch((FetchStmt *) parsetree, dest,
492 ExecuteDoStmt((DoStmt *) parsetree);
495 case T_CreateTableSpaceStmt:
496 /* no event triggers for global objects */
497 PreventTransactionChain(isTopLevel, "CREATE TABLESPACE");
498 CreateTableSpace((CreateTableSpaceStmt *) parsetree);
501 case T_DropTableSpaceStmt:
502 /* no event triggers for global objects */
503 PreventTransactionChain(isTopLevel, "DROP TABLESPACE");
504 DropTableSpace((DropTableSpaceStmt *) parsetree);
507 case T_AlterTableSpaceOptionsStmt:
508 /* no event triggers for global objects */
509 AlterTableSpaceOptions((AlterTableSpaceOptionsStmt *) parsetree);
513 ExecuteTruncate((TruncateStmt *) parsetree);
517 CommentObject((CommentStmt *) parsetree);
521 ExecSecLabelStmt((SecLabelStmt *) parsetree);
528 DoCopy((CopyStmt *) parsetree, queryString, &processed);
530 snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
531 "COPY " UINT64_FORMAT, processed);
536 CheckRestrictedOperation("PREPARE");
537 PrepareQuery((PrepareStmt *) parsetree, queryString);
541 ExecuteQuery((ExecuteStmt *) parsetree, NULL,
543 dest, completionTag);
546 case T_DeallocateStmt:
547 CheckRestrictedOperation("DEALLOCATE");
548 DeallocateQuery((DeallocateStmt *) parsetree);
552 /* no event triggers for global objects */
553 ExecuteGrantStmt((GrantStmt *) parsetree);
556 case T_GrantRoleStmt:
557 /* no event triggers for global objects */
558 GrantRole((GrantRoleStmt *) parsetree);
562 /* no event triggers for global objects */
563 PreventTransactionChain(isTopLevel, "CREATE DATABASE");
564 createdb((CreatedbStmt *) parsetree);
567 case T_AlterDatabaseStmt:
568 /* no event triggers for global objects */
569 AlterDatabase((AlterDatabaseStmt *) parsetree, isTopLevel);
572 case T_AlterDatabaseSetStmt:
573 /* no event triggers for global objects */
574 AlterDatabaseSet((AlterDatabaseSetStmt *) parsetree);
579 DropdbStmt *stmt = (DropdbStmt *) parsetree;
581 /* no event triggers for global objects */
582 PreventTransactionChain(isTopLevel, "DROP DATABASE");
583 dropdb(stmt->dbname, stmt->missing_ok);
587 /* Query-level asynchronous notification */
590 NotifyStmt *stmt = (NotifyStmt *) parsetree;
592 PreventCommandDuringRecovery("NOTIFY");
593 Async_Notify(stmt->conditionname, stmt->payload);
599 ListenStmt *stmt = (ListenStmt *) parsetree;
601 PreventCommandDuringRecovery("LISTEN");
602 CheckRestrictedOperation("LISTEN");
603 Async_Listen(stmt->conditionname);
609 UnlistenStmt *stmt = (UnlistenStmt *) parsetree;
611 PreventCommandDuringRecovery("UNLISTEN");
612 CheckRestrictedOperation("UNLISTEN");
613 if (stmt->conditionname)
614 Async_Unlisten(stmt->conditionname);
622 LoadStmt *stmt = (LoadStmt *) parsetree;
624 closeAllVfds(); /* probably not necessary... */
625 /* Allowed names are restricted if you're not superuser */
626 load_file(stmt->filename, !superuser());
631 /* we choose to allow this during "read only" transactions */
632 PreventCommandDuringRecovery("CLUSTER");
633 cluster((ClusterStmt *) parsetree, isTopLevel);
638 VacuumStmt *stmt = (VacuumStmt *) parsetree;
640 /* we choose to allow this during "read only" transactions */
641 PreventCommandDuringRecovery((stmt->options & VACOPT_VACUUM) ?
642 "VACUUM" : "ANALYZE");
643 vacuum(stmt, InvalidOid, true, NULL, false, isTopLevel);
648 ExplainQuery((ExplainStmt *) parsetree, queryString, params, dest);
651 case T_AlterSystemStmt:
652 PreventTransactionChain(isTopLevel, "ALTER SYSTEM");
653 AlterSystemSetConfigFile((AlterSystemStmt *) parsetree);
656 case T_VariableSetStmt:
657 ExecSetVariableStmt((VariableSetStmt *) parsetree, isTopLevel);
660 case T_VariableShowStmt:
662 VariableShowStmt *n = (VariableShowStmt *) parsetree;
664 GetPGVariable(n->name, dest);
669 /* should we allow DISCARD PLANS? */
670 CheckRestrictedOperation("DISCARD");
671 DiscardCommand((DiscardStmt *) parsetree, isTopLevel);
674 case T_CreateEventTrigStmt:
675 /* no event triggers on event triggers */
676 CreateEventTrigger((CreateEventTrigStmt *) parsetree);
679 case T_AlterEventTrigStmt:
680 /* no event triggers on event triggers */
681 AlterEventTrigger((AlterEventTrigStmt *) parsetree);
685 * ******************************** ROLE statements ****
687 case T_CreateRoleStmt:
688 /* no event triggers for global objects */
689 CreateRole((CreateRoleStmt *) parsetree);
692 case T_AlterRoleStmt:
693 /* no event triggers for global objects */
694 AlterRole((AlterRoleStmt *) parsetree);
697 case T_AlterRoleSetStmt:
698 /* no event triggers for global objects */
699 AlterRoleSet((AlterRoleSetStmt *) parsetree);
703 /* no event triggers for global objects */
704 DropRole((DropRoleStmt *) parsetree);
707 case T_ReassignOwnedStmt:
708 /* no event triggers for global objects */
709 ReassignOwnedObjects((ReassignOwnedStmt *) parsetree);
715 * Since the lock would just get dropped immediately, LOCK TABLE
716 * outside a transaction block is presumed to be user error.
718 RequireTransactionChain(isTopLevel, "LOCK TABLE");
719 LockTableCommand((LockStmt *) parsetree);
722 case T_ConstraintsSetStmt:
723 WarnNoTransactionChain(isTopLevel, "SET CONSTRAINTS");
724 AfterTriggerSetState((ConstraintsSetStmt *) parsetree);
727 case T_CheckPointStmt:
730 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
731 errmsg("must be superuser to do CHECKPOINT")));
734 * You might think we should have a PreventCommandDuringRecovery()
735 * here, but we interpret a CHECKPOINT command during recovery as
736 * a request for a restartpoint instead. We allow this since it
737 * can be a useful way of reducing switchover time when using
738 * various forms of replication.
740 RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_WAIT |
741 (RecoveryInProgress() ? 0 : CHECKPOINT_FORCE));
746 ReindexStmt *stmt = (ReindexStmt *) parsetree;
748 /* we choose to allow this during "read only" transactions */
749 PreventCommandDuringRecovery("REINDEX");
752 case REINDEX_OBJECT_INDEX:
753 ReindexIndex(stmt->relation);
755 case REINDEX_OBJECT_TABLE:
756 ReindexTable(stmt->relation);
758 case REINDEX_OBJECT_SCHEMA:
759 case REINDEX_OBJECT_SYSTEM:
760 case REINDEX_OBJECT_DATABASE:
763 * This cannot run inside a user transaction block; if
764 * we were inside a transaction, then its commit- and
765 * start-transaction-command calls would not have the
768 PreventTransactionChain(isTopLevel,
769 (stmt->kind == REINDEX_OBJECT_SCHEMA) ?
770 "REINDEX SCHEMA" : "REINDEX DATABASE");
771 ReindexObject(stmt->name, stmt->kind);
774 elog(ERROR, "unrecognized object type: %d",
782 * The following statements are supported by Event Triggers only
783 * in some cases, so we "fast path" them in the other cases.
788 DropStmt *stmt = (DropStmt *) parsetree;
790 if (EventTriggerSupportsObjectType(stmt->removeType))
791 ProcessUtilitySlow(parsetree, queryString,
793 dest, completionTag);
795 ExecDropStmt(stmt, isTopLevel);
801 RenameStmt *stmt = (RenameStmt *) parsetree;
803 if (EventTriggerSupportsObjectType(stmt->renameType))
804 ProcessUtilitySlow(parsetree, queryString,
806 dest, completionTag);
808 ExecRenameStmt(stmt);
812 case T_AlterObjectSchemaStmt:
814 AlterObjectSchemaStmt *stmt = (AlterObjectSchemaStmt *) parsetree;
816 if (EventTriggerSupportsObjectType(stmt->objectType))
817 ProcessUtilitySlow(parsetree, queryString,
819 dest, completionTag);
821 ExecAlterObjectSchemaStmt(stmt);
825 case T_AlterOwnerStmt:
827 AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree;
829 if (EventTriggerSupportsObjectType(stmt->objectType))
830 ProcessUtilitySlow(parsetree, queryString,
832 dest, completionTag);
834 ExecAlterOwnerStmt(stmt);
839 /* All other statement types have event trigger support */
840 ProcessUtilitySlow(parsetree, queryString,
842 dest, completionTag);
848 * The "Slow" variant of ProcessUtility should only receive statements
849 * supported by the event triggers facility. Therefore, we always
850 * perform the trigger support calls if the context allows it.
853 ProcessUtilitySlow(Node *parsetree,
854 const char *queryString,
855 ProcessUtilityContext context,
856 ParamListInfo params,
860 bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
861 bool isCompleteQuery = (context <= PROCESS_UTILITY_QUERY);
864 /* All event trigger calls are done only when isCompleteQuery is true */
865 needCleanup = isCompleteQuery && EventTriggerBeginCompleteQuery();
867 /* PG_TRY block is to ensure we call EventTriggerEndCompleteQuery */
871 EventTriggerDDLCommandStart(parsetree);
873 switch (nodeTag(parsetree))
876 * relation and attribute manipulation
878 case T_CreateSchemaStmt:
879 CreateSchemaCommand((CreateSchemaStmt *) parsetree,
884 case T_CreateForeignTableStmt:
890 /* Run parse analysis ... */
891 stmts = transformCreateStmt((CreateStmt *) parsetree,
897 Node *stmt = (Node *) lfirst(l);
899 if (IsA(stmt, CreateStmt))
902 static char *validnsps[] = HEAP_RELOPT_NAMESPACES;
904 /* Create the table itself */
905 relOid = DefineRelation((CreateStmt *) stmt,
910 * Let NewRelationCreateToastTable decide if this
911 * one needs a secondary relation too.
913 CommandCounterIncrement();
916 * parse and validate reloptions for the toast
919 toast_options = transformRelOptions((Datum) 0,
920 ((CreateStmt *) stmt)->options,
925 (void) heap_reloptions(RELKIND_TOASTVALUE,
929 NewRelationCreateToastTable(relOid, toast_options);
931 else if (IsA(stmt, CreateForeignTableStmt))
933 /* Create the table itself */
934 relOid = DefineRelation((CreateStmt *) stmt,
935 RELKIND_FOREIGN_TABLE,
937 CreateForeignTable((CreateForeignTableStmt *) stmt,
942 /* Recurse for anything else */
945 PROCESS_UTILITY_SUBCOMMAND,
951 /* Need CCI between commands */
952 if (lnext(l) != NULL)
953 CommandCounterIncrement();
958 case T_AlterTableStmt:
960 AlterTableStmt *atstmt = (AlterTableStmt *) parsetree;
967 * Figure out lock mode, and acquire lock. This also does
968 * basic permissions checks, so that we won't wait for a
969 * lock on (for example) a relation on which we have no
972 lockmode = AlterTableGetLockLevel(atstmt->cmds);
973 relid = AlterTableLookupRelation(atstmt, lockmode);
975 if (OidIsValid(relid))
977 /* Run parse analysis ... */
978 stmts = transformAlterTableStmt(relid, atstmt,
984 Node *stmt = (Node *) lfirst(l);
986 if (IsA(stmt, AlterTableStmt))
988 /* Do the table alteration proper */
989 AlterTable(relid, lockmode,
990 (AlterTableStmt *) stmt);
994 /* Recurse for anything else */
997 PROCESS_UTILITY_SUBCOMMAND,
1003 /* Need CCI between commands */
1004 if (lnext(l) != NULL)
1005 CommandCounterIncrement();
1010 (errmsg("relation \"%s\" does not exist, skipping",
1011 atstmt->relation->relname)));
1015 case T_AlterDomainStmt:
1017 AlterDomainStmt *stmt = (AlterDomainStmt *) parsetree;
1020 * Some or all of these functions are recursive to cover
1021 * inherited things, so permission checks are done there.
1023 switch (stmt->subtype)
1025 case 'T': /* ALTER DOMAIN DEFAULT */
1028 * Recursively alter column default for table and,
1029 * if requested, for descendants
1031 AlterDomainDefault(stmt->typeName,
1034 case 'N': /* ALTER DOMAIN DROP NOT NULL */
1035 AlterDomainNotNull(stmt->typeName,
1038 case 'O': /* ALTER DOMAIN SET NOT NULL */
1039 AlterDomainNotNull(stmt->typeName,
1042 case 'C': /* ADD CONSTRAINT */
1043 AlterDomainAddConstraint(stmt->typeName,
1046 case 'X': /* DROP CONSTRAINT */
1047 AlterDomainDropConstraint(stmt->typeName,
1052 case 'V': /* VALIDATE CONSTRAINT */
1053 AlterDomainValidateConstraint(stmt->typeName,
1057 elog(ERROR, "unrecognized alter domain type: %d",
1058 (int) stmt->subtype);
1065 * ************* object creation / destruction **************
1069 DefineStmt *stmt = (DefineStmt *) parsetree;
1073 case OBJECT_AGGREGATE:
1074 DefineAggregate(stmt->defnames, stmt->args,
1075 stmt->oldstyle, stmt->definition,
1078 case OBJECT_OPERATOR:
1079 Assert(stmt->args == NIL);
1080 DefineOperator(stmt->defnames, stmt->definition);
1083 Assert(stmt->args == NIL);
1084 DefineType(stmt->defnames, stmt->definition);
1086 case OBJECT_TSPARSER:
1087 Assert(stmt->args == NIL);
1088 DefineTSParser(stmt->defnames, stmt->definition);
1090 case OBJECT_TSDICTIONARY:
1091 Assert(stmt->args == NIL);
1092 DefineTSDictionary(stmt->defnames,
1095 case OBJECT_TSTEMPLATE:
1096 Assert(stmt->args == NIL);
1097 DefineTSTemplate(stmt->defnames,
1100 case OBJECT_TSCONFIGURATION:
1101 Assert(stmt->args == NIL);
1102 DefineTSConfiguration(stmt->defnames,
1105 case OBJECT_COLLATION:
1106 Assert(stmt->args == NIL);
1107 DefineCollation(stmt->defnames, stmt->definition);
1110 elog(ERROR, "unrecognized define stmt type: %d",
1117 case T_IndexStmt: /* CREATE INDEX */
1119 IndexStmt *stmt = (IndexStmt *) parsetree;
1123 if (stmt->concurrent)
1124 PreventTransactionChain(isTopLevel,
1125 "CREATE INDEX CONCURRENTLY");
1128 * Look up the relation OID just once, right here at the
1129 * beginning, so that we don't end up repeating the name
1130 * lookup later and latching onto a different relation
1131 * partway through. To avoid lock upgrade hazards, it's
1132 * important that we take the strongest lock that will
1133 * eventually be needed here, so the lockmode calculation
1134 * needs to match what DefineIndex() does.
1136 lockmode = stmt->concurrent ? ShareUpdateExclusiveLock
1139 RangeVarGetRelidExtended(stmt->relation, lockmode,
1141 RangeVarCallbackOwnsRelation,
1144 /* Run parse analysis ... */
1145 stmt = transformIndexStmt(relid, stmt, queryString);
1148 DefineIndex(relid, /* OID of heap relation */
1150 InvalidOid, /* no predefined OID */
1151 false, /* is_alter_table */
1152 true, /* check_rights */
1153 false, /* skip_build */
1158 case T_CreateExtensionStmt:
1159 CreateExtension((CreateExtensionStmt *) parsetree);
1162 case T_AlterExtensionStmt:
1163 ExecAlterExtensionStmt((AlterExtensionStmt *) parsetree);
1166 case T_AlterExtensionContentsStmt:
1167 ExecAlterExtensionContentsStmt((AlterExtensionContentsStmt *) parsetree);
1170 case T_CreateFdwStmt:
1171 CreateForeignDataWrapper((CreateFdwStmt *) parsetree);
1174 case T_AlterFdwStmt:
1175 AlterForeignDataWrapper((AlterFdwStmt *) parsetree);
1178 case T_CreateForeignServerStmt:
1179 CreateForeignServer((CreateForeignServerStmt *) parsetree);
1182 case T_AlterForeignServerStmt:
1183 AlterForeignServer((AlterForeignServerStmt *) parsetree);
1186 case T_CreateUserMappingStmt:
1187 CreateUserMapping((CreateUserMappingStmt *) parsetree);
1190 case T_AlterUserMappingStmt:
1191 AlterUserMapping((AlterUserMappingStmt *) parsetree);
1194 case T_DropUserMappingStmt:
1195 RemoveUserMapping((DropUserMappingStmt *) parsetree);
1198 case T_ImportForeignSchemaStmt:
1199 ImportForeignSchema((ImportForeignSchemaStmt *) parsetree);
1202 case T_CompositeTypeStmt: /* CREATE TYPE (composite) */
1204 CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree;
1206 DefineCompositeType(stmt->typevar, stmt->coldeflist);
1210 case T_CreateEnumStmt: /* CREATE TYPE AS ENUM */
1211 DefineEnum((CreateEnumStmt *) parsetree);
1214 case T_CreateRangeStmt: /* CREATE TYPE AS RANGE */
1215 DefineRange((CreateRangeStmt *) parsetree);
1218 case T_AlterEnumStmt: /* ALTER TYPE (enum) */
1219 AlterEnum((AlterEnumStmt *) parsetree, isTopLevel);
1222 case T_ViewStmt: /* CREATE VIEW */
1223 DefineView((ViewStmt *) parsetree, queryString);
1226 case T_CreateFunctionStmt: /* CREATE FUNCTION */
1227 CreateFunction((CreateFunctionStmt *) parsetree, queryString);
1230 case T_AlterFunctionStmt: /* ALTER FUNCTION */
1231 AlterFunction((AlterFunctionStmt *) parsetree);
1234 case T_RuleStmt: /* CREATE RULE */
1235 DefineRule((RuleStmt *) parsetree, queryString);
1238 case T_CreateSeqStmt:
1239 DefineSequence((CreateSeqStmt *) parsetree);
1242 case T_AlterSeqStmt:
1243 AlterSequence((AlterSeqStmt *) parsetree);
1246 case T_CreateTableAsStmt:
1247 ExecCreateTableAs((CreateTableAsStmt *) parsetree,
1248 queryString, params, completionTag);
1251 case T_RefreshMatViewStmt:
1252 ExecRefreshMatView((RefreshMatViewStmt *) parsetree,
1253 queryString, params, completionTag);
1256 case T_CreateTrigStmt:
1257 (void) CreateTrigger((CreateTrigStmt *) parsetree, queryString,
1258 InvalidOid, InvalidOid, InvalidOid,
1262 case T_CreatePLangStmt:
1263 CreateProceduralLanguage((CreatePLangStmt *) parsetree);
1266 case T_CreateDomainStmt:
1267 DefineDomain((CreateDomainStmt *) parsetree);
1270 case T_CreateConversionStmt:
1271 CreateConversionCommand((CreateConversionStmt *) parsetree);
1274 case T_CreateCastStmt:
1275 CreateCast((CreateCastStmt *) parsetree);
1278 case T_CreateOpClassStmt:
1279 DefineOpClass((CreateOpClassStmt *) parsetree);
1282 case T_CreateOpFamilyStmt:
1283 DefineOpFamily((CreateOpFamilyStmt *) parsetree);
1286 case T_AlterOpFamilyStmt:
1287 AlterOpFamily((AlterOpFamilyStmt *) parsetree);
1290 case T_AlterTSDictionaryStmt:
1291 AlterTSDictionary((AlterTSDictionaryStmt *) parsetree);
1294 case T_AlterTSConfigurationStmt:
1295 AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree);
1298 case T_AlterTableMoveAllStmt:
1299 AlterTableMoveAll((AlterTableMoveAllStmt *) parsetree);
1303 ExecDropStmt((DropStmt *) parsetree, isTopLevel);
1307 ExecRenameStmt((RenameStmt *) parsetree);
1310 case T_AlterObjectSchemaStmt:
1311 ExecAlterObjectSchemaStmt((AlterObjectSchemaStmt *) parsetree);
1314 case T_AlterOwnerStmt:
1315 ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree);
1318 case T_DropOwnedStmt:
1319 DropOwnedObjects((DropOwnedStmt *) parsetree);
1322 case T_AlterDefaultPrivilegesStmt:
1323 ExecAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt *) parsetree);
1326 case T_CreatePolicyStmt: /* CREATE POLICY */
1327 CreatePolicy((CreatePolicyStmt *) parsetree);
1330 case T_AlterPolicyStmt: /* ALTER POLICY */
1331 AlterPolicy((AlterPolicyStmt *) parsetree);
1335 elog(ERROR, "unrecognized node type: %d",
1336 (int) nodeTag(parsetree));
1340 if (isCompleteQuery)
1342 EventTriggerSQLDrop(parsetree);
1343 EventTriggerDDLCommandEnd(parsetree);
1349 EventTriggerEndCompleteQuery();
1355 EventTriggerEndCompleteQuery();
1359 * Dispatch function for DropStmt
1362 ExecDropStmt(DropStmt *stmt, bool isTopLevel)
1364 switch (stmt->removeType)
1367 if (stmt->concurrent)
1368 PreventTransactionChain(isTopLevel,
1369 "DROP INDEX CONCURRENTLY");
1373 case OBJECT_SEQUENCE:
1375 case OBJECT_MATVIEW:
1376 case OBJECT_FOREIGN_TABLE:
1377 RemoveRelations(stmt);
1380 RemoveObjects(stmt);
1387 * UtilityReturnsTuples
1388 * Return "true" if this utility statement will send output to the
1391 * Generally, there should be a case here for each case in ProcessUtility
1392 * where "dest" is passed on.
1395 UtilityReturnsTuples(Node *parsetree)
1397 switch (nodeTag(parsetree))
1401 FetchStmt *stmt = (FetchStmt *) parsetree;
1406 portal = GetPortalByName(stmt->portalname);
1407 if (!PortalIsValid(portal))
1408 return false; /* not our business to raise error */
1409 return portal->tupDesc ? true : false;
1414 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
1415 PreparedStatement *entry;
1417 entry = FetchPreparedStatement(stmt->name, false);
1419 return false; /* not our business to raise error */
1420 if (entry->plansource->resultDesc)
1428 case T_VariableShowStmt:
1437 * UtilityTupleDescriptor
1438 * Fetch the actual output tuple descriptor for a utility statement
1439 * for which UtilityReturnsTuples() previously returned "true".
1441 * The returned descriptor is created in (or copied into) the current memory
1445 UtilityTupleDescriptor(Node *parsetree)
1447 switch (nodeTag(parsetree))
1451 FetchStmt *stmt = (FetchStmt *) parsetree;
1456 portal = GetPortalByName(stmt->portalname);
1457 if (!PortalIsValid(portal))
1458 return NULL; /* not our business to raise error */
1459 return CreateTupleDescCopy(portal->tupDesc);
1464 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
1465 PreparedStatement *entry;
1467 entry = FetchPreparedStatement(stmt->name, false);
1469 return NULL; /* not our business to raise error */
1470 return FetchPreparedStatementResultDesc(entry);
1474 return ExplainResultDesc((ExplainStmt *) parsetree);
1476 case T_VariableShowStmt:
1478 VariableShowStmt *n = (VariableShowStmt *) parsetree;
1480 return GetPGVariableResultDesc(n->name);
1490 * QueryReturnsTuples
1491 * Return "true" if this Query will send output to the destination.
1495 QueryReturnsTuples(Query *parsetree)
1497 switch (parsetree->commandType)
1500 /* returns tuples ... unless it's DECLARE CURSOR */
1501 if (parsetree->utilityStmt == NULL)
1507 /* the forms with RETURNING return tuples */
1508 if (parsetree->returningList)
1512 return UtilityReturnsTuples(parsetree->utilityStmt);
1515 /* probably shouldn't get here */
1518 return false; /* default */
1524 * UtilityContainsQuery
1525 * Return the contained Query, or NULL if there is none
1527 * Certain utility statements, such as EXPLAIN, contain a plannable Query.
1528 * This function encapsulates knowledge of exactly which ones do.
1529 * We assume it is invoked only on already-parse-analyzed statements
1530 * (else the contained parsetree isn't a Query yet).
1532 * In some cases (currently, only EXPLAIN of CREATE TABLE AS/SELECT INTO and
1533 * CREATE MATERIALIZED VIEW), potentially Query-containing utility statements
1534 * can be nested. This function will drill down to a non-utility Query, or
1535 * return NULL if none.
1538 UtilityContainsQuery(Node *parsetree)
1542 switch (nodeTag(parsetree))
1545 qry = (Query *) ((ExplainStmt *) parsetree)->query;
1546 Assert(IsA(qry, Query));
1547 if (qry->commandType == CMD_UTILITY)
1548 return UtilityContainsQuery(qry->utilityStmt);
1551 case T_CreateTableAsStmt:
1552 qry = (Query *) ((CreateTableAsStmt *) parsetree)->query;
1553 Assert(IsA(qry, Query));
1554 if (qry->commandType == CMD_UTILITY)
1555 return UtilityContainsQuery(qry->utilityStmt);
1565 * AlterObjectTypeCommandTag
1566 * helper function for CreateCommandTag
1568 * This covers most cases where ALTER is used with an ObjectType enum.
1571 AlterObjectTypeCommandTag(ObjectType objtype)
1577 case OBJECT_AGGREGATE:
1578 tag = "ALTER AGGREGATE";
1580 case OBJECT_ATTRIBUTE:
1586 case OBJECT_COLLATION:
1587 tag = "ALTER COLLATION";
1590 tag = "ALTER TABLE";
1592 case OBJECT_CONVERSION:
1593 tag = "ALTER CONVERSION";
1595 case OBJECT_DATABASE:
1596 tag = "ALTER DATABASE";
1599 case OBJECT_DOMCONSTRAINT:
1600 tag = "ALTER DOMAIN";
1602 case OBJECT_EXTENSION:
1603 tag = "ALTER EXTENSION";
1606 tag = "ALTER FOREIGN DATA WRAPPER";
1608 case OBJECT_FOREIGN_SERVER:
1609 tag = "ALTER SERVER";
1611 case OBJECT_FOREIGN_TABLE:
1612 tag = "ALTER FOREIGN TABLE";
1614 case OBJECT_FUNCTION:
1615 tag = "ALTER FUNCTION";
1618 tag = "ALTER INDEX";
1620 case OBJECT_LANGUAGE:
1621 tag = "ALTER LANGUAGE";
1623 case OBJECT_LARGEOBJECT:
1624 tag = "ALTER LARGE OBJECT";
1626 case OBJECT_OPCLASS:
1627 tag = "ALTER OPERATOR CLASS";
1629 case OBJECT_OPERATOR:
1630 tag = "ALTER OPERATOR";
1632 case OBJECT_OPFAMILY:
1633 tag = "ALTER OPERATOR FAMILY";
1636 tag = "ALTER POLICY";
1645 tag = "ALTER SCHEMA";
1647 case OBJECT_SEQUENCE:
1648 tag = "ALTER SEQUENCE";
1651 case OBJECT_TABCONSTRAINT:
1652 tag = "ALTER TABLE";
1654 case OBJECT_TABLESPACE:
1655 tag = "ALTER TABLESPACE";
1657 case OBJECT_TRIGGER:
1658 tag = "ALTER TRIGGER";
1660 case OBJECT_EVENT_TRIGGER:
1661 tag = "ALTER EVENT TRIGGER";
1663 case OBJECT_TSCONFIGURATION:
1664 tag = "ALTER TEXT SEARCH CONFIGURATION";
1666 case OBJECT_TSDICTIONARY:
1667 tag = "ALTER TEXT SEARCH DICTIONARY";
1669 case OBJECT_TSPARSER:
1670 tag = "ALTER TEXT SEARCH PARSER";
1672 case OBJECT_TSTEMPLATE:
1673 tag = "ALTER TEXT SEARCH TEMPLATE";
1681 case OBJECT_MATVIEW:
1682 tag = "ALTER MATERIALIZED VIEW";
1694 * utility to get a string representation of the command operation,
1695 * given either a raw (un-analyzed) parsetree or a planned query.
1697 * This must handle all command types, but since the vast majority
1698 * of 'em are utility commands, it seems sensible to keep it here.
1700 * NB: all result strings must be shorter than COMPLETION_TAG_BUFSIZE.
1701 * Also, the result must point at a true constant (permanent storage).
1704 CreateCommandTag(Node *parsetree)
1708 switch (nodeTag(parsetree))
1710 /* raw plannable queries */
1727 /* utility statements --- same whether raw or cooked */
1728 case T_TransactionStmt:
1730 TransactionStmt *stmt = (TransactionStmt *) parsetree;
1734 case TRANS_STMT_BEGIN:
1738 case TRANS_STMT_START:
1739 tag = "START TRANSACTION";
1742 case TRANS_STMT_COMMIT:
1746 case TRANS_STMT_ROLLBACK:
1747 case TRANS_STMT_ROLLBACK_TO:
1751 case TRANS_STMT_SAVEPOINT:
1755 case TRANS_STMT_RELEASE:
1759 case TRANS_STMT_PREPARE:
1760 tag = "PREPARE TRANSACTION";
1763 case TRANS_STMT_COMMIT_PREPARED:
1764 tag = "COMMIT PREPARED";
1767 case TRANS_STMT_ROLLBACK_PREPARED:
1768 tag = "ROLLBACK PREPARED";
1778 case T_DeclareCursorStmt:
1779 tag = "DECLARE CURSOR";
1782 case T_ClosePortalStmt:
1784 ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
1786 if (stmt->portalname == NULL)
1787 tag = "CLOSE CURSOR ALL";
1789 tag = "CLOSE CURSOR";
1795 FetchStmt *stmt = (FetchStmt *) parsetree;
1797 tag = (stmt->ismove) ? "MOVE" : "FETCH";
1801 case T_CreateDomainStmt:
1802 tag = "CREATE DOMAIN";
1805 case T_CreateSchemaStmt:
1806 tag = "CREATE SCHEMA";
1810 tag = "CREATE TABLE";
1813 case T_CreateTableSpaceStmt:
1814 tag = "CREATE TABLESPACE";
1817 case T_DropTableSpaceStmt:
1818 tag = "DROP TABLESPACE";
1821 case T_AlterTableSpaceOptionsStmt:
1822 tag = "ALTER TABLESPACE";
1825 case T_CreateExtensionStmt:
1826 tag = "CREATE EXTENSION";
1829 case T_AlterExtensionStmt:
1830 tag = "ALTER EXTENSION";
1833 case T_AlterExtensionContentsStmt:
1834 tag = "ALTER EXTENSION";
1837 case T_CreateFdwStmt:
1838 tag = "CREATE FOREIGN DATA WRAPPER";
1841 case T_AlterFdwStmt:
1842 tag = "ALTER FOREIGN DATA WRAPPER";
1845 case T_CreateForeignServerStmt:
1846 tag = "CREATE SERVER";
1849 case T_AlterForeignServerStmt:
1850 tag = "ALTER SERVER";
1853 case T_CreateUserMappingStmt:
1854 tag = "CREATE USER MAPPING";
1857 case T_AlterUserMappingStmt:
1858 tag = "ALTER USER MAPPING";
1861 case T_DropUserMappingStmt:
1862 tag = "DROP USER MAPPING";
1865 case T_CreateForeignTableStmt:
1866 tag = "CREATE FOREIGN TABLE";
1869 case T_ImportForeignSchemaStmt:
1870 tag = "IMPORT FOREIGN SCHEMA";
1874 switch (((DropStmt *) parsetree)->removeType)
1879 case OBJECT_SEQUENCE:
1880 tag = "DROP SEQUENCE";
1885 case OBJECT_MATVIEW:
1886 tag = "DROP MATERIALIZED VIEW";
1895 tag = "DROP DOMAIN";
1897 case OBJECT_COLLATION:
1898 tag = "DROP COLLATION";
1900 case OBJECT_CONVERSION:
1901 tag = "DROP CONVERSION";
1904 tag = "DROP SCHEMA";
1906 case OBJECT_TSPARSER:
1907 tag = "DROP TEXT SEARCH PARSER";
1909 case OBJECT_TSDICTIONARY:
1910 tag = "DROP TEXT SEARCH DICTIONARY";
1912 case OBJECT_TSTEMPLATE:
1913 tag = "DROP TEXT SEARCH TEMPLATE";
1915 case OBJECT_TSCONFIGURATION:
1916 tag = "DROP TEXT SEARCH CONFIGURATION";
1918 case OBJECT_FOREIGN_TABLE:
1919 tag = "DROP FOREIGN TABLE";
1921 case OBJECT_EXTENSION:
1922 tag = "DROP EXTENSION";
1924 case OBJECT_FUNCTION:
1925 tag = "DROP FUNCTION";
1927 case OBJECT_AGGREGATE:
1928 tag = "DROP AGGREGATE";
1930 case OBJECT_OPERATOR:
1931 tag = "DROP OPERATOR";
1933 case OBJECT_LANGUAGE:
1934 tag = "DROP LANGUAGE";
1939 case OBJECT_TRIGGER:
1940 tag = "DROP TRIGGER";
1942 case OBJECT_EVENT_TRIGGER:
1943 tag = "DROP EVENT TRIGGER";
1949 tag = "DROP FOREIGN DATA WRAPPER";
1951 case OBJECT_FOREIGN_SERVER:
1952 tag = "DROP SERVER";
1954 case OBJECT_OPCLASS:
1955 tag = "DROP OPERATOR CLASS";
1957 case OBJECT_OPFAMILY:
1958 tag = "DROP OPERATOR FAMILY";
1961 tag = "DROP POLICY";
1968 case T_TruncateStmt:
1969 tag = "TRUNCATE TABLE";
1976 case T_SecLabelStmt:
1977 tag = "SECURITY LABEL";
1985 tag = AlterObjectTypeCommandTag(((RenameStmt *) parsetree)->renameType);
1988 case T_AlterObjectSchemaStmt:
1989 tag = AlterObjectTypeCommandTag(((AlterObjectSchemaStmt *) parsetree)->objectType);
1992 case T_AlterOwnerStmt:
1993 tag = AlterObjectTypeCommandTag(((AlterOwnerStmt *) parsetree)->objectType);
1996 case T_AlterTableMoveAllStmt:
1997 tag = AlterObjectTypeCommandTag(((AlterTableMoveAllStmt *) parsetree)->objtype);
2000 case T_AlterTableStmt:
2001 tag = AlterObjectTypeCommandTag(((AlterTableStmt *) parsetree)->relkind);
2004 case T_AlterDomainStmt:
2005 tag = "ALTER DOMAIN";
2008 case T_AlterFunctionStmt:
2009 tag = "ALTER FUNCTION";
2014 GrantStmt *stmt = (GrantStmt *) parsetree;
2016 tag = (stmt->is_grant) ? "GRANT" : "REVOKE";
2020 case T_GrantRoleStmt:
2022 GrantRoleStmt *stmt = (GrantRoleStmt *) parsetree;
2024 tag = (stmt->is_grant) ? "GRANT ROLE" : "REVOKE ROLE";
2028 case T_AlterDefaultPrivilegesStmt:
2029 tag = "ALTER DEFAULT PRIVILEGES";
2033 switch (((DefineStmt *) parsetree)->kind)
2035 case OBJECT_AGGREGATE:
2036 tag = "CREATE AGGREGATE";
2038 case OBJECT_OPERATOR:
2039 tag = "CREATE OPERATOR";
2042 tag = "CREATE TYPE";
2044 case OBJECT_TSPARSER:
2045 tag = "CREATE TEXT SEARCH PARSER";
2047 case OBJECT_TSDICTIONARY:
2048 tag = "CREATE TEXT SEARCH DICTIONARY";
2050 case OBJECT_TSTEMPLATE:
2051 tag = "CREATE TEXT SEARCH TEMPLATE";
2053 case OBJECT_TSCONFIGURATION:
2054 tag = "CREATE TEXT SEARCH CONFIGURATION";
2056 case OBJECT_COLLATION:
2057 tag = "CREATE COLLATION";
2064 case T_CompositeTypeStmt:
2065 tag = "CREATE TYPE";
2068 case T_CreateEnumStmt:
2069 tag = "CREATE TYPE";
2072 case T_CreateRangeStmt:
2073 tag = "CREATE TYPE";
2076 case T_AlterEnumStmt:
2081 tag = "CREATE VIEW";
2084 case T_CreateFunctionStmt:
2085 tag = "CREATE FUNCTION";
2089 tag = "CREATE INDEX";
2093 tag = "CREATE RULE";
2096 case T_CreateSeqStmt:
2097 tag = "CREATE SEQUENCE";
2100 case T_AlterSeqStmt:
2101 tag = "ALTER SEQUENCE";
2108 case T_CreatedbStmt:
2109 tag = "CREATE DATABASE";
2112 case T_AlterDatabaseStmt:
2113 tag = "ALTER DATABASE";
2116 case T_AlterDatabaseSetStmt:
2117 tag = "ALTER DATABASE";
2121 tag = "DROP DATABASE";
2132 case T_UnlistenStmt:
2145 if (((VacuumStmt *) parsetree)->options & VACOPT_VACUUM)
2155 case T_CreateTableAsStmt:
2156 switch (((CreateTableAsStmt *) parsetree)->relkind)
2159 if (((CreateTableAsStmt *) parsetree)->is_select_into)
2160 tag = "SELECT INTO";
2162 tag = "CREATE TABLE AS";
2164 case OBJECT_MATVIEW:
2165 tag = "CREATE MATERIALIZED VIEW";
2172 case T_RefreshMatViewStmt:
2173 tag = "REFRESH MATERIALIZED VIEW";
2176 case T_AlterSystemStmt:
2177 tag = "ALTER SYSTEM";
2180 case T_VariableSetStmt:
2181 switch (((VariableSetStmt *) parsetree)->kind)
2184 case VAR_SET_CURRENT:
2185 case VAR_SET_DEFAULT:
2198 case T_VariableShowStmt:
2203 switch (((DiscardStmt *) parsetree)->target)
2206 tag = "DISCARD ALL";
2209 tag = "DISCARD PLANS";
2212 tag = "DISCARD TEMP";
2214 case DISCARD_SEQUENCES:
2215 tag = "DISCARD SEQUENCES";
2222 case T_CreateTrigStmt:
2223 tag = "CREATE TRIGGER";
2226 case T_CreateEventTrigStmt:
2227 tag = "CREATE EVENT TRIGGER";
2230 case T_AlterEventTrigStmt:
2231 tag = "ALTER EVENT TRIGGER";
2234 case T_CreatePLangStmt:
2235 tag = "CREATE LANGUAGE";
2238 case T_CreateRoleStmt:
2239 tag = "CREATE ROLE";
2242 case T_AlterRoleStmt:
2246 case T_AlterRoleSetStmt:
2250 case T_DropRoleStmt:
2254 case T_DropOwnedStmt:
2258 case T_ReassignOwnedStmt:
2259 tag = "REASSIGN OWNED";
2266 case T_ConstraintsSetStmt:
2267 tag = "SET CONSTRAINTS";
2270 case T_CheckPointStmt:
2278 case T_CreateConversionStmt:
2279 tag = "CREATE CONVERSION";
2282 case T_CreateCastStmt:
2283 tag = "CREATE CAST";
2286 case T_CreateOpClassStmt:
2287 tag = "CREATE OPERATOR CLASS";
2290 case T_CreateOpFamilyStmt:
2291 tag = "CREATE OPERATOR FAMILY";
2294 case T_AlterOpFamilyStmt:
2295 tag = "ALTER OPERATOR FAMILY";
2298 case T_AlterTSDictionaryStmt:
2299 tag = "ALTER TEXT SEARCH DICTIONARY";
2302 case T_AlterTSConfigurationStmt:
2303 tag = "ALTER TEXT SEARCH CONFIGURATION";
2306 case T_CreatePolicyStmt:
2307 tag = "CREATE POLICY";
2310 case T_AlterPolicyStmt:
2311 tag = "ALTER POLICY";
2322 case T_DeallocateStmt:
2324 DeallocateStmt *stmt = (DeallocateStmt *) parsetree;
2326 if (stmt->name == NULL)
2327 tag = "DEALLOCATE ALL";
2333 /* already-planned queries */
2336 PlannedStmt *stmt = (PlannedStmt *) parsetree;
2338 switch (stmt->commandType)
2343 * We take a little extra care here so that the result
2344 * will be useful for complaints about read-only
2347 if (stmt->utilityStmt != NULL)
2349 Assert(IsA(stmt->utilityStmt, DeclareCursorStmt));
2350 tag = "DECLARE CURSOR";
2352 else if (stmt->rowMarks != NIL)
2354 /* not 100% but probably close enough */
2355 switch (((PlanRowMark *) linitial(stmt->rowMarks))->markType)
2357 case ROW_MARK_EXCLUSIVE:
2358 tag = "SELECT FOR UPDATE";
2360 case ROW_MARK_NOKEYEXCLUSIVE:
2361 tag = "SELECT FOR NO KEY UPDATE";
2363 case ROW_MARK_SHARE:
2364 tag = "SELECT FOR SHARE";
2366 case ROW_MARK_KEYSHARE:
2367 tag = "SELECT FOR KEY SHARE";
2369 case ROW_MARK_REFERENCE:
2391 elog(WARNING, "unrecognized commandType: %d",
2392 (int) stmt->commandType);
2399 /* parsed-and-rewritten-but-not-planned queries */
2402 Query *stmt = (Query *) parsetree;
2404 switch (stmt->commandType)
2409 * We take a little extra care here so that the result
2410 * will be useful for complaints about read-only
2413 if (stmt->utilityStmt != NULL)
2415 Assert(IsA(stmt->utilityStmt, DeclareCursorStmt));
2416 tag = "DECLARE CURSOR";
2418 else if (stmt->rowMarks != NIL)
2420 /* not 100% but probably close enough */
2421 switch (((RowMarkClause *) linitial(stmt->rowMarks))->strength)
2423 case LCS_FORKEYSHARE:
2424 tag = "SELECT FOR KEY SHARE";
2427 tag = "SELECT FOR SHARE";
2429 case LCS_FORNOKEYUPDATE:
2430 tag = "SELECT FOR NO KEY UPDATE";
2433 tag = "SELECT FOR UPDATE";
2453 tag = CreateCommandTag(stmt->utilityStmt);
2456 elog(WARNING, "unrecognized commandType: %d",
2457 (int) stmt->commandType);
2465 elog(WARNING, "unrecognized node type: %d",
2466 (int) nodeTag(parsetree));
2476 * GetCommandLogLevel
2477 * utility to get the minimum log_statement level for a command,
2478 * given either a raw (un-analyzed) parsetree or a planned query.
2480 * This must handle all command types, but since the vast majority
2481 * of 'em are utility commands, it seems sensible to keep it here.
2484 GetCommandLogLevel(Node *parsetree)
2488 switch (nodeTag(parsetree))
2490 /* raw plannable queries */
2498 if (((SelectStmt *) parsetree)->intoClause)
2499 lev = LOGSTMT_DDL; /* SELECT INTO */
2504 /* utility statements --- same whether raw or cooked */
2505 case T_TransactionStmt:
2509 case T_DeclareCursorStmt:
2513 case T_ClosePortalStmt:
2521 case T_CreateSchemaStmt:
2526 case T_CreateForeignTableStmt:
2530 case T_CreateTableSpaceStmt:
2531 case T_DropTableSpaceStmt:
2532 case T_AlterTableSpaceOptionsStmt:
2536 case T_CreateExtensionStmt:
2537 case T_AlterExtensionStmt:
2538 case T_AlterExtensionContentsStmt:
2542 case T_CreateFdwStmt:
2543 case T_AlterFdwStmt:
2544 case T_CreateForeignServerStmt:
2545 case T_AlterForeignServerStmt:
2546 case T_CreateUserMappingStmt:
2547 case T_AlterUserMappingStmt:
2548 case T_DropUserMappingStmt:
2549 case T_ImportForeignSchemaStmt:
2557 case T_TruncateStmt:
2565 case T_SecLabelStmt:
2570 if (((CopyStmt *) parsetree)->is_from)
2578 PrepareStmt *stmt = (PrepareStmt *) parsetree;
2580 /* Look through a PREPARE to the contained stmt */
2581 lev = GetCommandLogLevel(stmt->query);
2587 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
2588 PreparedStatement *ps;
2590 /* Look through an EXECUTE to the referenced stmt */
2591 ps = FetchPreparedStatement(stmt->name, false);
2592 if (ps && ps->plansource->raw_parse_tree)
2593 lev = GetCommandLogLevel(ps->plansource->raw_parse_tree);
2599 case T_DeallocateStmt:
2607 case T_AlterObjectSchemaStmt:
2611 case T_AlterOwnerStmt:
2615 case T_AlterTableMoveAllStmt:
2616 case T_AlterTableStmt:
2620 case T_AlterDomainStmt:
2628 case T_GrantRoleStmt:
2632 case T_AlterDefaultPrivilegesStmt:
2640 case T_CompositeTypeStmt:
2644 case T_CreateEnumStmt:
2648 case T_CreateRangeStmt:
2652 case T_AlterEnumStmt:
2660 case T_CreateFunctionStmt:
2664 case T_AlterFunctionStmt:
2676 case T_CreateSeqStmt:
2680 case T_AlterSeqStmt:
2688 case T_CreatedbStmt:
2692 case T_AlterDatabaseStmt:
2696 case T_AlterDatabaseSetStmt:
2712 case T_UnlistenStmt:
2730 ExplainStmt *stmt = (ExplainStmt *) parsetree;
2731 bool analyze = false;
2734 /* Look through an EXPLAIN ANALYZE to the contained stmt */
2735 foreach(lc, stmt->options)
2737 DefElem *opt = (DefElem *) lfirst(lc);
2739 if (strcmp(opt->defname, "analyze") == 0)
2740 analyze = defGetBoolean(opt);
2741 /* don't "break", as explain.c will use the last value */
2744 return GetCommandLogLevel(stmt->query);
2746 /* Plain EXPLAIN isn't so interesting */
2751 case T_CreateTableAsStmt:
2755 case T_RefreshMatViewStmt:
2759 case T_AlterSystemStmt:
2763 case T_VariableSetStmt:
2767 case T_VariableShowStmt:
2775 case T_CreateTrigStmt:
2779 case T_CreateEventTrigStmt:
2783 case T_AlterEventTrigStmt:
2787 case T_CreatePLangStmt:
2791 case T_CreateDomainStmt:
2795 case T_CreateRoleStmt:
2799 case T_AlterRoleStmt:
2803 case T_AlterRoleSetStmt:
2807 case T_DropRoleStmt:
2811 case T_DropOwnedStmt:
2815 case T_ReassignOwnedStmt:
2823 case T_ConstraintsSetStmt:
2827 case T_CheckPointStmt:
2832 lev = LOGSTMT_ALL; /* should this be DDL? */
2835 case T_CreateConversionStmt:
2839 case T_CreateCastStmt:
2843 case T_CreateOpClassStmt:
2847 case T_CreateOpFamilyStmt:
2851 case T_AlterOpFamilyStmt:
2855 case T_CreatePolicyStmt:
2859 case T_AlterPolicyStmt:
2863 case T_AlterTSDictionaryStmt:
2867 case T_AlterTSConfigurationStmt:
2871 /* already-planned queries */
2874 PlannedStmt *stmt = (PlannedStmt *) parsetree;
2876 switch (stmt->commandType)
2889 elog(WARNING, "unrecognized commandType: %d",
2890 (int) stmt->commandType);
2897 /* parsed-and-rewritten-but-not-planned queries */
2900 Query *stmt = (Query *) parsetree;
2902 switch (stmt->commandType)
2915 lev = GetCommandLogLevel(stmt->utilityStmt);
2919 elog(WARNING, "unrecognized commandType: %d",
2920 (int) stmt->commandType);
2929 elog(WARNING, "unrecognized node type: %d",
2930 (int) nodeTag(parsetree));