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-2015, 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);
520 DoCopy((CopyStmt *) parsetree, queryString, &processed);
522 snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
523 "COPY " UINT64_FORMAT, processed);
528 CheckRestrictedOperation("PREPARE");
529 PrepareQuery((PrepareStmt *) parsetree, queryString);
533 ExecuteQuery((ExecuteStmt *) parsetree, NULL,
535 dest, completionTag);
538 case T_DeallocateStmt:
539 CheckRestrictedOperation("DEALLOCATE");
540 DeallocateQuery((DeallocateStmt *) parsetree);
543 case T_GrantRoleStmt:
544 /* no event triggers for global objects */
545 GrantRole((GrantRoleStmt *) parsetree);
549 /* no event triggers for global objects */
550 PreventTransactionChain(isTopLevel, "CREATE DATABASE");
551 createdb((CreatedbStmt *) parsetree);
554 case T_AlterDatabaseStmt:
555 /* no event triggers for global objects */
556 AlterDatabase((AlterDatabaseStmt *) parsetree, isTopLevel);
559 case T_AlterDatabaseSetStmt:
560 /* no event triggers for global objects */
561 AlterDatabaseSet((AlterDatabaseSetStmt *) parsetree);
566 DropdbStmt *stmt = (DropdbStmt *) parsetree;
568 /* no event triggers for global objects */
569 PreventTransactionChain(isTopLevel, "DROP DATABASE");
570 dropdb(stmt->dbname, stmt->missing_ok);
574 /* Query-level asynchronous notification */
577 NotifyStmt *stmt = (NotifyStmt *) parsetree;
579 PreventCommandDuringRecovery("NOTIFY");
580 Async_Notify(stmt->conditionname, stmt->payload);
586 ListenStmt *stmt = (ListenStmt *) parsetree;
588 PreventCommandDuringRecovery("LISTEN");
589 CheckRestrictedOperation("LISTEN");
590 Async_Listen(stmt->conditionname);
596 UnlistenStmt *stmt = (UnlistenStmt *) parsetree;
598 PreventCommandDuringRecovery("UNLISTEN");
599 CheckRestrictedOperation("UNLISTEN");
600 if (stmt->conditionname)
601 Async_Unlisten(stmt->conditionname);
609 LoadStmt *stmt = (LoadStmt *) parsetree;
611 closeAllVfds(); /* probably not necessary... */
612 /* Allowed names are restricted if you're not superuser */
613 load_file(stmt->filename, !superuser());
618 /* we choose to allow this during "read only" transactions */
619 PreventCommandDuringRecovery("CLUSTER");
620 cluster((ClusterStmt *) parsetree, isTopLevel);
625 VacuumStmt *stmt = (VacuumStmt *) parsetree;
627 /* we choose to allow this during "read only" transactions */
628 PreventCommandDuringRecovery((stmt->options & VACOPT_VACUUM) ?
629 "VACUUM" : "ANALYZE");
630 ExecVacuum(stmt, isTopLevel);
635 ExplainQuery((ExplainStmt *) parsetree, queryString, params, dest);
638 case T_AlterSystemStmt:
639 PreventTransactionChain(isTopLevel, "ALTER SYSTEM");
640 AlterSystemSetConfigFile((AlterSystemStmt *) parsetree);
643 case T_VariableSetStmt:
644 ExecSetVariableStmt((VariableSetStmt *) parsetree, isTopLevel);
647 case T_VariableShowStmt:
649 VariableShowStmt *n = (VariableShowStmt *) parsetree;
651 GetPGVariable(n->name, dest);
656 /* should we allow DISCARD PLANS? */
657 CheckRestrictedOperation("DISCARD");
658 DiscardCommand((DiscardStmt *) parsetree, isTopLevel);
661 case T_CreateEventTrigStmt:
662 /* no event triggers on event triggers */
663 CreateEventTrigger((CreateEventTrigStmt *) parsetree);
666 case T_AlterEventTrigStmt:
667 /* no event triggers on event triggers */
668 AlterEventTrigger((AlterEventTrigStmt *) parsetree);
672 * ******************************** ROLE statements ****
674 case T_CreateRoleStmt:
675 /* no event triggers for global objects */
676 CreateRole((CreateRoleStmt *) parsetree);
679 case T_AlterRoleStmt:
680 /* no event triggers for global objects */
681 AlterRole((AlterRoleStmt *) parsetree);
684 case T_AlterRoleSetStmt:
685 /* no event triggers for global objects */
686 AlterRoleSet((AlterRoleSetStmt *) parsetree);
690 /* no event triggers for global objects */
691 DropRole((DropRoleStmt *) parsetree);
694 case T_ReassignOwnedStmt:
695 /* no event triggers for global objects */
696 ReassignOwnedObjects((ReassignOwnedStmt *) parsetree);
702 * Since the lock would just get dropped immediately, LOCK TABLE
703 * outside a transaction block is presumed to be user error.
705 RequireTransactionChain(isTopLevel, "LOCK TABLE");
706 LockTableCommand((LockStmt *) parsetree);
709 case T_ConstraintsSetStmt:
710 WarnNoTransactionChain(isTopLevel, "SET CONSTRAINTS");
711 AfterTriggerSetState((ConstraintsSetStmt *) parsetree);
714 case T_CheckPointStmt:
717 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
718 errmsg("must be superuser to do CHECKPOINT")));
721 * You might think we should have a PreventCommandDuringRecovery()
722 * here, but we interpret a CHECKPOINT command during recovery as
723 * a request for a restartpoint instead. We allow this since it
724 * can be a useful way of reducing switchover time when using
725 * various forms of replication.
727 RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_WAIT |
728 (RecoveryInProgress() ? 0 : CHECKPOINT_FORCE));
733 ReindexStmt *stmt = (ReindexStmt *) parsetree;
735 /* we choose to allow this during "read only" transactions */
736 PreventCommandDuringRecovery("REINDEX");
739 case REINDEX_OBJECT_INDEX:
740 ReindexIndex(stmt->relation);
742 case REINDEX_OBJECT_TABLE:
743 ReindexTable(stmt->relation);
745 case REINDEX_OBJECT_SCHEMA:
746 case REINDEX_OBJECT_SYSTEM:
747 case REINDEX_OBJECT_DATABASE:
750 * This cannot run inside a user transaction block; if
751 * we were inside a transaction, then its commit- and
752 * start-transaction-command calls would not have the
755 PreventTransactionChain(isTopLevel,
756 (stmt->kind == REINDEX_OBJECT_SCHEMA) ? "REINDEX SCHEMA" :
757 (stmt->kind == REINDEX_OBJECT_SYSTEM) ? "REINDEX SYSTEM" :
759 ReindexMultipleTables(stmt->name, stmt->kind);
762 elog(ERROR, "unrecognized object type: %d",
770 * The following statements are supported by Event Triggers only
771 * in some cases, so we "fast path" them in the other cases.
776 GrantStmt *stmt = (GrantStmt *) parsetree;
778 if (EventTriggerSupportsGrantObjectType(stmt->objtype))
779 ProcessUtilitySlow(parsetree, queryString,
781 dest, completionTag);
783 ExecuteGrantStmt((GrantStmt *) parsetree);
789 DropStmt *stmt = (DropStmt *) parsetree;
791 if (EventTriggerSupportsObjectType(stmt->removeType))
792 ProcessUtilitySlow(parsetree, queryString,
794 dest, completionTag);
796 ExecDropStmt(stmt, isTopLevel);
802 RenameStmt *stmt = (RenameStmt *) parsetree;
804 if (EventTriggerSupportsObjectType(stmt->renameType))
805 ProcessUtilitySlow(parsetree, queryString,
807 dest, completionTag);
809 ExecRenameStmt(stmt);
813 case T_AlterObjectSchemaStmt:
815 AlterObjectSchemaStmt *stmt = (AlterObjectSchemaStmt *) parsetree;
817 if (EventTriggerSupportsObjectType(stmt->objectType))
818 ProcessUtilitySlow(parsetree, queryString,
820 dest, completionTag);
822 ExecAlterObjectSchemaStmt(stmt, NULL);
826 case T_AlterOwnerStmt:
828 AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree;
830 if (EventTriggerSupportsObjectType(stmt->objectType))
831 ProcessUtilitySlow(parsetree, queryString,
833 dest, completionTag);
835 ExecAlterOwnerStmt(stmt);
841 CommentStmt *stmt = (CommentStmt *) parsetree;
843 if (EventTriggerSupportsObjectType(stmt->objtype))
844 ProcessUtilitySlow(parsetree, queryString,
846 dest, completionTag);
848 CommentObject((CommentStmt *) parsetree);
854 SecLabelStmt *stmt = (SecLabelStmt *) parsetree;
856 if (EventTriggerSupportsObjectType(stmt->objtype))
857 ProcessUtilitySlow(parsetree, queryString,
859 dest, completionTag);
861 ExecSecLabelStmt(stmt);
866 /* All other statement types have event trigger support */
867 ProcessUtilitySlow(parsetree, queryString,
869 dest, completionTag);
875 * The "Slow" variant of ProcessUtility should only receive statements
876 * supported by the event triggers facility. Therefore, we always
877 * perform the trigger support calls if the context allows it.
880 ProcessUtilitySlow(Node *parsetree,
881 const char *queryString,
882 ProcessUtilityContext context,
883 ParamListInfo params,
887 bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
888 bool isCompleteQuery = (context <= PROCESS_UTILITY_QUERY);
890 ObjectAddress address;
892 /* All event trigger calls are done only when isCompleteQuery is true */
893 needCleanup = isCompleteQuery && EventTriggerBeginCompleteQuery();
895 /* PG_TRY block is to ensure we call EventTriggerEndCompleteQuery */
899 EventTriggerDDLCommandStart(parsetree);
901 switch (nodeTag(parsetree))
904 * relation and attribute manipulation
906 case T_CreateSchemaStmt:
907 CreateSchemaCommand((CreateSchemaStmt *) parsetree,
912 case T_CreateForeignTableStmt:
917 /* Run parse analysis ... */
918 stmts = transformCreateStmt((CreateStmt *) parsetree,
924 Node *stmt = (Node *) lfirst(l);
926 if (IsA(stmt, CreateStmt))
929 static char *validnsps[] = HEAP_RELOPT_NAMESPACES;
931 /* Create the table itself */
932 address = DefineRelation((CreateStmt *) stmt,
937 * Let NewRelationCreateToastTable decide if this
938 * one needs a secondary relation too.
940 CommandCounterIncrement();
943 * parse and validate reloptions for the toast
946 toast_options = transformRelOptions((Datum) 0,
947 ((CreateStmt *) stmt)->options,
952 (void) heap_reloptions(RELKIND_TOASTVALUE,
956 NewRelationCreateToastTable(address.objectId,
959 else if (IsA(stmt, CreateForeignTableStmt))
961 /* Create the table itself */
962 address = DefineRelation((CreateStmt *) stmt,
963 RELKIND_FOREIGN_TABLE,
965 CreateForeignTable((CreateForeignTableStmt *) stmt,
970 /* Recurse for anything else */
973 PROCESS_UTILITY_SUBCOMMAND,
979 /* Need CCI between commands */
980 if (lnext(l) != NULL)
981 CommandCounterIncrement();
986 case T_AlterTableStmt:
988 AlterTableStmt *atstmt = (AlterTableStmt *) parsetree;
995 * Figure out lock mode, and acquire lock. This also does
996 * basic permissions checks, so that we won't wait for a
997 * lock on (for example) a relation on which we have no
1000 lockmode = AlterTableGetLockLevel(atstmt->cmds);
1001 relid = AlterTableLookupRelation(atstmt, lockmode);
1003 if (OidIsValid(relid))
1005 /* Run parse analysis ... */
1006 stmts = transformAlterTableStmt(relid, atstmt,
1012 Node *stmt = (Node *) lfirst(l);
1014 if (IsA(stmt, AlterTableStmt))
1016 /* Do the table alteration proper */
1017 AlterTable(relid, lockmode,
1018 (AlterTableStmt *) stmt);
1022 /* Recurse for anything else */
1023 ProcessUtility(stmt,
1025 PROCESS_UTILITY_SUBCOMMAND,
1031 /* Need CCI between commands */
1032 if (lnext(l) != NULL)
1033 CommandCounterIncrement();
1038 (errmsg("relation \"%s\" does not exist, skipping",
1039 atstmt->relation->relname)));
1043 case T_AlterDomainStmt:
1045 AlterDomainStmt *stmt = (AlterDomainStmt *) parsetree;
1048 * Some or all of these functions are recursive to cover
1049 * inherited things, so permission checks are done there.
1051 switch (stmt->subtype)
1053 case 'T': /* ALTER DOMAIN DEFAULT */
1056 * Recursively alter column default for table and,
1057 * if requested, for descendants
1059 AlterDomainDefault(stmt->typeName,
1062 case 'N': /* ALTER DOMAIN DROP NOT NULL */
1063 AlterDomainNotNull(stmt->typeName,
1066 case 'O': /* ALTER DOMAIN SET NOT NULL */
1067 AlterDomainNotNull(stmt->typeName,
1070 case 'C': /* ADD CONSTRAINT */
1071 AlterDomainAddConstraint(stmt->typeName,
1075 case 'X': /* DROP CONSTRAINT */
1076 AlterDomainDropConstraint(stmt->typeName,
1081 case 'V': /* VALIDATE CONSTRAINT */
1082 AlterDomainValidateConstraint(stmt->typeName,
1086 elog(ERROR, "unrecognized alter domain type: %d",
1087 (int) stmt->subtype);
1094 * ************* object creation / destruction **************
1098 DefineStmt *stmt = (DefineStmt *) parsetree;
1102 case OBJECT_AGGREGATE:
1103 DefineAggregate(stmt->defnames, stmt->args,
1104 stmt->oldstyle, stmt->definition,
1107 case OBJECT_OPERATOR:
1108 Assert(stmt->args == NIL);
1109 DefineOperator(stmt->defnames, stmt->definition);
1112 Assert(stmt->args == NIL);
1113 DefineType(stmt->defnames, stmt->definition);
1115 case OBJECT_TSPARSER:
1116 Assert(stmt->args == NIL);
1117 DefineTSParser(stmt->defnames, stmt->definition);
1119 case OBJECT_TSDICTIONARY:
1120 Assert(stmt->args == NIL);
1121 DefineTSDictionary(stmt->defnames,
1124 case OBJECT_TSTEMPLATE:
1125 Assert(stmt->args == NIL);
1126 DefineTSTemplate(stmt->defnames,
1129 case OBJECT_TSCONFIGURATION:
1130 Assert(stmt->args == NIL);
1131 DefineTSConfiguration(stmt->defnames,
1134 case OBJECT_COLLATION:
1135 Assert(stmt->args == NIL);
1136 DefineCollation(stmt->defnames, stmt->definition);
1139 elog(ERROR, "unrecognized define stmt type: %d",
1146 case T_IndexStmt: /* CREATE INDEX */
1148 IndexStmt *stmt = (IndexStmt *) parsetree;
1152 if (stmt->concurrent)
1153 PreventTransactionChain(isTopLevel,
1154 "CREATE INDEX CONCURRENTLY");
1157 * Look up the relation OID just once, right here at the
1158 * beginning, so that we don't end up repeating the name
1159 * lookup later and latching onto a different relation
1160 * partway through. To avoid lock upgrade hazards, it's
1161 * important that we take the strongest lock that will
1162 * eventually be needed here, so the lockmode calculation
1163 * needs to match what DefineIndex() does.
1165 lockmode = stmt->concurrent ? ShareUpdateExclusiveLock
1168 RangeVarGetRelidExtended(stmt->relation, lockmode,
1170 RangeVarCallbackOwnsRelation,
1173 /* Run parse analysis ... */
1174 stmt = transformIndexStmt(relid, stmt, queryString);
1177 DefineIndex(relid, /* OID of heap relation */
1179 InvalidOid, /* no predefined OID */
1180 false, /* is_alter_table */
1181 true, /* check_rights */
1182 false, /* skip_build */
1187 case T_CreateExtensionStmt:
1188 CreateExtension((CreateExtensionStmt *) parsetree);
1191 case T_AlterExtensionStmt:
1192 ExecAlterExtensionStmt((AlterExtensionStmt *) parsetree);
1195 case T_AlterExtensionContentsStmt:
1196 ExecAlterExtensionContentsStmt((AlterExtensionContentsStmt *) parsetree,
1200 case T_CreateFdwStmt:
1201 CreateForeignDataWrapper((CreateFdwStmt *) parsetree);
1204 case T_AlterFdwStmt:
1205 AlterForeignDataWrapper((AlterFdwStmt *) parsetree);
1208 case T_CreateForeignServerStmt:
1209 CreateForeignServer((CreateForeignServerStmt *) parsetree);
1212 case T_AlterForeignServerStmt:
1213 AlterForeignServer((AlterForeignServerStmt *) parsetree);
1216 case T_CreateUserMappingStmt:
1217 CreateUserMapping((CreateUserMappingStmt *) parsetree);
1220 case T_AlterUserMappingStmt:
1221 AlterUserMapping((AlterUserMappingStmt *) parsetree);
1224 case T_DropUserMappingStmt:
1225 RemoveUserMapping((DropUserMappingStmt *) parsetree);
1228 case T_ImportForeignSchemaStmt:
1229 ImportForeignSchema((ImportForeignSchemaStmt *) parsetree);
1232 case T_CompositeTypeStmt: /* CREATE TYPE (composite) */
1234 CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree;
1236 DefineCompositeType(stmt->typevar, stmt->coldeflist);
1240 case T_CreateEnumStmt: /* CREATE TYPE AS ENUM */
1241 DefineEnum((CreateEnumStmt *) parsetree);
1244 case T_CreateRangeStmt: /* CREATE TYPE AS RANGE */
1245 DefineRange((CreateRangeStmt *) parsetree);
1248 case T_AlterEnumStmt: /* ALTER TYPE (enum) */
1249 AlterEnum((AlterEnumStmt *) parsetree, isTopLevel);
1252 case T_ViewStmt: /* CREATE VIEW */
1253 DefineView((ViewStmt *) parsetree, queryString);
1256 case T_CreateFunctionStmt: /* CREATE FUNCTION */
1257 CreateFunction((CreateFunctionStmt *) parsetree, queryString);
1260 case T_AlterFunctionStmt: /* ALTER FUNCTION */
1261 AlterFunction((AlterFunctionStmt *) parsetree);
1264 case T_RuleStmt: /* CREATE RULE */
1265 DefineRule((RuleStmt *) parsetree, queryString);
1268 case T_CreateSeqStmt:
1269 DefineSequence((CreateSeqStmt *) parsetree);
1272 case T_AlterSeqStmt:
1273 AlterSequence((AlterSeqStmt *) parsetree);
1276 case T_CreateTableAsStmt:
1277 ExecCreateTableAs((CreateTableAsStmt *) parsetree,
1278 queryString, params, completionTag);
1281 case T_RefreshMatViewStmt:
1282 ExecRefreshMatView((RefreshMatViewStmt *) parsetree,
1283 queryString, params, completionTag);
1286 case T_CreateTrigStmt:
1287 (void) CreateTrigger((CreateTrigStmt *) parsetree, queryString,
1288 InvalidOid, InvalidOid, InvalidOid,
1292 case T_CreatePLangStmt:
1293 CreateProceduralLanguage((CreatePLangStmt *) parsetree);
1296 case T_CreateDomainStmt:
1297 DefineDomain((CreateDomainStmt *) parsetree);
1300 case T_CreateConversionStmt:
1301 CreateConversionCommand((CreateConversionStmt *) parsetree);
1304 case T_CreateCastStmt:
1305 CreateCast((CreateCastStmt *) parsetree);
1308 case T_CreateOpClassStmt:
1309 DefineOpClass((CreateOpClassStmt *) parsetree);
1312 case T_CreateOpFamilyStmt:
1313 DefineOpFamily((CreateOpFamilyStmt *) parsetree);
1316 case T_AlterOpFamilyStmt:
1317 AlterOpFamily((AlterOpFamilyStmt *) parsetree);
1320 case T_AlterTSDictionaryStmt:
1321 AlterTSDictionary((AlterTSDictionaryStmt *) parsetree);
1324 case T_AlterTSConfigurationStmt:
1325 AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree);
1328 case T_AlterTableMoveAllStmt:
1329 AlterTableMoveAll((AlterTableMoveAllStmt *) parsetree);
1333 ExecDropStmt((DropStmt *) parsetree, isTopLevel);
1337 ExecRenameStmt((RenameStmt *) parsetree);
1340 case T_AlterObjectSchemaStmt:
1341 ExecAlterObjectSchemaStmt((AlterObjectSchemaStmt *) parsetree,
1345 case T_AlterOwnerStmt:
1346 ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree);
1350 CommentObject((CommentStmt *) parsetree);
1354 ExecuteGrantStmt((GrantStmt *) parsetree);
1357 case T_DropOwnedStmt:
1358 DropOwnedObjects((DropOwnedStmt *) parsetree);
1361 case T_AlterDefaultPrivilegesStmt:
1362 ExecAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt *) parsetree);
1365 case T_CreatePolicyStmt: /* CREATE POLICY */
1366 CreatePolicy((CreatePolicyStmt *) parsetree);
1369 case T_AlterPolicyStmt: /* ALTER POLICY */
1370 AlterPolicy((AlterPolicyStmt *) parsetree);
1373 case T_SecLabelStmt:
1374 ExecSecLabelStmt((SecLabelStmt *) parsetree);
1378 elog(ERROR, "unrecognized node type: %d",
1379 (int) nodeTag(parsetree));
1383 if (isCompleteQuery)
1385 EventTriggerSQLDrop(parsetree);
1386 EventTriggerDDLCommandEnd(parsetree);
1392 EventTriggerEndCompleteQuery();
1398 EventTriggerEndCompleteQuery();
1402 * Dispatch function for DropStmt
1405 ExecDropStmt(DropStmt *stmt, bool isTopLevel)
1407 switch (stmt->removeType)
1410 if (stmt->concurrent)
1411 PreventTransactionChain(isTopLevel,
1412 "DROP INDEX CONCURRENTLY");
1416 case OBJECT_SEQUENCE:
1418 case OBJECT_MATVIEW:
1419 case OBJECT_FOREIGN_TABLE:
1420 RemoveRelations(stmt);
1423 RemoveObjects(stmt);
1430 * UtilityReturnsTuples
1431 * Return "true" if this utility statement will send output to the
1434 * Generally, there should be a case here for each case in ProcessUtility
1435 * where "dest" is passed on.
1438 UtilityReturnsTuples(Node *parsetree)
1440 switch (nodeTag(parsetree))
1444 FetchStmt *stmt = (FetchStmt *) parsetree;
1449 portal = GetPortalByName(stmt->portalname);
1450 if (!PortalIsValid(portal))
1451 return false; /* not our business to raise error */
1452 return portal->tupDesc ? true : false;
1457 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
1458 PreparedStatement *entry;
1460 entry = FetchPreparedStatement(stmt->name, false);
1462 return false; /* not our business to raise error */
1463 if (entry->plansource->resultDesc)
1471 case T_VariableShowStmt:
1480 * UtilityTupleDescriptor
1481 * Fetch the actual output tuple descriptor for a utility statement
1482 * for which UtilityReturnsTuples() previously returned "true".
1484 * The returned descriptor is created in (or copied into) the current memory
1488 UtilityTupleDescriptor(Node *parsetree)
1490 switch (nodeTag(parsetree))
1494 FetchStmt *stmt = (FetchStmt *) parsetree;
1499 portal = GetPortalByName(stmt->portalname);
1500 if (!PortalIsValid(portal))
1501 return NULL; /* not our business to raise error */
1502 return CreateTupleDescCopy(portal->tupDesc);
1507 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
1508 PreparedStatement *entry;
1510 entry = FetchPreparedStatement(stmt->name, false);
1512 return NULL; /* not our business to raise error */
1513 return FetchPreparedStatementResultDesc(entry);
1517 return ExplainResultDesc((ExplainStmt *) parsetree);
1519 case T_VariableShowStmt:
1521 VariableShowStmt *n = (VariableShowStmt *) parsetree;
1523 return GetPGVariableResultDesc(n->name);
1533 * QueryReturnsTuples
1534 * Return "true" if this Query will send output to the destination.
1538 QueryReturnsTuples(Query *parsetree)
1540 switch (parsetree->commandType)
1543 /* returns tuples ... unless it's DECLARE CURSOR */
1544 if (parsetree->utilityStmt == NULL)
1550 /* the forms with RETURNING return tuples */
1551 if (parsetree->returningList)
1555 return UtilityReturnsTuples(parsetree->utilityStmt);
1558 /* probably shouldn't get here */
1561 return false; /* default */
1567 * UtilityContainsQuery
1568 * Return the contained Query, or NULL if there is none
1570 * Certain utility statements, such as EXPLAIN, contain a plannable Query.
1571 * This function encapsulates knowledge of exactly which ones do.
1572 * We assume it is invoked only on already-parse-analyzed statements
1573 * (else the contained parsetree isn't a Query yet).
1575 * In some cases (currently, only EXPLAIN of CREATE TABLE AS/SELECT INTO and
1576 * CREATE MATERIALIZED VIEW), potentially Query-containing utility statements
1577 * can be nested. This function will drill down to a non-utility Query, or
1578 * return NULL if none.
1581 UtilityContainsQuery(Node *parsetree)
1585 switch (nodeTag(parsetree))
1588 qry = (Query *) ((ExplainStmt *) parsetree)->query;
1589 Assert(IsA(qry, Query));
1590 if (qry->commandType == CMD_UTILITY)
1591 return UtilityContainsQuery(qry->utilityStmt);
1594 case T_CreateTableAsStmt:
1595 qry = (Query *) ((CreateTableAsStmt *) parsetree)->query;
1596 Assert(IsA(qry, Query));
1597 if (qry->commandType == CMD_UTILITY)
1598 return UtilityContainsQuery(qry->utilityStmt);
1608 * AlterObjectTypeCommandTag
1609 * helper function for CreateCommandTag
1611 * This covers most cases where ALTER is used with an ObjectType enum.
1614 AlterObjectTypeCommandTag(ObjectType objtype)
1620 case OBJECT_AGGREGATE:
1621 tag = "ALTER AGGREGATE";
1623 case OBJECT_ATTRIBUTE:
1629 case OBJECT_COLLATION:
1630 tag = "ALTER COLLATION";
1633 tag = "ALTER TABLE";
1635 case OBJECT_CONVERSION:
1636 tag = "ALTER CONVERSION";
1638 case OBJECT_DATABASE:
1639 tag = "ALTER DATABASE";
1642 case OBJECT_DOMCONSTRAINT:
1643 tag = "ALTER DOMAIN";
1645 case OBJECT_EXTENSION:
1646 tag = "ALTER EXTENSION";
1649 tag = "ALTER FOREIGN DATA WRAPPER";
1651 case OBJECT_FOREIGN_SERVER:
1652 tag = "ALTER SERVER";
1654 case OBJECT_FOREIGN_TABLE:
1655 tag = "ALTER FOREIGN TABLE";
1657 case OBJECT_FUNCTION:
1658 tag = "ALTER FUNCTION";
1661 tag = "ALTER INDEX";
1663 case OBJECT_LANGUAGE:
1664 tag = "ALTER LANGUAGE";
1666 case OBJECT_LARGEOBJECT:
1667 tag = "ALTER LARGE OBJECT";
1669 case OBJECT_OPCLASS:
1670 tag = "ALTER OPERATOR CLASS";
1672 case OBJECT_OPERATOR:
1673 tag = "ALTER OPERATOR";
1675 case OBJECT_OPFAMILY:
1676 tag = "ALTER OPERATOR FAMILY";
1679 tag = "ALTER POLICY";
1688 tag = "ALTER SCHEMA";
1690 case OBJECT_SEQUENCE:
1691 tag = "ALTER SEQUENCE";
1694 case OBJECT_TABCONSTRAINT:
1695 tag = "ALTER TABLE";
1697 case OBJECT_TABLESPACE:
1698 tag = "ALTER TABLESPACE";
1700 case OBJECT_TRIGGER:
1701 tag = "ALTER TRIGGER";
1703 case OBJECT_EVENT_TRIGGER:
1704 tag = "ALTER EVENT TRIGGER";
1706 case OBJECT_TSCONFIGURATION:
1707 tag = "ALTER TEXT SEARCH CONFIGURATION";
1709 case OBJECT_TSDICTIONARY:
1710 tag = "ALTER TEXT SEARCH DICTIONARY";
1712 case OBJECT_TSPARSER:
1713 tag = "ALTER TEXT SEARCH PARSER";
1715 case OBJECT_TSTEMPLATE:
1716 tag = "ALTER TEXT SEARCH TEMPLATE";
1724 case OBJECT_MATVIEW:
1725 tag = "ALTER MATERIALIZED VIEW";
1737 * utility to get a string representation of the command operation,
1738 * given either a raw (un-analyzed) parsetree or a planned query.
1740 * This must handle all command types, but since the vast majority
1741 * of 'em are utility commands, it seems sensible to keep it here.
1743 * NB: all result strings must be shorter than COMPLETION_TAG_BUFSIZE.
1744 * Also, the result must point at a true constant (permanent storage).
1747 CreateCommandTag(Node *parsetree)
1751 switch (nodeTag(parsetree))
1753 /* raw plannable queries */
1770 /* utility statements --- same whether raw or cooked */
1771 case T_TransactionStmt:
1773 TransactionStmt *stmt = (TransactionStmt *) parsetree;
1777 case TRANS_STMT_BEGIN:
1781 case TRANS_STMT_START:
1782 tag = "START TRANSACTION";
1785 case TRANS_STMT_COMMIT:
1789 case TRANS_STMT_ROLLBACK:
1790 case TRANS_STMT_ROLLBACK_TO:
1794 case TRANS_STMT_SAVEPOINT:
1798 case TRANS_STMT_RELEASE:
1802 case TRANS_STMT_PREPARE:
1803 tag = "PREPARE TRANSACTION";
1806 case TRANS_STMT_COMMIT_PREPARED:
1807 tag = "COMMIT PREPARED";
1810 case TRANS_STMT_ROLLBACK_PREPARED:
1811 tag = "ROLLBACK PREPARED";
1821 case T_DeclareCursorStmt:
1822 tag = "DECLARE CURSOR";
1825 case T_ClosePortalStmt:
1827 ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
1829 if (stmt->portalname == NULL)
1830 tag = "CLOSE CURSOR ALL";
1832 tag = "CLOSE CURSOR";
1838 FetchStmt *stmt = (FetchStmt *) parsetree;
1840 tag = (stmt->ismove) ? "MOVE" : "FETCH";
1844 case T_CreateDomainStmt:
1845 tag = "CREATE DOMAIN";
1848 case T_CreateSchemaStmt:
1849 tag = "CREATE SCHEMA";
1853 tag = "CREATE TABLE";
1856 case T_CreateTableSpaceStmt:
1857 tag = "CREATE TABLESPACE";
1860 case T_DropTableSpaceStmt:
1861 tag = "DROP TABLESPACE";
1864 case T_AlterTableSpaceOptionsStmt:
1865 tag = "ALTER TABLESPACE";
1868 case T_CreateExtensionStmt:
1869 tag = "CREATE EXTENSION";
1872 case T_AlterExtensionStmt:
1873 tag = "ALTER EXTENSION";
1876 case T_AlterExtensionContentsStmt:
1877 tag = "ALTER EXTENSION";
1880 case T_CreateFdwStmt:
1881 tag = "CREATE FOREIGN DATA WRAPPER";
1884 case T_AlterFdwStmt:
1885 tag = "ALTER FOREIGN DATA WRAPPER";
1888 case T_CreateForeignServerStmt:
1889 tag = "CREATE SERVER";
1892 case T_AlterForeignServerStmt:
1893 tag = "ALTER SERVER";
1896 case T_CreateUserMappingStmt:
1897 tag = "CREATE USER MAPPING";
1900 case T_AlterUserMappingStmt:
1901 tag = "ALTER USER MAPPING";
1904 case T_DropUserMappingStmt:
1905 tag = "DROP USER MAPPING";
1908 case T_CreateForeignTableStmt:
1909 tag = "CREATE FOREIGN TABLE";
1912 case T_ImportForeignSchemaStmt:
1913 tag = "IMPORT FOREIGN SCHEMA";
1917 switch (((DropStmt *) parsetree)->removeType)
1922 case OBJECT_SEQUENCE:
1923 tag = "DROP SEQUENCE";
1928 case OBJECT_MATVIEW:
1929 tag = "DROP MATERIALIZED VIEW";
1938 tag = "DROP DOMAIN";
1940 case OBJECT_COLLATION:
1941 tag = "DROP COLLATION";
1943 case OBJECT_CONVERSION:
1944 tag = "DROP CONVERSION";
1947 tag = "DROP SCHEMA";
1949 case OBJECT_TSPARSER:
1950 tag = "DROP TEXT SEARCH PARSER";
1952 case OBJECT_TSDICTIONARY:
1953 tag = "DROP TEXT SEARCH DICTIONARY";
1955 case OBJECT_TSTEMPLATE:
1956 tag = "DROP TEXT SEARCH TEMPLATE";
1958 case OBJECT_TSCONFIGURATION:
1959 tag = "DROP TEXT SEARCH CONFIGURATION";
1961 case OBJECT_FOREIGN_TABLE:
1962 tag = "DROP FOREIGN TABLE";
1964 case OBJECT_EXTENSION:
1965 tag = "DROP EXTENSION";
1967 case OBJECT_FUNCTION:
1968 tag = "DROP FUNCTION";
1970 case OBJECT_AGGREGATE:
1971 tag = "DROP AGGREGATE";
1973 case OBJECT_OPERATOR:
1974 tag = "DROP OPERATOR";
1976 case OBJECT_LANGUAGE:
1977 tag = "DROP LANGUAGE";
1982 case OBJECT_TRIGGER:
1983 tag = "DROP TRIGGER";
1985 case OBJECT_EVENT_TRIGGER:
1986 tag = "DROP EVENT TRIGGER";
1992 tag = "DROP FOREIGN DATA WRAPPER";
1994 case OBJECT_FOREIGN_SERVER:
1995 tag = "DROP SERVER";
1997 case OBJECT_OPCLASS:
1998 tag = "DROP OPERATOR CLASS";
2000 case OBJECT_OPFAMILY:
2001 tag = "DROP OPERATOR FAMILY";
2004 tag = "DROP POLICY";
2011 case T_TruncateStmt:
2012 tag = "TRUNCATE TABLE";
2019 case T_SecLabelStmt:
2020 tag = "SECURITY LABEL";
2028 tag = AlterObjectTypeCommandTag(((RenameStmt *) parsetree)->renameType);
2031 case T_AlterObjectSchemaStmt:
2032 tag = AlterObjectTypeCommandTag(((AlterObjectSchemaStmt *) parsetree)->objectType);
2035 case T_AlterOwnerStmt:
2036 tag = AlterObjectTypeCommandTag(((AlterOwnerStmt *) parsetree)->objectType);
2039 case T_AlterTableMoveAllStmt:
2040 tag = AlterObjectTypeCommandTag(((AlterTableMoveAllStmt *) parsetree)->objtype);
2043 case T_AlterTableStmt:
2044 tag = AlterObjectTypeCommandTag(((AlterTableStmt *) parsetree)->relkind);
2047 case T_AlterDomainStmt:
2048 tag = "ALTER DOMAIN";
2051 case T_AlterFunctionStmt:
2052 tag = "ALTER FUNCTION";
2057 GrantStmt *stmt = (GrantStmt *) parsetree;
2059 tag = (stmt->is_grant) ? "GRANT" : "REVOKE";
2063 case T_GrantRoleStmt:
2065 GrantRoleStmt *stmt = (GrantRoleStmt *) parsetree;
2067 tag = (stmt->is_grant) ? "GRANT ROLE" : "REVOKE ROLE";
2071 case T_AlterDefaultPrivilegesStmt:
2072 tag = "ALTER DEFAULT PRIVILEGES";
2076 switch (((DefineStmt *) parsetree)->kind)
2078 case OBJECT_AGGREGATE:
2079 tag = "CREATE AGGREGATE";
2081 case OBJECT_OPERATOR:
2082 tag = "CREATE OPERATOR";
2085 tag = "CREATE TYPE";
2087 case OBJECT_TSPARSER:
2088 tag = "CREATE TEXT SEARCH PARSER";
2090 case OBJECT_TSDICTIONARY:
2091 tag = "CREATE TEXT SEARCH DICTIONARY";
2093 case OBJECT_TSTEMPLATE:
2094 tag = "CREATE TEXT SEARCH TEMPLATE";
2096 case OBJECT_TSCONFIGURATION:
2097 tag = "CREATE TEXT SEARCH CONFIGURATION";
2099 case OBJECT_COLLATION:
2100 tag = "CREATE COLLATION";
2107 case T_CompositeTypeStmt:
2108 tag = "CREATE TYPE";
2111 case T_CreateEnumStmt:
2112 tag = "CREATE TYPE";
2115 case T_CreateRangeStmt:
2116 tag = "CREATE TYPE";
2119 case T_AlterEnumStmt:
2124 tag = "CREATE VIEW";
2127 case T_CreateFunctionStmt:
2128 tag = "CREATE FUNCTION";
2132 tag = "CREATE INDEX";
2136 tag = "CREATE RULE";
2139 case T_CreateSeqStmt:
2140 tag = "CREATE SEQUENCE";
2143 case T_AlterSeqStmt:
2144 tag = "ALTER SEQUENCE";
2151 case T_CreatedbStmt:
2152 tag = "CREATE DATABASE";
2155 case T_AlterDatabaseStmt:
2156 tag = "ALTER DATABASE";
2159 case T_AlterDatabaseSetStmt:
2160 tag = "ALTER DATABASE";
2164 tag = "DROP DATABASE";
2175 case T_UnlistenStmt:
2188 if (((VacuumStmt *) parsetree)->options & VACOPT_VACUUM)
2198 case T_CreateTableAsStmt:
2199 switch (((CreateTableAsStmt *) parsetree)->relkind)
2202 if (((CreateTableAsStmt *) parsetree)->is_select_into)
2203 tag = "SELECT INTO";
2205 tag = "CREATE TABLE AS";
2207 case OBJECT_MATVIEW:
2208 tag = "CREATE MATERIALIZED VIEW";
2215 case T_RefreshMatViewStmt:
2216 tag = "REFRESH MATERIALIZED VIEW";
2219 case T_AlterSystemStmt:
2220 tag = "ALTER SYSTEM";
2223 case T_VariableSetStmt:
2224 switch (((VariableSetStmt *) parsetree)->kind)
2227 case VAR_SET_CURRENT:
2228 case VAR_SET_DEFAULT:
2241 case T_VariableShowStmt:
2246 switch (((DiscardStmt *) parsetree)->target)
2249 tag = "DISCARD ALL";
2252 tag = "DISCARD PLANS";
2255 tag = "DISCARD TEMP";
2257 case DISCARD_SEQUENCES:
2258 tag = "DISCARD SEQUENCES";
2265 case T_CreateTrigStmt:
2266 tag = "CREATE TRIGGER";
2269 case T_CreateEventTrigStmt:
2270 tag = "CREATE EVENT TRIGGER";
2273 case T_AlterEventTrigStmt:
2274 tag = "ALTER EVENT TRIGGER";
2277 case T_CreatePLangStmt:
2278 tag = "CREATE LANGUAGE";
2281 case T_CreateRoleStmt:
2282 tag = "CREATE ROLE";
2285 case T_AlterRoleStmt:
2289 case T_AlterRoleSetStmt:
2293 case T_DropRoleStmt:
2297 case T_DropOwnedStmt:
2301 case T_ReassignOwnedStmt:
2302 tag = "REASSIGN OWNED";
2309 case T_ConstraintsSetStmt:
2310 tag = "SET CONSTRAINTS";
2313 case T_CheckPointStmt:
2321 case T_CreateConversionStmt:
2322 tag = "CREATE CONVERSION";
2325 case T_CreateCastStmt:
2326 tag = "CREATE CAST";
2329 case T_CreateOpClassStmt:
2330 tag = "CREATE OPERATOR CLASS";
2333 case T_CreateOpFamilyStmt:
2334 tag = "CREATE OPERATOR FAMILY";
2337 case T_AlterOpFamilyStmt:
2338 tag = "ALTER OPERATOR FAMILY";
2341 case T_AlterTSDictionaryStmt:
2342 tag = "ALTER TEXT SEARCH DICTIONARY";
2345 case T_AlterTSConfigurationStmt:
2346 tag = "ALTER TEXT SEARCH CONFIGURATION";
2349 case T_CreatePolicyStmt:
2350 tag = "CREATE POLICY";
2353 case T_AlterPolicyStmt:
2354 tag = "ALTER POLICY";
2365 case T_DeallocateStmt:
2367 DeallocateStmt *stmt = (DeallocateStmt *) parsetree;
2369 if (stmt->name == NULL)
2370 tag = "DEALLOCATE ALL";
2376 /* already-planned queries */
2379 PlannedStmt *stmt = (PlannedStmt *) parsetree;
2381 switch (stmt->commandType)
2386 * We take a little extra care here so that the result
2387 * will be useful for complaints about read-only
2390 if (stmt->utilityStmt != NULL)
2392 Assert(IsA(stmt->utilityStmt, DeclareCursorStmt));
2393 tag = "DECLARE CURSOR";
2395 else if (stmt->rowMarks != NIL)
2397 /* not 100% but probably close enough */
2398 switch (((PlanRowMark *) linitial(stmt->rowMarks))->strength)
2400 case LCS_FORKEYSHARE:
2401 tag = "SELECT FOR KEY SHARE";
2404 tag = "SELECT FOR SHARE";
2406 case LCS_FORNOKEYUPDATE:
2407 tag = "SELECT FOR NO KEY UPDATE";
2410 tag = "SELECT FOR UPDATE";
2430 elog(WARNING, "unrecognized commandType: %d",
2431 (int) stmt->commandType);
2438 /* parsed-and-rewritten-but-not-planned queries */
2441 Query *stmt = (Query *) parsetree;
2443 switch (stmt->commandType)
2448 * We take a little extra care here so that the result
2449 * will be useful for complaints about read-only
2452 if (stmt->utilityStmt != NULL)
2454 Assert(IsA(stmt->utilityStmt, DeclareCursorStmt));
2455 tag = "DECLARE CURSOR";
2457 else if (stmt->rowMarks != NIL)
2459 /* not 100% but probably close enough */
2460 switch (((RowMarkClause *) linitial(stmt->rowMarks))->strength)
2462 case LCS_FORKEYSHARE:
2463 tag = "SELECT FOR KEY SHARE";
2466 tag = "SELECT FOR SHARE";
2468 case LCS_FORNOKEYUPDATE:
2469 tag = "SELECT FOR NO KEY UPDATE";
2472 tag = "SELECT FOR UPDATE";
2492 tag = CreateCommandTag(stmt->utilityStmt);
2495 elog(WARNING, "unrecognized commandType: %d",
2496 (int) stmt->commandType);
2504 elog(WARNING, "unrecognized node type: %d",
2505 (int) nodeTag(parsetree));
2515 * GetCommandLogLevel
2516 * utility to get the minimum log_statement level for a command,
2517 * given either a raw (un-analyzed) parsetree or a planned query.
2519 * This must handle all command types, but since the vast majority
2520 * of 'em are utility commands, it seems sensible to keep it here.
2523 GetCommandLogLevel(Node *parsetree)
2527 switch (nodeTag(parsetree))
2529 /* raw plannable queries */
2537 if (((SelectStmt *) parsetree)->intoClause)
2538 lev = LOGSTMT_DDL; /* SELECT INTO */
2543 /* utility statements --- same whether raw or cooked */
2544 case T_TransactionStmt:
2548 case T_DeclareCursorStmt:
2552 case T_ClosePortalStmt:
2560 case T_CreateSchemaStmt:
2565 case T_CreateForeignTableStmt:
2569 case T_CreateTableSpaceStmt:
2570 case T_DropTableSpaceStmt:
2571 case T_AlterTableSpaceOptionsStmt:
2575 case T_CreateExtensionStmt:
2576 case T_AlterExtensionStmt:
2577 case T_AlterExtensionContentsStmt:
2581 case T_CreateFdwStmt:
2582 case T_AlterFdwStmt:
2583 case T_CreateForeignServerStmt:
2584 case T_AlterForeignServerStmt:
2585 case T_CreateUserMappingStmt:
2586 case T_AlterUserMappingStmt:
2587 case T_DropUserMappingStmt:
2588 case T_ImportForeignSchemaStmt:
2596 case T_TruncateStmt:
2604 case T_SecLabelStmt:
2609 if (((CopyStmt *) parsetree)->is_from)
2617 PrepareStmt *stmt = (PrepareStmt *) parsetree;
2619 /* Look through a PREPARE to the contained stmt */
2620 lev = GetCommandLogLevel(stmt->query);
2626 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
2627 PreparedStatement *ps;
2629 /* Look through an EXECUTE to the referenced stmt */
2630 ps = FetchPreparedStatement(stmt->name, false);
2631 if (ps && ps->plansource->raw_parse_tree)
2632 lev = GetCommandLogLevel(ps->plansource->raw_parse_tree);
2638 case T_DeallocateStmt:
2646 case T_AlterObjectSchemaStmt:
2650 case T_AlterOwnerStmt:
2654 case T_AlterTableMoveAllStmt:
2655 case T_AlterTableStmt:
2659 case T_AlterDomainStmt:
2667 case T_GrantRoleStmt:
2671 case T_AlterDefaultPrivilegesStmt:
2679 case T_CompositeTypeStmt:
2683 case T_CreateEnumStmt:
2687 case T_CreateRangeStmt:
2691 case T_AlterEnumStmt:
2699 case T_CreateFunctionStmt:
2703 case T_AlterFunctionStmt:
2715 case T_CreateSeqStmt:
2719 case T_AlterSeqStmt:
2727 case T_CreatedbStmt:
2731 case T_AlterDatabaseStmt:
2735 case T_AlterDatabaseSetStmt:
2751 case T_UnlistenStmt:
2769 ExplainStmt *stmt = (ExplainStmt *) parsetree;
2770 bool analyze = false;
2773 /* Look through an EXPLAIN ANALYZE to the contained stmt */
2774 foreach(lc, stmt->options)
2776 DefElem *opt = (DefElem *) lfirst(lc);
2778 if (strcmp(opt->defname, "analyze") == 0)
2779 analyze = defGetBoolean(opt);
2780 /* don't "break", as explain.c will use the last value */
2783 return GetCommandLogLevel(stmt->query);
2785 /* Plain EXPLAIN isn't so interesting */
2790 case T_CreateTableAsStmt:
2794 case T_RefreshMatViewStmt:
2798 case T_AlterSystemStmt:
2802 case T_VariableSetStmt:
2806 case T_VariableShowStmt:
2814 case T_CreateTrigStmt:
2818 case T_CreateEventTrigStmt:
2822 case T_AlterEventTrigStmt:
2826 case T_CreatePLangStmt:
2830 case T_CreateDomainStmt:
2834 case T_CreateRoleStmt:
2838 case T_AlterRoleStmt:
2842 case T_AlterRoleSetStmt:
2846 case T_DropRoleStmt:
2850 case T_DropOwnedStmt:
2854 case T_ReassignOwnedStmt:
2862 case T_ConstraintsSetStmt:
2866 case T_CheckPointStmt:
2871 lev = LOGSTMT_ALL; /* should this be DDL? */
2874 case T_CreateConversionStmt:
2878 case T_CreateCastStmt:
2882 case T_CreateOpClassStmt:
2886 case T_CreateOpFamilyStmt:
2890 case T_AlterOpFamilyStmt:
2894 case T_CreatePolicyStmt:
2898 case T_AlterPolicyStmt:
2902 case T_AlterTSDictionaryStmt:
2906 case T_AlterTSConfigurationStmt:
2910 /* already-planned queries */
2913 PlannedStmt *stmt = (PlannedStmt *) parsetree;
2915 switch (stmt->commandType)
2928 elog(WARNING, "unrecognized commandType: %d",
2929 (int) stmt->commandType);
2936 /* parsed-and-rewritten-but-not-planned queries */
2939 Query *stmt = (Query *) parsetree;
2941 switch (stmt->commandType)
2954 lev = GetCommandLogLevel(stmt->utilityStmt);
2958 elog(WARNING, "unrecognized commandType: %d",
2959 (int) stmt->commandType);
2968 elog(WARNING, "unrecognized node type: %d",
2969 (int) nodeTag(parsetree));