Age Owner TLA Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * utility.c
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
6 : * systems.
7 : *
8 : * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
9 : * Portions Copyright (c) 1994, Regents of the University of California
10 : *
11 : *
12 : * IDENTIFICATION
13 : * src/backend/tcop/utility.c
14 : *
15 : *-------------------------------------------------------------------------
16 : */
17 : #include "postgres.h"
18 :
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/index.h"
26 : #include "catalog/namespace.h"
27 : #include "catalog/pg_authid.h"
28 : #include "catalog/pg_inherits.h"
29 : #include "catalog/toasting.h"
30 : #include "commands/alter.h"
31 : #include "commands/async.h"
32 : #include "commands/cluster.h"
33 : #include "commands/collationcmds.h"
34 : #include "commands/comment.h"
35 : #include "commands/conversioncmds.h"
36 : #include "commands/copy.h"
37 : #include "commands/createas.h"
38 : #include "commands/dbcommands.h"
39 : #include "commands/defrem.h"
40 : #include "commands/discard.h"
41 : #include "commands/event_trigger.h"
42 : #include "commands/explain.h"
43 : #include "commands/extension.h"
44 : #include "commands/lockcmds.h"
45 : #include "commands/matview.h"
46 : #include "commands/policy.h"
47 : #include "commands/portalcmds.h"
48 : #include "commands/prepare.h"
49 : #include "commands/proclang.h"
50 : #include "commands/publicationcmds.h"
51 : #include "commands/schemacmds.h"
52 : #include "commands/seclabel.h"
53 : #include "commands/sequence.h"
54 : #include "commands/subscriptioncmds.h"
55 : #include "commands/tablecmds.h"
56 : #include "commands/tablespace.h"
57 : #include "commands/trigger.h"
58 : #include "commands/typecmds.h"
59 : #include "commands/user.h"
60 : #include "commands/vacuum.h"
61 : #include "commands/view.h"
62 : #include "miscadmin.h"
63 : #include "parser/parse_utilcmd.h"
64 : #include "postmaster/bgwriter.h"
65 : #include "rewrite/rewriteDefine.h"
66 : #include "rewrite/rewriteRemove.h"
67 : #include "storage/fd.h"
68 : #include "tcop/pquery.h"
69 : #include "tcop/utility.h"
70 : #include "utils/acl.h"
71 : #include "utils/guc.h"
72 : #include "utils/lsyscache.h"
73 : #include "utils/rel.h"
74 : #include "utils/syscache.h"
75 :
76 : /* Hook for plugins to get control in ProcessUtility() */
77 : ProcessUtility_hook_type ProcessUtility_hook = NULL;
78 :
79 : /* local function declarations */
80 : static int ClassifyUtilityCommandAsReadOnly(Node *parsetree);
81 : static void ProcessUtilitySlow(ParseState *pstate,
82 : PlannedStmt *pstmt,
83 : const char *queryString,
84 : ProcessUtilityContext context,
85 : ParamListInfo params,
86 : QueryEnvironment *queryEnv,
87 : DestReceiver *dest,
88 : QueryCompletion *qc);
89 : static void ExecDropStmt(DropStmt *stmt, bool isTopLevel);
90 :
91 : /*
92 : * CommandIsReadOnly: is an executable query read-only?
93 : *
94 : * This is a much stricter test than we apply for XactReadOnly mode;
95 : * the query must be *in truth* read-only, because the caller wishes
96 : * not to do CommandCounterIncrement for it.
97 : *
98 : * Note: currently no need to support raw or analyzed queries here
99 : */
100 : bool
2276 tgl 101 CBC 5472 : CommandIsReadOnly(PlannedStmt *pstmt)
102 : {
103 5472 : Assert(IsA(pstmt, PlannedStmt));
104 5472 : switch (pstmt->commandType)
105 : {
106 5472 : case CMD_SELECT:
107 5472 : if (pstmt->rowMarks != NIL)
2276 tgl 108 UBC 0 : return false; /* SELECT FOR [KEY] UPDATE/SHARE */
2276 tgl 109 CBC 5472 : else if (pstmt->hasModifyingCTE)
2276 tgl 110 UBC 0 : return false; /* data-modifying CTE */
111 : else
2276 tgl 112 CBC 5472 : return true;
2276 tgl 113 UBC 0 : case CMD_UPDATE:
114 : case CMD_INSERT:
115 : case CMD_DELETE:
116 : case CMD_MERGE:
117 0 : return false;
118 0 : case CMD_UTILITY:
119 : /* For now, treat all utility commands as read/write */
120 0 : return false;
121 0 : default:
122 0 : elog(WARNING, "unrecognized commandType: %d",
123 : (int) pstmt->commandType);
124 0 : break;
125 : }
6782 126 0 : return false;
127 : }
128 :
129 : /*
130 : * Determine the degree to which a utility command is read only.
131 : *
132 : * Note the definitions of the relevant flags in src/include/utility/tcop.h.
133 : */
134 : static int
1179 rhaas 135 CBC 358114 : ClassifyUtilityCommandAsReadOnly(Node *parsetree)
136 : {
7394 peter_e 137 358114 : switch (nodeTag(parsetree))
138 : {
1179 rhaas 139 291592 : case T_AlterCollationStmt:
140 : case T_AlterDatabaseRefreshCollStmt:
141 : case T_AlterDatabaseSetStmt:
142 : case T_AlterDatabaseStmt:
143 : case T_AlterDefaultPrivilegesStmt:
144 : case T_AlterDomainStmt:
145 : case T_AlterEnumStmt:
146 : case T_AlterEventTrigStmt:
147 : case T_AlterExtensionContentsStmt:
148 : case T_AlterExtensionStmt:
149 : case T_AlterFdwStmt:
150 : case T_AlterForeignServerStmt:
151 : case T_AlterFunctionStmt:
152 : case T_AlterObjectDependsStmt:
153 : case T_AlterObjectSchemaStmt:
154 : case T_AlterOpFamilyStmt:
155 : case T_AlterOperatorStmt:
156 : case T_AlterOwnerStmt:
157 : case T_AlterPolicyStmt:
158 : case T_AlterPublicationStmt:
159 : case T_AlterRoleSetStmt:
160 : case T_AlterRoleStmt:
161 : case T_AlterSeqStmt:
162 : case T_AlterStatsStmt:
163 : case T_AlterSubscriptionStmt:
164 : case T_AlterTSConfigurationStmt:
165 : case T_AlterTSDictionaryStmt:
166 : case T_AlterTableMoveAllStmt:
167 : case T_AlterTableSpaceOptionsStmt:
168 : case T_AlterTableStmt:
169 : case T_AlterTypeStmt:
170 : case T_AlterUserMappingStmt:
171 : case T_CommentStmt:
172 : case T_CompositeTypeStmt:
173 : case T_CreateAmStmt:
174 : case T_CreateCastStmt:
175 : case T_CreateConversionStmt:
176 : case T_CreateDomainStmt:
177 : case T_CreateEnumStmt:
178 : case T_CreateEventTrigStmt:
179 : case T_CreateExtensionStmt:
180 : case T_CreateFdwStmt:
181 : case T_CreateForeignServerStmt:
182 : case T_CreateForeignTableStmt:
183 : case T_CreateFunctionStmt:
184 : case T_CreateOpClassStmt:
185 : case T_CreateOpFamilyStmt:
186 : case T_CreatePLangStmt:
187 : case T_CreatePolicyStmt:
188 : case T_CreatePublicationStmt:
189 : case T_CreateRangeStmt:
190 : case T_CreateRoleStmt:
191 : case T_CreateSchemaStmt:
192 : case T_CreateSeqStmt:
193 : case T_CreateStatsStmt:
194 : case T_CreateStmt:
195 : case T_CreateSubscriptionStmt:
196 : case T_CreateTableAsStmt:
197 : case T_CreateTableSpaceStmt:
198 : case T_CreateTransformStmt:
199 : case T_CreateTrigStmt:
200 : case T_CreateUserMappingStmt:
201 : case T_CreatedbStmt:
202 : case T_DefineStmt:
203 : case T_DropOwnedStmt:
204 : case T_DropRoleStmt:
205 : case T_DropStmt:
206 : case T_DropSubscriptionStmt:
207 : case T_DropTableSpaceStmt:
208 : case T_DropUserMappingStmt:
209 : case T_DropdbStmt:
210 : case T_GrantRoleStmt:
211 : case T_GrantStmt:
212 : case T_ImportForeignSchemaStmt:
213 : case T_IndexStmt:
214 : case T_ReassignOwnedStmt:
215 : case T_RefreshMatViewStmt:
216 : case T_RenameStmt:
217 : case T_RuleStmt:
218 : case T_SecLabelStmt:
219 : case T_TruncateStmt:
220 : case T_ViewStmt:
221 : {
222 : /* DDL is not read-only, and neither is TRUNCATE. */
223 291592 : return COMMAND_IS_NOT_READ_ONLY;
224 : }
225 :
226 75 : case T_AlterSystemStmt:
227 : {
228 : /*
229 : * Surprisingly, ALTER SYSTEM meets all our definitions of
230 : * read-only: it changes nothing that affects the output of
231 : * pg_dump, it doesn't write WAL or imperil the application of
232 : * future WAL, and it doesn't depend on any state that needs
233 : * to be synchronized with parallel workers.
234 : *
235 : * So, despite the fact that it writes to a file, it's read
236 : * only!
237 : */
238 75 : return COMMAND_IS_STRICTLY_READ_ONLY;
239 : }
240 :
241 696 : case T_CallStmt:
242 : case T_DoStmt:
243 : {
244 : /*
245 : * Commands inside the DO block or the called procedure might
246 : * not be read only, but they'll be checked separately when we
247 : * try to execute them. Here we only need to worry about the
248 : * DO or CALL command itself.
249 : */
250 696 : return COMMAND_IS_STRICTLY_READ_ONLY;
251 : }
252 :
253 77 : case T_CheckPointStmt:
254 : {
255 : /*
256 : * You might think that this should not be permitted in
257 : * recovery, but we interpret a CHECKPOINT command during
258 : * recovery as a request for a restartpoint instead. We allow
259 : * this since it can be a useful way of reducing switchover
260 : * time when using various forms of replication.
261 : */
262 77 : return COMMAND_IS_STRICTLY_READ_ONLY;
263 : }
264 :
265 28124 : case T_ClosePortalStmt:
266 : case T_ConstraintsSetStmt:
267 : case T_DeallocateStmt:
268 : case T_DeclareCursorStmt:
269 : case T_DiscardStmt:
270 : case T_ExecuteStmt:
271 : case T_FetchStmt:
272 : case T_LoadStmt:
273 : case T_PrepareStmt:
274 : case T_UnlistenStmt:
275 : case T_VariableSetStmt:
276 : {
277 : /*
278 : * These modify only backend-local state, so they're OK to run
279 : * in a read-only transaction or on a standby. However, they
280 : * are disallowed in parallel mode, because they either rely
281 : * upon or modify backend-local state that might not be
282 : * synchronized among cooperating backends.
283 : */
284 28124 : return COMMAND_OK_IN_RECOVERY | COMMAND_OK_IN_READ_ONLY_TXN;
285 : }
286 :
287 5583 : case T_ClusterStmt:
288 : case T_ReindexStmt:
289 : case T_VacuumStmt:
290 : {
291 : /*
292 : * These commands write WAL, so they're not strictly
293 : * read-only, and running them in parallel workers isn't
294 : * supported.
295 : *
296 : * However, they don't change the database state in a way that
297 : * would affect pg_dump output, so it's fine to run them in a
298 : * read-only transaction. (CLUSTER might change the order of
299 : * rows on disk, which could affect the ordering of pg_dump
300 : * output, but that's not semantically significant.)
301 : */
302 5583 : return COMMAND_OK_IN_READ_ONLY_TXN;
303 : }
304 :
305 4500 : case T_CopyStmt:
306 : {
1060 tgl 307 4500 : CopyStmt *stmt = (CopyStmt *) parsetree;
308 :
309 : /*
310 : * You might think that COPY FROM is not at all read only, but
311 : * it's OK to copy into a temporary table, because that
312 : * wouldn't change the output of pg_dump. If the target table
313 : * turns out to be non-temporary, DoCopy itself will call
314 : * PreventCommandIfReadOnly.
315 : */
1179 rhaas 316 4500 : if (stmt->is_from)
317 958 : return COMMAND_OK_IN_READ_ONLY_TXN;
318 : else
319 3542 : return COMMAND_IS_STRICTLY_READ_ONLY;
320 : }
321 :
322 10295 : case T_ExplainStmt:
323 : case T_VariableShowStmt:
324 : {
325 : /*
326 : * These commands don't modify any data and are safe to run in
327 : * a parallel worker.
328 : */
329 10295 : return COMMAND_IS_STRICTLY_READ_ONLY;
330 : }
331 :
332 81 : case T_ListenStmt:
333 : case T_NotifyStmt:
334 : {
335 : /*
336 : * NOTIFY requires an XID assignment, so it can't be permitted
337 : * on a standby. Perhaps LISTEN could, since without NOTIFY it
338 : * would be OK to just do nothing, at least until promotion,
339 : * but we currently prohibit it lest the user get the wrong
340 : * idea.
341 : *
342 : * (We do allow T_UnlistenStmt on a standby, though, because
343 : * it's a no-op.)
344 : */
345 81 : return COMMAND_OK_IN_READ_ONLY_TXN;
346 : }
347 :
348 522 : case T_LockStmt:
349 : {
1060 tgl 350 522 : LockStmt *stmt = (LockStmt *) parsetree;
351 :
352 : /*
353 : * Only weaker locker modes are allowed during recovery. The
354 : * restrictions here must match those in
355 : * LockAcquireExtended().
356 : */
1179 rhaas 357 522 : if (stmt->mode > RowExclusiveLock)
358 237 : return COMMAND_OK_IN_READ_ONLY_TXN;
359 : else
360 285 : return COMMAND_IS_STRICTLY_READ_ONLY;
361 : }
362 :
363 16569 : case T_TransactionStmt:
364 : {
365 16569 : TransactionStmt *stmt = (TransactionStmt *) parsetree;
366 :
367 : /*
368 : * PREPARE, COMMIT PREPARED, and ROLLBACK PREPARED all write
369 : * WAL, so they're not read-only in the strict sense; but the
370 : * first and third do not change pg_dump output, so they're OK
371 : * in a read-only transactions.
372 : *
373 : * We also consider COMMIT PREPARED to be OK in a read-only
374 : * transaction environment, by way of exception.
375 : */
376 16569 : switch (stmt->kind)
377 : {
378 15832 : case TRANS_STMT_BEGIN:
379 : case TRANS_STMT_START:
380 : case TRANS_STMT_COMMIT:
381 : case TRANS_STMT_ROLLBACK:
382 : case TRANS_STMT_SAVEPOINT:
383 : case TRANS_STMT_RELEASE:
384 : case TRANS_STMT_ROLLBACK_TO:
385 15832 : return COMMAND_IS_STRICTLY_READ_ONLY;
386 :
387 737 : case TRANS_STMT_PREPARE:
388 : case TRANS_STMT_COMMIT_PREPARED:
389 : case TRANS_STMT_ROLLBACK_PREPARED:
390 737 : return COMMAND_OK_IN_READ_ONLY_TXN;
391 : }
1176 tgl 392 UBC 0 : elog(ERROR, "unrecognized TransactionStmtKind: %d",
393 : (int) stmt->kind);
394 : return 0; /* silence stupider compilers */
395 : }
396 :
7394 peter_e 397 0 : default:
1179 rhaas 398 0 : elog(ERROR, "unrecognized node type: %d",
399 : (int) nodeTag(parsetree));
400 : return 0; /* silence stupider compilers */
401 : }
402 : }
403 :
404 : /*
405 : * PreventCommandIfReadOnly: throw error if XactReadOnly
406 : *
407 : * This is useful partly to ensure consistency of the error message wording;
408 : * some callers have checked XactReadOnly for themselves.
409 : */
410 : void
4796 tgl 411 CBC 40215 : PreventCommandIfReadOnly(const char *cmdname)
412 : {
413 40215 : if (XactReadOnly)
414 50 : ereport(ERROR,
415 : (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
416 : /* translator: %s is name of a SQL command, eg CREATE */
417 : errmsg("cannot execute %s in a read-only transaction",
418 : cmdname)));
419 40165 : }
420 :
421 : /*
422 : * PreventCommandIfParallelMode: throw error if current (sub)transaction is
423 : * in parallel mode.
424 : *
425 : * This is useful partly to ensure consistency of the error message wording;
426 : * some callers have checked IsInParallelMode() for themselves.
427 : */
428 : void
2901 rhaas 429 105579 : PreventCommandIfParallelMode(const char *cmdname)
430 : {
431 105579 : if (IsInParallelMode())
2901 rhaas 432 UBC 0 : ereport(ERROR,
433 : (errcode(ERRCODE_INVALID_TRANSACTION_STATE),
434 : /* translator: %s is name of a SQL command, eg CREATE */
435 : errmsg("cannot execute %s during a parallel operation",
436 : cmdname)));
2901 rhaas 437 CBC 105579 : }
438 :
439 : /*
440 : * PreventCommandDuringRecovery: throw error if RecoveryInProgress
441 : *
442 : * The majority of operations that are unsafe in a Hot Standby
443 : * will be rejected by XactReadOnly tests. However there are a few
444 : * commands that are allowed in "read-only" xacts but cannot be allowed
445 : * in Hot Standby mode. Those commands should call this function.
446 : */
447 : void
4796 tgl 448 3919 : PreventCommandDuringRecovery(const char *cmdname)
449 : {
450 3919 : if (RecoveryInProgress())
4796 tgl 451 UBC 0 : ereport(ERROR,
452 : (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
453 : /* translator: %s is name of a SQL command, eg CREATE */
454 : errmsg("cannot execute %s during recovery",
455 : cmdname)));
4796 tgl 456 CBC 3919 : }
457 :
458 : /*
459 : * CheckRestrictedOperation: throw error for hazardous command if we're
460 : * inside a security restriction context.
461 : *
462 : * This is needed to protect session-local state for which there is not any
463 : * better-defined protection mechanism, such as ownership.
464 : */
465 : static void
4869 466 3082 : CheckRestrictedOperation(const char *cmdname)
467 : {
468 3082 : if (InSecurityRestrictedOperation())
4869 tgl 469 UBC 0 : ereport(ERROR,
470 : (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
471 : /* translator: %s is name of a SQL command, eg PREPARE */
472 : errmsg("cannot execute %s within security-restricted operation",
473 : cmdname)));
4869 tgl 474 CBC 3082 : }
475 :
476 : /*
477 : * ProcessUtility
478 : * general utility function invoker
479 : *
480 : * pstmt: PlannedStmt wrapper for the utility statement
481 : * queryString: original source text of command
482 : * readOnlyTree: if true, pstmt's node tree must not be modified
483 : * context: identifies source of statement (toplevel client command,
484 : * non-toplevel client command, subcommand of a larger utility command)
485 : * params: parameters to use during execution
486 : * queryEnv: environment for parse through execution (e.g., ephemeral named
487 : * tables like trigger transition tables). May be NULL.
488 : * dest: where to send results
489 : * qc: where to store command completion status data. May be NULL,
490 : * but if not, then caller must have initialized it.
491 : *
492 : * Caller MUST supply a queryString; it is not allowed (anymore) to pass NULL.
493 : * If you really don't have source text, you can pass a constant string,
494 : * perhaps "(query not available)".
495 : *
496 : * Note for users of ProcessUtility_hook: the same queryString may be passed
497 : * to multiple invocations of ProcessUtility when processing a query string
498 : * containing multiple semicolon-separated statements. One should use
499 : * pstmt->stmt_location and pstmt->stmt_len to identify the substring
500 : * containing the current statement. Keep in mind also that some utility
501 : * statements (e.g., CREATE SCHEMA) will recurse to ProcessUtility to process
502 : * sub-statements, often passing down the same queryString, stmt_location,
503 : * and stmt_len that were given for the whole statement.
504 : */
505 : void
2276 506 358114 : ProcessUtility(PlannedStmt *pstmt,
507 : const char *queryString,
508 : bool readOnlyTree,
509 : ProcessUtilityContext context,
510 : ParamListInfo params,
511 : QueryEnvironment *queryEnv,
512 : DestReceiver *dest,
513 : QueryCompletion *qc)
514 : {
515 358114 : Assert(IsA(pstmt, PlannedStmt));
516 358114 : Assert(pstmt->commandType == CMD_UTILITY);
5050 bruce 517 358114 : Assert(queryString != NULL); /* required as of 8.4 */
1133 alvherre 518 358114 : Assert(qc == NULL || qc->commandTag == CMDTAG_UNKNOWN);
519 :
520 : /*
521 : * We provide a function hook variable that lets loadable plugins get
522 : * control when ProcessUtility is called. Such a plugin would normally
523 : * call standard_ProcessUtility().
524 : */
4863 tgl 525 358114 : if (ProcessUtility_hook)
660 526 27741 : (*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,
527 : context, params, queryEnv,
528 : dest, qc);
529 : else
530 330373 : standard_ProcessUtility(pstmt, queryString, readOnlyTree,
531 : context, params, queryEnv,
532 : dest, qc);
4863 533 351326 : }
534 :
535 : /*
536 : * standard_ProcessUtility itself deals only with utility commands for
537 : * which we do not provide event trigger support. Commands that do have
538 : * such support are passed down to ProcessUtilitySlow, which contains the
539 : * necessary infrastructure for such triggers.
540 : *
541 : * This division is not just for performance: it's critical that the
542 : * event trigger code not be invoked when doing START TRANSACTION for
543 : * example, because we might need to refresh the event trigger cache,
544 : * which requires being in a valid transaction.
545 : */
546 : void
2276 547 358114 : standard_ProcessUtility(PlannedStmt *pstmt,
548 : const char *queryString,
549 : bool readOnlyTree,
550 : ProcessUtilityContext context,
551 : ParamListInfo params,
552 : QueryEnvironment *queryEnv,
553 : DestReceiver *dest,
554 : QueryCompletion *qc)
555 : {
556 : Node *parsetree;
3915 rhaas 557 358114 : bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
1842 peter_e 558 358114 : bool isAtomicContext = (!(context == PROCESS_UTILITY_TOPLEVEL || context == PROCESS_UTILITY_QUERY_NONATOMIC) || IsTransactionBlock());
559 : ParseState *pstate;
560 : int readonly_flags;
561 :
562 : /* This can recurse, so check for excessive recursion */
1637 tgl 563 358114 : check_stack_depth();
564 :
565 : /*
566 : * If the given node tree is read-only, make a copy to ensure that parse
567 : * transformations don't damage the original tree. This could be
568 : * refactored to avoid making unnecessary copies in more cases, but it's
569 : * not clear that it's worth a great deal of trouble over. Statements
570 : * that are complex enough to be expensive to copy are exactly the ones
571 : * we'd need to copy, so that only marginal savings seem possible.
572 : */
660 573 358114 : if (readOnlyTree)
574 7525 : pstmt = copyObject(pstmt);
575 358114 : parsetree = pstmt->utilityStmt;
576 :
577 : /* Prohibit read/write commands in read-only states. */
1179 rhaas 578 358114 : readonly_flags = ClassifyUtilityCommandAsReadOnly(parsetree);
579 358114 : if (readonly_flags != COMMAND_IS_STRICTLY_READ_ONLY &&
580 327312 : (XactReadOnly || IsInParallelMode()))
581 : {
1133 alvherre 582 5122 : CommandTag commandtag = CreateCommandTag(parsetree);
583 :
1179 rhaas 584 5122 : if ((readonly_flags & COMMAND_OK_IN_READ_ONLY_TXN) == 0)
1133 alvherre 585 6 : PreventCommandIfReadOnly(GetCommandTagName(commandtag));
1179 rhaas 586 5116 : if ((readonly_flags & COMMAND_OK_IN_PARALLEL_MODE) == 0)
1133 alvherre 587 5116 : PreventCommandIfParallelMode(GetCommandTagName(commandtag));
1179 rhaas 588 5116 : if ((readonly_flags & COMMAND_OK_IN_RECOVERY) == 0)
1133 alvherre 589 UBC 0 : PreventCommandDuringRecovery(GetCommandTagName(commandtag));
590 : }
591 :
2406 peter_e 592 CBC 358108 : pstate = make_parsestate(NULL);
593 358108 : pstate->p_sourcetext = queryString;
1191 peter 594 358108 : pstate->p_queryEnv = queryEnv;
595 :
9345 bruce 596 358108 : switch (nodeTag(parsetree))
597 : {
598 : /*
599 : * ******************** transactions ********************
600 : */
9344 601 16569 : case T_TransactionStmt:
602 : {
603 16569 : TransactionStmt *stmt = (TransactionStmt *) parsetree;
604 :
7363 tgl 605 16569 : switch (stmt->kind)
606 : {
607 : /*
608 : * START TRANSACTION, as defined by SQL99: Identical
609 : * to BEGIN. Same code for both.
610 : */
611 7417 : case TRANS_STMT_BEGIN:
612 : case TRANS_STMT_START:
613 : {
614 : ListCell *lc;
615 :
6814 616 7417 : BeginTransactionBlock();
617 10877 : foreach(lc, stmt->options)
618 : {
619 3460 : DefElem *item = (DefElem *) lfirst(lc);
620 :
621 3460 : if (strcmp(item->defname, "transaction_isolation") == 0)
622 3012 : SetPGVariable("transaction_isolation",
623 3012 : list_make1(item->arg),
624 : true);
625 448 : else if (strcmp(item->defname, "transaction_read_only") == 0)
626 427 : SetPGVariable("transaction_read_only",
627 427 : list_make1(item->arg),
628 : true);
4444 heikki.linnakangas 629 21 : else if (strcmp(item->defname, "transaction_deferrable") == 0)
630 21 : SetPGVariable("transaction_deferrable",
631 21 : list_make1(item->arg),
632 : true);
633 : }
634 : }
7553 bruce 635 7417 : break;
636 :
7363 tgl 637 5769 : case TRANS_STMT_COMMIT:
1477 peter 638 5769 : if (!EndTransactionBlock(stmt->chain))
639 : {
640 : /* report unsuccessful commit in qc */
1133 alvherre 641 365 : if (qc)
642 365 : SetQueryCompletion(qc, CMDTAG_ROLLBACK, 0);
643 : }
9344 bruce 644 5754 : break;
645 :
6505 tgl 646 390 : case TRANS_STMT_PREPARE:
647 390 : if (!PrepareTransactionBlock(stmt->gid))
648 : {
649 : /* report unsuccessful commit in qc */
1133 alvherre 650 2 : if (qc)
651 2 : SetQueryCompletion(qc, CMDTAG_ROLLBACK, 0);
652 : }
6505 tgl 653 390 : break;
654 :
655 311 : case TRANS_STMT_COMMIT_PREPARED:
1878 peter_e 656 311 : PreventInTransactionBlock(isTopLevel, "COMMIT PREPARED");
6505 tgl 657 311 : FinishPreparedTransaction(stmt->gid, true);
658 308 : break;
659 :
660 36 : case TRANS_STMT_ROLLBACK_PREPARED:
1878 peter_e 661 36 : PreventInTransactionBlock(isTopLevel, "ROLLBACK PREPARED");
6505 tgl 662 36 : FinishPreparedTransaction(stmt->gid, false);
663 33 : break;
664 :
7363 665 1160 : case TRANS_STMT_ROLLBACK:
1477 peter 666 1160 : UserAbortTransactionBlock(stmt->chain);
9344 bruce 667 1145 : break;
668 :
6830 tgl 669 997 : case TRANS_STMT_SAVEPOINT:
1878 peter_e 670 997 : RequireTransactionBlock(isTopLevel, "SAVEPOINT");
671 994 : DefineSavepoint(stmt->savepoint_name);
6830 tgl 672 988 : break;
673 :
674 141 : case TRANS_STMT_RELEASE:
1878 peter_e 675 141 : RequireTransactionBlock(isTopLevel, "RELEASE SAVEPOINT");
676 138 : ReleaseSavepoint(stmt->savepoint_name);
6830 tgl 677 135 : break;
678 :
679 348 : case TRANS_STMT_ROLLBACK_TO:
1878 peter_e 680 348 : RequireTransactionBlock(isTopLevel, "ROLLBACK TO SAVEPOINT");
681 345 : RollbackToSavepoint(stmt->savepoint_name);
682 :
683 : /*
684 : * CommitTransactionCommand is in charge of
685 : * re-defining the savepoint again
686 : */
6830 tgl 687 339 : break;
688 : }
689 : }
9344 bruce 690 16509 : break;
691 :
692 : /*
693 : * Portal (cursor) manipulation
694 : */
2276 tgl 695 1331 : case T_DeclareCursorStmt:
1191 peter 696 1331 : PerformCursorOpen(pstate, (DeclareCursorStmt *) parsetree, params,
697 : isTopLevel);
7335 tgl 698 1324 : break;
699 :
9344 bruce 700 1047 : case T_ClosePortalStmt:
701 : {
702 1047 : ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
703 :
4869 tgl 704 1047 : CheckRestrictedOperation("CLOSE");
7335 705 1047 : PerformPortalClose(stmt->portalname);
706 : }
9344 bruce 707 1046 : break;
708 :
709 2839 : case T_FetchStmt:
1133 alvherre 710 2839 : PerformPortalFetch((FetchStmt *) parsetree, dest, qc);
9344 bruce 711 2790 : break;
712 :
3634 tgl 713 506 : case T_DoStmt:
633 dean.a.rasheed 714 506 : ExecuteDoStmt(pstate, (DoStmt *) parsetree, isAtomicContext);
9344 bruce 715 323 : break;
716 :
6869 tgl 717 48 : case T_CreateTableSpaceStmt:
718 : /* no event triggers for global objects */
1878 peter_e 719 48 : PreventInTransactionBlock(isTopLevel, "CREATE TABLESPACE");
6869 tgl 720 48 : CreateTableSpace((CreateTableSpaceStmt *) parsetree);
721 33 : break;
722 :
723 30 : case T_DropTableSpaceStmt:
724 : /* no event triggers for global objects */
1878 peter_e 725 30 : PreventInTransactionBlock(isTopLevel, "DROP TABLESPACE");
6869 tgl 726 30 : DropTableSpace((DropTableSpaceStmt *) parsetree);
727 23 : break;
728 :
4842 rhaas 729 12 : case T_AlterTableSpaceOptionsStmt:
730 : /* no event triggers for global objects */
731 12 : AlterTableSpaceOptions((AlterTableSpaceOptionsStmt *) parsetree);
732 6 : break;
733 :
8592 tgl 734 641 : case T_TruncateStmt:
6246 735 641 : ExecuteTruncate((TruncateStmt *) parsetree);
8599 bruce 736 576 : break;
737 :
9344 738 4500 : case T_CopyStmt:
739 : {
740 : uint64 processed;
741 :
2276 tgl 742 4500 : DoCopy(pstate, (CopyStmt *) parsetree,
743 : pstmt->stmt_location, pstmt->stmt_len,
744 : &processed);
1133 alvherre 745 4151 : if (qc)
746 4151 : SetQueryCompletion(qc, CMDTAG_COPY, processed);
747 : }
9344 bruce 748 4151 : break;
749 :
7530 tgl 750 813 : case T_PrepareStmt:
4869 751 813 : CheckRestrictedOperation("PREPARE");
1191 peter 752 813 : PrepareQuery(pstate, (PrepareStmt *) parsetree,
753 : pstmt->stmt_location, pstmt->stmt_len);
7530 tgl 754 807 : break;
755 :
756 4598 : case T_ExecuteStmt:
1191 peter 757 4598 : ExecuteQuery(pstate,
758 : (ExecuteStmt *) parsetree, NULL,
759 : params,
760 : dest, qc);
7530 tgl 761 4549 : break;
762 :
763 1151 : case T_DeallocateStmt:
4869 764 1151 : CheckRestrictedOperation("DEALLOCATE");
7530 765 1151 : DeallocateQuery((DeallocateStmt *) parsetree);
766 1151 : break;
767 :
6494 768 1175 : case T_GrantRoleStmt:
769 : /* no event triggers for global objects */
227 rhaas 770 GNC 1175 : GrantRole(pstate, (GrantRoleStmt *) parsetree);
6494 tgl 771 CBC 1112 : break;
772 :
9344 bruce 773 808 : case T_CreatedbStmt:
774 : /* no event triggers for global objects */
1878 peter_e 775 808 : PreventInTransactionBlock(isTopLevel, "CREATE DATABASE");
2406 776 808 : createdb(pstate, (CreatedbStmt *) parsetree);
9344 bruce 777 797 : break;
778 :
6461 tgl 779 10 : case T_AlterDatabaseStmt:
780 : /* no event triggers for global objects */
2406 peter_e 781 10 : AlterDatabase(pstate, (AlterDatabaseStmt *) parsetree, isTopLevel);
6461 tgl 782 10 : break;
783 :
419 peter 784 6 : case T_AlterDatabaseRefreshCollStmt:
785 : /* no event triggers for global objects */
786 6 : AlterDatabaseRefreshColl((AlterDatabaseRefreshCollStmt *) parsetree);
787 6 : break;
788 :
7709 peter_e 789 516 : case T_AlterDatabaseSetStmt:
790 : /* no event triggers for global objects */
7587 tgl 791 516 : AlterDatabaseSet((AlterDatabaseSetStmt *) parsetree);
7709 peter_e 792 516 : break;
793 :
8521 bruce 794 36 : case T_DropdbStmt:
795 : /* no event triggers for global objects */
1244 akapila 796 36 : PreventInTransactionBlock(isTopLevel, "DROP DATABASE");
797 36 : DropDatabase(pstate, (DropdbStmt *) parsetree);
9344 bruce 798 28 : break;
799 :
800 : /* Query-level asynchronous notification */
801 44 : case T_NotifyStmt:
802 : {
803 44 : NotifyStmt *stmt = (NotifyStmt *) parsetree;
804 :
4800 tgl 805 44 : Async_Notify(stmt->conditionname, stmt->payload);
806 : }
9344 bruce 807 44 : break;
808 :
809 37 : case T_ListenStmt:
810 : {
811 37 : ListenStmt *stmt = (ListenStmt *) parsetree;
812 :
4869 tgl 813 37 : CheckRestrictedOperation("LISTEN");
814 :
815 : /*
816 : * We don't allow LISTEN in background processes, as there is
817 : * no mechanism for them to collect NOTIFY messages, so they'd
818 : * just block cleanout of the async SLRU indefinitely.
819 : * (Authors of custom background workers could bypass this
820 : * restriction by calling Async_Listen directly, but then it's
821 : * on them to provide some mechanism to process the message
822 : * queue.) Note there seems no reason to forbid UNLISTEN.
823 : */
571 824 37 : if (MyBackendType != B_BACKEND)
571 tgl 825 UBC 0 : ereport(ERROR,
826 : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
827 : /* translator: %s is name of a SQL command, eg LISTEN */
828 : errmsg("cannot execute %s within a background process",
829 : "LISTEN")));
830 :
5333 tgl 831 CBC 37 : Async_Listen(stmt->conditionname);
832 : }
9344 bruce 833 37 : break;
834 :
8993 scrappy 835 19 : case T_UnlistenStmt:
836 : {
837 19 : UnlistenStmt *stmt = (UnlistenStmt *) parsetree;
838 :
4869 tgl 839 19 : CheckRestrictedOperation("UNLISTEN");
5333 840 19 : if (stmt->conditionname)
841 3 : Async_Unlisten(stmt->conditionname);
842 : else
5335 843 16 : Async_UnlistenAll();
844 : }
8993 scrappy 845 19 : break;
846 :
9344 bruce 847 26 : case T_LoadStmt:
848 : {
849 26 : LoadStmt *stmt = (LoadStmt *) parsetree;
850 :
8720 851 26 : closeAllVfds(); /* probably not necessary... */
852 : /* Allowed names are restricted if you're not superuser */
6081 tgl 853 26 : load_file(stmt->filename, !superuser());
854 : }
9344 bruce 855 26 : break;
856 :
1956 peter_e 857 190 : case T_CallStmt:
1843 858 190 : ExecuteCallStmt(castNode(CallStmt, parsetree), params, isAtomicContext, dest);
1956 859 169 : break;
860 :
9344 bruce 861 108 : case T_ClusterStmt:
857 michael 862 108 : cluster(pstate, (ClusterStmt *) parsetree, isTopLevel);
9344 bruce 863 96 : break;
864 :
865 5038 : case T_VacuumStmt:
1179 rhaas 866 5038 : ExecVacuum(pstate, (VacuumStmt *) parsetree, isTopLevel);
9344 bruce 867 4942 : break;
868 :
869 9927 : case T_ExplainStmt:
1191 peter 870 9927 : ExplainQuery(pstate, (ExplainStmt *) parsetree, params, dest);
9344 bruce 871 9873 : break;
872 :
3399 ishii 873 75 : case T_AlterSystemStmt:
1878 peter_e 874 75 : PreventInTransactionBlock(isTopLevel, "ALTER SYSTEM");
3399 ishii 875 75 : AlterSystemSetConfigFile((AlterSystemStmt *) parsetree);
876 56 : break;
877 :
9344 bruce 878 16234 : case T_VariableSetStmt:
3474 879 16234 : ExecSetVariableStmt((VariableSetStmt *) parsetree, isTopLevel);
9344 880 16149 : break;
881 :
882 368 : case T_VariableShowStmt:
883 : {
884 368 : VariableShowStmt *n = (VariableShowStmt *) parsetree;
885 :
7278 tgl 886 368 : GetPGVariable(n->name, dest);
887 : }
9344 bruce 888 368 : break;
889 :
5827 neilc 890 15 : case T_DiscardStmt:
891 : /* should we allow DISCARD PLANS? */
4869 tgl 892 15 : CheckRestrictedOperation("DISCARD");
5827 neilc 893 15 : DiscardCommand((DiscardStmt *) parsetree, isTopLevel);
894 15 : break;
895 :
3917 rhaas 896 80 : case T_CreateEventTrigStmt:
897 : /* no event triggers on event triggers */
898 80 : CreateEventTrigger((CreateEventTrigStmt *) parsetree);
899 47 : break;
900 :
901 16 : case T_AlterEventTrigStmt:
902 : /* no event triggers on event triggers */
903 16 : AlterEventTrigger((AlterEventTrigStmt *) parsetree);
904 16 : break;
905 :
906 : /*
907 : * ******************************** ROLE statements ****
908 : */
6494 tgl 909 800 : case T_CreateRoleStmt:
910 : /* no event triggers for global objects */
2406 peter_e 911 800 : CreateRole(pstate, (CreateRoleStmt *) parsetree);
9173 bruce 912 735 : break;
913 :
6494 tgl 914 197 : case T_AlterRoleStmt:
915 : /* no event triggers for global objects */
633 dean.a.rasheed 916 197 : AlterRole(pstate, (AlterRoleStmt *) parsetree);
9173 bruce 917 161 : break;
918 :
6494 tgl 919 46 : case T_AlterRoleSetStmt:
920 : /* no event triggers for global objects */
921 46 : AlterRoleSet((AlterRoleSetStmt *) parsetree);
7709 peter_e 922 38 : break;
923 :
6494 tgl 924 799 : case T_DropRoleStmt:
925 : /* no event triggers for global objects */
926 799 : DropRole((DropRoleStmt *) parsetree);
9173 bruce 927 682 : break;
928 :
6348 alvherre 929 19 : case T_ReassignOwnedStmt:
930 : /* no event triggers for global objects */
931 19 : ReassignOwnedObjects((ReassignOwnedStmt *) parsetree);
932 10 : break;
933 :
8878 vadim4o 934 522 : case T_LockStmt:
935 :
936 : /*
937 : * Since the lock would just get dropped immediately, LOCK TABLE
938 : * outside a transaction block is presumed to be user error.
939 : */
1878 peter_e 940 522 : RequireTransactionBlock(isTopLevel, "LOCK TABLE");
8878 vadim4o 941 522 : LockTableCommand((LockStmt *) parsetree);
942 484 : break;
943 :
8593 JanWieck 944 51 : case T_ConstraintsSetStmt:
1878 peter_e 945 51 : WarnNoTransactionBlock(isTopLevel, "SET CONSTRAINTS");
6785 tgl 946 51 : AfterTriggerSetState((ConstraintsSetStmt *) parsetree);
8593 JanWieck 947 43 : break;
948 :
8190 vadim4o 949 77 : case T_CheckPointStmt:
278 rhaas 950 77 : if (!has_privs_of_role(GetUserId(), ROLE_PG_CHECKPOINT))
7201 tgl 951 UBC 0 : ereport(ERROR,
952 : (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
953 : errmsg("permission denied to execute %s command",
954 : "CHECKPOINT"),
955 : errdetail("Only roles with privileges of the \"%s\" role may execute this command.",
956 : "pg_checkpoint")));
957 :
4859 simon 958 GIC 77 : RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_WAIT |
4796 tgl 959 77 : (RecoveryInProgress() ? 0 : CHECKPOINT_FORCE));
8190 vadim4o 960 77 : break;
8190 vadim4o 961 ECB :
8451 inoue 962 CBC 437 : case T_ReindexStmt:
811 michael 963 437 : ExecReindex(pstate, (ReindexStmt *) parsetree, isTopLevel);
8451 inoue 964 GIC 280 : break;
8397 bruce 965 ECB :
3634 tgl 966 : /*
967 : * The following statements are supported by Event Triggers only
968 : * in some cases, so we "fast path" them in the other cases.
969 : */
970 :
2967 alvherre 971 GIC 48823 : case T_GrantStmt:
972 : {
973 48823 : GrantStmt *stmt = (GrantStmt *) parsetree;
2967 alvherre 974 ECB :
2006 peter_e 975 GIC 48823 : if (EventTriggerSupportsObjectType(stmt->objtype))
2276 tgl 976 CBC 48129 : ProcessUtilitySlow(pstate, pstmt, queryString,
977 : context, params, queryEnv,
1133 alvherre 978 ECB : dest, qc);
2967 979 : else
2276 tgl 980 GIC 694 : ExecuteGrantStmt(stmt);
981 : }
2967 alvherre 982 48762 : break;
2967 alvherre 983 ECB :
3634 tgl 984 GIC 11354 : case T_DropStmt:
3634 tgl 985 ECB : {
3634 tgl 986 GIC 11354 : DropStmt *stmt = (DropStmt *) parsetree;
7570 peter_e 987 ECB :
3634 tgl 988 GIC 11354 : if (EventTriggerSupportsObjectType(stmt->removeType))
2276 tgl 989 CBC 11307 : ProcessUtilitySlow(pstate, pstmt, queryString,
990 : context, params, queryEnv,
1133 alvherre 991 ECB : dest, qc);
3634 tgl 992 : else
3634 tgl 993 GIC 47 : ExecDropStmt(stmt, isTopLevel);
994 : }
7559 995 10858 : break;
7559 tgl 996 ECB :
3634 tgl 997 GIC 750 : case T_RenameStmt:
3634 tgl 998 ECB : {
3634 tgl 999 GIC 750 : RenameStmt *stmt = (RenameStmt *) parsetree;
5920 tgl 1000 ECB :
3634 tgl 1001 GIC 750 : if (EventTriggerSupportsObjectType(stmt->renameType))
2276 tgl 1002 CBC 726 : ProcessUtilitySlow(pstate, pstmt, queryString,
1003 : context, params, queryEnv,
1133 alvherre 1004 ECB : dest, qc);
3634 tgl 1005 : else
3634 tgl 1006 GIC 24 : ExecRenameStmt(stmt);
1007 : }
5920 1008 545 : break;
5920 tgl 1009 ECB :
2560 alvherre 1010 GIC 23 : case T_AlterObjectDependsStmt:
2560 alvherre 1011 ECB : {
2560 alvherre 1012 GIC 23 : AlterObjectDependsStmt *stmt = (AlterObjectDependsStmt *) parsetree;
2560 alvherre 1013 ECB :
2560 alvherre 1014 GIC 23 : if (EventTriggerSupportsObjectType(stmt->objectType))
2276 tgl 1015 CBC 23 : ProcessUtilitySlow(pstate, pstmt, queryString,
1016 : context, params, queryEnv,
1133 alvherre 1017 ECB : dest, qc);
2560 1018 : else
2560 alvherre 1019 UIC 0 : ExecAlterObjectDependsStmt(stmt, NULL);
1020 : }
2560 alvherre 1021 GIC 23 : break;
2560 alvherre 1022 EUB :
3634 tgl 1023 GIC 194 : case T_AlterObjectSchemaStmt:
3634 tgl 1024 ECB : {
3634 tgl 1025 GIC 194 : AlterObjectSchemaStmt *stmt = (AlterObjectSchemaStmt *) parsetree;
3634 tgl 1026 ECB :
3634 tgl 1027 GIC 194 : if (EventTriggerSupportsObjectType(stmt->objectType))
2276 tgl 1028 CBC 194 : ProcessUtilitySlow(pstate, pstmt, queryString,
1029 : context, params, queryEnv,
1133 alvherre 1030 ECB : dest, qc);
3634 tgl 1031 : else
2959 alvherre 1032 UIC 0 : ExecAlterObjectSchemaStmt(stmt, NULL);
1033 : }
5710 tgl 1034 GIC 132 : break;
5710 tgl 1035 EUB :
3634 tgl 1036 GIC 1014 : case T_AlterOwnerStmt:
3634 tgl 1037 ECB : {
3634 tgl 1038 GIC 1014 : AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree;
3634 tgl 1039 ECB :
3634 tgl 1040 GIC 1014 : if (EventTriggerSupportsObjectType(stmt->objectType))
2276 tgl 1041 CBC 987 : ProcessUtilitySlow(pstate, pstmt, queryString,
1042 : context, params, queryEnv,
1133 alvherre 1043 ECB : dest, qc);
3634 tgl 1044 : else
3634 tgl 1045 GIC 27 : ExecAlterOwnerStmt(stmt);
1046 : }
5710 1047 887 : break;
5710 tgl 1048 ECB :
2967 alvherre 1049 GIC 18699 : case T_CommentStmt:
2967 alvherre 1050 ECB : {
2967 alvherre 1051 GIC 18699 : CommentStmt *stmt = (CommentStmt *) parsetree;
2967 alvherre 1052 ECB :
2967 alvherre 1053 GIC 18699 : if (EventTriggerSupportsObjectType(stmt->objtype))
2276 tgl 1054 CBC 18081 : ProcessUtilitySlow(pstate, pstmt, queryString,
1055 : context, params, queryEnv,
1133 alvherre 1056 ECB : dest, qc);
2967 1057 : else
2276 tgl 1058 GIC 618 : CommentObject(stmt);
2967 alvherre 1059 18620 : break;
1060 : }
2967 alvherre 1061 ECB :
2967 alvherre 1062 CBC 50 : case T_SecLabelStmt:
1063 : {
2967 alvherre 1064 GIC 50 : SecLabelStmt *stmt = (SecLabelStmt *) parsetree;
2967 alvherre 1065 ECB :
2967 alvherre 1066 GIC 50 : if (EventTriggerSupportsObjectType(stmt->objtype))
2276 tgl 1067 CBC 31 : ProcessUtilitySlow(pstate, pstmt, queryString,
1068 : context, params, queryEnv,
1133 alvherre 1069 ECB : dest, qc);
2967 1070 : else
2967 alvherre 1071 GIC 19 : ExecSecLabelStmt(stmt);
1072 14 : break;
1073 : }
2967 alvherre 1074 ECB :
9344 bruce 1075 CBC 205440 : default:
1076 : /* All other statement types have event trigger support */
2276 tgl 1077 GIC 205440 : ProcessUtilitySlow(pstate, pstmt, queryString,
2200 kgrittn 1078 ECB : context, params, queryEnv,
1079 : dest, qc);
9344 bruce 1080 CBC 201361 : break;
1081 : }
1082 :
2406 peter_e 1083 351326 : free_parsestate(pstate);
1084 :
1085 : /*
1441 peter 1086 ECB : * Make effects of commands visible, for instance so that
1087 : * PreCommit_on_commit_actions() can see them (see for example bug
1088 : * #15631).
1089 : */
1441 peter 1090 GIC 351326 : CommandCounterIncrement();
3634 tgl 1091 351326 : }
1092 :
3634 tgl 1093 ECB : /*
1094 : * The "Slow" variant of ProcessUtility should only receive statements
1095 : * supported by the event triggers facility. Therefore, we always
1096 : * perform the trigger support calls if the context allows it.
1097 : */
1098 : static void
2406 peter_e 1099 GIC 284918 : ProcessUtilitySlow(ParseState *pstate,
1100 : PlannedStmt *pstmt,
1101 : const char *queryString,
3633 tgl 1102 ECB : ProcessUtilityContext context,
1103 : ParamListInfo params,
1104 : QueryEnvironment *queryEnv,
1105 : DestReceiver *dest,
1106 : QueryCompletion *qc)
1107 : {
2276 tgl 1108 GIC 284918 : Node *parsetree = pstmt->utilityStmt;
3634 1109 284918 : bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
1647 peter_e 1110 284918 : bool isCompleteQuery = (context != PROCESS_UTILITY_SUBCOMMAND);
3634 tgl 1111 ECB : bool needCleanup;
2890 alvherre 1112 CBC 284918 : bool commandCollected = false;
2959 alvherre 1113 ECB : ObjectAddress address;
2890 alvherre 1114 GIC 284918 : ObjectAddress secondaryObject = InvalidObjectAddress;
3634 tgl 1115 ECB :
1116 : /* All event trigger calls are done only when isCompleteQuery is true */
3634 tgl 1117 CBC 284918 : needCleanup = isCompleteQuery && EventTriggerBeginCompleteQuery();
1118 :
1119 : /* PG_TRY block is to ensure we call EventTriggerEndCompleteQuery */
1120 284918 : PG_TRY();
1121 : {
3634 tgl 1122 GIC 284918 : if (isCompleteQuery)
3634 tgl 1123 CBC 276920 : EventTriggerDDLCommandStart(parsetree);
1124 :
1125 284918 : switch (nodeTag(parsetree))
3634 tgl 1126 ECB : {
1127 : /*
1128 : * relation and attribute manipulation
1129 : */
3634 tgl 1130 GIC 671 : case T_CreateSchemaStmt:
1131 671 : CreateSchemaCommand((CreateSchemaStmt *) parsetree,
1132 : queryString,
2276 tgl 1133 ECB : pstmt->stmt_location,
1134 : pstmt->stmt_len);
1135 :
1136 : /*
1137 : * EventTriggerCollectSimpleCommand called by
1138 : * CreateSchemaCommand
1139 : */
2890 alvherre 1140 GIC 654 : commandCollected = true;
3634 tgl 1141 654 : break;
1142 :
3634 tgl 1143 CBC 17263 : case T_CreateStmt:
3634 tgl 1144 ECB : case T_CreateForeignTableStmt:
1145 : {
1146 : List *stmts;
938 tgl 1147 GIC 17263 : RangeVar *table_rv = NULL;
1148 :
1149 : /* Run parse analysis ... */
3634 tgl 1150 CBC 17263 : stmts = transformCreateStmt((CreateStmt *) parsetree,
1151 : queryString);
1152 :
871 tgl 1153 ECB : /*
1154 : * ... and do it. We can't use foreach() because we may
1155 : * modify the list midway through, so pick off the
1156 : * elements one at a time, the hard way.
1157 : */
871 tgl 1158 GIC 41566 : while (stmts != NIL)
1159 : {
1160 25066 : Node *stmt = (Node *) linitial(stmts);
871 tgl 1161 ECB :
871 tgl 1162 GIC 25066 : stmts = list_delete_first(stmts);
3634 tgl 1163 ECB :
3634 tgl 1164 GIC 25066 : if (IsA(stmt, CreateStmt))
3634 tgl 1165 ECB : {
938 tgl 1166 GIC 16946 : CreateStmt *cstmt = (CreateStmt *) stmt;
3634 tgl 1167 ECB : Datum toast_options;
1168 : static char *validnsps[] = HEAP_RELOPT_NAMESPACES;
1169 :
1170 : /* Remember transformed RangeVar for LIKE */
938 tgl 1171 GIC 16946 : table_rv = cstmt->relation;
1172 :
1173 : /* Create the table itself */
938 tgl 1174 CBC 16946 : address = DefineRelation(cstmt,
1175 : RELKIND_RELATION,
1176 : InvalidOid, NULL,
2314 rhaas 1177 ECB : queryString);
2890 alvherre 1178 GIC 16452 : EventTriggerCollectSimpleCommand(address,
1179 : secondaryObject,
1180 : stmt);
3634 tgl 1181 ECB :
1182 : /*
1183 : * Let NewRelationCreateToastTable decide if this
1184 : * one needs a secondary relation too.
1185 : */
3634 tgl 1186 GIC 16452 : CommandCounterIncrement();
1187 :
1188 : /*
3634 tgl 1189 ECB : * parse and validate reloptions for the toast
1190 : * table
1191 : */
3634 tgl 1192 GIC 16452 : toast_options = transformRelOptions((Datum) 0,
1193 : cstmt->options,
1194 : "toast",
3634 tgl 1195 ECB : validnsps,
1196 : true,
1197 : false);
3634 tgl 1198 GIC 16452 : (void) heap_reloptions(RELKIND_TOASTVALUE,
1199 : toast_options,
1200 : true);
3634 tgl 1201 ECB :
2959 alvherre 1202 GIC 16449 : NewRelationCreateToastTable(address.objectId,
1203 : toast_options);
1204 : }
3634 tgl 1205 CBC 8120 : else if (IsA(stmt, CreateForeignTableStmt))
1206 : {
938 tgl 1207 GIC 209 : CreateForeignTableStmt *cstmt = (CreateForeignTableStmt *) stmt;
938 tgl 1208 ECB :
1209 : /* Remember transformed RangeVar for LIKE */
938 tgl 1210 CBC 209 : table_rv = cstmt->base.relation;
1211 :
1212 : /* Create the table itself */
1213 209 : address = DefineRelation(&cstmt->base,
1214 : RELKIND_FOREIGN_TABLE,
1215 : InvalidOid, NULL,
2314 rhaas 1216 ECB : queryString);
938 tgl 1217 GIC 199 : CreateForeignTable(cstmt,
1218 : address.objectId);
2890 alvherre 1219 171 : EventTriggerCollectSimpleCommand(address,
2890 alvherre 1220 ECB : secondaryObject,
1221 : stmt);
3634 tgl 1222 : }
961 tgl 1223 GIC 7911 : else if (IsA(stmt, TableLikeClause))
1224 : {
1225 : /*
961 tgl 1226 ECB : * Do delayed processing of LIKE options. This
1227 : * will result in additional sub-statements for us
1228 : * to process. Those should get done before any
1229 : * remaining actions, so prepend them to "stmts".
1230 : */
961 tgl 1231 GIC 313 : TableLikeClause *like = (TableLikeClause *) stmt;
1232 : List *morestmts;
1233 :
938 tgl 1234 CBC 313 : Assert(table_rv != NULL);
1235 :
938 tgl 1236 GIC 313 : morestmts = expandTableLikeClause(table_rv, like);
871 tgl 1237 CBC 313 : stmts = list_concat(morestmts, stmts);
1238 : }
3634 tgl 1239 ECB : else
1240 : {
1241 : /*
1242 : * Recurse for anything else. Note the recursive
1243 : * call will stash the objects so created into our
1244 : * event trigger context.
1245 : */
1246 : PlannedStmt *wrapper;
1247 :
2276 tgl 1248 GIC 7598 : wrapper = makeNode(PlannedStmt);
1249 7598 : wrapper->commandType = CMD_UTILITY;
1250 7598 : wrapper->canSetTag = false;
2276 tgl 1251 CBC 7598 : wrapper->utilityStmt = stmt;
1252 7598 : wrapper->stmt_location = pstmt->stmt_location;
1253 7598 : wrapper->stmt_len = pstmt->stmt_len;
2276 tgl 1254 ECB :
2276 tgl 1255 CBC 7598 : ProcessUtility(wrapper,
3634 tgl 1256 ECB : queryString,
1257 : false,
3633 1258 : PROCESS_UTILITY_SUBCOMMAND,
1259 : params,
1260 : NULL,
1261 : None_Receiver,
1262 : NULL);
1263 : }
1264 :
1265 : /* Need CCI between commands */
871 tgl 1266 GIC 24404 : if (stmts != NIL)
3634 1267 7908 : CommandCounterIncrement();
1268 : }
2890 alvherre 1269 ECB :
1270 : /*
1271 : * The multiple commands generated here are stashed
1272 : * individually, so disable collection below.
1273 : */
2890 alvherre 1274 GIC 16500 : commandCollected = true;
1275 : }
3634 tgl 1276 16500 : break;
3634 tgl 1277 ECB :
3634 tgl 1278 GIC 44956 : case T_AlterTableStmt:
3634 tgl 1279 ECB : {
3634 tgl 1280 GIC 44956 : AlterTableStmt *atstmt = (AlterTableStmt *) parsetree;
3634 tgl 1281 ECB : Oid relid;
1282 : LOCKMODE lockmode;
745 alvherre 1283 : ListCell *cell;
1284 :
1285 : /*
1286 : * Disallow ALTER TABLE .. DETACH CONCURRENTLY in a
1287 : * transaction block or function. (Perhaps it could be
1288 : * allowed in a procedure, but don't hold your breath.)
1289 : */
745 alvherre 1290 GIC 90653 : foreach(cell, atstmt->cmds)
1291 : {
1292 45700 : AlterTableCmd *cmd = (AlterTableCmd *) lfirst(cell);
745 alvherre 1293 ECB :
1294 : /* Disallow DETACH CONCURRENTLY in a transaction block */
745 alvherre 1295 CBC 45700 : if (cmd->subtype == AT_DetachPartition)
1296 : {
745 alvherre 1297 GIC 261 : if (((PartitionCmd *) cmd->def)->concurrent)
745 alvherre 1298 CBC 82 : PreventInTransactionBlock(isTopLevel,
1299 : "ALTER TABLE ... DETACH CONCURRENTLY");
745 alvherre 1300 ECB : }
1301 : }
1302 :
1303 : /*
1304 : * Figure out lock mode, and acquire lock. This also does
1305 : * basic permissions checks, so that we won't wait for a
1306 : * lock on (for example) a relation on which we have no
1307 : * permissions.
1308 : */
3634 tgl 1309 GIC 44953 : lockmode = AlterTableGetLockLevel(atstmt->cmds);
1310 44953 : relid = AlterTableLookupRelation(atstmt, lockmode);
1311 :
3634 tgl 1312 CBC 44911 : if (OidIsValid(relid))
3634 tgl 1313 ECB : {
1314 : AlterTableUtilityContext atcontext;
1180 1315 :
1316 : /* Set up info needed for recursive callbacks ... */
1180 tgl 1317 GIC 44842 : atcontext.pstmt = pstmt;
1318 44842 : atcontext.queryString = queryString;
1319 44842 : atcontext.relid = relid;
1180 tgl 1320 CBC 44842 : atcontext.params = params;
1321 44842 : atcontext.queryEnv = queryEnv;
3634 tgl 1322 ECB :
2890 alvherre 1323 : /* ... ensure we have an event trigger context ... */
2890 alvherre 1324 CBC 44842 : EventTriggerAlterTableStart(parsetree);
2890 alvherre 1325 GIC 44842 : EventTriggerAlterTableRelid(relid);
1326 :
3634 tgl 1327 ECB : /* ... and do it */
1180 tgl 1328 CBC 44842 : AlterTable(atstmt, lockmode, &atcontext);
1329 :
1330 : /* done */
2890 alvherre 1331 43514 : EventTriggerAlterTableEnd();
1332 : }
1333 : else
3634 tgl 1334 69 : ereport(NOTICE,
1335 : (errmsg("relation \"%s\" does not exist, skipping",
1336 : atstmt->relation->relname)));
3634 tgl 1337 ECB : }
1338 :
1339 : /* ALTER TABLE stashes commands internally */
2890 alvherre 1340 GIC 43583 : commandCollected = true;
3634 tgl 1341 43583 : break;
1342 :
3634 tgl 1343 CBC 117 : case T_AlterDomainStmt:
3634 tgl 1344 ECB : {
3634 tgl 1345 GIC 117 : AlterDomainStmt *stmt = (AlterDomainStmt *) parsetree;
3634 tgl 1346 ECB :
1347 : /*
1348 : * Some or all of these functions are recursive to cover
1349 : * inherited things, so permission checks are done there.
1350 : */
3634 tgl 1351 GIC 117 : switch (stmt->subtype)
1352 : {
2118 1353 7 : case 'T': /* ALTER DOMAIN DEFAULT */
3634 tgl 1354 ECB :
1355 : /*
1356 : * Recursively alter column default for table and,
1357 : * if requested, for descendants
1358 : */
1359 : address =
2890 alvherre 1360 GIC 7 : AlterDomainDefault(stmt->typeName,
1361 : stmt->def);
3634 tgl 1362 7 : break;
2118 tgl 1363 CBC 6 : case 'N': /* ALTER DOMAIN DROP NOT NULL */
1364 : address =
2890 alvherre 1365 6 : AlterDomainNotNull(stmt->typeName,
2890 alvherre 1366 ECB : false);
3634 tgl 1367 GIC 6 : break;
2118 tgl 1368 CBC 12 : case 'O': /* ALTER DOMAIN SET NOT NULL */
1369 : address =
2890 alvherre 1370 12 : AlterDomainNotNull(stmt->typeName,
2890 alvherre 1371 ECB : true);
3634 tgl 1372 GIC 6 : break;
2118 tgl 1373 CBC 65 : case 'C': /* ADD CONSTRAINT */
1374 : address =
2890 alvherre 1375 65 : AlterDomainAddConstraint(stmt->typeName,
2890 alvherre 1376 ECB : stmt->def,
1377 : &secondaryObject);
3634 tgl 1378 CBC 35 : break;
2118 tgl 1379 GIC 21 : case 'X': /* DROP CONSTRAINT */
1380 : address =
2890 alvherre 1381 CBC 21 : AlterDomainDropConstraint(stmt->typeName,
1382 21 : stmt->name,
1383 : stmt->behavior,
1384 21 : stmt->missing_ok);
3634 tgl 1385 18 : break;
2118 tgl 1386 GIC 6 : case 'V': /* VALIDATE CONSTRAINT */
2890 alvherre 1387 ECB : address =
2890 alvherre 1388 CBC 6 : AlterDomainValidateConstraint(stmt->typeName,
1389 6 : stmt->name);
3634 tgl 1390 GIC 3 : break;
2118 tgl 1391 LBC 0 : default: /* oops */
3634 1392 0 : elog(ERROR, "unrecognized alter domain type: %d",
3634 tgl 1393 ECB : (int) stmt->subtype);
3634 tgl 1394 EUB : break;
1395 : }
1396 : }
3634 tgl 1397 GIC 75 : break;
1398 :
1399 : /*
3634 tgl 1400 ECB : * ************* object creation / destruction **************
1401 : */
3634 tgl 1402 GIC 18983 : case T_DefineStmt:
1403 : {
1404 18983 : DefineStmt *stmt = (DefineStmt *) parsetree;
3634 tgl 1405 ECB :
3634 tgl 1406 GIC 18983 : switch (stmt->kind)
3634 tgl 1407 ECB : {
3634 tgl 1408 GIC 449 : case OBJECT_AGGREGATE:
2890 alvherre 1409 ECB : address =
2406 peter_e 1410 GIC 449 : DefineAggregate(pstate, stmt->defnames, stmt->args,
2890 alvherre 1411 CBC 449 : stmt->oldstyle,
1412 : stmt->definition,
1482 rhodiumtoad 1413 449 : stmt->replace);
3634 tgl 1414 284 : break;
3634 tgl 1415 GIC 742 : case OBJECT_OPERATOR:
3634 tgl 1416 CBC 742 : Assert(stmt->args == NIL);
2890 alvherre 1417 742 : address = DefineOperator(stmt->defnames,
2878 bruce 1418 ECB : stmt->definition);
3634 tgl 1419 CBC 705 : break;
1420 180 : case OBJECT_TYPE:
3634 tgl 1421 GIC 180 : Assert(stmt->args == NIL);
2406 peter_e 1422 CBC 180 : address = DefineType(pstate,
2406 peter_e 1423 ECB : stmt->defnames,
2878 bruce 1424 : stmt->definition);
3634 tgl 1425 CBC 165 : break;
3634 tgl 1426 GIC 20 : case OBJECT_TSPARSER:
1427 20 : Assert(stmt->args == NIL);
2890 alvherre 1428 CBC 20 : address = DefineTSParser(stmt->defnames,
2878 bruce 1429 ECB : stmt->definition);
3634 tgl 1430 CBC 17 : break;
1431 8557 : case OBJECT_TSDICTIONARY:
3634 tgl 1432 GIC 8557 : Assert(stmt->args == NIL);
2890 alvherre 1433 CBC 8557 : address = DefineTSDictionary(stmt->defnames,
2878 bruce 1434 ECB : stmt->definition);
3634 tgl 1435 CBC 8545 : break;
1436 325 : case OBJECT_TSTEMPLATE:
3634 tgl 1437 GIC 325 : Assert(stmt->args == NIL);
2890 alvherre 1438 CBC 325 : address = DefineTSTemplate(stmt->defnames,
2878 bruce 1439 ECB : stmt->definition);
3634 tgl 1440 CBC 322 : break;
1441 8525 : case OBJECT_TSCONFIGURATION:
3634 tgl 1442 GIC 8525 : Assert(stmt->args == NIL);
2890 alvherre 1443 CBC 8525 : address = DefineTSConfiguration(stmt->defnames,
2878 bruce 1444 ECB : stmt->definition,
1445 : &secondaryObject);
3634 tgl 1446 CBC 8525 : break;
3634 tgl 1447 GIC 185 : case OBJECT_COLLATION:
1448 185 : Assert(stmt->args == NIL);
2406 peter_e 1449 CBC 185 : address = DefineCollation(pstate,
2406 peter_e 1450 ECB : stmt->defnames,
2251 1451 : stmt->definition,
2251 peter_e 1452 CBC 185 : stmt->if_not_exists);
3634 tgl 1453 GIC 112 : break;
3634 tgl 1454 UIC 0 : default:
3634 tgl 1455 LBC 0 : elog(ERROR, "unrecognized define stmt type: %d",
3634 tgl 1456 ECB : (int) stmt->kind);
3634 tgl 1457 EUB : break;
1458 : }
1459 : }
3634 tgl 1460 GIC 18675 : break;
1461 :
1462 5893 : case T_IndexStmt: /* CREATE INDEX */
3634 tgl 1463 ECB : {
3634 tgl 1464 GIC 5893 : IndexStmt *stmt = (IndexStmt *) parsetree;
3338 rhaas 1465 ECB : Oid relid;
1466 : LOCKMODE lockmode;
15 tgl 1467 GNC 5893 : int nparts = -1;
961 tgl 1468 ECB : bool is_alter_table;
1469 :
3634 tgl 1470 GIC 5893 : if (stmt->concurrent)
1878 peter_e 1471 CBC 92 : PreventInTransactionBlock(isTopLevel,
1472 : "CREATE INDEX CONCURRENTLY");
1473 :
3338 rhaas 1474 ECB : /*
1475 : * Look up the relation OID just once, right here at the
1476 : * beginning, so that we don't end up repeating the name
1477 : * lookup later and latching onto a different relation
1478 : * partway through. To avoid lock upgrade hazards, it's
1479 : * important that we take the strongest lock that will
1480 : * eventually be needed here, so the lockmode calculation
1481 : * needs to match what DefineIndex() does.
1482 : */
3338 rhaas 1483 GIC 11774 : lockmode = stmt->concurrent ? ShareUpdateExclusiveLock
1484 5887 : : ShareLock;
1485 : relid =
1486 5887 : RangeVarGetRelidExtended(stmt->relation, lockmode,
1836 andres 1487 ECB : 0,
3338 rhaas 1488 : RangeVarCallbackOwnsRelation,
1489 : NULL);
3634 tgl 1490 :
1491 : /*
1492 : * CREATE INDEX on partitioned tables (but not regular
1493 : * inherited tables) recurses to partitions, so we must
1494 : * acquire locks early to avoid deadlocks.
1495 : *
1496 : * We also take the opportunity to verify that all
1497 : * partitions are something we can put an index on, to
1498 : * avoid building some indexes only to fail later. While
1499 : * at it, also count the partitions, so that DefineIndex
1500 : * needn't do a duplicative find_all_inheritors search.
1501 : */
1791 alvherre 1502 GIC 5883 : if (stmt->relation->inh &&
1503 5798 : get_rel_relkind(relid) == RELKIND_PARTITIONED_TABLE)
1504 : {
1505 : ListCell *lc;
1506 547 : List *inheritors = NIL;
1507 :
1791 alvherre 1508 CBC 547 : inheritors = find_all_inheritors(relid, lockmode, NULL);
1509 1421 : foreach(lc, inheritors)
1510 : {
15 tgl 1511 GNC 880 : Oid partrelid = lfirst_oid(lc);
1512 880 : char relkind = get_rel_relkind(partrelid);
1791 alvherre 1513 ECB :
1791 alvherre 1514 GIC 880 : if (relkind != RELKIND_RELATION &&
1791 alvherre 1515 CBC 606 : relkind != RELKIND_MATVIEW &&
1383 1516 9 : relkind != RELKIND_PARTITIONED_TABLE &&
1517 : relkind != RELKIND_FOREIGN_TABLE)
1383 alvherre 1518 LBC 0 : elog(ERROR, "unexpected relkind \"%c\" on partition \"%s\"",
1383 alvherre 1519 ECB : relkind, stmt->relation->relname);
1520 :
1383 alvherre 1521 CBC 880 : if (relkind == RELKIND_FOREIGN_TABLE &&
1522 9 : (stmt->unique || stmt->primary))
1791 1523 6 : ereport(ERROR,
1524 : (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1383 alvherre 1525 EUB : errmsg("cannot create unique index on partitioned table \"%s\"",
1526 : stmt->relation->relname),
1527 : errdetail("Table \"%s\" contains partitions that are foreign tables.",
1791 alvherre 1528 ECB : stmt->relation->relname)));
1529 : }
1530 : /* count direct and indirect children, but not rel */
15 tgl 1531 GNC 541 : nparts = list_length(inheritors) - 1;
1791 alvherre 1532 CBC 541 : list_free(inheritors);
1533 : }
1534 :
1535 : /*
1536 : * If the IndexStmt is already transformed, it must have
1537 : * come from generateClonedIndexStmt, which in current
1538 : * usage means it came from expandTableLikeClause rather
1539 : * than from original parse analysis. And that means we
961 tgl 1540 ECB : * must treat it like ALTER TABLE ADD INDEX, not CREATE.
1541 : * (This is a bit grotty, but currently it doesn't seem
1542 : * worth adding a separate bool field for the purpose.)
1543 : */
961 tgl 1544 GIC 5877 : is_alter_table = stmt->transformed;
1545 :
1546 : /* Run parse analysis ... */
3338 rhaas 1547 5877 : stmt = transformIndexStmt(relid, stmt, queryString);
1548 :
1549 : /* ... and do it */
2890 alvherre 1550 5868 : EventTriggerAlterTableStart(parsetree);
1551 : address =
2118 tgl 1552 5868 : DefineIndex(relid, /* OID of heap relation */
2890 alvherre 1553 ECB : stmt,
1554 : InvalidOid, /* no predefined OID */
1555 : InvalidOid, /* no parent index */
1875 1556 : InvalidOid, /* no parent constraint */
1557 : nparts, /* # of partitions, or -1 */
1558 : is_alter_table,
1559 : true, /* check_rights */
2118 tgl 1560 : true, /* check_not_in_use */
1561 : false, /* skip_build */
1562 : false); /* quiet */
1563 :
1564 : /*
1565 : * Add the CREATE INDEX node itself to stash right away;
1566 : * if there were any commands stashed in the ALTER TABLE
1567 : * code, we need them to appear after this one.
1568 : */
2890 alvherre 1569 GIC 5686 : EventTriggerCollectSimpleCommand(address, secondaryObject,
1570 : parsetree);
1571 5686 : commandCollected = true;
1572 5686 : EventTriggerAlterTableEnd();
1573 : }
3634 tgl 1574 5686 : break;
1575 :
1576 452 : case T_CreateExtensionStmt:
2406 peter_e 1577 452 : address = CreateExtension(pstate, (CreateExtensionStmt *) parsetree);
3634 tgl 1578 432 : break;
3634 tgl 1579 ECB :
3634 tgl 1580 GIC 11 : case T_AlterExtensionStmt:
2406 peter_e 1581 CBC 11 : address = ExecAlterExtensionStmt(pstate, (AlterExtensionStmt *) parsetree);
3634 tgl 1582 11 : break;
1583 :
1584 87 : case T_AlterExtensionContentsStmt:
2890 alvherre 1585 GIC 87 : address = ExecAlterExtensionContentsStmt((AlterExtensionContentsStmt *) parsetree,
2878 bruce 1586 ECB : &secondaryObject);
3634 tgl 1587 CBC 86 : break;
3634 tgl 1588 ECB :
3634 tgl 1589 GIC 92 : case T_CreateFdwStmt:
633 dean.a.rasheed 1590 CBC 92 : address = CreateForeignDataWrapper(pstate, (CreateFdwStmt *) parsetree);
3634 tgl 1591 67 : break;
3634 tgl 1592 ECB :
3634 tgl 1593 GIC 61 : case T_AlterFdwStmt:
633 dean.a.rasheed 1594 CBC 61 : address = AlterForeignDataWrapper(pstate, (AlterFdwStmt *) parsetree);
3634 tgl 1595 24 : break;
1596 :
1597 133 : case T_CreateForeignServerStmt:
2890 alvherre 1598 GIC 133 : address = CreateForeignServer((CreateForeignServerStmt *) parsetree);
3634 tgl 1599 CBC 108 : break;
3634 tgl 1600 ECB :
3634 tgl 1601 CBC 107 : case T_AlterForeignServerStmt:
2890 alvherre 1602 GIC 107 : address = AlterForeignServer((AlterForeignServerStmt *) parsetree);
3634 tgl 1603 CBC 84 : break;
3634 tgl 1604 ECB :
3634 tgl 1605 CBC 118 : case T_CreateUserMappingStmt:
2890 alvherre 1606 GIC 118 : address = CreateUserMapping((CreateUserMappingStmt *) parsetree);
3634 tgl 1607 CBC 86 : break;
3634 tgl 1608 ECB :
3634 tgl 1609 CBC 55 : case T_AlterUserMappingStmt:
2890 alvherre 1610 GIC 55 : address = AlterUserMapping((AlterUserMappingStmt *) parsetree);
3634 tgl 1611 CBC 29 : break;
3634 tgl 1612 ECB :
3634 tgl 1613 CBC 62 : case T_DropUserMappingStmt:
3634 tgl 1614 GIC 62 : RemoveUserMapping((DropUserMappingStmt *) parsetree);
2890 alvherre 1615 ECB : /* no commands stashed for DROP */
2890 alvherre 1616 CBC 43 : commandCollected = true;
3634 tgl 1617 43 : break;
1618 :
3195 1619 22 : case T_ImportForeignSchemaStmt:
1620 22 : ImportForeignSchema((ImportForeignSchemaStmt *) parsetree);
2890 alvherre 1621 ECB : /* commands are stashed inside ImportForeignSchema */
2890 alvherre 1622 GIC 5 : commandCollected = true;
3195 tgl 1623 CBC 5 : break;
3195 tgl 1624 ECB :
3634 tgl 1625 GIC 315 : case T_CompositeTypeStmt: /* CREATE TYPE (composite) */
3634 tgl 1626 ECB : {
3634 tgl 1627 CBC 315 : CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree;
1628 :
2890 alvherre 1629 315 : address = DefineCompositeType(stmt->typevar,
2890 alvherre 1630 ECB : stmt->coldeflist);
1631 : }
3634 tgl 1632 CBC 309 : break;
3634 tgl 1633 ECB :
2118 tgl 1634 GIC 208 : case T_CreateEnumStmt: /* CREATE TYPE AS ENUM */
2890 alvherre 1635 CBC 208 : address = DefineEnum((CreateEnumStmt *) parsetree);
3634 tgl 1636 GIC 207 : break;
3634 tgl 1637 ECB :
2118 tgl 1638 GIC 76 : case T_CreateRangeStmt: /* CREATE TYPE AS RANGE */
633 dean.a.rasheed 1639 CBC 76 : address = DefineRange(pstate, (CreateRangeStmt *) parsetree);
3634 tgl 1640 GIC 64 : break;
1641 :
2118 tgl 1642 CBC 191 : case T_AlterEnumStmt: /* ALTER TYPE (enum) */
1643 tmunro 1643 GIC 191 : address = AlterEnum((AlterEnumStmt *) parsetree);
3634 tgl 1644 CBC 176 : break;
3634 tgl 1645 ECB :
3634 tgl 1646 CBC 44067 : case T_ViewStmt: /* CREATE VIEW */
2890 alvherre 1647 GIC 44067 : EventTriggerAlterTableStart(parsetree);
2276 tgl 1648 CBC 44067 : address = DefineView((ViewStmt *) parsetree, queryString,
2276 tgl 1649 ECB : pstmt->stmt_location, pstmt->stmt_len);
2890 alvherre 1650 CBC 44027 : EventTriggerCollectSimpleCommand(address, secondaryObject,
1651 : parsetree);
2890 alvherre 1652 ECB : /* stashed internally */
2890 alvherre 1653 CBC 44027 : commandCollected = true;
1654 44027 : EventTriggerAlterTableEnd();
3634 tgl 1655 GIC 44027 : break;
3634 tgl 1656 ECB :
3634 tgl 1657 CBC 35429 : case T_CreateFunctionStmt: /* CREATE FUNCTION */
2406 peter_e 1658 35429 : address = CreateFunction(pstate, (CreateFunctionStmt *) parsetree);
3634 tgl 1659 GIC 35186 : break;
3634 tgl 1660 ECB :
3634 tgl 1661 GIC 316 : case T_AlterFunctionStmt: /* ALTER FUNCTION */
2406 peter_e 1662 316 : address = AlterFunction(pstate, (AlterFunctionStmt *) parsetree);
3634 tgl 1663 CBC 301 : break;
3634 tgl 1664 ECB :
3634 tgl 1665 CBC 1031 : case T_RuleStmt: /* CREATE RULE */
2890 alvherre 1666 GIC 1031 : address = DefineRule((RuleStmt *) parsetree, queryString);
3634 tgl 1667 CBC 1009 : break;
3634 tgl 1668 ECB :
3634 tgl 1669 CBC 785 : case T_CreateSeqStmt:
2406 peter_e 1670 GIC 785 : address = DefineSequence(pstate, (CreateSeqStmt *) parsetree);
3634 tgl 1671 CBC 736 : break;
3634 tgl 1672 ECB :
3634 tgl 1673 CBC 593 : case T_AlterSeqStmt:
2406 peter_e 1674 GIC 593 : address = AlterSequence(pstate, (AlterSeqStmt *) parsetree);
3634 tgl 1675 CBC 569 : break;
3634 tgl 1676 ECB :
3634 tgl 1677 CBC 847 : case T_CreateTableAsStmt:
1191 peter 1678 GIC 847 : address = ExecCreateTableAs(pstate, (CreateTableAsStmt *) parsetree,
1133 alvherre 1679 ECB : params, queryEnv, qc);
3634 tgl 1680 CBC 791 : break;
3634 tgl 1681 ECB :
3634 tgl 1682 GIC 123 : case T_RefreshMatViewStmt:
2153 bruce 1683 ECB :
2890 alvherre 1684 : /*
2195 simon 1685 : * REFRESH CONCURRENTLY executes some DDL commands internally.
1686 : * Inhibit DDL command collection here to avoid those commands
2890 alvherre 1687 : * from showing up in the deparsed command queue. The refresh
1688 : * command itself is queued, which is enough.
1689 : */
2890 alvherre 1690 CBC 123 : EventTriggerInhibitCommandCollection();
185 drowley 1691 GNC 123 : PG_TRY(2);
2890 alvherre 1692 ECB : {
2890 alvherre 1693 GIC 123 : address = ExecRefreshMatView((RefreshMatViewStmt *) parsetree,
1694 : queryString, params, qc);
1695 : }
185 drowley 1696 GNC 33 : PG_FINALLY(2);
1697 : {
2890 alvherre 1698 GIC 123 : EventTriggerUndoInhibitCommandCollection();
1699 : }
185 drowley 1700 GNC 123 : PG_END_TRY(2);
3634 tgl 1701 CBC 90 : break;
1702 :
1703 1515 : case T_CreateTrigStmt:
2890 alvherre 1704 GIC 1515 : address = CreateTrigger((CreateTrigStmt *) parsetree,
1705 : queryString, InvalidOid, InvalidOid,
1843 alvherre 1706 ECB : InvalidOid, InvalidOid, InvalidOid,
1707 : InvalidOid, NULL, false, false);
3634 tgl 1708 CBC 1409 : break;
1709 :
1710 326 : case T_CreatePLangStmt:
2890 alvherre 1711 326 : address = CreateProceduralLanguage((CreatePLangStmt *) parsetree);
3634 tgl 1712 GIC 326 : break;
3634 tgl 1713 ECB :
3634 tgl 1714 CBC 1862 : case T_CreateDomainStmt:
2890 alvherre 1715 GIC 1862 : address = DefineDomain((CreateDomainStmt *) parsetree);
3634 tgl 1716 1850 : break;
1717 :
3634 tgl 1718 CBC 32 : case T_CreateConversionStmt:
2890 alvherre 1719 GIC 32 : address = CreateConversionCommand((CreateConversionStmt *) parsetree);
3634 tgl 1720 CBC 26 : break;
3634 tgl 1721 ECB :
3634 tgl 1722 CBC 135 : case T_CreateCastStmt:
2890 alvherre 1723 GIC 135 : address = CreateCast((CreateCastStmt *) parsetree);
3634 tgl 1724 CBC 132 : break;
3634 tgl 1725 ECB :
3634 tgl 1726 CBC 183 : case T_CreateOpClassStmt:
3634 tgl 1727 GIC 183 : DefineOpClass((CreateOpClassStmt *) parsetree);
2890 alvherre 1728 ECB : /* command is stashed in DefineOpClass */
2890 alvherre 1729 CBC 183 : commandCollected = true;
3634 tgl 1730 183 : break;
1731 :
1732 74 : case T_CreateOpFamilyStmt:
2890 alvherre 1733 74 : address = DefineOpFamily((CreateOpFamilyStmt *) parsetree);
324 alvherre 1734 ECB :
1735 : /*
1736 : * DefineOpFamily calls EventTriggerCollectSimpleCommand
1737 : * directly.
1738 : */
324 alvherre 1739 CBC 74 : commandCollected = true;
3634 tgl 1740 74 : break;
1741 :
2905 peter_e 1742 25 : case T_CreateTransformStmt:
2844 alvherre 1743 25 : address = CreateTransform((CreateTransformStmt *) parsetree);
2905 peter_e 1744 GIC 20 : break;
1745 :
3634 tgl 1746 223 : case T_AlterOpFamilyStmt:
1747 223 : AlterOpFamily((AlterOpFamilyStmt *) parsetree);
1748 : /* commands are stashed in AlterOpFamily */
2890 alvherre 1749 CBC 145 : commandCollected = true;
3634 tgl 1750 145 : break;
1751 :
1752 20 : case T_AlterTSDictionaryStmt:
2890 alvherre 1753 20 : address = AlterTSDictionary((AlterTSDictionaryStmt *) parsetree);
3634 tgl 1754 16 : break;
1755 :
1756 25548 : case T_AlterTSConfigurationStmt:
2299 sfrost 1757 25548 : AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree);
1758 :
2299 sfrost 1759 ECB : /*
1760 : * Commands are stashed in MakeConfigurationMapping and
1761 : * DropConfigurationMapping, which are called from
1762 : * AlterTSConfiguration
1763 : */
2299 sfrost 1764 CBC 25548 : commandCollected = true;
3634 tgl 1765 GIC 25548 : break;
3634 tgl 1766 ECB :
3134 sfrost 1767 CBC 15 : case T_AlterTableMoveAllStmt:
3134 sfrost 1768 GIC 15 : AlterTableMoveAll((AlterTableMoveAllStmt *) parsetree);
1769 : /* commands are stashed in AlterTableMoveAll */
2890 alvherre 1770 15 : commandCollected = true;
3134 sfrost 1771 15 : break;
1772 :
3634 tgl 1773 11307 : case T_DropStmt:
3634 tgl 1774 CBC 11307 : ExecDropStmt((DropStmt *) parsetree, isTopLevel);
2890 alvherre 1775 ECB : /* no commands stashed for DROP */
2890 alvherre 1776 GIC 10823 : commandCollected = true;
3634 tgl 1777 CBC 10823 : break;
3634 tgl 1778 ECB :
3634 tgl 1779 GIC 726 : case T_RenameStmt:
2890 alvherre 1780 CBC 726 : address = ExecRenameStmt((RenameStmt *) parsetree);
3634 tgl 1781 527 : break;
1782 :
2560 alvherre 1783 23 : case T_AlterObjectDependsStmt:
2560 alvherre 1784 ECB : address =
2560 alvherre 1785 GIC 23 : ExecAlterObjectDependsStmt((AlterObjectDependsStmt *) parsetree,
2560 alvherre 1786 ECB : &secondaryObject);
2560 alvherre 1787 CBC 23 : break;
1788 :
3634 tgl 1789 194 : case T_AlterObjectSchemaStmt:
2890 alvherre 1790 ECB : address =
2890 alvherre 1791 CBC 194 : ExecAlterObjectSchemaStmt((AlterObjectSchemaStmt *) parsetree,
1792 : &secondaryObject);
3634 tgl 1793 132 : break;
1794 :
1795 987 : case T_AlterOwnerStmt:
2890 alvherre 1796 GIC 987 : address = ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree);
3634 tgl 1797 CBC 863 : break;
1798 :
2826 heikki.linnakangas 1799 258 : case T_AlterOperatorStmt:
2826 heikki.linnakangas 1800 GIC 258 : address = AlterOperator((AlterOperatorStmt *) parsetree);
2826 heikki.linnakangas 1801 CBC 234 : break;
1802 :
1129 tgl 1803 30 : case T_AlterTypeStmt:
1129 tgl 1804 GIC 30 : address = AlterType((AlterTypeStmt *) parsetree);
1129 tgl 1805 CBC 24 : break;
1129 tgl 1806 ECB :
2967 alvherre 1807 CBC 18081 : case T_CommentStmt:
2890 alvherre 1808 GIC 18081 : address = CommentObject((CommentStmt *) parsetree);
2967 alvherre 1809 CBC 18005 : break;
2967 alvherre 1810 ECB :
2967 alvherre 1811 CBC 48129 : case T_GrantStmt:
2967 alvherre 1812 GIC 48129 : ExecuteGrantStmt((GrantStmt *) parsetree);
2890 alvherre 1813 ECB : /* commands are stashed in ExecGrantStmt_oids */
2890 alvherre 1814 CBC 48069 : commandCollected = true;
2967 1815 48069 : break;
1816 :
3634 tgl 1817 70 : case T_DropOwnedStmt:
1818 70 : DropOwnedObjects((DropOwnedStmt *) parsetree);
2890 alvherre 1819 ECB : /* no commands stashed for DROP */
2890 alvherre 1820 GIC 61 : commandCollected = true;
3634 tgl 1821 CBC 61 : break;
3634 tgl 1822 ECB :
3634 tgl 1823 GIC 80 : case T_AlterDefaultPrivilegesStmt:
2406 peter_e 1824 CBC 80 : ExecAlterDefaultPrivilegesStmt(pstate, (AlterDefaultPrivilegesStmt *) parsetree);
2890 alvherre 1825 77 : EventTriggerCollectAlterDefPrivs((AlterDefaultPrivilegesStmt *) parsetree);
2890 alvherre 1826 GIC 77 : commandCollected = true;
3634 tgl 1827 CBC 77 : break;
3634 tgl 1828 ECB :
3124 sfrost 1829 GIC 314 : case T_CreatePolicyStmt: /* CREATE POLICY */
2890 alvherre 1830 CBC 314 : address = CreatePolicy((CreatePolicyStmt *) parsetree);
3124 sfrost 1831 307 : break;
1832 :
2118 tgl 1833 42 : case T_AlterPolicyStmt: /* ALTER POLICY */
2890 alvherre 1834 42 : address = AlterPolicy((AlterPolicyStmt *) parsetree);
3124 sfrost 1835 36 : break;
3124 sfrost 1836 ECB :
2967 alvherre 1837 CBC 31 : case T_SecLabelStmt:
2890 alvherre 1838 GIC 31 : address = ExecSecLabelStmt((SecLabelStmt *) parsetree);
2967 alvherre 1839 CBC 12 : break;
2967 alvherre 1840 ECB :
2573 alvherre 1841 CBC 30 : case T_CreateAmStmt:
2573 alvherre 1842 GIC 30 : address = CreateAccessMethod((CreateAmStmt *) parsetree);
2573 alvherre 1843 CBC 18 : break;
2573 alvherre 1844 ECB :
2271 peter_e 1845 CBC 325 : case T_CreatePublicationStmt:
633 dean.a.rasheed 1846 GIC 325 : address = CreatePublication(pstate, (CreatePublicationStmt *) parsetree);
2271 peter_e 1847 CBC 255 : break;
2271 peter_e 1848 ECB :
2271 peter_e 1849 CBC 506 : case T_AlterPublicationStmt:
633 dean.a.rasheed 1850 GIC 506 : AlterPublication(pstate, (AlterPublicationStmt *) parsetree);
2153 bruce 1851 ECB :
2271 peter_e 1852 : /*
1853 : * AlterPublication calls EventTriggerCollectSimpleCommand
1854 : * directly
1855 : */
2271 peter_e 1856 CBC 404 : commandCollected = true;
1857 404 : break;
1858 :
1859 177 : case T_CreateSubscriptionStmt:
633 dean.a.rasheed 1860 177 : address = CreateSubscription(pstate,
1861 : (CreateSubscriptionStmt *) parsetree,
1862 : isTopLevel);
2271 peter_e 1863 GIC 107 : break;
1864 :
1865 198 : case T_AlterSubscriptionStmt:
633 dean.a.rasheed 1866 CBC 198 : address = AlterSubscription(pstate,
633 dean.a.rasheed 1867 ECB : (AlterSubscriptionStmt *) parsetree,
1868 : isTopLevel);
2271 peter_e 1869 CBC 144 : break;
2271 peter_e 1870 ECB :
2271 peter_e 1871 GIC 78 : case T_DropSubscriptionStmt:
2228 1872 78 : DropSubscription((DropSubscriptionStmt *) parsetree, isTopLevel);
2271 peter_e 1873 ECB : /* no commands stashed for DROP */
2271 peter_e 1874 GIC 72 : commandCollected = true;
2271 peter_e 1875 CBC 72 : break;
2271 peter_e 1876 ECB :
2207 alvherre 1877 GIC 291 : case T_CreateStatsStmt:
1878 : {
744 tomas.vondra 1879 ECB : Oid relid;
744 tomas.vondra 1880 GIC 291 : CreateStatsStmt *stmt = (CreateStatsStmt *) parsetree;
744 tomas.vondra 1881 CBC 291 : RangeVar *rel = (RangeVar *) linitial(stmt->relations);
744 tomas.vondra 1882 ECB :
744 tomas.vondra 1883 GIC 291 : if (!IsA(rel, RangeVar))
744 tomas.vondra 1884 LBC 0 : ereport(ERROR,
744 tomas.vondra 1885 ECB : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1886 : errmsg("only a single relation is allowed in CREATE STATISTICS")));
1887 :
1888 : /*
1889 : * CREATE STATISTICS will influence future execution plans
1890 : * but does not interfere with currently executing plans.
1891 : * So it should be enough to take ShareUpdateExclusiveLock
1892 : * on relation, conflicting with ANALYZE and other DDL
1893 : * that sets statistical information, but not with normal
744 tomas.vondra 1894 EUB : * queries.
1895 : *
1896 : * XXX RangeVarCallbackOwnsRelation not needed here, to
1897 : * keep the same behavior as before.
1898 : */
744 tomas.vondra 1899 GIC 291 : relid = RangeVarGetRelid(rel, ShareUpdateExclusiveLock, false);
1900 :
1901 : /* Run parse analysis ... */
1902 288 : stmt = transformStatsStmt(relid, stmt, queryString);
1903 :
1904 288 : address = CreateStatistics(stmt);
1905 : }
2207 alvherre 1906 249 : break;
1907 :
1307 tomas.vondra 1908 13 : case T_AlterStatsStmt:
1307 tomas.vondra 1909 CBC 13 : address = AlterStatistics((AlterStatsStmt *) parsetree);
1307 tomas.vondra 1910 GIC 10 : break;
1911 :
702 tmunro 1912 CBC 6 : case T_AlterCollationStmt:
702 tmunro 1913 GIC 6 : address = AlterCollation((AlterCollationStmt *) parsetree);
702 tmunro 1914 CBC 6 : break;
1915 :
3634 tgl 1916 LBC 0 : default:
3634 tgl 1917 UIC 0 : elog(ERROR, "unrecognized node type: %d",
3634 tgl 1918 ECB : (int) nodeTag(parsetree));
1919 : break;
1920 : }
1921 :
2890 alvherre 1922 : /*
1923 : * Remember the object so that ddl_command_end event triggers have
1924 : * access to it.
1925 : */
2890 alvherre 1926 GBC 279815 : if (!commandCollected)
1927 83846 : EventTriggerCollectSimpleCommand(address, secondaryObject,
1928 : parsetree);
1929 :
3634 tgl 1930 GIC 279815 : if (isCompleteQuery)
1931 : {
1932 271955 : EventTriggerSQLDrop(parsetree);
1933 271946 : EventTriggerDDLCommandEnd(parsetree);
1934 : }
1935 : }
1255 peter 1936 CBC 5112 : PG_FINALLY();
3634 tgl 1937 ECB : {
3634 tgl 1938 GIC 284918 : if (needCleanup)
1939 780 : EventTriggerEndCompleteQuery();
3634 tgl 1940 ECB : }
3634 tgl 1941 GIC 284918 : PG_END_TRY();
9770 scrappy 1942 CBC 279806 : }
7282 tgl 1943 ECB :
1944 : /*
1945 : * ProcessUtilityForAlterTable
1180 1946 : * Recursive entry from ALTER TABLE
1947 : *
1948 : * ALTER TABLE sometimes generates subcommands such as CREATE INDEX.
1949 : * It calls this, not the main entry point ProcessUtility, to execute
1950 : * such subcommands.
1951 : *
1952 : * stmt: the utility command to execute
1953 : * context: opaque passthrough struct with the info we need
1954 : *
1955 : * It's caller's responsibility to do CommandCounterIncrement after
1956 : * calling this, if needed.
1957 : */
1958 : void
1180 tgl 1959 GIC 195 : ProcessUtilityForAlterTable(Node *stmt, AlterTableUtilityContext *context)
1960 : {
1961 : PlannedStmt *wrapper;
1962 :
1963 : /*
1964 : * For event triggers, we must "close" the current complex-command set,
1965 : * and start a new one afterwards; this is needed to ensure the ordering
1966 : * of command events is consistent with the way they were executed.
1967 : */
1968 195 : EventTriggerAlterTableEnd();
1180 tgl 1969 ECB :
1970 : /* Create a suitable wrapper */
1180 tgl 1971 GIC 195 : wrapper = makeNode(PlannedStmt);
1972 195 : wrapper->commandType = CMD_UTILITY;
1973 195 : wrapper->canSetTag = false;
1974 195 : wrapper->utilityStmt = stmt;
1975 195 : wrapper->stmt_location = context->pstmt->stmt_location;
1976 195 : wrapper->stmt_len = context->pstmt->stmt_len;
1977 :
1180 tgl 1978 CBC 195 : ProcessUtility(wrapper,
1979 : context->queryString,
1980 : false,
1180 tgl 1981 ECB : PROCESS_UTILITY_SUBCOMMAND,
1982 : context->params,
1983 : context->queryEnv,
1984 : None_Receiver,
1985 : NULL);
1986 :
1180 tgl 1987 GIC 189 : EventTriggerAlterTableStart(context->pstmt->utilityStmt);
1180 tgl 1988 CBC 189 : EventTriggerAlterTableRelid(context->relid);
1180 tgl 1989 GIC 189 : }
1990 :
1991 : /*
1992 : * Dispatch function for DropStmt
1993 : */
1994 : static void
3634 1995 11354 : ExecDropStmt(DropStmt *stmt, bool isTopLevel)
1996 : {
3634 tgl 1997 CBC 11354 : switch (stmt->removeType)
3634 tgl 1998 ECB : {
3634 tgl 1999 CBC 369 : case OBJECT_INDEX:
3634 tgl 2000 GIC 369 : if (stmt->concurrent)
1878 peter_e 2001 73 : PreventInTransactionBlock(isTopLevel,
2002 : "DROP INDEX CONCURRENTLY");
2003 : /* fall through */
2004 :
3634 tgl 2005 ECB : case OBJECT_TABLE:
2006 : case OBJECT_SEQUENCE:
2007 : case OBJECT_VIEW:
2008 : case OBJECT_MATVIEW:
2009 : case OBJECT_FOREIGN_TABLE:
3634 tgl 2010 CBC 7479 : RemoveRelations(stmt);
2011 7330 : break;
3634 tgl 2012 GIC 3872 : default:
2013 3872 : RemoveObjects(stmt);
2014 3537 : break;
2015 : }
2016 10867 : }
2017 :
2018 :
2019 : /*
7278 tgl 2020 ECB : * UtilityReturnsTuples
2021 : * Return "true" if this utility statement will send output to the
2022 : * destination.
2023 : *
2024 : * Generally, there should be a case here for each case in ProcessUtility
2025 : * where "dest" is passed on.
2026 : */
2027 : bool
7278 tgl 2028 GIC 343720 : UtilityReturnsTuples(Node *parsetree)
2029 : {
2030 343720 : switch (nodeTag(parsetree))
2031 : {
1735 peter_e 2032 178 : case T_CallStmt:
2033 : {
2034 178 : CallStmt *stmt = (CallStmt *) parsetree;
2035 :
2036 178 : return (stmt->funcexpr->funcresulttype == RECORDOID);
2037 : }
7278 tgl 2038 CBC 2839 : case T_FetchStmt:
2039 : {
7188 bruce 2040 2839 : FetchStmt *stmt = (FetchStmt *) parsetree;
2041 : Portal portal;
7278 tgl 2042 ECB :
7278 tgl 2043 GIC 2839 : if (stmt->ismove)
7278 tgl 2044 CBC 47 : return false;
7278 tgl 2045 GIC 2792 : portal = GetPortalByName(stmt->portalname);
7278 tgl 2046 CBC 2792 : if (!PortalIsValid(portal))
2118 tgl 2047 GIC 17 : return false; /* not our business to raise error */
7278 tgl 2048 CBC 2775 : return portal->tupDesc ? true : false;
2049 : }
7278 tgl 2050 ECB :
7278 tgl 2051 GIC 4601 : case T_ExecuteStmt:
2052 : {
7278 tgl 2053 CBC 4601 : ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
7278 tgl 2054 ECB : PreparedStatement *entry;
2055 :
7278 tgl 2056 CBC 4601 : entry = FetchPreparedStatement(stmt->name, false);
2057 4601 : if (!entry)
2118 tgl 2058 LBC 0 : return false; /* not our business to raise error */
5871 tgl 2059 GIC 4601 : if (entry->plansource->resultDesc)
2060 4550 : return true;
7278 tgl 2061 CBC 51 : return false;
2062 : }
7278 tgl 2063 ECB :
7278 tgl 2064 GIC 13843 : case T_ExplainStmt:
2065 13843 : return true;
7278 tgl 2066 ECB :
7278 tgl 2067 CBC 381 : case T_VariableShowStmt:
7278 tgl 2068 GBC 381 : return true;
7278 tgl 2069 ECB :
7278 tgl 2070 CBC 321878 : default:
2071 321878 : return false;
2072 : }
2073 : }
7278 tgl 2074 ECB :
2075 : /*
2076 : * UtilityTupleDescriptor
2077 : * Fetch the actual output tuple descriptor for a utility statement
2078 : * for which UtilityReturnsTuples() previously returned "true".
2079 : *
2080 : * The returned descriptor is created in (or copied into) the current memory
2081 : * context.
2082 : */
2083 : TupleDesc
7278 tgl 2084 GIC 21622 : UtilityTupleDescriptor(Node *parsetree)
2085 : {
2086 21622 : switch (nodeTag(parsetree))
2087 : {
1735 peter_e 2088 73 : case T_CallStmt:
2089 73 : return CallStmtResultDesc((CallStmt *) parsetree);
2090 :
7278 tgl 2091 2775 : case T_FetchStmt:
2092 : {
7188 bruce 2093 2775 : FetchStmt *stmt = (FetchStmt *) parsetree;
7188 bruce 2094 ECB : Portal portal;
2095 :
7278 tgl 2096 CBC 2775 : if (stmt->ismove)
7278 tgl 2097 UIC 0 : return NULL;
7278 tgl 2098 CBC 2775 : portal = GetPortalByName(stmt->portalname);
2099 2775 : if (!PortalIsValid(portal))
7188 bruce 2100 UIC 0 : return NULL; /* not our business to raise error */
7278 tgl 2101 CBC 2775 : return CreateTupleDescCopy(portal->tupDesc);
2102 : }
7278 tgl 2103 ECB :
7278 tgl 2104 GIC 4550 : case T_ExecuteStmt:
2105 : {
7278 tgl 2106 CBC 4550 : ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
7278 tgl 2107 EUB : PreparedStatement *entry;
7278 tgl 2108 ECB :
7278 tgl 2109 CBC 4550 : entry = FetchPreparedStatement(stmt->name, false);
7278 tgl 2110 GBC 4550 : if (!entry)
7188 bruce 2111 LBC 0 : return NULL; /* not our business to raise error */
7278 tgl 2112 GIC 4550 : return FetchPreparedStatementResultDesc(entry);
2113 : }
7278 tgl 2114 ECB :
7278 tgl 2115 GIC 13843 : case T_ExplainStmt:
7278 tgl 2116 CBC 13843 : return ExplainResultDesc((ExplainStmt *) parsetree);
2117 :
7278 tgl 2118 GIC 381 : case T_VariableShowStmt:
7278 tgl 2119 ECB : {
7278 tgl 2120 CBC 381 : VariableShowStmt *n = (VariableShowStmt *) parsetree;
7278 tgl 2121 EUB :
7278 tgl 2122 CBC 381 : return GetPGVariableResultDesc(n->name);
2123 : }
2124 :
7278 tgl 2125 LBC 0 : default:
2126 0 : return NULL;
2127 : }
7278 tgl 2128 ECB : }
2129 :
7282 2130 :
2131 : /*
6084 2132 : * QueryReturnsTuples
2133 : * Return "true" if this Query will send output to the destination.
2134 : */
5892 tgl 2135 EUB : #ifdef NOT_USED
6084 2136 : bool
2137 : QueryReturnsTuples(Query *parsetree)
2138 : {
2139 : switch (parsetree->commandType)
2140 : {
2141 : case CMD_SELECT:
2142 : /* returns tuples */
2143 : return true;
2144 : case CMD_MERGE:
2145 : return false;
2146 : case CMD_INSERT:
2147 : case CMD_UPDATE:
2148 : case CMD_DELETE:
2149 : /* the forms with RETURNING return tuples */
2150 : if (parsetree->returningList)
2151 : return true;
2152 : break;
2153 : case CMD_UTILITY:
2154 : return UtilityReturnsTuples(parsetree->utilityStmt);
2155 : case CMD_UNKNOWN:
2156 : case CMD_NOTHING:
2157 : /* probably shouldn't get here */
2158 : break;
2159 : }
2160 : return false; /* default */
2161 : }
2162 : #endif
2163 :
2164 :
2165 : /*
2166 : * UtilityContainsQuery
2167 : * Return the contained Query, or NULL if there is none
2168 : *
2169 : * Certain utility statements, such as EXPLAIN, contain a plannable Query.
2170 : * This function encapsulates knowledge of exactly which ones do.
2171 : * We assume it is invoked only on already-parse-analyzed statements
2172 : * (else the contained parsetree isn't a Query yet).
2173 : *
2174 : * In some cases (currently, only EXPLAIN of CREATE TABLE AS/SELECT INTO and
2175 : * CREATE MATERIALIZED VIEW), potentially Query-containing utility statements
2176 : * can be nested. This function will drill down to a non-utility Query, or
2177 : * return NULL if none.
2178 : */
2179 : Query *
4038 tgl 2180 GIC 22992 : UtilityContainsQuery(Node *parsetree)
2181 : {
2182 : Query *qry;
2183 :
2184 22992 : switch (nodeTag(parsetree))
2185 : {
2276 2186 1586 : case T_DeclareCursorStmt:
2264 2187 1586 : qry = castNode(Query, ((DeclareCursorStmt *) parsetree)->query);
2276 2188 1586 : if (qry->commandType == CMD_UTILITY)
2276 tgl 2189 UIC 0 : return UtilityContainsQuery(qry->utilityStmt);
2276 tgl 2190 CBC 1586 : return qry;
2191 :
4038 tgl 2192 GIC 7832 : case T_ExplainStmt:
2264 2193 7832 : qry = castNode(Query, ((ExplainStmt *) parsetree)->query);
3938 tgl 2194 CBC 7832 : if (qry->commandType == CMD_UTILITY)
3938 tgl 2195 GIC 30 : return UtilityContainsQuery(qry->utilityStmt);
3938 tgl 2196 CBC 7802 : return qry;
4038 tgl 2197 ECB :
4038 tgl 2198 CBC 33 : case T_CreateTableAsStmt:
2264 tgl 2199 GBC 33 : qry = castNode(Query, ((CreateTableAsStmt *) parsetree)->query);
3824 tgl 2200 CBC 33 : if (qry->commandType == CMD_UTILITY)
3824 tgl 2201 UIC 0 : return UtilityContainsQuery(qry->utilityStmt);
3824 tgl 2202 CBC 33 : return qry;
4038 tgl 2203 ECB :
4038 tgl 2204 CBC 13541 : default:
2205 13541 : return NULL;
4038 tgl 2206 ECB : }
2207 : }
2208 :
2209 :
4442 2210 : /*
4442 tgl 2211 EUB : * AlterObjectTypeCommandTag
4442 tgl 2212 ECB : * helper function for CreateCommandTag
2213 : *
2214 : * This covers most cases where ALTER is used with an ObjectType enum.
2215 : */
2216 : static CommandTag
4442 tgl 2217 GIC 53315 : AlterObjectTypeCommandTag(ObjectType objtype)
2218 : {
2219 : CommandTag tag;
2220 :
2221 53315 : switch (objtype)
2222 : {
2223 208 : case OBJECT_AGGREGATE:
1133 alvherre 2224 208 : tag = CMDTAG_ALTER_AGGREGATE;
4442 tgl 2225 208 : break;
2226 24 : case OBJECT_ATTRIBUTE:
1133 alvherre 2227 CBC 24 : tag = CMDTAG_ALTER_TYPE;
4442 tgl 2228 GIC 24 : break;
4442 tgl 2229 UIC 0 : case OBJECT_CAST:
1133 alvherre 2230 0 : tag = CMDTAG_ALTER_CAST;
4442 tgl 2231 LBC 0 : break;
4439 peter_e 2232 GIC 74 : case OBJECT_COLLATION:
1133 alvherre 2233 CBC 74 : tag = CMDTAG_ALTER_COLLATION;
4439 peter_e 2234 74 : break;
4442 tgl 2235 LBC 0 : case OBJECT_COLUMN:
1133 alvherre 2236 0 : tag = CMDTAG_ALTER_TABLE;
4442 tgl 2237 0 : break;
4442 tgl 2238 CBC 72 : case OBJECT_CONVERSION:
1133 alvherre 2239 GBC 72 : tag = CMDTAG_ALTER_CONVERSION;
4442 tgl 2240 72 : break;
2241 18 : case OBJECT_DATABASE:
1133 alvherre 2242 CBC 18 : tag = CMDTAG_ALTER_DATABASE;
4442 tgl 2243 18 : break;
2244 52 : case OBJECT_DOMAIN:
3029 alvherre 2245 EUB : case OBJECT_DOMCONSTRAINT:
1133 alvherre 2246 GBC 52 : tag = CMDTAG_ALTER_DOMAIN;
4442 tgl 2247 52 : break;
4442 tgl 2248 CBC 6 : case OBJECT_EXTENSION:
1133 alvherre 2249 6 : tag = CMDTAG_ALTER_EXTENSION;
4442 tgl 2250 6 : break;
2251 44 : case OBJECT_FDW:
1133 alvherre 2252 44 : tag = CMDTAG_ALTER_FOREIGN_DATA_WRAPPER;
4442 tgl 2253 44 : break;
2254 92 : case OBJECT_FOREIGN_SERVER:
1133 alvherre 2255 GIC 92 : tag = CMDTAG_ALTER_SERVER;
4442 tgl 2256 CBC 92 : break;
2257 506 : case OBJECT_FOREIGN_TABLE:
1133 alvherre 2258 506 : tag = CMDTAG_ALTER_FOREIGN_TABLE;
4442 tgl 2259 506 : break;
2260 638 : case OBJECT_FUNCTION:
1133 alvherre 2261 638 : tag = CMDTAG_ALTER_FUNCTION;
4442 tgl 2262 638 : break;
2263 830 : case OBJECT_INDEX:
1133 alvherre 2264 830 : tag = CMDTAG_ALTER_INDEX;
4442 tgl 2265 830 : break;
2266 56 : case OBJECT_LANGUAGE:
1133 alvherre 2267 56 : tag = CMDTAG_ALTER_LANGUAGE;
4442 tgl 2268 56 : break;
2269 12 : case OBJECT_LARGEOBJECT:
1133 alvherre 2270 12 : tag = CMDTAG_ALTER_LARGE_OBJECT;
4442 tgl 2271 12 : break;
2272 102 : case OBJECT_OPCLASS:
1133 alvherre 2273 102 : tag = CMDTAG_ALTER_OPERATOR_CLASS;
4442 tgl 2274 102 : break;
2275 64 : case OBJECT_OPERATOR:
1133 alvherre 2276 64 : tag = CMDTAG_ALTER_OPERATOR;
4442 tgl 2277 64 : break;
2278 110 : case OBJECT_OPFAMILY:
1133 alvherre 2279 110 : tag = CMDTAG_ALTER_OPERATOR_FAMILY;
4442 tgl 2280 110 : break;
3124 sfrost 2281 27 : case OBJECT_POLICY:
1133 alvherre 2282 27 : tag = CMDTAG_ALTER_POLICY;
3124 sfrost 2283 27 : break;
1956 peter_e 2284 18 : case OBJECT_PROCEDURE:
1133 alvherre 2285 18 : tag = CMDTAG_ALTER_PROCEDURE;
1956 peter_e 2286 18 : break;
4442 tgl 2287 15 : case OBJECT_ROLE:
1133 alvherre 2288 15 : tag = CMDTAG_ALTER_ROLE;
4442 tgl 2289 15 : break;
1956 peter_e 2290 24 : case OBJECT_ROUTINE:
1133 alvherre 2291 24 : tag = CMDTAG_ALTER_ROUTINE;
1956 peter_e 2292 24 : break;
4442 tgl 2293 34 : case OBJECT_RULE:
1133 alvherre 2294 34 : tag = CMDTAG_ALTER_RULE;
4442 tgl 2295 34 : break;
2296 72 : case OBJECT_SCHEMA:
1133 alvherre 2297 72 : tag = CMDTAG_ALTER_SCHEMA;
4442 tgl 2298 72 : break;
2299 76 : case OBJECT_SEQUENCE:
1133 alvherre 2300 76 : tag = CMDTAG_ALTER_SEQUENCE;
4442 tgl 2301 76 : break;
2302 49008 : case OBJECT_TABLE:
3029 alvherre 2303 ECB : case OBJECT_TABCONSTRAINT:
1133 alvherre 2304 CBC 49008 : tag = CMDTAG_ALTER_TABLE;
4442 tgl 2305 49008 : break;
2306 6 : case OBJECT_TABLESPACE:
1133 alvherre 2307 6 : tag = CMDTAG_ALTER_TABLESPACE;
4442 tgl 2308 6 : break;
2309 50 : case OBJECT_TRIGGER:
1133 alvherre 2310 50 : tag = CMDTAG_ALTER_TRIGGER;
4442 tgl 2311 50 : break;
3917 rhaas 2312 12 : case OBJECT_EVENT_TRIGGER:
1133 alvherre 2313 GIC 12 : tag = CMDTAG_ALTER_EVENT_TRIGGER;
3917 rhaas 2314 CBC 12 : break;
4442 tgl 2315 80 : case OBJECT_TSCONFIGURATION:
1133 alvherre 2316 80 : tag = CMDTAG_ALTER_TEXT_SEARCH_CONFIGURATION;
4442 tgl 2317 80 : break;
2318 90 : case OBJECT_TSDICTIONARY:
1133 alvherre 2319 90 : tag = CMDTAG_ALTER_TEXT_SEARCH_DICTIONARY;
4442 tgl 2320 90 : break;
2321 30 : case OBJECT_TSPARSER:
1133 alvherre 2322 30 : tag = CMDTAG_ALTER_TEXT_SEARCH_PARSER;
4442 tgl 2323 30 : break;
2324 30 : case OBJECT_TSTEMPLATE:
1133 alvherre 2325 30 : tag = CMDTAG_ALTER_TEXT_SEARCH_TEMPLATE;
4442 tgl 2326 30 : break;
2327 327 : case OBJECT_TYPE:
1133 alvherre 2328 327 : tag = CMDTAG_ALTER_TYPE;
4442 tgl 2329 327 : break;
2330 251 : case OBJECT_VIEW:
1133 alvherre 2331 251 : tag = CMDTAG_ALTER_VIEW;
4442 tgl 2332 251 : break;
3689 kgrittn 2333 85 : case OBJECT_MATVIEW:
1133 alvherre 2334 85 : tag = CMDTAG_ALTER_MATERIALIZED_VIEW;
3689 kgrittn 2335 85 : break;
2271 peter_e 2336 42 : case OBJECT_PUBLICATION:
1133 alvherre 2337 42 : tag = CMDTAG_ALTER_PUBLICATION;
2271 peter_e 2338 42 : break;
2339 50 : case OBJECT_SUBSCRIPTION:
1133 alvherre 2340 50 : tag = CMDTAG_ALTER_SUBSCRIPTION;
2205 2341 50 : break;
2207 2342 80 : case OBJECT_STATISTIC_EXT:
1133 2343 80 : tag = CMDTAG_ALTER_STATISTICS;
2271 peter_e 2344 80 : break;
4442 tgl 2345 LBC 0 : default:
1133 alvherre 2346 0 : tag = CMDTAG_UNKNOWN;
4442 tgl 2347 0 : break;
4442 tgl 2348 ECB : }
2349 :
4442 tgl 2350 CBC 53315 : return tag;
4442 tgl 2351 ECB : }
2352 :
7282 2353 : /*
2354 : * CreateCommandTag
1133 alvherre 2355 EUB : * utility to get a CommandTag for the command operation,
2276 tgl 2356 : * given either a raw (un-analyzed) parsetree, an analyzed Query,
2357 : * or a PlannedStmt.
2358 : *
2359 : * This must handle all command types, but since the vast majority
7282 tgl 2360 ECB : * of 'em are utility commands, it seems sensible to keep it here.
2361 : */
2362 : CommandTag
7282 tgl 2363 GIC 578740 : CreateCommandTag(Node *parsetree)
2364 : {
2365 : CommandTag tag;
2366 :
2367 578740 : switch (nodeTag(parsetree))
2368 : {
2369 : /* recurse if we're given a RawStmt */
2276 tgl 2370 UIC 0 : case T_RawStmt:
2371 0 : tag = CreateCommandTag(((RawStmt *) parsetree)->stmt);
2372 0 : break;
2276 tgl 2373 ECB :
2374 : /* raw plannable queries */
7282 tgl 2375 GIC 42240 : case T_InsertStmt:
1133 alvherre 2376 42240 : tag = CMDTAG_INSERT;
7282 tgl 2377 CBC 42240 : break;
2378 :
7282 tgl 2379 GIC 1842 : case T_DeleteStmt:
1133 alvherre 2380 GBC 1842 : tag = CMDTAG_DELETE;
7282 tgl 2381 1842 : break;
7282 tgl 2382 EUB :
7282 tgl 2383 GIC 7151 : case T_UpdateStmt:
1133 alvherre 2384 7151 : tag = CMDTAG_UPDATE;
7282 tgl 2385 CBC 7151 : break;
7282 tgl 2386 ECB :
377 alvherre 2387 CBC 459 : case T_MergeStmt:
377 alvherre 2388 GIC 459 : tag = CMDTAG_MERGE;
377 alvherre 2389 CBC 459 : break;
377 alvherre 2390 ECB :
7282 tgl 2391 CBC 119524 : case T_SelectStmt:
1133 alvherre 2392 GIC 119524 : tag = CMDTAG_SELECT;
7282 tgl 2393 CBC 119524 : break;
7282 tgl 2394 ECB :
825 tgl 2395 CBC 1768 : case T_PLAssignStmt:
825 tgl 2396 GIC 1768 : tag = CMDTAG_SELECT;
825 tgl 2397 CBC 1768 : break;
825 tgl 2398 ECB :
5624 bruce 2399 : /* utility statements --- same whether raw or cooked */
7282 tgl 2400 GIC 16370 : case T_TransactionStmt:
7282 tgl 2401 ECB : {
7282 tgl 2402 CBC 16370 : TransactionStmt *stmt = (TransactionStmt *) parsetree;
7282 tgl 2403 ECB :
7282 tgl 2404 GIC 16370 : switch (stmt->kind)
7282 tgl 2405 ECB : {
7282 tgl 2406 CBC 6551 : case TRANS_STMT_BEGIN:
1133 alvherre 2407 6551 : tag = CMDTAG_BEGIN;
7282 tgl 2408 GIC 6551 : break;
2409 :
7282 tgl 2410 CBC 761 : case TRANS_STMT_START:
1133 alvherre 2411 GIC 761 : tag = CMDTAG_START_TRANSACTION;
7282 tgl 2412 CBC 761 : break;
2413 :
2414 5664 : case TRANS_STMT_COMMIT:
1133 alvherre 2415 GIC 5664 : tag = CMDTAG_COMMIT;
7282 tgl 2416 CBC 5664 : break;
7282 tgl 2417 ECB :
7282 tgl 2418 CBC 1510 : case TRANS_STMT_ROLLBACK:
2419 : case TRANS_STMT_ROLLBACK_TO:
1133 alvherre 2420 1510 : tag = CMDTAG_ROLLBACK;
7282 tgl 2421 1510 : break;
7282 tgl 2422 ECB :
6830 tgl 2423 GIC 1003 : case TRANS_STMT_SAVEPOINT:
1133 alvherre 2424 CBC 1003 : tag = CMDTAG_SAVEPOINT;
6830 tgl 2425 1003 : break;
6830 tgl 2426 ECB :
6830 tgl 2427 GIC 144 : case TRANS_STMT_RELEASE:
1133 alvherre 2428 CBC 144 : tag = CMDTAG_RELEASE;
6830 tgl 2429 GIC 144 : break;
6830 tgl 2430 ECB :
6505 tgl 2431 CBC 390 : case TRANS_STMT_PREPARE:
1133 alvherre 2432 GIC 390 : tag = CMDTAG_PREPARE_TRANSACTION;
6505 tgl 2433 CBC 390 : break;
6505 tgl 2434 ECB :
6505 tgl 2435 CBC 311 : case TRANS_STMT_COMMIT_PREPARED:
1133 alvherre 2436 GIC 311 : tag = CMDTAG_COMMIT_PREPARED;
6505 tgl 2437 CBC 311 : break;
6505 tgl 2438 ECB :
6505 tgl 2439 CBC 36 : case TRANS_STMT_ROLLBACK_PREPARED:
1133 alvherre 2440 GIC 36 : tag = CMDTAG_ROLLBACK_PREPARED;
6505 tgl 2441 CBC 36 : break;
6505 tgl 2442 ECB :
7282 tgl 2443 LBC 0 : default:
1133 alvherre 2444 UIC 0 : tag = CMDTAG_UNKNOWN;
7282 tgl 2445 LBC 0 : break;
7282 tgl 2446 ECB : }
2447 : }
7282 tgl 2448 GIC 16370 : break;
7282 tgl 2449 ECB :
7282 tgl 2450 CBC 1432 : case T_DeclareCursorStmt:
1133 alvherre 2451 1432 : tag = CMDTAG_DECLARE_CURSOR;
7282 tgl 2452 GIC 1432 : break;
7282 tgl 2453 EUB :
7282 tgl 2454 GBC 1108 : case T_ClosePortalStmt:
5841 neilc 2455 EUB : {
5841 neilc 2456 GIC 1108 : ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
2457 :
5841 neilc 2458 CBC 1108 : if (stmt->portalname == NULL)
1133 alvherre 2459 GIC 6 : tag = CMDTAG_CLOSE_CURSOR_ALL;
5841 neilc 2460 ECB : else
1133 alvherre 2461 CBC 1102 : tag = CMDTAG_CLOSE_CURSOR;
5841 neilc 2462 ECB : }
7282 tgl 2463 GIC 1108 : break;
7282 tgl 2464 ECB :
7282 tgl 2465 GIC 3024 : case T_FetchStmt:
7282 tgl 2466 ECB : {
7282 tgl 2467 GIC 3024 : FetchStmt *stmt = (FetchStmt *) parsetree;
7282 tgl 2468 ECB :
1133 alvherre 2469 CBC 3024 : tag = (stmt->ismove) ? CMDTAG_MOVE : CMDTAG_FETCH;
2470 : }
7282 tgl 2471 3024 : break;
2472 :
2473 2217 : case T_CreateDomainStmt:
1133 alvherre 2474 GIC 2217 : tag = CMDTAG_CREATE_DOMAIN;
7282 tgl 2475 CBC 2217 : break;
2476 :
2477 1058 : case T_CreateSchemaStmt:
1133 alvherre 2478 GIC 1058 : tag = CMDTAG_CREATE_SCHEMA;
7282 tgl 2479 CBC 1058 : break;
2480 :
2481 32820 : case T_CreateStmt:
1133 alvherre 2482 GIC 32820 : tag = CMDTAG_CREATE_TABLE;
7282 tgl 2483 CBC 32820 : break;
7282 tgl 2484 ECB :
6869 tgl 2485 CBC 48 : case T_CreateTableSpaceStmt:
1133 alvherre 2486 GIC 48 : tag = CMDTAG_CREATE_TABLESPACE;
6869 tgl 2487 CBC 48 : break;
6869 tgl 2488 ECB :
6869 tgl 2489 CBC 30 : case T_DropTableSpaceStmt:
1133 alvherre 2490 GIC 30 : tag = CMDTAG_DROP_TABLESPACE;
6869 tgl 2491 CBC 30 : break;
6869 tgl 2492 ECB :
4842 rhaas 2493 CBC 12 : case T_AlterTableSpaceOptionsStmt:
1133 alvherre 2494 GIC 12 : tag = CMDTAG_ALTER_TABLESPACE;
4842 rhaas 2495 CBC 12 : break;
4842 rhaas 2496 ECB :
4443 tgl 2497 CBC 605 : case T_CreateExtensionStmt:
1133 alvherre 2498 GIC 605 : tag = CMDTAG_CREATE_EXTENSION;
4443 tgl 2499 CBC 605 : break;
4443 tgl 2500 ECB :
4440 tgl 2501 CBC 23 : case T_AlterExtensionStmt:
1133 alvherre 2502 GIC 23 : tag = CMDTAG_ALTER_EXTENSION;
4440 tgl 2503 CBC 23 : break;
4440 tgl 2504 ECB :
4441 tgl 2505 CBC 164 : case T_AlterExtensionContentsStmt:
1133 alvherre 2506 GIC 164 : tag = CMDTAG_ALTER_EXTENSION;
4442 tgl 2507 CBC 164 : break;
4442 tgl 2508 ECB :
5224 peter_e 2509 CBC 188 : case T_CreateFdwStmt:
1133 alvherre 2510 GIC 188 : tag = CMDTAG_CREATE_FOREIGN_DATA_WRAPPER;
5224 peter_e 2511 CBC 188 : break;
5224 peter_e 2512 ECB :
5224 peter_e 2513 CBC 122 : case T_AlterFdwStmt:
1133 alvherre 2514 GIC 122 : tag = CMDTAG_ALTER_FOREIGN_DATA_WRAPPER;
5224 peter_e 2515 CBC 122 : break;
5224 peter_e 2516 ECB :
5224 peter_e 2517 CBC 272 : case T_CreateForeignServerStmt:
1133 alvherre 2518 GIC 272 : tag = CMDTAG_CREATE_SERVER;
5224 peter_e 2519 CBC 272 : break;
5224 peter_e 2520 ECB :
5224 peter_e 2521 CBC 214 : case T_AlterForeignServerStmt:
1133 alvherre 2522 GIC 214 : tag = CMDTAG_ALTER_SERVER;
5224 peter_e 2523 CBC 214 : break;
5224 peter_e 2524 ECB :
5224 peter_e 2525 CBC 246 : case T_CreateUserMappingStmt:
1133 alvherre 2526 GIC 246 : tag = CMDTAG_CREATE_USER_MAPPING;
5224 peter_e 2527 CBC 246 : break;
5224 peter_e 2528 ECB :
5224 peter_e 2529 CBC 110 : case T_AlterUserMappingStmt:
1133 alvherre 2530 GIC 110 : tag = CMDTAG_ALTER_USER_MAPPING;
5224 peter_e 2531 CBC 110 : break;
5224 peter_e 2532 ECB :
5224 peter_e 2533 CBC 124 : case T_DropUserMappingStmt:
1133 alvherre 2534 GIC 124 : tag = CMDTAG_DROP_USER_MAPPING;
5224 peter_e 2535 CBC 124 : break;
5224 peter_e 2536 ECB :
4481 rhaas 2537 CBC 382 : case T_CreateForeignTableStmt:
1133 alvherre 2538 GIC 382 : tag = CMDTAG_CREATE_FOREIGN_TABLE;
4481 rhaas 2539 CBC 382 : break;
4481 rhaas 2540 ECB :
3195 tgl 2541 CBC 44 : case T_ImportForeignSchemaStmt:
1133 alvherre 2542 GIC 44 : tag = CMDTAG_IMPORT_FOREIGN_SCHEMA;
3195 tgl 2543 CBC 44 : break;
3195 tgl 2544 ECB :
7282 tgl 2545 CBC 22801 : case T_DropStmt:
7282 tgl 2546 GIC 22801 : switch (((DropStmt *) parsetree)->removeType)
7282 tgl 2547 ECB : {
7226 peter_e 2548 CBC 13219 : case OBJECT_TABLE:
1133 alvherre 2549 13219 : tag = CMDTAG_DROP_TABLE;
7282 tgl 2550 GIC 13219 : break;
7226 peter_e 2551 CBC 172 : case OBJECT_SEQUENCE:
1133 alvherre 2552 172 : tag = CMDTAG_DROP_SEQUENCE;
7282 tgl 2553 172 : break;
7226 peter_e 2554 GIC 801 : case OBJECT_VIEW:
1133 alvherre 2555 CBC 801 : tag = CMDTAG_DROP_VIEW;
7282 tgl 2556 801 : break;
3689 kgrittn 2557 GIC 120 : case OBJECT_MATVIEW:
1133 alvherre 2558 CBC 120 : tag = CMDTAG_DROP_MATERIALIZED_VIEW;
3689 kgrittn 2559 120 : break;
7226 peter_e 2560 754 : case OBJECT_INDEX:
1133 alvherre 2561 754 : tag = CMDTAG_DROP_INDEX;
7282 tgl 2562 754 : break;
7226 peter_e 2563 648 : case OBJECT_TYPE:
1133 alvherre 2564 648 : tag = CMDTAG_DROP_TYPE;
7282 tgl 2565 648 : break;
7226 peter_e 2566 374 : case OBJECT_DOMAIN:
1133 alvherre 2567 374 : tag = CMDTAG_DROP_DOMAIN;
7282 tgl 2568 374 : break;
4439 peter_e 2569 106 : case OBJECT_COLLATION:
1133 alvherre 2570 106 : tag = CMDTAG_DROP_COLLATION;
4439 peter_e 2571 106 : break;
7226 2572 36 : case OBJECT_CONVERSION:
1133 alvherre 2573 36 : tag = CMDTAG_DROP_CONVERSION;
7282 tgl 2574 36 : break;
7226 peter_e 2575 487 : case OBJECT_SCHEMA:
1133 alvherre 2576 487 : tag = CMDTAG_DROP_SCHEMA;
7282 tgl 2577 487 : break;
5710 2578 18 : case OBJECT_TSPARSER:
1133 alvherre 2579 18 : tag = CMDTAG_DROP_TEXT_SEARCH_PARSER;
5710 tgl 2580 18 : break;
2581 24 : case OBJECT_TSDICTIONARY:
1133 alvherre 2582 24 : tag = CMDTAG_DROP_TEXT_SEARCH_DICTIONARY;
5710 tgl 2583 24 : break;
2584 18 : case OBJECT_TSTEMPLATE:
1133 alvherre 2585 18 : tag = CMDTAG_DROP_TEXT_SEARCH_TEMPLATE;
5710 tgl 2586 18 : break;
2587 24 : case OBJECT_TSCONFIGURATION:
1133 alvherre 2588 24 : tag = CMDTAG_DROP_TEXT_SEARCH_CONFIGURATION;
5710 tgl 2589 24 : break;
4481 rhaas 2590 154 : case OBJECT_FOREIGN_TABLE:
1133 alvherre 2591 154 : tag = CMDTAG_DROP_FOREIGN_TABLE;
4481 rhaas 2592 154 : break;
4443 tgl 2593 100 : case OBJECT_EXTENSION:
1133 alvherre 2594 100 : tag = CMDTAG_DROP_EXTENSION;
4443 tgl 2595 100 : break;
4161 rhaas 2596 3148 : case OBJECT_FUNCTION:
1133 alvherre 2597 3148 : tag = CMDTAG_DROP_FUNCTION;
4161 rhaas 2598 3148 : break;
1956 peter_e 2599 144 : case OBJECT_PROCEDURE:
1133 alvherre 2600 144 : tag = CMDTAG_DROP_PROCEDURE;
1956 peter_e 2601 144 : break;
2602 30 : case OBJECT_ROUTINE:
1133 alvherre 2603 30 : tag = CMDTAG_DROP_ROUTINE;
1956 peter_e 2604 30 : break;
4161 rhaas 2605 104 : case OBJECT_AGGREGATE:
1133 alvherre 2606 104 : tag = CMDTAG_DROP_AGGREGATE;
4161 rhaas 2607 104 : break;
2608 170 : case OBJECT_OPERATOR:
1133 alvherre 2609 170 : tag = CMDTAG_DROP_OPERATOR;
4161 rhaas 2610 170 : break;
2611 26 : case OBJECT_LANGUAGE:
1133 alvherre 2612 26 : tag = CMDTAG_DROP_LANGUAGE;
4161 rhaas 2613 26 : break;
2614 54 : case OBJECT_CAST:
1133 alvherre 2615 54 : tag = CMDTAG_DROP_CAST;
4161 rhaas 2616 54 : break;
2617 726 : case OBJECT_TRIGGER:
1133 alvherre 2618 726 : tag = CMDTAG_DROP_TRIGGER;
4161 rhaas 2619 726 : break;
3917 2620 47 : case OBJECT_EVENT_TRIGGER:
1133 alvherre 2621 47 : tag = CMDTAG_DROP_EVENT_TRIGGER;
3917 rhaas 2622 47 : break;
4161 2623 212 : case OBJECT_RULE:
1133 alvherre 2624 212 : tag = CMDTAG_DROP_RULE;
4161 rhaas 2625 212 : break;
2626 144 : case OBJECT_FDW:
1133 alvherre 2627 144 : tag = CMDTAG_DROP_FOREIGN_DATA_WRAPPER;
4161 rhaas 2628 144 : break;
2629 126 : case OBJECT_FOREIGN_SERVER:
1133 alvherre 2630 126 : tag = CMDTAG_DROP_SERVER;
4161 rhaas 2631 126 : break;
2632 56 : case OBJECT_OPCLASS:
1133 alvherre 2633 56 : tag = CMDTAG_DROP_OPERATOR_CLASS;
4161 rhaas 2634 56 : break;
2635 113 : case OBJECT_OPFAMILY:
1133 alvherre 2636 113 : tag = CMDTAG_DROP_OPERATOR_FAMILY;
4161 rhaas 2637 113 : break;
3124 sfrost 2638 167 : case OBJECT_POLICY:
1133 alvherre 2639 167 : tag = CMDTAG_DROP_POLICY;
3124 sfrost 2640 167 : break;
2905 peter_e 2641 17 : case OBJECT_TRANSFORM:
1133 alvherre 2642 17 : tag = CMDTAG_DROP_TRANSFORM;
2905 peter_e 2643 17 : break;
2573 alvherre 2644 36 : case OBJECT_ACCESS_METHOD:
1133 2645 36 : tag = CMDTAG_DROP_ACCESS_METHOD;
2573 2646 36 : break;
2271 peter_e 2647 258 : case OBJECT_PUBLICATION:
1133 alvherre 2648 258 : tag = CMDTAG_DROP_PUBLICATION;
2206 peter_e 2649 258 : break;
2207 alvherre 2650 168 : case OBJECT_STATISTIC_EXT:
1133 2651 168 : tag = CMDTAG_DROP_STATISTICS;
2271 peter_e 2652 168 : break;
7282 tgl 2653 LBC 0 : default:
1133 alvherre 2654 0 : tag = CMDTAG_UNKNOWN;
7282 tgl 2655 ECB : }
7282 tgl 2656 CBC 22801 : break;
7282 tgl 2657 ECB :
7282 tgl 2658 CBC 641 : case T_TruncateStmt:
1133 alvherre 2659 641 : tag = CMDTAG_TRUNCATE_TABLE;
7282 tgl 2660 641 : break;
7282 tgl 2661 ECB :
7282 tgl 2662 CBC 18768 : case T_CommentStmt:
1133 alvherre 2663 GBC 18768 : tag = CMDTAG_COMMENT;
7282 tgl 2664 18768 : break;
2665 :
4577 rhaas 2666 CBC 84 : case T_SecLabelStmt:
1133 alvherre 2667 GIC 84 : tag = CMDTAG_SECURITY_LABEL;
4577 rhaas 2668 CBC 84 : break;
4577 rhaas 2669 ECB :
7282 tgl 2670 CBC 4504 : case T_CopyStmt:
1133 alvherre 2671 GIC 4504 : tag = CMDTAG_COPY;
7282 tgl 2672 CBC 4504 : break;
7282 tgl 2673 ECB :
7282 tgl 2674 CBC 1492 : case T_RenameStmt:
2675 :
1250 fujii 2676 ECB : /*
1180 tgl 2677 : * When the column is renamed, the command tag is created from its
2678 : * relation type
2679 : */
1165 alvherre 2680 CBC 1492 : tag = AlterObjectTypeCommandTag(((RenameStmt *) parsetree)->renameType == OBJECT_COLUMN ?
1180 tgl 2681 ECB : ((RenameStmt *) parsetree)->relationType :
2682 : ((RenameStmt *) parsetree)->renameType);
7282 tgl 2683 GIC 1492 : break;
7282 tgl 2684 ECB :
2560 alvherre 2685 GIC 46 : case T_AlterObjectDependsStmt:
2686 46 : tag = AlterObjectTypeCommandTag(((AlterObjectDependsStmt *) parsetree)->objectType);
2687 46 : break;
2688 :
6460 tgl 2689 396 : case T_AlterObjectSchemaStmt:
4442 tgl 2690 CBC 396 : tag = AlterObjectTypeCommandTag(((AlterObjectSchemaStmt *) parsetree)->objectType);
6460 tgl 2691 GIC 396 : break;
2692 :
6862 tgl 2693 CBC 1387 : case T_AlterOwnerStmt:
4442 tgl 2694 GIC 1387 : tag = AlterObjectTypeCommandTag(((AlterOwnerStmt *) parsetree)->objectType);
6862 tgl 2695 CBC 1387 : break;
6862 tgl 2696 ECB :
3153 sfrost 2697 CBC 30 : case T_AlterTableMoveAllStmt:
3153 sfrost 2698 GIC 30 : tag = AlterObjectTypeCommandTag(((AlterTableMoveAllStmt *) parsetree)->objtype);
3153 sfrost 2699 CBC 30 : break;
3153 sfrost 2700 ECB :
7282 tgl 2701 CBC 49964 : case T_AlterTableStmt:
1002 michael 2702 GIC 49964 : tag = AlterObjectTypeCommandTag(((AlterTableStmt *) parsetree)->objtype);
6806 bruce 2703 CBC 49964 : break;
6600 neilc 2704 ECB :
7282 tgl 2705 CBC 238 : case T_AlterDomainStmt:
1133 alvherre 2706 GIC 238 : tag = CMDTAG_ALTER_DOMAIN;
7282 tgl 2707 CBC 238 : break;
7282 tgl 2708 ECB :
6600 neilc 2709 CBC 403 : case T_AlterFunctionStmt:
1956 peter_e 2710 GIC 403 : switch (((AlterFunctionStmt *) parsetree)->objtype)
1956 peter_e 2711 ECB : {
1956 peter_e 2712 CBC 385 : case OBJECT_FUNCTION:
1133 alvherre 2713 385 : tag = CMDTAG_ALTER_FUNCTION;
1956 peter_e 2714 GIC 385 : break;
1956 peter_e 2715 CBC 18 : case OBJECT_PROCEDURE:
1133 alvherre 2716 18 : tag = CMDTAG_ALTER_PROCEDURE;
1956 peter_e 2717 18 : break;
1956 peter_e 2718 UIC 0 : case OBJECT_ROUTINE:
1133 alvherre 2719 LBC 0 : tag = CMDTAG_ALTER_ROUTINE;
1956 peter_e 2720 0 : break;
1956 peter_e 2721 UIC 0 : default:
1133 alvherre 2722 LBC 0 : tag = CMDTAG_UNKNOWN;
1956 peter_e 2723 ECB : }
6600 neilc 2724 CBC 403 : break;
6600 neilc 2725 ECB :
7282 tgl 2726 CBC 50122 : case T_GrantStmt:
7282 tgl 2727 ECB : {
7282 tgl 2728 GBC 50122 : GrantStmt *stmt = (GrantStmt *) parsetree;
7282 tgl 2729 EUB :
1133 alvherre 2730 GBC 50122 : tag = (stmt->is_grant) ? CMDTAG_GRANT : CMDTAG_REVOKE;
7282 tgl 2731 EUB : }
7282 tgl 2732 GBC 50122 : break;
2733 :
6494 tgl 2734 CBC 1142 : case T_GrantRoleStmt:
2735 : {
6385 bruce 2736 1142 : GrantRoleStmt *stmt = (GrantRoleStmt *) parsetree;
2737 :
1133 alvherre 2738 1142 : tag = (stmt->is_grant) ? CMDTAG_GRANT_ROLE : CMDTAG_REVOKE_ROLE;
2739 : }
6494 tgl 2740 1142 : break;
2741 :
4934 2742 175 : case T_AlterDefaultPrivilegesStmt:
1133 alvherre 2743 GIC 175 : tag = CMDTAG_ALTER_DEFAULT_PRIVILEGES;
4934 tgl 2744 CBC 175 : break;
2745 :
7282 2746 20074 : case T_DefineStmt:
7282 tgl 2747 GIC 20074 : switch (((DefineStmt *) parsetree)->kind)
7282 tgl 2748 ECB : {
7226 peter_e 2749 GIC 892 : case OBJECT_AGGREGATE:
1133 alvherre 2750 CBC 892 : tag = CMDTAG_CREATE_AGGREGATE;
7282 tgl 2751 GIC 892 : break;
7226 peter_e 2752 CBC 917 : case OBJECT_OPERATOR:
1133 alvherre 2753 917 : tag = CMDTAG_CREATE_OPERATOR;
7282 tgl 2754 917 : break;
7226 peter_e 2755 GIC 318 : case OBJECT_TYPE:
1133 alvherre 2756 CBC 318 : tag = CMDTAG_CREATE_TYPE;
7282 tgl 2757 318 : break;
5710 tgl 2758 GIC 40 : case OBJECT_TSPARSER:
1133 alvherre 2759 CBC 40 : tag = CMDTAG_CREATE_TEXT_SEARCH_PARSER;
5710 tgl 2760 40 : break;
2761 8628 : case OBJECT_TSDICTIONARY:
1133 alvherre 2762 8628 : tag = CMDTAG_CREATE_TEXT_SEARCH_DICTIONARY;
5710 tgl 2763 8628 : break;
2764 345 : case OBJECT_TSTEMPLATE:
1133 alvherre 2765 345 : tag = CMDTAG_CREATE_TEXT_SEARCH_TEMPLATE;
5710 tgl 2766 345 : break;
2767 8571 : case OBJECT_TSCONFIGURATION:
1133 alvherre 2768 8571 : tag = CMDTAG_CREATE_TEXT_SEARCH_CONFIGURATION;
5710 tgl 2769 8571 : break;
4439 peter_e 2770 363 : case OBJECT_COLLATION:
1133 alvherre 2771 363 : tag = CMDTAG_CREATE_COLLATION;
4439 peter_e 2772 363 : break;
2573 alvherre 2773 LBC 0 : case OBJECT_ACCESS_METHOD:
1133 2774 0 : tag = CMDTAG_CREATE_ACCESS_METHOD;
2573 2775 0 : break;
7282 tgl 2776 0 : default:
1133 alvherre 2777 0 : tag = CMDTAG_UNKNOWN;
7282 tgl 2778 ECB : }
7282 tgl 2779 CBC 20074 : break;
7282 tgl 2780 ECB :
7282 tgl 2781 CBC 640 : case T_CompositeTypeStmt:
1133 alvherre 2782 640 : tag = CMDTAG_CREATE_TYPE;
7282 tgl 2783 GBC 640 : break;
7282 tgl 2784 EUB :
5851 tgl 2785 GBC 298 : case T_CreateEnumStmt:
1133 alvherre 2786 298 : tag = CMDTAG_CREATE_TYPE;
5851 tgl 2787 298 : break;
2788 :
4175 heikki.linnakangas 2789 CBC 158 : case T_CreateRangeStmt:
1133 alvherre 2790 GIC 158 : tag = CMDTAG_CREATE_TYPE;
4175 heikki.linnakangas 2791 CBC 158 : break;
4175 heikki.linnakangas 2792 ECB :
4550 tgl 2793 CBC 390 : case T_AlterEnumStmt:
1133 alvherre 2794 GIC 390 : tag = CMDTAG_ALTER_TYPE;
4550 tgl 2795 CBC 390 : break;
4550 tgl 2796 ECB :
7282 tgl 2797 CBC 45410 : case T_ViewStmt:
1133 alvherre 2798 GIC 45410 : tag = CMDTAG_CREATE_VIEW;
7282 tgl 2799 CBC 45410 : break;
7282 tgl 2800 ECB :
7282 tgl 2801 CBC 38793 : case T_CreateFunctionStmt:
1956 peter_e 2802 GIC 38793 : if (((CreateFunctionStmt *) parsetree)->is_procedure)
1133 alvherre 2803 CBC 312 : tag = CMDTAG_CREATE_PROCEDURE;
1956 peter_e 2804 ECB : else
1133 alvherre 2805 CBC 38481 : tag = CMDTAG_CREATE_FUNCTION;
7282 tgl 2806 GIC 38793 : break;
7282 tgl 2807 ECB :
7282 tgl 2808 CBC 5490 : case T_IndexStmt:
1133 alvherre 2809 5490 : tag = CMDTAG_CREATE_INDEX;
7282 tgl 2810 GIC 5490 : break;
7282 tgl 2811 ECB :
7282 tgl 2812 CBC 1472 : case T_RuleStmt:
1133 alvherre 2813 1472 : tag = CMDTAG_CREATE_RULE;
7282 tgl 2814 GIC 1472 : break;
7282 tgl 2815 ECB :
7282 tgl 2816 CBC 612 : case T_CreateSeqStmt:
1133 alvherre 2817 GIC 612 : tag = CMDTAG_CREATE_SEQUENCE;
7282 tgl 2818 CBC 612 : break;
7282 tgl 2819 ECB :
7282 tgl 2820 CBC 214 : case T_AlterSeqStmt:
1133 alvherre 2821 GIC 214 : tag = CMDTAG_ALTER_SEQUENCE;
7282 tgl 2822 CBC 214 : break;
7282 tgl 2823 ECB :
4947 tgl 2824 CBC 502 : case T_DoStmt:
1133 alvherre 2825 GIC 502 : tag = CMDTAG_DO;
4947 tgl 2826 CBC 502 : break;
4947 tgl 2827 ECB :
7282 tgl 2828 CBC 808 : case T_CreatedbStmt:
1133 alvherre 2829 GIC 808 : tag = CMDTAG_CREATE_DATABASE;
7282 tgl 2830 CBC 808 : break;
7282 tgl 2831 ECB :
6461 tgl 2832 CBC 532 : case T_AlterDatabaseStmt:
2833 : case T_AlterDatabaseRefreshCollStmt:
7282 tgl 2834 ECB : case T_AlterDatabaseSetStmt:
1133 alvherre 2835 CBC 532 : tag = CMDTAG_ALTER_DATABASE;
7282 tgl 2836 532 : break;
2837 :
2838 36 : case T_DropdbStmt:
1133 alvherre 2839 36 : tag = CMDTAG_DROP_DATABASE;
7282 tgl 2840 36 : break;
2841 :
2842 44 : case T_NotifyStmt:
1133 alvherre 2843 GIC 44 : tag = CMDTAG_NOTIFY;
7282 tgl 2844 44 : break;
7282 tgl 2845 ECB :
7282 tgl 2846 CBC 37 : case T_ListenStmt:
1133 alvherre 2847 GIC 37 : tag = CMDTAG_LISTEN;
7282 tgl 2848 CBC 37 : break;
7282 tgl 2849 ECB :
7282 tgl 2850 CBC 19 : case T_UnlistenStmt:
1133 alvherre 2851 GIC 19 : tag = CMDTAG_UNLISTEN;
7282 tgl 2852 CBC 19 : break;
7282 tgl 2853 ECB :
7282 tgl 2854 CBC 26 : case T_LoadStmt:
1133 alvherre 2855 GIC 26 : tag = CMDTAG_LOAD;
7282 tgl 2856 CBC 26 : break;
7282 tgl 2857 ECB :
1956 peter_e 2858 CBC 193 : case T_CallStmt:
1133 alvherre 2859 GIC 193 : tag = CMDTAG_CALL;
1956 peter_e 2860 CBC 193 : break;
1956 peter_e 2861 ECB :
7282 tgl 2862 CBC 108 : case T_ClusterStmt:
1133 alvherre 2863 GIC 108 : tag = CMDTAG_CLUSTER;
7282 tgl 2864 CBC 108 : break;
7282 tgl 2865 ECB :
7282 tgl 2866 CBC 5026 : case T_VacuumStmt:
1483 rhaas 2867 GIC 5026 : if (((VacuumStmt *) parsetree)->is_vacuumcmd)
1133 alvherre 2868 CBC 2593 : tag = CMDTAG_VACUUM;
7282 tgl 2869 ECB : else
1133 alvherre 2870 CBC 2433 : tag = CMDTAG_ANALYZE;
7282 tgl 2871 GIC 5026 : break;
7282 tgl 2872 ECB :
7282 tgl 2873 CBC 9933 : case T_ExplainStmt:
1133 alvherre 2874 9933 : tag = CMDTAG_EXPLAIN;
7282 tgl 2875 GIC 9933 : break;
7282 tgl 2876 ECB :
4038 tgl 2877 CBC 1667 : case T_CreateTableAsStmt:
1002 michael 2878 1667 : switch (((CreateTableAsStmt *) parsetree)->objtype)
2879 : {
3689 kgrittn 2880 1196 : case OBJECT_TABLE:
2881 1196 : if (((CreateTableAsStmt *) parsetree)->is_select_into)
1133 alvherre 2882 GIC 28 : tag = CMDTAG_SELECT_INTO;
3689 kgrittn 2883 ECB : else
1133 alvherre 2884 CBC 1168 : tag = CMDTAG_CREATE_TABLE_AS;
3689 kgrittn 2885 1196 : break;
3689 kgrittn 2886 GIC 471 : case OBJECT_MATVIEW:
1133 alvherre 2887 CBC 471 : tag = CMDTAG_CREATE_MATERIALIZED_VIEW;
3689 kgrittn 2888 471 : break;
3689 kgrittn 2889 UIC 0 : default:
1133 alvherre 2890 LBC 0 : tag = CMDTAG_UNKNOWN;
3689 kgrittn 2891 ECB : }
3689 kgrittn 2892 CBC 1667 : break;
2893 :
2894 250 : case T_RefreshMatViewStmt:
1133 alvherre 2895 250 : tag = CMDTAG_REFRESH_MATERIALIZED_VIEW;
4038 tgl 2896 250 : break;
4038 tgl 2897 ECB :
3399 ishii 2898 CBC 85 : case T_AlterSystemStmt:
1133 alvherre 2899 GBC 85 : tag = CMDTAG_ALTER_SYSTEM;
3399 ishii 2900 85 : break;
2901 :
7282 tgl 2902 CBC 11190 : case T_VariableSetStmt:
5697 tgl 2903 GIC 11190 : switch (((VariableSetStmt *) parsetree)->kind)
5697 tgl 2904 ECB : {
5697 tgl 2905 CBC 9404 : case VAR_SET_VALUE:
5697 tgl 2906 ECB : case VAR_SET_CURRENT:
2907 : case VAR_SET_DEFAULT:
2908 : case VAR_SET_MULTI:
1133 alvherre 2909 CBC 9404 : tag = CMDTAG_SET;
5697 tgl 2910 9404 : break;
5697 tgl 2911 GIC 1786 : case VAR_RESET:
5697 tgl 2912 ECB : case VAR_RESET_ALL:
1133 alvherre 2913 CBC 1786 : tag = CMDTAG_RESET;
5697 tgl 2914 GIC 1786 : break;
5697 tgl 2915 LBC 0 : default:
1133 alvherre 2916 UIC 0 : tag = CMDTAG_UNKNOWN;
2917 : }
7282 tgl 2918 GIC 11190 : break;
7282 tgl 2919 ECB :
7282 tgl 2920 CBC 381 : case T_VariableShowStmt:
1133 alvherre 2921 381 : tag = CMDTAG_SHOW;
7282 tgl 2922 GIC 381 : break;
7282 tgl 2923 ECB :
5827 neilc 2924 CBC 15 : case T_DiscardStmt:
5697 tgl 2925 GBC 15 : switch (((DiscardStmt *) parsetree)->target)
5697 tgl 2926 EUB : {
5827 neilc 2927 GIC 3 : case DISCARD_ALL:
1133 alvherre 2928 CBC 3 : tag = CMDTAG_DISCARD_ALL;
5827 neilc 2929 GIC 3 : break;
5827 neilc 2930 CBC 2 : case DISCARD_PLANS:
1133 alvherre 2931 2 : tag = CMDTAG_DISCARD_PLANS;
5827 neilc 2932 2 : break;
5827 neilc 2933 GIC 4 : case DISCARD_TEMP:
1133 alvherre 2934 CBC 4 : tag = CMDTAG_DISCARD_TEMP;
5827 neilc 2935 4 : break;
3475 rhaas 2936 GIC 6 : case DISCARD_SEQUENCES:
1133 alvherre 2937 CBC 6 : tag = CMDTAG_DISCARD_SEQUENCES;
3475 rhaas 2938 6 : break;
5827 neilc 2939 LBC 0 : default:
1133 alvherre 2940 0 : tag = CMDTAG_UNKNOWN;
5841 neilc 2941 ECB : }
7282 tgl 2942 CBC 15 : break;
7282 tgl 2943 ECB :
2905 peter_e 2944 CBC 45 : case T_CreateTransformStmt:
1133 alvherre 2945 45 : tag = CMDTAG_CREATE_TRANSFORM;
2905 peter_e 2946 45 : break;
2905 peter_e 2947 ECB :
7282 tgl 2948 CBC 3059 : case T_CreateTrigStmt:
1133 alvherre 2949 GBC 3059 : tag = CMDTAG_CREATE_TRIGGER;
7282 tgl 2950 3059 : break;
2951 :
3917 rhaas 2952 CBC 79 : case T_CreateEventTrigStmt:
1133 alvherre 2953 GIC 79 : tag = CMDTAG_CREATE_EVENT_TRIGGER;
3917 rhaas 2954 CBC 79 : break;
3917 rhaas 2955 ECB :
3917 rhaas 2956 CBC 15 : case T_AlterEventTrigStmt:
1133 alvherre 2957 GIC 15 : tag = CMDTAG_ALTER_EVENT_TRIGGER;
3917 rhaas 2958 CBC 15 : break;
3917 rhaas 2959 ECB :
7282 tgl 2960 CBC 30 : case T_CreatePLangStmt:
1133 alvherre 2961 GIC 30 : tag = CMDTAG_CREATE_LANGUAGE;
7282 tgl 2962 CBC 30 : break;
7282 tgl 2963 ECB :
6494 tgl 2964 CBC 801 : case T_CreateRoleStmt:
1133 alvherre 2965 GIC 801 : tag = CMDTAG_CREATE_ROLE;
7282 tgl 2966 CBC 801 : break;
7282 tgl 2967 ECB :
6494 tgl 2968 CBC 197 : case T_AlterRoleStmt:
1133 alvherre 2969 GIC 197 : tag = CMDTAG_ALTER_ROLE;
7282 tgl 2970 CBC 197 : break;
7282 tgl 2971 ECB :
6494 tgl 2972 CBC 46 : case T_AlterRoleSetStmt:
1133 alvherre 2973 GIC 46 : tag = CMDTAG_ALTER_ROLE;
7282 tgl 2974 CBC 46 : break;
7282 tgl 2975 ECB :
6494 tgl 2976 CBC 803 : case T_DropRoleStmt:
1133 alvherre 2977 GIC 803 : tag = CMDTAG_DROP_ROLE;
7282 tgl 2978 CBC 803 : break;
7282 tgl 2979 ECB :
6348 alvherre 2980 CBC 151 : case T_DropOwnedStmt:
1133 alvherre 2981 GIC 151 : tag = CMDTAG_DROP_OWNED;
6348 alvherre 2982 CBC 151 : break;
6348 alvherre 2983 ECB :
6348 alvherre 2984 CBC 19 : case T_ReassignOwnedStmt:
1133 alvherre 2985 GIC 19 : tag = CMDTAG_REASSIGN_OWNED;
6348 alvherre 2986 CBC 19 : break;
6348 alvherre 2987 ECB :
7282 tgl 2988 CBC 522 : case T_LockStmt:
1133 alvherre 2989 GIC 522 : tag = CMDTAG_LOCK_TABLE;
7282 tgl 2990 CBC 522 : break;
7282 tgl 2991 ECB :
7282 tgl 2992 CBC 51 : case T_ConstraintsSetStmt:
1133 alvherre 2993 GIC 51 : tag = CMDTAG_SET_CONSTRAINTS;
7282 tgl 2994 CBC 51 : break;
7282 tgl 2995 ECB :
7282 tgl 2996 CBC 77 : case T_CheckPointStmt:
1133 alvherre 2997 GIC 77 : tag = CMDTAG_CHECKPOINT;
7282 tgl 2998 CBC 77 : break;
7282 tgl 2999 ECB :
7282 tgl 3000 CBC 437 : case T_ReindexStmt:
1133 alvherre 3001 GIC 437 : tag = CMDTAG_REINDEX;
7282 tgl 3002 CBC 437 : break;
7282 tgl 3003 ECB :
7282 tgl 3004 CBC 69 : case T_CreateConversionStmt:
1133 alvherre 3005 GIC 69 : tag = CMDTAG_CREATE_CONVERSION;
7282 tgl 3006 CBC 69 : break;
7282 tgl 3007 ECB :
7282 tgl 3008 CBC 230 : case T_CreateCastStmt:
1133 alvherre 3009 GIC 230 : tag = CMDTAG_CREATE_CAST;
7282 tgl 3010 CBC 230 : break;
7282 tgl 3011 ECB :
7282 tgl 3012 CBC 251 : case T_CreateOpClassStmt:
1133 alvherre 3013 GIC 251 : tag = CMDTAG_CREATE_OPERATOR_CLASS;
7282 tgl 3014 CBC 251 : break;
7282 tgl 3015 ECB :
5920 tgl 3016 CBC 152 : case T_CreateOpFamilyStmt:
1133 alvherre 3017 GIC 152 : tag = CMDTAG_CREATE_OPERATOR_FAMILY;
5920 tgl 3018 CBC 152 : break;
5920 tgl 3019 ECB :
5920 tgl 3020 CBC 365 : case T_AlterOpFamilyStmt:
1133 alvherre 3021 GIC 365 : tag = CMDTAG_ALTER_OPERATOR_FAMILY;
5920 tgl 3022 CBC 365 : break;
5920 tgl 3023 ECB :
2826 heikki.linnakangas 3024 CBC 300 : case T_AlterOperatorStmt:
1133 alvherre 3025 GIC 300 : tag = CMDTAG_ALTER_OPERATOR;
2826 heikki.linnakangas 3026 CBC 300 : break;
2826 heikki.linnakangas 3027 ECB :
1129 tgl 3028 CBC 44 : case T_AlterTypeStmt:
1129 tgl 3029 GIC 44 : tag = CMDTAG_ALTER_TYPE;
1129 tgl 3030 CBC 44 : break;
1129 tgl 3031 ECB :
5710 tgl 3032 CBC 40 : case T_AlterTSDictionaryStmt:
1133 alvherre 3033 GIC 40 : tag = CMDTAG_ALTER_TEXT_SEARCH_DICTIONARY;
5710 tgl 3034 CBC 40 : break;
5710 tgl 3035 ECB :
5710 tgl 3036 CBC 25648 : case T_AlterTSConfigurationStmt:
1133 alvherre 3037 GIC 25648 : tag = CMDTAG_ALTER_TEXT_SEARCH_CONFIGURATION;
5710 tgl 3038 CBC 25648 : break;
5710 tgl 3039 ECB :
3124 sfrost 3040 CBC 637 : case T_CreatePolicyStmt:
1133 alvherre 3041 GIC 637 : tag = CMDTAG_CREATE_POLICY;
3124 sfrost 3042 CBC 637 : break;
3124 sfrost 3043 ECB :
3124 sfrost 3044 CBC 93 : case T_AlterPolicyStmt:
1133 alvherre 3045 GIC 93 : tag = CMDTAG_ALTER_POLICY;
3124 sfrost 3046 CBC 93 : break;
3124 sfrost 3047 ECB :
2573 alvherre 3048 CBC 56 : case T_CreateAmStmt:
1133 alvherre 3049 GIC 56 : tag = CMDTAG_CREATE_ACCESS_METHOD;
2573 alvherre 3050 CBC 56 : break;
2573 alvherre 3051 ECB :
2271 peter_e 3052 CBC 654 : case T_CreatePublicationStmt:
1133 alvherre 3053 GIC 654 : tag = CMDTAG_CREATE_PUBLICATION;
2271 peter_e 3054 CBC 654 : break;
2271 peter_e 3055 ECB :
2271 peter_e 3056 CBC 1021 : case T_AlterPublicationStmt:
1133 alvherre 3057 GIC 1021 : tag = CMDTAG_ALTER_PUBLICATION;
2271 peter_e 3058 CBC 1021 : break;
2271 peter_e 3059 ECB :
2271 peter_e 3060 CBC 357 : case T_CreateSubscriptionStmt:
1133 alvherre 3061 GIC 357 : tag = CMDTAG_CREATE_SUBSCRIPTION;
2271 peter_e 3062 CBC 357 : break;
2271 peter_e 3063 ECB :
2271 peter_e 3064 CBC 393 : case T_AlterSubscriptionStmt:
1133 alvherre 3065 GIC 393 : tag = CMDTAG_ALTER_SUBSCRIPTION;
2271 peter_e 3066 CBC 393 : break;
2271 peter_e 3067 ECB :
2271 peter_e 3068 CBC 156 : case T_DropSubscriptionStmt:
1133 alvherre 3069 GIC 156 : tag = CMDTAG_DROP_SUBSCRIPTION;
2271 peter_e 3070 CBC 156 : break;
2271 peter_e 3071 ECB :
702 tmunro 3072 CBC 12 : case T_AlterCollationStmt:
702 tmunro 3073 GIC 12 : tag = CMDTAG_ALTER_COLLATION;
702 tmunro 3074 CBC 12 : break;
702 tmunro 3075 ECB :
7282 tgl 3076 CBC 1392 : case T_PrepareStmt:
1133 alvherre 3077 GIC 1392 : tag = CMDTAG_PREPARE;
7282 tgl 3078 CBC 1392 : break;
7282 tgl 3079 ECB :
7282 tgl 3080 CBC 8600 : case T_ExecuteStmt:
1133 alvherre 3081 GIC 8600 : tag = CMDTAG_EXECUTE;
7282 tgl 3082 CBC 8600 : break;
7282 tgl 3083 ECB :
2207 alvherre 3084 CBC 553 : case T_CreateStatsStmt:
1133 alvherre 3085 GIC 553 : tag = CMDTAG_CREATE_STATISTICS;
2207 alvherre 3086 CBC 553 : break;
2207 alvherre 3087 ECB :
1307 tomas.vondra 3088 CBC 27 : case T_AlterStatsStmt:
1133 alvherre 3089 GIC 27 : tag = CMDTAG_ALTER_STATISTICS;
1307 tomas.vondra 3090 CBC 27 : break;
1307 tomas.vondra 3091 ECB :
7282 tgl 3092 CBC 1151 : case T_DeallocateStmt:
3093 : {
5841 neilc 3094 1151 : DeallocateStmt *stmt = (DeallocateStmt *) parsetree;
5624 bruce 3095 ECB :
5841 neilc 3096 CBC 1151 : if (stmt->name == NULL)
1133 alvherre 3097 GIC 23 : tag = CMDTAG_DEALLOCATE_ALL;
5841 neilc 3098 ECB : else
1133 alvherre 3099 CBC 1128 : tag = CMDTAG_DEALLOCATE;
5841 neilc 3100 ECB : }
7282 tgl 3101 GIC 1151 : break;
7282 tgl 3102 ECB :
3103 : /* already-planned queries */
5892 tgl 3104 CBC 14 : case T_PlannedStmt:
3105 : {
3106 14 : PlannedStmt *stmt = (PlannedStmt *) parsetree;
6058 tgl 3107 ECB :
5892 tgl 3108 GIC 14 : switch (stmt->commandType)
5892 tgl 3109 ECB : {
5892 tgl 3110 UIC 0 : case CMD_SELECT:
5624 bruce 3111 ECB :
3112 : /*
3113 : * We take a little extra care here so that the result
5892 tgl 3114 : * will be useful for complaints about read-only
3115 : * statements
3116 : */
2276 tgl 3117 UIC 0 : if (stmt->rowMarks != NIL)
5892 tgl 3118 ECB : {
3119 : /* not 100% but probably close enough */
2947 tgl 3120 UBC 0 : switch (((PlanRowMark *) linitial(stmt->rowMarks))->strength)
3121 : {
2947 tgl 3122 UIC 0 : case LCS_FORKEYSHARE:
1133 alvherre 3123 0 : tag = CMDTAG_SELECT_FOR_KEY_SHARE;
3728 3124 0 : break;
2947 tgl 3125 0 : case LCS_FORSHARE:
1133 alvherre 3126 0 : tag = CMDTAG_SELECT_FOR_SHARE;
3728 alvherre 3127 UBC 0 : break;
2947 tgl 3128 UIC 0 : case LCS_FORNOKEYUPDATE:
1133 alvherre 3129 0 : tag = CMDTAG_SELECT_FOR_NO_KEY_UPDATE;
3728 alvherre 3130 UBC 0 : break;
2947 tgl 3131 UIC 0 : case LCS_FORUPDATE:
1133 alvherre 3132 UBC 0 : tag = CMDTAG_SELECT_FOR_UPDATE;
3728 3133 0 : break;
3134 0 : default:
1133 3135 0 : tag = CMDTAG_SELECT;
3728 3136 0 : break;
3728 alvherre 3137 EUB : }
5892 tgl 3138 : }
3139 : else
1133 alvherre 3140 UBC 0 : tag = CMDTAG_SELECT;
5892 tgl 3141 0 : break;
5892 tgl 3142 GBC 6 : case CMD_UPDATE:
1133 alvherre 3143 6 : tag = CMDTAG_UPDATE;
5892 tgl 3144 6 : break;
3145 5 : case CMD_INSERT:
1133 alvherre 3146 5 : tag = CMDTAG_INSERT;
5892 tgl 3147 GIC 5 : break;
3148 3 : case CMD_DELETE:
1133 alvherre 3149 3 : tag = CMDTAG_DELETE;
5892 tgl 3150 GBC 3 : break;
377 alvherre 3151 UBC 0 : case CMD_MERGE:
377 alvherre 3152 LBC 0 : tag = CMDTAG_MERGE;
3153 0 : break;
2276 tgl 3154 0 : case CMD_UTILITY:
3155 0 : tag = CreateCommandTag(stmt->utilityStmt);
3156 0 : break;
5892 3157 0 : default:
3158 0 : elog(WARNING, "unrecognized commandType: %d",
5892 tgl 3159 ECB : (int) stmt->commandType);
1133 alvherre 3160 LBC 0 : tag = CMDTAG_UNKNOWN;
5892 tgl 3161 UBC 0 : break;
5892 tgl 3162 EUB : }
3163 : }
5892 tgl 3164 GBC 14 : break;
6385 bruce 3165 EUB :
5624 3166 : /* parsed-and-rewritten-but-not-planned queries */
5892 tgl 3167 UBC 0 : case T_Query:
6555 tgl 3168 EUB : {
5624 bruce 3169 UIC 0 : Query *stmt = (Query *) parsetree;
5892 tgl 3170 EUB :
5892 tgl 3171 UBC 0 : switch (stmt->commandType)
3172 : {
5892 tgl 3173 UIC 0 : case CMD_SELECT:
5624 bruce 3174 ECB :
3175 : /*
3176 : * We take a little extra care here so that the result
5892 tgl 3177 EUB : * will be useful for complaints about read-only
3178 : * statements
3179 : */
2276 tgl 3180 UIC 0 : if (stmt->rowMarks != NIL)
5892 tgl 3181 EUB : {
3182 : /* not 100% but probably close enough */
3728 alvherre 3183 UBC 0 : switch (((RowMarkClause *) linitial(stmt->rowMarks))->strength)
3184 : {
3728 alvherre 3185 UIC 0 : case LCS_FORKEYSHARE:
1133 3186 0 : tag = CMDTAG_SELECT_FOR_KEY_SHARE;
3728 3187 0 : break;
3188 0 : case LCS_FORSHARE:
1133 3189 0 : tag = CMDTAG_SELECT_FOR_SHARE;
3728 alvherre 3190 UBC 0 : break;
3728 alvherre 3191 UIC 0 : case LCS_FORNOKEYUPDATE:
1133 3192 0 : tag = CMDTAG_SELECT_FOR_NO_KEY_UPDATE;
3728 alvherre 3193 UBC 0 : break;
3728 alvherre 3194 UIC 0 : case LCS_FORUPDATE:
1133 alvherre 3195 UBC 0 : tag = CMDTAG_SELECT_FOR_UPDATE;
3728 3196 0 : break;
3197 0 : default:
1133 3198 0 : tag = CMDTAG_UNKNOWN;
3728 3199 0 : break;
3728 alvherre 3200 EUB : }
5892 tgl 3201 : }
3202 : else
1133 alvherre 3203 UBC 0 : tag = CMDTAG_SELECT;
5892 tgl 3204 0 : break;
3205 0 : case CMD_UPDATE:
1133 alvherre 3206 0 : tag = CMDTAG_UPDATE;
5892 tgl 3207 0 : break;
3208 0 : case CMD_INSERT:
1133 alvherre 3209 0 : tag = CMDTAG_INSERT;
5892 tgl 3210 UIC 0 : break;
3211 0 : case CMD_DELETE:
1133 alvherre 3212 0 : tag = CMDTAG_DELETE;
5892 tgl 3213 UBC 0 : break;
377 alvherre 3214 0 : case CMD_MERGE:
3215 0 : tag = CMDTAG_MERGE;
3216 0 : break;
5892 tgl 3217 0 : case CMD_UTILITY:
3218 0 : tag = CreateCommandTag(stmt->utilityStmt);
3219 0 : break;
3220 0 : default:
3221 0 : elog(WARNING, "unrecognized commandType: %d",
5892 tgl 3222 EUB : (int) stmt->commandType);
1133 alvherre 3223 UBC 0 : tag = CMDTAG_UNKNOWN;
5892 tgl 3224 0 : break;
5892 tgl 3225 EUB : }
6555 3226 : }
6782 tgl 3227 UBC 0 : break;
5892 tgl 3228 EUB :
6782 tgl 3229 UBC 0 : default:
5892 3230 0 : elog(WARNING, "unrecognized node type: %d",
5892 tgl 3231 EUB : (int) nodeTag(parsetree));
1133 alvherre 3232 UIC 0 : tag = CMDTAG_UNKNOWN;
6782 tgl 3233 UBC 0 : break;
6782 tgl 3234 EUB : }
3235 :
6782 tgl 3236 GIC 578740 : return tag;
6782 tgl 3237 EUB : }
3238 :
6058 3239 :
3240 : /*
3241 : * GetCommandLogLevel
3242 : * utility to get the minimum log_statement level for a command,
2276 3243 : * given either a raw (un-analyzed) parsetree, an analyzed Query,
3244 : * or a PlannedStmt.
3245 : *
5892 tgl 3246 ECB : * This must handle all command types, but since the vast majority
3247 : * of 'em are utility commands, it seems sensible to keep it here.
3248 : */
3249 : LogStmtLevel
6058 tgl 3250 UIC 0 : GetCommandLogLevel(Node *parsetree)
3251 : {
3252 : LogStmtLevel lev;
3253 :
3254 0 : switch (nodeTag(parsetree))
3255 : {
3256 : /* recurse if we're given a RawStmt */
2276 3257 0 : case T_RawStmt:
3258 0 : lev = GetCommandLogLevel(((RawStmt *) parsetree)->stmt);
3259 0 : break;
2276 tgl 3260 EUB :
3261 : /* raw plannable queries */
6058 tgl 3262 UIC 0 : case T_InsertStmt:
3263 : case T_DeleteStmt:
6058 tgl 3264 EUB : case T_UpdateStmt:
3265 : case T_MergeStmt:
6058 tgl 3266 UIC 0 : lev = LOGSTMT_MOD;
6058 tgl 3267 UBC 0 : break;
6058 tgl 3268 EUB :
6058 tgl 3269 UBC 0 : case T_SelectStmt:
5826 tgl 3270 UIC 0 : if (((SelectStmt *) parsetree)->intoClause)
2118 3271 0 : lev = LOGSTMT_DDL; /* SELECT INTO */
6058 tgl 3272 EUB : else
6058 tgl 3273 UIC 0 : lev = LOGSTMT_ALL;
3274 0 : break;
3275 :
825 tgl 3276 UBC 0 : case T_PLAssignStmt:
3277 0 : lev = LOGSTMT_ALL;
825 tgl 3278 UIC 0 : break;
825 tgl 3279 EUB :
5624 bruce 3280 : /* utility statements --- same whether raw or cooked */
6058 tgl 3281 UBC 0 : case T_TransactionStmt:
6058 tgl 3282 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3283 UBC 0 : break;
6058 tgl 3284 EUB :
6058 tgl 3285 UIC 0 : case T_DeclareCursorStmt:
6058 tgl 3286 UBC 0 : lev = LOGSTMT_ALL;
3287 0 : break;
6058 tgl 3288 EUB :
6058 tgl 3289 UIC 0 : case T_ClosePortalStmt:
3290 0 : lev = LOGSTMT_ALL;
6058 tgl 3291 UBC 0 : break;
6058 tgl 3292 EUB :
6058 tgl 3293 UBC 0 : case T_FetchStmt:
6058 tgl 3294 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3295 UBC 0 : break;
6058 tgl 3296 EUB :
6058 tgl 3297 UBC 0 : case T_CreateSchemaStmt:
6058 tgl 3298 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3299 UBC 0 : break;
6058 tgl 3300 EUB :
6058 tgl 3301 UBC 0 : case T_CreateStmt:
3302 : case T_CreateForeignTableStmt:
3303 0 : lev = LOGSTMT_DDL;
3304 0 : break;
6058 tgl 3305 EUB :
6058 tgl 3306 UIC 0 : case T_CreateTableSpaceStmt:
6058 tgl 3307 EUB : case T_DropTableSpaceStmt:
4842 rhaas 3308 : case T_AlterTableSpaceOptionsStmt:
4842 rhaas 3309 UBC 0 : lev = LOGSTMT_DDL;
4842 rhaas 3310 UIC 0 : break;
4842 rhaas 3311 EUB :
4443 tgl 3312 UIC 0 : case T_CreateExtensionStmt:
4440 tgl 3313 EUB : case T_AlterExtensionStmt:
4441 3314 : case T_AlterExtensionContentsStmt:
4443 tgl 3315 UIC 0 : lev = LOGSTMT_DDL;
4443 tgl 3316 UBC 0 : break;
3317 :
5224 peter_e 3318 UIC 0 : case T_CreateFdwStmt:
5224 peter_e 3319 EUB : case T_AlterFdwStmt:
3320 : case T_CreateForeignServerStmt:
3321 : case T_AlterForeignServerStmt:
3322 : case T_CreateUserMappingStmt:
3323 : case T_AlterUserMappingStmt:
3324 : case T_DropUserMappingStmt:
3195 tgl 3325 : case T_ImportForeignSchemaStmt:
5224 peter_e 3326 UBC 0 : lev = LOGSTMT_DDL;
5224 peter_e 3327 UIC 0 : break;
5224 peter_e 3328 EUB :
6058 tgl 3329 UIC 0 : case T_DropStmt:
3330 0 : lev = LOGSTMT_DDL;
3331 0 : break;
3332 :
3333 0 : case T_TruncateStmt:
3334 0 : lev = LOGSTMT_MOD;
3335 0 : break;
6058 tgl 3336 EUB :
6058 tgl 3337 UBC 0 : case T_CommentStmt:
6058 tgl 3338 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3339 UBC 0 : break;
4577 rhaas 3340 EUB :
4577 rhaas 3341 UBC 0 : case T_SecLabelStmt:
4577 rhaas 3342 UIC 0 : lev = LOGSTMT_DDL;
4577 rhaas 3343 UBC 0 : break;
6058 tgl 3344 EUB :
6058 tgl 3345 UBC 0 : case T_CopyStmt:
6058 tgl 3346 UIC 0 : if (((CopyStmt *) parsetree)->is_from)
6058 tgl 3347 UBC 0 : lev = LOGSTMT_MOD;
6058 tgl 3348 EUB : else
6058 tgl 3349 UBC 0 : lev = LOGSTMT_ALL;
6058 tgl 3350 UIC 0 : break;
6058 tgl 3351 EUB :
5294 tgl 3352 UBC 0 : case T_PrepareStmt:
5294 tgl 3353 EUB : {
5294 tgl 3354 UIC 0 : PrepareStmt *stmt = (PrepareStmt *) parsetree;
5294 tgl 3355 EUB :
3356 : /* Look through a PREPARE to the contained stmt */
5294 tgl 3357 UBC 0 : lev = GetCommandLogLevel(stmt->query);
3358 : }
3359 0 : break;
5294 tgl 3360 EUB :
5294 tgl 3361 UIC 0 : case T_ExecuteStmt:
5294 tgl 3362 EUB : {
5294 tgl 3363 UIC 0 : ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
5294 tgl 3364 EUB : PreparedStatement *ps;
3365 :
3366 : /* Look through an EXECUTE to the referenced stmt */
5294 tgl 3367 UBC 0 : ps = FetchPreparedStatement(stmt->name, false);
3070 tgl 3368 UIC 0 : if (ps && ps->plansource->raw_parse_tree)
2276 tgl 3369 UBC 0 : lev = GetCommandLogLevel(ps->plansource->raw_parse_tree->stmt);
3370 : else
5294 3371 0 : lev = LOGSTMT_ALL;
3372 : }
3373 0 : break;
3374 :
5294 tgl 3375 UIC 0 : case T_DeallocateStmt:
3376 0 : lev = LOGSTMT_ALL;
5294 tgl 3377 UBC 0 : break;
5294 tgl 3378 EUB :
6058 tgl 3379 UBC 0 : case T_RenameStmt:
6058 tgl 3380 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3381 UBC 0 : break;
3382 :
2560 alvherre 3383 0 : case T_AlterObjectDependsStmt:
2560 alvherre 3384 UIC 0 : lev = LOGSTMT_DDL;
2560 alvherre 3385 UBC 0 : break;
2560 alvherre 3386 EUB :
6058 tgl 3387 UBC 0 : case T_AlterObjectSchemaStmt:
6058 tgl 3388 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3389 UBC 0 : break;
6058 tgl 3390 EUB :
6058 tgl 3391 UBC 0 : case T_AlterOwnerStmt:
6058 tgl 3392 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3393 UBC 0 : break;
6058 tgl 3394 EUB :
2033 rhaas 3395 UBC 0 : case T_AlterOperatorStmt:
2033 rhaas 3396 UIC 0 : lev = LOGSTMT_DDL;
2033 rhaas 3397 UBC 0 : break;
2033 rhaas 3398 EUB :
1129 tgl 3399 UBC 0 : case T_AlterTypeStmt:
1129 tgl 3400 UIC 0 : lev = LOGSTMT_DDL;
1129 tgl 3401 UBC 0 : break;
1129 tgl 3402 EUB :
3153 sfrost 3403 UBC 0 : case T_AlterTableMoveAllStmt:
3404 : case T_AlterTableStmt:
6058 tgl 3405 0 : lev = LOGSTMT_DDL;
3406 0 : break;
6058 tgl 3407 EUB :
6058 tgl 3408 UIC 0 : case T_AlterDomainStmt:
6058 tgl 3409 UBC 0 : lev = LOGSTMT_DDL;
3410 0 : break;
6058 tgl 3411 EUB :
6058 tgl 3412 UIC 0 : case T_GrantStmt:
6058 tgl 3413 UBC 0 : lev = LOGSTMT_DDL;
6058 tgl 3414 UIC 0 : break;
6058 tgl 3415 EUB :
6058 tgl 3416 UBC 0 : case T_GrantRoleStmt:
6058 tgl 3417 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3418 UBC 0 : break;
6058 tgl 3419 EUB :
4934 tgl 3420 UBC 0 : case T_AlterDefaultPrivilegesStmt:
4934 tgl 3421 UIC 0 : lev = LOGSTMT_DDL;
4934 tgl 3422 UBC 0 : break;
4934 tgl 3423 EUB :
6058 tgl 3424 UBC 0 : case T_DefineStmt:
6058 tgl 3425 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3426 UBC 0 : break;
6058 tgl 3427 EUB :
6058 tgl 3428 UBC 0 : case T_CompositeTypeStmt:
6058 tgl 3429 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3430 UBC 0 : break;
6058 tgl 3431 EUB :
5851 tgl 3432 UBC 0 : case T_CreateEnumStmt:
5851 tgl 3433 UIC 0 : lev = LOGSTMT_DDL;
5851 tgl 3434 UBC 0 : break;
5851 tgl 3435 EUB :
4175 heikki.linnakangas 3436 UBC 0 : case T_CreateRangeStmt:
4175 heikki.linnakangas 3437 UIC 0 : lev = LOGSTMT_DDL;
4175 heikki.linnakangas 3438 UBC 0 : break;
4175 heikki.linnakangas 3439 EUB :
4550 tgl 3440 UBC 0 : case T_AlterEnumStmt:
4550 tgl 3441 UIC 0 : lev = LOGSTMT_DDL;
4550 tgl 3442 UBC 0 : break;
4550 tgl 3443 EUB :
6058 tgl 3444 UBC 0 : case T_ViewStmt:
6058 tgl 3445 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3446 UBC 0 : break;
6058 tgl 3447 EUB :
6058 tgl 3448 UBC 0 : case T_CreateFunctionStmt:
6058 tgl 3449 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3450 UBC 0 : break;
6058 tgl 3451 EUB :
5294 tgl 3452 UBC 0 : case T_AlterFunctionStmt:
5294 tgl 3453 UIC 0 : lev = LOGSTMT_DDL;
5294 tgl 3454 UBC 0 : break;
5294 tgl 3455 EUB :
6058 tgl 3456 UBC 0 : case T_IndexStmt:
6058 tgl 3457 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3458 UBC 0 : break;
6058 tgl 3459 EUB :
6058 tgl 3460 UBC 0 : case T_RuleStmt:
6058 tgl 3461 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3462 UBC 0 : break;
6058 tgl 3463 EUB :
6058 tgl 3464 UBC 0 : case T_CreateSeqStmt:
6058 tgl 3465 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3466 UBC 0 : break;
6058 tgl 3467 EUB :
6058 tgl 3468 UBC 0 : case T_AlterSeqStmt:
6058 tgl 3469 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3470 UBC 0 : break;
6058 tgl 3471 EUB :
4947 tgl 3472 UBC 0 : case T_DoStmt:
4947 tgl 3473 UIC 0 : lev = LOGSTMT_ALL;
4947 tgl 3474 UBC 0 : break;
4947 tgl 3475 EUB :
6058 tgl 3476 UBC 0 : case T_CreatedbStmt:
6058 tgl 3477 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3478 UBC 0 : break;
6058 tgl 3479 EUB :
6058 tgl 3480 UBC 0 : case T_AlterDatabaseStmt:
3481 : case T_AlterDatabaseRefreshCollStmt:
6058 tgl 3482 EUB : case T_AlterDatabaseSetStmt:
6058 tgl 3483 UBC 0 : lev = LOGSTMT_DDL;
3484 0 : break;
3485 :
3486 0 : case T_DropdbStmt:
3487 0 : lev = LOGSTMT_DDL;
3488 0 : break;
3489 :
3490 0 : case T_NotifyStmt:
6058 tgl 3491 UIC 0 : lev = LOGSTMT_ALL;
3492 0 : break;
6058 tgl 3493 EUB :
6058 tgl 3494 UBC 0 : case T_ListenStmt:
6058 tgl 3495 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3496 UBC 0 : break;
6058 tgl 3497 EUB :
6058 tgl 3498 UBC 0 : case T_UnlistenStmt:
6058 tgl 3499 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3500 UBC 0 : break;
6058 tgl 3501 EUB :
6058 tgl 3502 UBC 0 : case T_LoadStmt:
6058 tgl 3503 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3504 UBC 0 : break;
6058 tgl 3505 EUB :
1956 peter_e 3506 UBC 0 : case T_CallStmt:
1956 peter_e 3507 UIC 0 : lev = LOGSTMT_ALL;
1956 peter_e 3508 UBC 0 : break;
1956 peter_e 3509 EUB :
6058 tgl 3510 UBC 0 : case T_ClusterStmt:
6058 tgl 3511 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3512 UBC 0 : break;
6058 tgl 3513 EUB :
6058 tgl 3514 UBC 0 : case T_VacuumStmt:
6058 tgl 3515 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3516 UBC 0 : break;
6058 tgl 3517 EUB :
6058 tgl 3518 UBC 0 : case T_ExplainStmt:
3519 : {
6031 bruce 3520 0 : ExplainStmt *stmt = (ExplainStmt *) parsetree;
4790 3521 0 : bool analyze = false;
4790 bruce 3522 EUB : ListCell *lc;
3523 :
6058 tgl 3524 : /* Look through an EXPLAIN ANALYZE to the contained stmt */
5005 tgl 3525 UBC 0 : foreach(lc, stmt->options)
5005 tgl 3526 EUB : {
4790 bruce 3527 UIC 0 : DefElem *opt = (DefElem *) lfirst(lc);
5005 tgl 3528 EUB :
5005 tgl 3529 UIC 0 : if (strcmp(opt->defname, "analyze") == 0)
5005 tgl 3530 UBC 0 : analyze = defGetBoolean(opt);
4832 tgl 3531 EUB : /* don't "break", as explain.c will use the last value */
3532 : }
5005 tgl 3533 UIC 0 : if (analyze)
5871 3534 0 : return GetCommandLogLevel(stmt->query);
5005 tgl 3535 EUB :
3536 : /* Plain EXPLAIN isn't so interesting */
6058 tgl 3537 UBC 0 : lev = LOGSTMT_ALL;
3538 : }
3539 0 : break;
6058 tgl 3540 EUB :
4038 tgl 3541 UIC 0 : case T_CreateTableAsStmt:
3542 0 : lev = LOGSTMT_DDL;
4038 tgl 3543 UBC 0 : break;
4038 tgl 3544 EUB :
3689 kgrittn 3545 UIC 0 : case T_RefreshMatViewStmt:
3546 0 : lev = LOGSTMT_DDL;
3689 kgrittn 3547 UBC 0 : break;
3548 :
3399 ishii 3549 0 : case T_AlterSystemStmt:
3121 sfrost 3550 UIC 0 : lev = LOGSTMT_DDL;
3399 ishii 3551 UBC 0 : break;
3399 ishii 3552 EUB :
6058 tgl 3553 UBC 0 : case T_VariableSetStmt:
6058 tgl 3554 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3555 UBC 0 : break;
6058 tgl 3556 EUB :
6058 tgl 3557 UBC 0 : case T_VariableShowStmt:
6058 tgl 3558 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3559 UBC 0 : break;
6058 tgl 3560 EUB :
5294 tgl 3561 UBC 0 : case T_DiscardStmt:
5294 tgl 3562 UIC 0 : lev = LOGSTMT_ALL;
5294 tgl 3563 UBC 0 : break;
5294 tgl 3564 EUB :
6058 tgl 3565 UBC 0 : case T_CreateTrigStmt:
6058 tgl 3566 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3567 UBC 0 : break;
6058 tgl 3568 EUB :
3917 rhaas 3569 UBC 0 : case T_CreateEventTrigStmt:
3917 rhaas 3570 UIC 0 : lev = LOGSTMT_DDL;
3917 rhaas 3571 UBC 0 : break;
3917 rhaas 3572 EUB :
3917 rhaas 3573 UBC 0 : case T_AlterEventTrigStmt:
3917 rhaas 3574 UIC 0 : lev = LOGSTMT_DDL;
3917 rhaas 3575 UBC 0 : break;
3917 rhaas 3576 EUB :
6058 tgl 3577 UBC 0 : case T_CreatePLangStmt:
6058 tgl 3578 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3579 UBC 0 : break;
6058 tgl 3580 EUB :
5294 tgl 3581 UBC 0 : case T_CreateDomainStmt:
5294 tgl 3582 UIC 0 : lev = LOGSTMT_DDL;
5294 tgl 3583 UBC 0 : break;
5294 tgl 3584 EUB :
6058 tgl 3585 UBC 0 : case T_CreateRoleStmt:
6058 tgl 3586 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3587 UBC 0 : break;
6058 tgl 3588 EUB :
6058 tgl 3589 UBC 0 : case T_AlterRoleStmt:
6058 tgl 3590 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3591 UBC 0 : break;
6058 tgl 3592 EUB :
6058 tgl 3593 UBC 0 : case T_AlterRoleSetStmt:
6058 tgl 3594 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3595 UBC 0 : break;
6058 tgl 3596 EUB :
6058 tgl 3597 UBC 0 : case T_DropRoleStmt:
6058 tgl 3598 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3599 UBC 0 : break;
6058 tgl 3600 EUB :
6058 tgl 3601 UBC 0 : case T_DropOwnedStmt:
6058 tgl 3602 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3603 UBC 0 : break;
6058 tgl 3604 EUB :
6058 tgl 3605 UBC 0 : case T_ReassignOwnedStmt:
6058 tgl 3606 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3607 UBC 0 : break;
6058 tgl 3608 EUB :
6058 tgl 3609 UBC 0 : case T_LockStmt:
6058 tgl 3610 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3611 UBC 0 : break;
6058 tgl 3612 EUB :
6058 tgl 3613 UBC 0 : case T_ConstraintsSetStmt:
6058 tgl 3614 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3615 UBC 0 : break;
6058 tgl 3616 EUB :
6058 tgl 3617 UBC 0 : case T_CheckPointStmt:
6058 tgl 3618 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3619 UBC 0 : break;
6058 tgl 3620 EUB :
6058 tgl 3621 UBC 0 : case T_ReindexStmt:
6031 bruce 3622 UIC 0 : lev = LOGSTMT_ALL; /* should this be DDL? */
6058 tgl 3623 UBC 0 : break;
6058 tgl 3624 EUB :
6058 tgl 3625 UBC 0 : case T_CreateConversionStmt:
6058 tgl 3626 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3627 UBC 0 : break;
6058 tgl 3628 EUB :
6058 tgl 3629 UBC 0 : case T_CreateCastStmt:
6058 tgl 3630 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3631 UBC 0 : break;
6058 tgl 3632 EUB :
6058 tgl 3633 UBC 0 : case T_CreateOpClassStmt:
6058 tgl 3634 UIC 0 : lev = LOGSTMT_DDL;
6058 tgl 3635 UBC 0 : break;
6058 tgl 3636 EUB :
5920 tgl 3637 UBC 0 : case T_CreateOpFamilyStmt:
5920 tgl 3638 UIC 0 : lev = LOGSTMT_DDL;
5920 tgl 3639 UBC 0 : break;
5920 tgl 3640 EUB :
2905 peter_e 3641 UBC 0 : case T_CreateTransformStmt:
2905 peter_e 3642 UIC 0 : lev = LOGSTMT_DDL;
2905 peter_e 3643 UBC 0 : break;
2905 peter_e 3644 EUB :
5920 tgl 3645 UBC 0 : case T_AlterOpFamilyStmt:
5920 tgl 3646 UIC 0 : lev = LOGSTMT_DDL;
5920 tgl 3647 UBC 0 : break;
5920 tgl 3648 EUB :
3124 sfrost 3649 UBC 0 : case T_CreatePolicyStmt:
3124 sfrost 3650 UIC 0 : lev = LOGSTMT_DDL;
3124 sfrost 3651 UBC 0 : break;
3124 sfrost 3652 EUB :
3124 sfrost 3653 UBC 0 : case T_AlterPolicyStmt:
3124 sfrost 3654 UIC 0 : lev = LOGSTMT_DDL;
3124 sfrost 3655 UBC 0 : break;
3124 sfrost 3656 EUB :
5710 tgl 3657 UBC 0 : case T_AlterTSDictionaryStmt:
5710 tgl 3658 UIC 0 : lev = LOGSTMT_DDL;
5710 tgl 3659 UBC 0 : break;
5710 tgl 3660 EUB :
5710 tgl 3661 UBC 0 : case T_AlterTSConfigurationStmt:
5710 tgl 3662 UIC 0 : lev = LOGSTMT_DDL;
5710 tgl 3663 UBC 0 : break;
6058 tgl 3664 EUB :
2573 alvherre 3665 UBC 0 : case T_CreateAmStmt:
2573 alvherre 3666 UIC 0 : lev = LOGSTMT_DDL;
2573 alvherre 3667 UBC 0 : break;
2573 alvherre 3668 EUB :
2271 peter_e 3669 UBC 0 : case T_CreatePublicationStmt:
2271 peter_e 3670 UIC 0 : lev = LOGSTMT_DDL;
2271 peter_e 3671 UBC 0 : break;
2271 peter_e 3672 EUB :
2271 peter_e 3673 UBC 0 : case T_AlterPublicationStmt:
2271 peter_e 3674 UIC 0 : lev = LOGSTMT_DDL;
2271 peter_e 3675 UBC 0 : break;
2271 peter_e 3676 EUB :
2271 peter_e 3677 UBC 0 : case T_CreateSubscriptionStmt:
2271 peter_e 3678 UIC 0 : lev = LOGSTMT_DDL;
2271 peter_e 3679 UBC 0 : break;
2271 peter_e 3680 EUB :
2271 peter_e 3681 UBC 0 : case T_AlterSubscriptionStmt:
2271 peter_e 3682 UIC 0 : lev = LOGSTMT_DDL;
2271 peter_e 3683 UBC 0 : break;
2271 peter_e 3684 EUB :
2271 peter_e 3685 UBC 0 : case T_DropSubscriptionStmt:
2271 peter_e 3686 UIC 0 : lev = LOGSTMT_DDL;
2271 peter_e 3687 UBC 0 : break;
2271 peter_e 3688 EUB :
2033 rhaas 3689 UBC 0 : case T_CreateStatsStmt:
2033 rhaas 3690 UIC 0 : lev = LOGSTMT_DDL;
2033 rhaas 3691 UBC 0 : break;
2033 rhaas 3692 EUB :
1307 tomas.vondra 3693 UBC 0 : case T_AlterStatsStmt:
1307 tomas.vondra 3694 UIC 0 : lev = LOGSTMT_DDL;
1307 tomas.vondra 3695 UBC 0 : break;
1307 tomas.vondra 3696 EUB :
702 tmunro 3697 UBC 0 : case T_AlterCollationStmt:
702 tmunro 3698 UIC 0 : lev = LOGSTMT_DDL;
702 tmunro 3699 UBC 0 : break;
702 tmunro 3700 EUB :
5624 bruce 3701 : /* already-planned queries */
5892 tgl 3702 UIC 0 : case T_PlannedStmt:
5892 tgl 3703 EUB : {
5892 tgl 3704 UBC 0 : PlannedStmt *stmt = (PlannedStmt *) parsetree;
6031 bruce 3705 EUB :
5892 tgl 3706 UIC 0 : switch (stmt->commandType)
5892 tgl 3707 EUB : {
5892 tgl 3708 UBC 0 : case CMD_SELECT:
4038 3709 0 : lev = LOGSTMT_ALL;
5892 tgl 3710 UIC 0 : break;
3711 :
5892 tgl 3712 UBC 0 : case CMD_UPDATE:
3713 : case CMD_INSERT:
5892 tgl 3714 EUB : case CMD_DELETE:
3715 : case CMD_MERGE:
5892 tgl 3716 UBC 0 : lev = LOGSTMT_MOD;
5892 tgl 3717 UIC 0 : break;
5892 tgl 3718 EUB :
2276 tgl 3719 UBC 0 : case CMD_UTILITY:
3720 0 : lev = GetCommandLogLevel(stmt->utilityStmt);
2276 tgl 3721 UIC 0 : break;
2276 tgl 3722 EUB :
5892 tgl 3723 UIC 0 : default:
3724 0 : elog(WARNING, "unrecognized commandType: %d",
3725 : (int) stmt->commandType);
5892 tgl 3726 UBC 0 : lev = LOGSTMT_ALL;
3727 0 : break;
3728 : }
5892 tgl 3729 EUB : }
6058 tgl 3730 UBC 0 : break;
6058 tgl 3731 EUB :
3732 : /* parsed-and-rewritten-but-not-planned queries */
5892 tgl 3733 UBC 0 : case T_Query:
5892 tgl 3734 EUB : {
5624 bruce 3735 UIC 0 : Query *stmt = (Query *) parsetree;
6058 tgl 3736 EUB :
5892 tgl 3737 UBC 0 : switch (stmt->commandType)
3738 : {
5892 tgl 3739 UIC 0 : case CMD_SELECT:
4038 tgl 3740 UBC 0 : lev = LOGSTMT_ALL;
5892 tgl 3741 UIC 0 : break;
3742 :
5892 tgl 3743 UBC 0 : case CMD_UPDATE:
3744 : case CMD_INSERT:
5892 tgl 3745 EUB : case CMD_DELETE:
3746 : case CMD_MERGE:
5892 tgl 3747 UBC 0 : lev = LOGSTMT_MOD;
5892 tgl 3748 UIC 0 : break;
6058 tgl 3749 EUB :
5892 tgl 3750 UBC 0 : case CMD_UTILITY:
3751 0 : lev = GetCommandLogLevel(stmt->utilityStmt);
5892 tgl 3752 UIC 0 : break;
6058 tgl 3753 EUB :
5892 tgl 3754 UIC 0 : default:
3755 0 : elog(WARNING, "unrecognized commandType: %d",
3756 : (int) stmt->commandType);
5892 tgl 3757 UBC 0 : lev = LOGSTMT_ALL;
3758 0 : break;
3759 : }
5892 tgl 3760 EUB : }
6058 tgl 3761 UBC 0 : break;
6058 tgl 3762 EUB :
6058 tgl 3763 UIC 0 : default:
5892 tgl 3764 UBC 0 : elog(WARNING, "unrecognized node type: %d",
5892 tgl 3765 EUB : (int) nodeTag(parsetree));
6058 tgl 3766 UIC 0 : lev = LOGSTMT_ALL;
6058 tgl 3767 UBC 0 : break;
6058 tgl 3768 EUB : }
3769 :
6058 tgl 3770 UIC 0 : return lev;
6058 tgl 3771 EUB : }
|