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