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
3512 tgl@sss.pgh.pa.us 96 :CBC 12558 : CommandIsReadOnly(PlannedStmt *pstmt)
97 : : {
98 [ - + ]: 12558 : Assert(IsA(pstmt, PlannedStmt));
99 [ + - - - ]: 12558 : switch (pstmt->commandType)
100 : : {
101 : 12558 : case CMD_SELECT:
102 [ - + ]: 12558 : if (pstmt->rowMarks != NIL)
3512 tgl@sss.pgh.pa.us 103 :UBC 0 : return false; /* SELECT FOR [KEY] UPDATE/SHARE */
3512 tgl@sss.pgh.pa.us 104 [ - + ]:CBC 12558 : else if (pstmt->hasModifyingCTE)
3512 tgl@sss.pgh.pa.us 105 :UBC 0 : return false; /* data-modifying CTE */
106 : : else
3512 tgl@sss.pgh.pa.us 107 :CBC 12558 : return true;
3512 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 : : }
8018 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
2415 rhaas@postgresql.org 130 :CBC 261526 : ClassifyUtilityCommandAsReadOnly(Node *parsetree)
131 : : {
8630 peter_e@gmx.net 132 [ + + + + : 261526 : switch (nodeTag(parsetree))
+ + + + +
+ + - ]
133 : : {
2415 rhaas@postgresql.org 134 : 152941 : 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 : 152941 : return COMMAND_IS_NOT_READ_ONLY;
221 : : }
222 : :
223 : 122 : 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 : 122 : return COMMAND_IS_STRICTLY_READ_ONLY;
236 : : }
237 : :
238 : 1191 : 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 : 1191 : return COMMAND_IS_STRICTLY_READ_ONLY;
248 : : }
249 : :
250 : 463 : 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 : 463 : return COMMAND_IS_STRICTLY_READ_ONLY;
260 : : }
261 : :
262 : 45078 : 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 : 45078 : return COMMAND_OK_IN_RECOVERY | COMMAND_OK_IN_READ_ONLY_TXN;
283 : : }
284 : :
285 : 9739 : 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 : : */
300 : 9739 : return COMMAND_OK_IN_READ_ONLY_TXN;
301 : : }
302 : :
303 : 6701 : case T_CopyStmt:
304 : : {
2296 tgl@sss.pgh.pa.us 305 : 6701 : 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 : : */
2415 rhaas@postgresql.org 314 [ + + ]: 6701 : if (stmt->is_from)
315 : 1240 : return COMMAND_OK_IN_READ_ONLY_TXN;
316 : : else
317 : 5461 : return COMMAND_IS_STRICTLY_READ_ONLY;
318 : : }
319 : :
320 : 17429 : 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 : 17429 : return COMMAND_IS_STRICTLY_READ_ONLY;
328 : : }
329 : :
330 : 104 : 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 : 104 : return COMMAND_OK_IN_READ_ONLY_TXN;
344 : : }
345 : :
346 : 597 : case T_LockStmt:
347 : : {
2296 tgl@sss.pgh.pa.us 348 : 597 : 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 : : */
2415 rhaas@postgresql.org 355 [ + + ]: 597 : if (stmt->mode > RowExclusiveLock)
356 : 297 : return COMMAND_OK_IN_READ_ONLY_TXN;
357 : : else
358 : 300 : return COMMAND_IS_STRICTLY_READ_ONLY;
359 : : }
360 : :
361 : 27161 : case T_TransactionStmt:
362 : : {
363 : 27161 : 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 [ + + - ]: 27161 : switch (stmt->kind)
375 : : {
376 : 26461 : 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 : 26461 : return COMMAND_IS_STRICTLY_READ_ONLY;
384 : :
385 : 700 : case TRANS_STMT_PREPARE:
386 : : case TRANS_STMT_COMMIT_PREPARED:
387 : : case TRANS_STMT_ROLLBACK_PREPARED:
388 : 700 : return COMMAND_OK_IN_READ_ONLY_TXN;
389 : : }
2412 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 : :
8630 peter_e@gmx.net 395 : 0 : default:
2415 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
6032 tgl@sss.pgh.pa.us 409 :CBC 47285 : PreventCommandIfReadOnly(const char *cmdname)
410 : : {
411 [ + + ]: 47285 : 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 : 47211 : }
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
4137 rhaas@postgresql.org 427 : 136857 : PreventCommandIfParallelMode(const char *cmdname)
428 : : {
429 [ - + ]: 136857 : if (IsInParallelMode())
4137 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)));
4137 rhaas@postgresql.org 435 :CBC 136857 : }
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
6032 tgl@sss.pgh.pa.us 446 : 4653 : PreventCommandDuringRecovery(const char *cmdname)
447 : : {
448 [ - + ]: 4653 : if (RecoveryInProgress())
6032 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)));
6032 tgl@sss.pgh.pa.us 454 :CBC 4653 : }
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
6105 464 : 3703 : CheckRestrictedOperation(const char *cmdname)
465 : : {
466 [ - + ]: 3703 : if (InSecurityRestrictedOperation())
6105 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)));
6105 tgl@sss.pgh.pa.us 472 :CBC 3703 : }
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
3512 504 : 261526 : 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 [ - + ]: 261526 : Assert(IsA(pstmt, PlannedStmt));
514 [ - + ]: 261526 : Assert(pstmt->commandType == CMD_UTILITY);
6286 bruce@momjian.us 515 [ - + ]: 261526 : Assert(queryString != NULL); /* required as of 8.4 */
2369 alvherre@alvh.no-ip. 516 [ + + - + ]: 261526 : 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 : : */
6099 tgl@sss.pgh.pa.us 523 [ + + ]: 261526 : if (ProcessUtility_hook)
1896 524 : 37807 : (*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,
525 : : context, params, queryEnv,
526 : : dest, qc);
527 : : else
528 : 223719 : standard_ProcessUtility(pstmt, queryString, readOnlyTree,
529 : : context, params, queryEnv,
530 : : dest, qc);
6099 531 : 249533 : }
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
3512 548 : 261526 : 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;
5151 rhaas@postgresql.org 558 : 261526 : bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
3078 peter_e@gmx.net 559 [ + + + + : 261526 : 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 */
2873 tgl@sss.pgh.pa.us 564 : 261526 : 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 : : */
1896 574 [ + + ]: 261526 : if (readOnlyTree)
575 : 19570 : pstmt = copyObject(pstmt);
576 : 261526 : parsetree = pstmt->utilityStmt;
577 : :
578 : : /* Prohibit read/write commands in read-only states. */
2415 rhaas@postgresql.org 579 : 261526 : readonly_flags = ClassifyUtilityCommandAsReadOnly(parsetree);
580 [ + + ]: 261526 : if (readonly_flags != COMMAND_IS_STRICTLY_READ_ONLY &&
581 [ + + - + ]: 210099 : (XactReadOnly || IsInParallelMode()))
582 : : {
2369 alvherre@alvh.no-ip. 583 : 9192 : CommandTag commandtag = CreateCommandTag(parsetree);
584 : :
2415 rhaas@postgresql.org 585 [ + + ]: 9192 : if ((readonly_flags & COMMAND_OK_IN_READ_ONLY_TXN) == 0)
2369 alvherre@alvh.no-ip. 586 : 8 : PreventCommandIfReadOnly(GetCommandTagName(commandtag));
2415 rhaas@postgresql.org 587 [ + - ]: 9184 : if ((readonly_flags & COMMAND_OK_IN_PARALLEL_MODE) == 0)
2369 alvherre@alvh.no-ip. 588 : 9184 : PreventCommandIfParallelMode(GetCommandTagName(commandtag));
2415 rhaas@postgresql.org 589 [ - + ]: 9184 : if ((readonly_flags & COMMAND_OK_IN_RECOVERY) == 0)
2369 alvherre@alvh.no-ip. 590 :UBC 0 : PreventCommandDuringRecovery(GetCommandTagName(commandtag));
591 : : }
592 : :
3642 peter_e@gmx.net 593 :CBC 261518 : pstate = make_parsestate(NULL);
594 : 261518 : pstate->p_sourcetext = queryString;
2427 peter@eisentraut.org 595 : 261518 : pstate->p_queryEnv = queryEnv;
596 : :
10581 bruce@momjian.us 597 [ + + + + : 261518 : switch (nodeTag(parsetree))
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + ]
598 : : {
599 : : /*
600 : : * ******************** transactions ********************
601 : : */
10580 602 : 27161 : case T_TransactionStmt:
603 : : {
604 : 27161 : TransactionStmt *stmt = (TransactionStmt *) parsetree;
605 : :
8599 tgl@sss.pgh.pa.us 606 [ + + + + : 27161 : switch (stmt->kind)
+ + + + +
- ]
607 : : {
608 : : /*
609 : : * START TRANSACTION, as defined by SQL99: Identical
610 : : * to BEGIN. Same code for both.
611 : : */
612 : 12589 : case TRANS_STMT_BEGIN:
613 : : case TRANS_STMT_START:
614 : : {
615 : : ListCell *lc;
616 : :
8050 617 : 12589 : BeginTransactionBlock();
618 [ + + + + : 16772 : foreach(lc, stmt->options)
+ + ]
619 : : {
620 : 4183 : DefElem *item = (DefElem *) lfirst(lc);
621 : :
622 [ + + ]: 4183 : if (strcmp(item->defname, "transaction_isolation") == 0)
623 : 3638 : SetPGVariable("transaction_isolation",
624 : 3638 : list_make1(item->arg),
625 : : true);
626 [ + + ]: 545 : else if (strcmp(item->defname, "transaction_read_only") == 0)
627 : 511 : SetPGVariable("transaction_read_only",
628 : 511 : list_make1(item->arg),
629 : : true);
5680 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 : : }
8789 bruce@momjian.us 636 : 12589 : break;
637 : :
8599 tgl@sss.pgh.pa.us 638 : 9804 : case TRANS_STMT_COMMIT:
2713 peter@eisentraut.org 639 [ + + ]: 9804 : if (!EndTransactionBlock(stmt->chain))
640 : : {
641 : : /* report unsuccessful commit in qc */
2369 alvherre@alvh.no-ip. 642 [ + - ]: 507 : if (qc)
643 : 507 : SetQueryCompletion(qc, CMDTAG_ROLLBACK, 0);
644 : : }
10580 bruce@momjian.us 645 : 9784 : break;
646 : :
7741 tgl@sss.pgh.pa.us 647 : 374 : case TRANS_STMT_PREPARE:
648 [ + + ]: 374 : if (!PrepareTransactionBlock(stmt->gid))
649 : : {
650 : : /* report unsuccessful commit in qc */
2369 alvherre@alvh.no-ip. 651 [ + - ]: 2 : if (qc)
652 : 2 : SetQueryCompletion(qc, CMDTAG_ROLLBACK, 0);
653 : : }
7741 tgl@sss.pgh.pa.us 654 : 374 : break;
655 : :
656 : 277 : case TRANS_STMT_COMMIT_PREPARED:
3114 peter_e@gmx.net 657 : 277 : PreventInTransactionBlock(isTopLevel, "COMMIT PREPARED");
7741 tgl@sss.pgh.pa.us 658 : 277 : FinishPreparedTransaction(stmt->gid, true);
659 : 267 : break;
660 : :
661 : 49 : case TRANS_STMT_ROLLBACK_PREPARED:
3114 peter_e@gmx.net 662 : 49 : PreventInTransactionBlock(isTopLevel, "ROLLBACK PREPARED");
7741 tgl@sss.pgh.pa.us 663 : 49 : FinishPreparedTransaction(stmt->gid, false);
664 : 45 : break;
665 : :
8599 666 : 2241 : case TRANS_STMT_ROLLBACK:
2713 peter@eisentraut.org 667 : 2241 : UserAbortTransactionBlock(stmt->chain);
10580 bruce@momjian.us 668 : 2221 : break;
669 : :
8066 tgl@sss.pgh.pa.us 670 : 1157 : case TRANS_STMT_SAVEPOINT:
3114 peter_e@gmx.net 671 : 1157 : RequireTransactionBlock(isTopLevel, "SAVEPOINT");
672 : 1148 : DefineSavepoint(stmt->savepoint_name);
8066 tgl@sss.pgh.pa.us 673 : 1140 : break;
674 : :
675 : 189 : case TRANS_STMT_RELEASE:
3114 peter_e@gmx.net 676 : 189 : RequireTransactionBlock(isTopLevel, "RELEASE SAVEPOINT");
677 : 185 : ReleaseSavepoint(stmt->savepoint_name);
8066 tgl@sss.pgh.pa.us 678 : 181 : break;
679 : :
680 : 481 : case TRANS_STMT_ROLLBACK_TO:
3114 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 : : */
8066 tgl@sss.pgh.pa.us 688 : 469 : break;
689 : : }
690 : : }
10580 bruce@momjian.us 691 : 27070 : break;
692 : :
693 : : /*
694 : : * Portal (cursor) manipulation
695 : : */
3512 tgl@sss.pgh.pa.us 696 : 2702 : case T_DeclareCursorStmt:
2427 peter@eisentraut.org 697 : 2702 : PerformCursorOpen(pstate, (DeclareCursorStmt *) parsetree, params,
698 : : isTopLevel);
8571 tgl@sss.pgh.pa.us 699 : 2693 : break;
700 : :
10580 bruce@momjian.us 701 : 1199 : case T_ClosePortalStmt:
702 : : {
703 : 1199 : ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
704 : :
6105 tgl@sss.pgh.pa.us 705 : 1199 : CheckRestrictedOperation("CLOSE");
8571 706 : 1199 : PerformPortalClose(stmt->portalname);
707 : : }
10580 bruce@momjian.us 708 : 1197 : break;
709 : :
710 : 4374 : case T_FetchStmt:
2369 alvherre@alvh.no-ip. 711 : 4374 : PerformPortalFetch((FetchStmt *) parsetree, dest, qc);
10580 bruce@momjian.us 712 : 4300 : break;
713 : :
4870 tgl@sss.pgh.pa.us 714 : 902 : case T_DoStmt:
1869 dean.a.rasheed@gmail 715 : 902 : ExecuteDoStmt(pstate, (DoStmt *) parsetree, isAtomicContext);
10580 bruce@momjian.us 716 : 663 : break;
717 : :
8105 tgl@sss.pgh.pa.us 718 : 75 : case T_CreateTableSpaceStmt:
719 : : /* no event triggers for global objects */
3114 peter_e@gmx.net 720 : 75 : PreventInTransactionBlock(isTopLevel, "CREATE TABLESPACE");
8105 tgl@sss.pgh.pa.us 721 : 75 : CreateTableSpace((CreateTableSpaceStmt *) parsetree);
722 : 55 : break;
723 : :
724 : 36 : case T_DropTableSpaceStmt:
725 : : /* no event triggers for global objects */
3114 peter_e@gmx.net 726 : 36 : PreventInTransactionBlock(isTopLevel, "DROP TABLESPACE");
8105 tgl@sss.pgh.pa.us 727 : 36 : DropTableSpace((DropTableSpaceStmt *) parsetree);
728 : 27 : break;
729 : :
6078 rhaas@postgresql.org 730 : 17 : case T_AlterTableSpaceOptionsStmt:
731 : : /* no event triggers for global objects */
732 : 17 : AlterTableSpaceOptions((AlterTableSpaceOptionsStmt *) parsetree);
733 : 9 : break;
734 : :
9828 tgl@sss.pgh.pa.us 735 : 1161 : case T_TruncateStmt:
7482 736 : 1161 : ExecuteTruncate((TruncateStmt *) parsetree);
9835 bruce@momjian.us 737 : 1072 : break;
738 : :
10580 739 : 6701 : case T_CopyStmt:
740 : : {
741 : : uint64 processed;
742 : :
3512 tgl@sss.pgh.pa.us 743 : 6701 : DoCopy(pstate, (CopyStmt *) parsetree,
744 : : pstmt->stmt_location, pstmt->stmt_len,
745 : : &processed);
2369 alvherre@alvh.no-ip. 746 [ + - ]: 5948 : if (qc)
747 : 5948 : SetQueryCompletion(qc, CMDTAG_COPY, processed);
748 : : }
10580 bruce@momjian.us 749 : 5948 : break;
750 : :
8766 tgl@sss.pgh.pa.us 751 : 1131 : case T_PrepareStmt:
6105 752 : 1131 : CheckRestrictedOperation("PREPARE");
2427 peter@eisentraut.org 753 : 1131 : PrepareQuery(pstate, (PrepareStmt *) parsetree,
754 : : pstmt->stmt_location, pstmt->stmt_len);
8766 tgl@sss.pgh.pa.us 755 : 1123 : break;
756 : :
757 : 8663 : case T_ExecuteStmt:
2427 peter@eisentraut.org 758 : 8663 : ExecuteQuery(pstate,
759 : : (ExecuteStmt *) parsetree, NULL,
760 : : params,
761 : : dest, qc);
8766 tgl@sss.pgh.pa.us 762 : 8570 : break;
763 : :
764 : 1235 : case T_DeallocateStmt:
6105 765 : 1235 : CheckRestrictedOperation("DEALLOCATE");
8766 766 : 1235 : DeallocateQuery((DeallocateStmt *) parsetree);
767 : 1235 : break;
768 : :
7730 769 : 441 : case T_GrantRoleStmt:
770 : : /* no event triggers for global objects */
1463 rhaas@postgresql.org 771 : 441 : GrantRole(pstate, (GrantRoleStmt *) parsetree);
7730 tgl@sss.pgh.pa.us 772 : 351 : break;
773 : :
10580 bruce@momjian.us 774 : 442 : case T_CreatedbStmt:
775 : : /* no event triggers for global objects */
3114 peter_e@gmx.net 776 : 442 : PreventInTransactionBlock(isTopLevel, "CREATE DATABASE");
3642 777 : 442 : createdb(pstate, (CreatedbStmt *) parsetree);
10580 bruce@momjian.us 778 : 417 : break;
779 : :
7697 tgl@sss.pgh.pa.us 780 : 52 : case T_AlterDatabaseStmt:
781 : : /* no event triggers for global objects */
3642 peter_e@gmx.net 782 : 52 : AlterDatabase(pstate, (AlterDatabaseStmt *) parsetree, isTopLevel);
7697 tgl@sss.pgh.pa.us 783 : 51 : break;
784 : :
1655 peter@eisentraut.org 785 : 4 : case T_AlterDatabaseRefreshCollStmt:
786 : : /* no event triggers for global objects */
787 : 4 : AlterDatabaseRefreshColl((AlterDatabaseRefreshCollStmt *) parsetree);
788 : 4 : break;
789 : :
8945 peter_e@gmx.net 790 : 658 : case T_AlterDatabaseSetStmt:
791 : : /* no event triggers for global objects */
8823 tgl@sss.pgh.pa.us 792 : 658 : AlterDatabaseSet((AlterDatabaseSetStmt *) parsetree);
8945 peter_e@gmx.net 793 : 656 : break;
794 : :
9757 bruce@momjian.us 795 : 78 : case T_DropdbStmt:
796 : : /* no event triggers for global objects */
2480 akapila@postgresql.o 797 : 78 : PreventInTransactionBlock(isTopLevel, "DROP DATABASE");
798 : 78 : DropDatabase(pstate, (DropdbStmt *) parsetree);
10580 bruce@momjian.us 799 : 66 : break;
800 : :
801 : : /* Query-level asynchronous notification */
802 : 52 : case T_NotifyStmt:
803 : : {
804 : 52 : NotifyStmt *stmt = (NotifyStmt *) parsetree;
805 : :
6036 tgl@sss.pgh.pa.us 806 : 52 : Async_Notify(stmt->conditionname, stmt->payload);
807 : : }
10580 bruce@momjian.us 808 : 52 : break;
809 : :
810 : 52 : case T_ListenStmt:
811 : : {
812 : 52 : ListenStmt *stmt = (ListenStmt *) parsetree;
813 : :
6105 tgl@sss.pgh.pa.us 814 : 52 : 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 : : */
1807 825 [ - + ]: 52 : if (MyBackendType != B_BACKEND)
1807 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 : :
6569 tgl@sss.pgh.pa.us 832 :CBC 52 : Async_Listen(stmt->conditionname);
833 : : }
10580 bruce@momjian.us 834 : 52 : break;
835 : :
10229 scrappy@hub.org 836 : 62 : case T_UnlistenStmt:
837 : : {
838 : 62 : UnlistenStmt *stmt = (UnlistenStmt *) parsetree;
839 : :
6105 tgl@sss.pgh.pa.us 840 : 62 : CheckRestrictedOperation("UNLISTEN");
6569 841 [ + + ]: 62 : if (stmt->conditionname)
842 : 4 : Async_Unlisten(stmt->conditionname);
843 : : else
6571 844 : 58 : Async_UnlistenAll();
845 : : }
10229 scrappy@hub.org 846 : 62 : break;
847 : :
10580 bruce@momjian.us 848 : 49 : case T_LoadStmt:
849 : : {
850 : 49 : LoadStmt *stmt = (LoadStmt *) parsetree;
851 : :
9956 852 : 49 : closeAllVfds(); /* probably not necessary... */
853 : : /* Allowed names are restricted if you're not superuser */
7317 tgl@sss.pgh.pa.us 854 : 49 : load_file(stmt->filename, !superuser());
855 : : }
10580 bruce@momjian.us 856 : 49 : break;
857 : :
3192 peter_e@gmx.net 858 : 289 : case T_CallStmt:
3079 859 : 289 : ExecuteCallStmt(castNode(CallStmt, parsetree), params, isAtomicContext, dest);
3192 860 : 264 : break;
861 : :
10580 bruce@momjian.us 862 : 8800 : case T_VacuumStmt:
2415 rhaas@postgresql.org 863 : 8800 : ExecVacuum(pstate, (VacuumStmt *) parsetree, isTopLevel);
10580 bruce@momjian.us 864 : 8666 : break;
865 : :
170 alvherre@kurilemu.de 866 : 233 : case T_RepackStmt:
867 : 233 : ExecRepack(pstate, (RepackStmt *) parsetree, isTopLevel);
868 : 176 : break;
869 : :
10580 bruce@momjian.us 870 : 16875 : case T_ExplainStmt:
2427 peter@eisentraut.org 871 : 16875 : ExplainQuery(pstate, (ExplainStmt *) parsetree, params, dest);
10580 bruce@momjian.us 872 : 16789 : break;
873 : :
4635 ishii@postgresql.org 874 : 122 : case T_AlterSystemStmt:
3114 peter_e@gmx.net 875 : 122 : PreventInTransactionBlock(isTopLevel, "ALTER SYSTEM");
4635 ishii@postgresql.org 876 : 122 : AlterSystemSetConfigFile((AlterSystemStmt *) parsetree);
877 : 93 : break;
878 : :
10580 bruce@momjian.us 879 : 25299 : case T_VariableSetStmt:
4710 880 : 25299 : ExecSetVariableStmt((VariableSetStmt *) parsetree, isTopLevel);
10580 881 : 25101 : break;
882 : :
883 : 554 : case T_VariableShowStmt:
884 : : {
885 : 554 : VariableShowStmt *n = (VariableShowStmt *) parsetree;
886 : :
8514 tgl@sss.pgh.pa.us 887 : 554 : GetPGVariable(n->name, dest);
888 : : }
10580 bruce@momjian.us 889 : 554 : break;
890 : :
7063 neilc@samurai.com 891 : 24 : case T_DiscardStmt:
892 : : /* should we allow DISCARD PLANS? */
6105 tgl@sss.pgh.pa.us 893 : 24 : CheckRestrictedOperation("DISCARD");
7063 neilc@samurai.com 894 : 24 : DiscardCommand((DiscardStmt *) parsetree, isTopLevel);
895 : 24 : break;
896 : :
5153 rhaas@postgresql.org 897 : 129 : case T_CreateEventTrigStmt:
898 : : /* no event triggers on event triggers */
899 : 129 : CreateEventTrigger((CreateEventTrigStmt *) parsetree);
900 : 85 : break;
901 : :
902 : 32 : case T_AlterEventTrigStmt:
903 : : /* no event triggers on event triggers */
904 : 32 : AlterEventTrigger((AlterEventTrigStmt *) parsetree);
905 : 32 : break;
906 : :
907 : : /*
908 : : * ******************************** ROLE statements ****
909 : : */
7730 tgl@sss.pgh.pa.us 910 : 1290 : case T_CreateRoleStmt:
911 : : /* no event triggers for global objects */
3642 peter_e@gmx.net 912 : 1290 : CreateRole(pstate, (CreateRoleStmt *) parsetree);
10409 bruce@momjian.us 913 : 1201 : break;
914 : :
7730 tgl@sss.pgh.pa.us 915 : 291 : case T_AlterRoleStmt:
916 : : /* no event triggers for global objects */
1869 dean.a.rasheed@gmail 917 : 291 : AlterRole(pstate, (AlterRoleStmt *) parsetree);
10409 bruce@momjian.us 918 : 231 : break;
919 : :
7730 tgl@sss.pgh.pa.us 920 : 52 : case T_AlterRoleSetStmt:
921 : : /* no event triggers for global objects */
922 : 52 : AlterRoleSet((AlterRoleSetStmt *) parsetree);
8945 peter_e@gmx.net 923 : 46 : break;
924 : :
7730 tgl@sss.pgh.pa.us 925 : 1246 : case T_DropRoleStmt:
926 : : /* no event triggers for global objects */
927 : 1246 : DropRole((DropRoleStmt *) parsetree);
10409 bruce@momjian.us 928 : 1092 : break;
929 : :
7584 alvherre@alvh.no-ip. 930 : 36 : case T_ReassignOwnedStmt:
931 : : /* no event triggers for global objects */
932 : 36 : ReassignOwnedObjects((ReassignOwnedStmt *) parsetree);
933 : 24 : break;
934 : :
10114 vadim4o@yahoo.com 935 : 597 : 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 : : */
3114 peter_e@gmx.net 941 : 597 : RequireTransactionBlock(isTopLevel, "LOCK TABLE");
10114 vadim4o@yahoo.com 942 : 592 : LockTableCommand((LockStmt *) parsetree);
943 : 545 : break;
944 : :
9829 JanWieck@Yahoo.com 945 : 71 : case T_ConstraintsSetStmt:
3114 peter_e@gmx.net 946 : 71 : WarnNoTransactionBlock(isTopLevel, "SET CONSTRAINTS");
8021 tgl@sss.pgh.pa.us 947 : 71 : AfterTriggerSetState((ConstraintsSetStmt *) parsetree);
9829 JanWieck@Yahoo.com 948 : 61 : break;
949 : :
9426 vadim4o@yahoo.com 950 : 463 : case T_CheckPointStmt:
412 nathan@postgresql.or 951 : 463 : ExecCheckpoint(pstate, (CheckPointStmt *) parsetree);
9426 vadim4o@yahoo.com 952 : 455 : 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 : :
4203 alvherre@alvh.no-ip. 959 : 12455 : case T_GrantStmt:
960 : : {
961 : 12455 : GrantStmt *stmt = (GrantStmt *) parsetree;
962 : :
3242 peter_e@gmx.net 963 [ + + ]: 12455 : if (EventTriggerSupportsObjectType(stmt->objtype))
3512 tgl@sss.pgh.pa.us 964 : 12208 : ProcessUtilitySlow(pstate, pstmt, queryString,
965 : : context, params, queryEnv,
966 : : dest, qc);
967 : : else
968 : 247 : ExecuteGrantStmt(stmt);
969 : : }
4203 alvherre@alvh.no-ip. 970 : 12355 : break;
971 : :
4870 tgl@sss.pgh.pa.us 972 : 17927 : case T_DropStmt:
973 : : {
974 : 17927 : DropStmt *stmt = (DropStmt *) parsetree;
975 : :
976 [ + + ]: 17927 : if (EventTriggerSupportsObjectType(stmt->removeType))
3512 977 : 17846 : ProcessUtilitySlow(pstate, pstmt, queryString,
978 : : context, params, queryEnv,
979 : : dest, qc);
980 : : else
4870 981 : 81 : ExecDropStmt(stmt, isTopLevel);
982 : : }
8795 983 : 17227 : break;
984 : :
4870 985 : 1039 : case T_RenameStmt:
986 : : {
987 : 1039 : RenameStmt *stmt = (RenameStmt *) parsetree;
988 : :
989 [ + + ]: 1039 : if (EventTriggerSupportsObjectType(stmt->renameType))
3512 990 : 995 : ProcessUtilitySlow(pstate, pstmt, queryString,
991 : : context, params, queryEnv,
992 : : dest, qc);
993 : : else
4870 994 : 44 : ExecRenameStmt(stmt);
995 : : }
7156 996 : 748 : break;
997 : :
3796 alvherre@alvh.no-ip. 998 : 23 : case T_AlterObjectDependsStmt:
999 : : {
1000 : 23 : AlterObjectDependsStmt *stmt = (AlterObjectDependsStmt *) parsetree;
1001 : :
1002 [ + - ]: 23 : if (EventTriggerSupportsObjectType(stmt->objectType))
3512 tgl@sss.pgh.pa.us 1003 : 23 : ProcessUtilitySlow(pstate, pstmt, queryString,
1004 : : context, params, queryEnv,
1005 : : dest, qc);
1006 : : else
3796 alvherre@alvh.no-ip. 1007 :UBC 0 : ExecAlterObjectDependsStmt(stmt, NULL);
1008 : : }
3796 alvherre@alvh.no-ip. 1009 :CBC 23 : break;
1010 : :
4870 tgl@sss.pgh.pa.us 1011 : 291 : case T_AlterObjectSchemaStmt:
1012 : : {
1013 : 291 : AlterObjectSchemaStmt *stmt = (AlterObjectSchemaStmt *) parsetree;
1014 : :
1015 [ + - ]: 291 : if (EventTriggerSupportsObjectType(stmt->objectType))
3512 1016 : 291 : ProcessUtilitySlow(pstate, pstmt, queryString,
1017 : : context, params, queryEnv,
1018 : : dest, qc);
1019 : : else
4195 alvherre@alvh.no-ip. 1020 :UBC 0 : ExecAlterObjectSchemaStmt(stmt, NULL);
1021 : : }
6946 tgl@sss.pgh.pa.us 1022 :CBC 187 : break;
1023 : :
4870 1024 : 1020 : case T_AlterOwnerStmt:
1025 : : {
1026 : 1020 : AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree;
1027 : :
1028 [ + + ]: 1020 : if (EventTriggerSupportsObjectType(stmt->objectType))
3512 1029 : 958 : ProcessUtilitySlow(pstate, pstmt, queryString,
1030 : : context, params, queryEnv,
1031 : : dest, qc);
1032 : : else
4870 1033 : 62 : ExecAlterOwnerStmt(stmt);
1034 : : }
6946 1035 : 840 : break;
1036 : :
4203 alvherre@alvh.no-ip. 1037 : 4304 : case T_CommentStmt:
1038 : : {
1039 : 4304 : CommentStmt *stmt = (CommentStmt *) parsetree;
1040 : :
1041 [ + + ]: 4304 : if (EventTriggerSupportsObjectType(stmt->objtype))
3512 tgl@sss.pgh.pa.us 1042 : 4145 : ProcessUtilitySlow(pstate, pstmt, queryString,
1043 : : context, params, queryEnv,
1044 : : dest, qc);
1045 : : else
1046 : 159 : CommentObject(stmt);
4203 alvherre@alvh.no-ip. 1047 : 4195 : break;
1048 : : }
1049 : :
1050 : 67 : case T_SecLabelStmt:
1051 : : {
1052 : 67 : SecLabelStmt *stmt = (SecLabelStmt *) parsetree;
1053 : :
1054 [ + + ]: 67 : if (EventTriggerSupportsObjectType(stmt->objtype))
3512 tgl@sss.pgh.pa.us 1055 : 44 : ProcessUtilitySlow(pstate, pstmt, queryString,
1056 : : context, params, queryEnv,
1057 : : dest, qc);
1058 : : else
4203 alvherre@alvh.no-ip. 1059 : 23 : ExecSecLabelStmt(stmt);
1060 : 23 : break;
1061 : : }
1062 : :
295 akorotkov@postgresql 1063 : 269 : case T_WaitStmt:
1064 : : {
136 1065 : 269 : ExecWaitStmt(pstate, (WaitStmt *) parsetree, isTopLevel,
1066 : : dest);
1067 : : }
295 1068 : 249 : break;
1069 : :
10580 bruce@momjian.us 1070 : 110473 : default:
1071 : : /* All other statement types have event trigger support */
3512 tgl@sss.pgh.pa.us 1072 : 110473 : ProcessUtilitySlow(pstate, pstmt, queryString,
1073 : : context, params, queryEnv,
1074 : : dest, qc);
10580 bruce@momjian.us 1075 : 102525 : break;
1076 : : }
1077 : :
3642 peter_e@gmx.net 1078 : 249533 : 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 : : */
2677 peter@eisentraut.org 1085 : 249533 : CommandCounterIncrement();
4870 tgl@sss.pgh.pa.us 1086 : 249533 : }
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
3642 peter_e@gmx.net 1094 : 146983 : 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 : : {
3512 tgl@sss.pgh.pa.us 1103 : 146983 : Node *parsetree = pstmt->utilityStmt;
4870 1104 : 146983 : bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
2883 peter_e@gmx.net 1105 : 146983 : bool isCompleteQuery = (context != PROCESS_UTILITY_SUBCOMMAND);
1106 : : bool needCleanup;
4126 alvherre@alvh.no-ip. 1107 : 146983 : bool commandCollected = false;
1108 : : ObjectAddress address;
1109 : 146983 : ObjectAddress secondaryObject = InvalidObjectAddress;
1110 : :
1111 : : /* All event trigger calls are done only when isCompleteQuery is true */
4870 tgl@sss.pgh.pa.us 1112 [ + + + + ]: 146983 : needCleanup = isCompleteQuery && EventTriggerBeginCompleteQuery();
1113 : :
1114 : : /* PG_TRY block is to ensure we call EventTriggerEndCompleteQuery */
1115 [ + + ]: 146983 : PG_TRY();
1116 : : {
1117 [ + + ]: 146983 : if (isCompleteQuery)
1118 : 138586 : EventTriggerDDLCommandStart(parsetree);
1119 : :
1120 [ + + + + : 146983 : switch (nodeTag(parsetree))
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + - ]
1121 : : {
1122 : : /*
1123 : : * relation and attribute manipulation
1124 : : */
1125 : 756 : case T_CreateSchemaStmt:
143 1126 : 756 : CreateSchemaCommand(pstate,
1127 : : (CreateSchemaStmt *) parsetree,
1128 : : pstmt->stmt_location,
1129 : : pstmt->stmt_len);
1130 : :
1131 : : /*
1132 : : * EventTriggerCollectSimpleCommand called by
1133 : : * CreateSchemaCommand
1134 : : */
4126 alvherre@alvh.no-ip. 1135 : 664 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1136 : 664 : break;
1137 : :
1138 : 26028 : case T_CreateStmt:
1139 : : case T_CreateForeignTableStmt:
1140 : : {
1141 : : List *stmts;
2174 1142 : 26028 : RangeVar *table_rv = NULL;
1143 : :
1144 : : /* Run parse analysis ... */
4870 1145 : 26028 : 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 : : */
2107 1153 [ + + ]: 57971 : while (stmts != NIL)
1154 : : {
1155 : 33417 : Node *stmt = (Node *) linitial(stmts);
1156 : :
1157 : 33417 : stmts = list_delete_first(stmts);
1158 : :
4870 1159 [ + + ]: 33417 : if (IsA(stmt, CreateStmt))
1160 : : {
2174 1161 : 25508 : CreateStmt *cstmt = (CreateStmt *) stmt;
1162 : : Datum toast_options;
751 heikki.linnakangas@i 1163 : 25508 : const char *const validnsps[] = HEAP_RELOPT_NAMESPACES;
1164 : :
1165 : : /* Remember transformed RangeVar for LIKE */
2174 tgl@sss.pgh.pa.us 1166 : 25508 : table_rv = cstmt->relation;
1167 : :
1168 : : /* Create the table itself */
1169 : 25508 : address = DefineRelation(cstmt,
1170 : : RELKIND_RELATION,
1171 : : InvalidOid, NULL,
1172 : : queryString);
4126 alvherre@alvh.no-ip. 1173 : 24614 : EventTriggerCollectSimpleCommand(address,
1174 : : secondaryObject,
1175 : : stmt);
1176 : :
1177 : : /*
1178 : : * Let NewRelationCreateToastTable decide if this
1179 : : * one needs a secondary relation too.
1180 : : */
4870 tgl@sss.pgh.pa.us 1181 : 24614 : CommandCounterIncrement();
1182 : :
1183 : : /*
1184 : : * parse and validate reloptions for the toast
1185 : : * table
1186 : : */
1187 : 24614 : toast_options = transformRelOptions((Datum) 0,
1188 : : cstmt->options,
1189 : : "toast",
1190 : : validnsps,
1191 : : true,
1192 : : false);
868 akorotkov@postgresql 1193 : 24614 : (void) heap_reloptions(RELKIND_TOASTVALUE,
1194 : : toast_options,
1195 : : true);
1196 : :
4195 alvherre@alvh.no-ip. 1197 : 24610 : NewRelationCreateToastTable(address.objectId,
1198 : : toast_options);
1199 : : }
4870 tgl@sss.pgh.pa.us 1200 [ + + ]: 7909 : else if (IsA(stmt, CreateForeignTableStmt))
1201 : : {
2174 1202 : 293 : CreateForeignTableStmt *cstmt = (CreateForeignTableStmt *) stmt;
1203 : :
1204 : : /* Remember transformed RangeVar for LIKE */
1205 : 293 : table_rv = cstmt->base.relation;
1206 : :
1207 : : /* Create the table itself */
1208 : 293 : address = DefineRelation(&cstmt->base,
1209 : : RELKIND_FOREIGN_TABLE,
1210 : : InvalidOid, NULL,
1211 : : queryString);
1212 : 276 : CreateForeignTable(cstmt,
1213 : : address.objectId);
4126 alvherre@alvh.no-ip. 1214 : 237 : EventTriggerCollectSimpleCommand(address,
1215 : : secondaryObject,
1216 : : stmt);
1217 : : }
2197 tgl@sss.pgh.pa.us 1218 [ + + ]: 7616 : 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 : 145 : TableLikeClause *like = (TableLikeClause *) stmt;
1227 : : List *morestmts;
1228 : :
2174 1229 [ - + ]: 145 : Assert(table_rv != NULL);
1230 : :
1231 : 145 : morestmts = expandTableLikeClause(table_rv, like);
2107 1232 : 141 : 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 : :
3512 1243 : 7471 : wrapper = makeNode(PlannedStmt);
1244 : 7471 : wrapper->commandType = CMD_UTILITY;
1245 : 7471 : wrapper->canSetTag = false;
1246 : 7471 : wrapper->utilityStmt = stmt;
1247 : 7471 : wrapper->stmt_location = pstmt->stmt_location;
1248 : 7471 : wrapper->stmt_len = pstmt->stmt_len;
392 michael@paquier.xyz 1249 : 7471 : wrapper->planOrigin = PLAN_STMT_INTERNAL;
1250 : :
3512 tgl@sss.pgh.pa.us 1251 : 7471 : 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 */
2107 1262 [ + + ]: 32161 : if (stmts != NIL)
4870 1263 : 7612 : CommandCounterIncrement();
1264 : : }
1265 : :
1266 : : /*
1267 : : * The multiple commands generated here are stashed
1268 : : * individually, so disable collection below.
1269 : : */
4126 alvherre@alvh.no-ip. 1270 : 24554 : commandCollected = true;
1271 : : }
4870 tgl@sss.pgh.pa.us 1272 : 24554 : break;
1273 : :
1274 : 21109 : case T_AlterTableStmt:
1275 : : {
1276 : 21109 : 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 : : */
1981 alvherre@alvh.no-ip. 1286 [ + - + + : 43079 : foreach(cell, atstmt->cmds)
+ + ]
1287 : : {
1288 : 21974 : AlterTableCmd *cmd = (AlterTableCmd *) lfirst(cell);
1289 : :
1290 : : /* Disallow DETACH CONCURRENTLY in a transaction block */
1291 [ + + ]: 21974 : if (cmd->subtype == AT_DetachPartition)
1292 : : {
1293 [ + + ]: 385 : 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 : : */
4870 tgl@sss.pgh.pa.us 1305 : 21105 : lockmode = AlterTableGetLockLevel(atstmt->cmds);
1306 : 21105 : relid = AlterTableLookupRelation(atstmt, lockmode);
1307 : :
1308 [ + + ]: 21039 : if (OidIsValid(relid))
1309 : : {
1310 : : AlterTableUtilityContext atcontext;
1311 : :
1312 : : /* Set up info needed for recursive callbacks ... */
2416 1313 : 20931 : atcontext.pstmt = pstmt;
1314 : 20931 : atcontext.queryString = queryString;
1315 : 20931 : atcontext.relid = relid;
1316 : 20931 : atcontext.params = params;
1317 : 20931 : atcontext.queryEnv = queryEnv;
1318 : :
1319 : : /* ... ensure we have an event trigger context ... */
4126 alvherre@alvh.no-ip. 1320 : 20931 : EventTriggerAlterTableStart(parsetree);
1321 : 20931 : EventTriggerAlterTableRelid(relid);
1322 : :
1323 : : /* ... and do it */
2416 tgl@sss.pgh.pa.us 1324 : 20931 : AlterTable(atstmt, lockmode, &atcontext);
1325 : :
1326 : : /* done */
4126 alvherre@alvh.no-ip. 1327 : 18214 : EventTriggerAlterTableEnd();
1328 : : }
1329 : : else
4870 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 */
4126 alvherre@alvh.no-ip. 1336 : 18322 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1337 : 18322 : break;
1338 : :
1339 : 194 : case T_AlterDomainStmt:
1340 : : {
1341 : 194 : 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 [ + + + + : 194 : switch (stmt->subtype)
+ + - ]
1348 : : {
420 michael@paquier.xyz 1349 : 9 : case AD_AlterDefault:
1350 : :
1351 : : /*
1352 : : * Recursively alter column default for table and,
1353 : : * if requested, for descendants
1354 : : */
1355 : : address =
4126 alvherre@alvh.no-ip. 1356 : 9 : AlterDomainDefault(stmt->typeName,
1357 : : stmt->def);
4870 tgl@sss.pgh.pa.us 1358 : 9 : break;
420 michael@paquier.xyz 1359 : 8 : case AD_DropNotNull:
1360 : : address =
4126 alvherre@alvh.no-ip. 1361 : 8 : AlterDomainNotNull(stmt->typeName,
1362 : : false);
4870 tgl@sss.pgh.pa.us 1363 : 8 : break;
420 michael@paquier.xyz 1364 : 16 : case AD_SetNotNull:
1365 : : address =
4126 alvherre@alvh.no-ip. 1366 : 16 : AlterDomainNotNull(stmt->typeName,
1367 : : true);
4870 tgl@sss.pgh.pa.us 1368 : 8 : break;
420 michael@paquier.xyz 1369 : 112 : case AD_AddConstraint:
1370 : : address =
4126 alvherre@alvh.no-ip. 1371 : 112 : AlterDomainAddConstraint(stmt->typeName,
1372 : : stmt->def,
1373 : : &secondaryObject,
1374 : : false);
4870 tgl@sss.pgh.pa.us 1375 : 64 : break;
420 michael@paquier.xyz 1376 : 40 : case AD_DropConstraint:
1377 : : address =
4126 alvherre@alvh.no-ip. 1378 : 40 : AlterDomainDropConstraint(stmt->typeName,
1379 : 40 : stmt->name,
1380 : : stmt->behavior,
1381 : 40 : stmt->missing_ok);
4870 tgl@sss.pgh.pa.us 1382 : 36 : break;
420 michael@paquier.xyz 1383 : 9 : case AD_ValidateConstraint:
1384 : : address =
4126 alvherre@alvh.no-ip. 1385 : 9 : AlterDomainValidateConstraint(stmt->typeName,
1386 : 9 : stmt->name);
4870 tgl@sss.pgh.pa.us 1387 : 4 : break;
3354 tgl@sss.pgh.pa.us 1388 :UBC 0 : default: /* oops */
4870 1389 [ # # ]: 0 : elog(ERROR, "unrecognized alter domain type: %d",
1390 : : (int) stmt->subtype);
1391 : : break;
1392 : : }
1393 : : }
4870 tgl@sss.pgh.pa.us 1394 :CBC 129 : break;
1395 : :
1396 : : /*
1397 : : * ************* object creation / destruction **************
1398 : : */
1399 : 5530 : case T_DefineStmt:
1400 : : {
1401 : 5530 : DefineStmt *stmt = (DefineStmt *) parsetree;
1402 : :
1403 [ + + + + : 5530 : switch (stmt->kind)
+ + + +
- ]
1404 : : {
1405 : 585 : case OBJECT_AGGREGATE:
1406 : : address =
3642 peter_e@gmx.net 1407 : 585 : DefineAggregate(pstate, stmt->defnames, stmt->args,
4126 alvherre@alvh.no-ip. 1408 : 585 : stmt->oldstyle,
1409 : : stmt->definition,
2718 rhodiumtoad@postgres 1410 : 585 : stmt->replace);
4870 tgl@sss.pgh.pa.us 1411 : 365 : break;
1412 : 889 : case OBJECT_OPERATOR:
1413 [ - + ]: 889 : Assert(stmt->args == NIL);
4126 alvherre@alvh.no-ip. 1414 : 889 : address = DefineOperator(stmt->defnames,
1415 : : stmt->definition);
4870 tgl@sss.pgh.pa.us 1416 : 824 : break;
1417 : 251 : case OBJECT_TYPE:
1418 [ - + ]: 251 : Assert(stmt->args == NIL);
3642 peter_e@gmx.net 1419 : 251 : address = DefineType(pstate,
1420 : : stmt->defnames,
1421 : : stmt->definition);
4870 tgl@sss.pgh.pa.us 1422 : 227 : break;
1423 : 31 : case OBJECT_TSPARSER:
1424 [ - + ]: 31 : Assert(stmt->args == NIL);
4126 alvherre@alvh.no-ip. 1425 : 31 : address = DefineTSParser(stmt->defnames,
1426 : : stmt->definition);
4870 tgl@sss.pgh.pa.us 1427 : 27 : break;
1428 : 1740 : case OBJECT_TSDICTIONARY:
1429 [ - + ]: 1740 : Assert(stmt->args == NIL);
4126 alvherre@alvh.no-ip. 1430 : 1740 : address = DefineTSDictionary(stmt->defnames,
1431 : : stmt->definition);
4870 tgl@sss.pgh.pa.us 1432 : 1724 : break;
1433 : 85 : case OBJECT_TSTEMPLATE:
1434 [ - + ]: 85 : Assert(stmt->args == NIL);
4126 alvherre@alvh.no-ip. 1435 : 85 : address = DefineTSTemplate(stmt->defnames,
1436 : : stmt->definition);
4870 tgl@sss.pgh.pa.us 1437 : 81 : break;
1438 : 1704 : case OBJECT_TSCONFIGURATION:
1439 [ - + ]: 1704 : Assert(stmt->args == NIL);
4126 alvherre@alvh.no-ip. 1440 : 1704 : address = DefineTSConfiguration(stmt->defnames,
1441 : : stmt->definition,
1442 : : &secondaryObject);
4870 tgl@sss.pgh.pa.us 1443 : 1704 : break;
1444 : 245 : case OBJECT_COLLATION:
1445 [ - + ]: 245 : Assert(stmt->args == NIL);
3642 peter_e@gmx.net 1446 : 245 : address = DefineCollation(pstate,
1447 : : stmt->defnames,
1448 : : stmt->definition,
3487 1449 : 245 : stmt->if_not_exists);
4870 tgl@sss.pgh.pa.us 1450 : 148 : break;
4870 tgl@sss.pgh.pa.us 1451 :UBC 0 : default:
1452 [ # # ]: 0 : elog(ERROR, "unrecognized define stmt type: %d",
1453 : : (int) stmt->kind);
1454 : : break;
1455 : : }
1456 : : }
4870 tgl@sss.pgh.pa.us 1457 :CBC 5100 : break;
1458 : :
1459 : 9252 : case T_IndexStmt: /* CREATE INDEX */
1460 : : {
1461 : 9252 : IndexStmt *stmt = (IndexStmt *) parsetree;
1462 : : Oid relid;
1463 : : LOCKMODE lockmode;
1251 1464 : 9252 : int nparts = -1;
1465 : : bool is_alter_table;
1466 : :
4870 1467 [ + + ]: 9252 : if (stmt->concurrent)
3114 peter_e@gmx.net 1468 : 132 : PreventInTransactionBlock(isTopLevel,
1469 : : "CREATE INDEX CONCURRENTLY");
1470 : :
1471 : : /*
1472 : : * Look up the relation OID just once, right here at the
1473 : : * beginning, so that we don't end up repeating the name
1474 : : * lookup later and latching onto a different relation
1475 : : * partway through. To avoid lock upgrade hazards, it's
1476 : : * important that we take the strongest lock that will
1477 : : * eventually be needed here, so the lockmode calculation
1478 : : * needs to match what DefineIndex() does.
1479 : : */
4574 rhaas@postgresql.org 1480 : 18488 : lockmode = stmt->concurrent ? ShareUpdateExclusiveLock
1481 [ + + ]: 9244 : : ShareLock;
1482 : : relid =
1483 : 9244 : RangeVarGetRelidExtended(stmt->relation, lockmode,
1484 : : 0,
1485 : : RangeVarCallbackOwnsRelation,
1486 : : NULL);
1487 : :
1488 : : /*
1489 : : * CREATE INDEX on partitioned tables (but not regular
1490 : : * inherited tables) recurses to partitions, so we must
1491 : : * acquire locks early to avoid deadlocks.
1492 : : *
1493 : : * We also take the opportunity to verify that all
1494 : : * partitions are something we can put an index on, to
1495 : : * avoid building some indexes only to fail later. While
1496 : : * at it, also count the partitions, so that DefineIndex
1497 : : * needn't do a duplicative find_all_inheritors search.
1498 : : */
3027 alvherre@alvh.no-ip. 1499 [ + + ]: 9239 : if (stmt->relation->inh &&
1500 [ + + ]: 9090 : get_rel_relkind(relid) == RELKIND_PARTITIONED_TABLE)
1501 : : {
1502 : : ListCell *lc;
1503 : 876 : List *inheritors = NIL;
1504 : :
1505 : 876 : inheritors = find_all_inheritors(relid, lockmode, NULL);
1506 [ + - + + : 2256 : foreach(lc, inheritors)
+ + ]
1507 : : {
1251 tgl@sss.pgh.pa.us 1508 : 1388 : Oid partrelid = lfirst_oid(lc);
1509 : 1388 : char relkind = get_rel_relkind(partrelid);
1510 : :
3027 alvherre@alvh.no-ip. 1511 [ + + + - ]: 1388 : if (relkind != RELKIND_RELATION &&
1512 [ + + ]: 962 : relkind != RELKIND_MATVIEW &&
2619 1513 [ - + ]: 12 : relkind != RELKIND_PARTITIONED_TABLE &&
1514 : : relkind != RELKIND_FOREIGN_TABLE)
2619 alvherre@alvh.no-ip. 1515 [ # # ]:UBC 0 : elog(ERROR, "unexpected relkind \"%c\" on partition \"%s\"",
1516 : : relkind, stmt->relation->relname);
1517 : :
2619 alvherre@alvh.no-ip. 1518 [ + + ]:CBC 1388 : if (relkind == RELKIND_FOREIGN_TABLE &&
1519 [ + + - + ]: 12 : (stmt->unique || stmt->primary))
3027 1520 [ + - ]: 8 : ereport(ERROR,
1521 : : (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1522 : : errmsg("cannot create unique index on partitioned table \"%s\"",
1523 : : stmt->relation->relname),
1524 : : errdetail("Table \"%s\" contains partitions that are foreign tables.",
1525 : : stmt->relation->relname)));
1526 : : }
1527 : : /* count direct and indirect children, but not rel */
1251 tgl@sss.pgh.pa.us 1528 : 868 : nparts = list_length(inheritors) - 1;
3027 alvherre@alvh.no-ip. 1529 : 868 : list_free(inheritors);
1530 : : }
1531 : :
1532 : : /*
1533 : : * If the IndexStmt is already transformed, it must have
1534 : : * come from generateClonedIndexStmt, which in current
1535 : : * usage means it came from expandTableLikeClause rather
1536 : : * than from original parse analysis. And that means we
1537 : : * must treat it like ALTER TABLE ADD INDEX, not CREATE.
1538 : : * (This is a bit grotty, but currently it doesn't seem
1539 : : * worth adding a separate bool field for the purpose.)
1540 : : */
2197 tgl@sss.pgh.pa.us 1541 : 9231 : is_alter_table = stmt->transformed;
1542 : :
1543 : : /* Run parse analysis ... */
4574 rhaas@postgresql.org 1544 : 9231 : stmt = transformIndexStmt(relid, stmt, queryString);
1545 : :
1546 : : /* ... and do it */
4126 alvherre@alvh.no-ip. 1547 : 9207 : EventTriggerAlterTableStart(parsetree);
1548 : : address =
235 tgl@sss.pgh.pa.us 1549 : 9207 : DefineIndex(pstate,
1550 : : relid, /* OID of heap relation */
1551 : : stmt,
1552 : : InvalidOid, /* no predefined OID */
1553 : : InvalidOid, /* no parent index */
1554 : : InvalidOid, /* no parent constraint */
1555 : : nparts, /* # of partitions, or -1 */
1556 : : is_alter_table,
1557 : : true, /* check_rights */
1558 : : true, /* check_not_in_use */
1559 : : false, /* skip_build */
1560 : : false); /* quiet */
1561 : :
1562 : : /*
1563 : : * Add the CREATE INDEX node itself to stash right away;
1564 : : * if there were any commands stashed in the ALTER TABLE
1565 : : * code, we need them to appear after this one.
1566 : : */
4126 alvherre@alvh.no-ip. 1567 : 8729 : EventTriggerCollectSimpleCommand(address, secondaryObject,
1568 : : parsetree);
1569 : 8729 : commandCollected = true;
1570 : 8729 : EventTriggerAlterTableEnd();
1571 : : }
4870 tgl@sss.pgh.pa.us 1572 : 8729 : break;
1573 : :
997 michael@paquier.xyz 1574 : 706 : case T_ReindexStmt:
1575 : 706 : ExecReindex(pstate, (ReindexStmt *) parsetree, isTopLevel);
1576 : :
1577 : : /* EventTriggerCollectSimpleCommand is called directly */
1578 : 498 : commandCollected = true;
1579 : 498 : break;
1580 : :
4870 tgl@sss.pgh.pa.us 1581 : 331 : case T_CreateExtensionStmt:
3642 peter_e@gmx.net 1582 : 331 : address = CreateExtension(pstate, (CreateExtensionStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1583 : 308 : break;
1584 : :
1585 : 19 : case T_AlterExtensionStmt:
3642 peter_e@gmx.net 1586 : 19 : address = ExecAlterExtensionStmt(pstate, (AlterExtensionStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1587 : 17 : break;
1588 : :
1589 : 146 : case T_AlterExtensionContentsStmt:
4126 alvherre@alvh.no-ip. 1590 : 146 : address = ExecAlterExtensionContentsStmt((AlterExtensionContentsStmt *) parsetree,
1591 : : &secondaryObject);
4870 tgl@sss.pgh.pa.us 1592 : 145 : break;
1593 : :
1594 : 152 : case T_CreateFdwStmt:
1869 dean.a.rasheed@gmail 1595 : 152 : address = CreateForeignDataWrapper(pstate, (CreateFdwStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1596 : 119 : break;
1597 : :
1598 : 103 : case T_AlterFdwStmt:
1869 dean.a.rasheed@gmail 1599 : 103 : address = AlterForeignDataWrapper(pstate, (AlterFdwStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1600 : 54 : break;
1601 : :
1602 : 194 : case T_CreateForeignServerStmt:
4126 alvherre@alvh.no-ip. 1603 : 194 : address = CreateForeignServer((CreateForeignServerStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1604 : 161 : break;
1605 : :
1606 : 129 : case T_AlterForeignServerStmt:
4126 alvherre@alvh.no-ip. 1607 : 129 : address = AlterForeignServer((AlterForeignServerStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1608 : 96 : break;
1609 : :
1610 : 167 : case T_CreateUserMappingStmt:
4126 alvherre@alvh.no-ip. 1611 : 167 : address = CreateUserMapping((CreateUserMappingStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1612 : 124 : break;
1613 : :
1614 : 73 : case T_AlterUserMappingStmt:
4126 alvherre@alvh.no-ip. 1615 : 73 : address = AlterUserMapping((AlterUserMappingStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1616 : 36 : break;
1617 : :
1618 : 79 : case T_DropUserMappingStmt:
1619 : 79 : RemoveUserMapping((DropUserMappingStmt *) parsetree);
1620 : : /* no commands stashed for DROP */
4126 alvherre@alvh.no-ip. 1621 : 54 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1622 : 54 : break;
1623 : :
4431 1624 : 28 : case T_ImportForeignSchemaStmt:
1625 : 28 : ImportForeignSchema((ImportForeignSchemaStmt *) parsetree);
1626 : : /* commands are stashed inside ImportForeignSchema */
4126 alvherre@alvh.no-ip. 1627 : 7 : commandCollected = true;
4431 tgl@sss.pgh.pa.us 1628 : 7 : break;
1629 : :
4870 1630 : 2384 : case T_CompositeTypeStmt: /* CREATE TYPE (composite) */
1631 : : {
1632 : 2384 : CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree;
1633 : :
4126 alvherre@alvh.no-ip. 1634 : 2384 : address = DefineCompositeType(stmt->typevar,
1635 : : stmt->coldeflist);
1636 : : }
4870 tgl@sss.pgh.pa.us 1637 : 2376 : break;
1638 : :
3354 1639 : 285 : case T_CreateEnumStmt: /* CREATE TYPE AS ENUM */
4126 alvherre@alvh.no-ip. 1640 : 285 : address = DefineEnum((CreateEnumStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1641 : 280 : break;
1642 : :
3354 1643 : 157 : case T_CreateRangeStmt: /* CREATE TYPE AS RANGE */
1869 dean.a.rasheed@gmail 1644 : 157 : address = DefineRange(pstate, (CreateRangeStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1645 : 133 : break;
1646 : :
3354 1647 : 246 : case T_AlterEnumStmt: /* ALTER TYPE (enum) */
2879 tmunro@postgresql.or 1648 : 246 : address = AlterEnum((AlterEnumStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1649 : 226 : break;
1650 : :
1651 : 10705 : case T_ViewStmt: /* CREATE VIEW */
4126 alvherre@alvh.no-ip. 1652 : 10705 : EventTriggerAlterTableStart(parsetree);
3512 tgl@sss.pgh.pa.us 1653 : 10705 : address = DefineView((ViewStmt *) parsetree, queryString,
1654 : : pstmt->stmt_location, pstmt->stmt_len);
4126 alvherre@alvh.no-ip. 1655 : 10644 : EventTriggerCollectSimpleCommand(address, secondaryObject,
1656 : : parsetree);
1657 : : /* stashed internally */
1658 : 10644 : commandCollected = true;
1659 : 10644 : EventTriggerAlterTableEnd();
4870 tgl@sss.pgh.pa.us 1660 : 10644 : break;
1661 : :
1662 : 13174 : case T_CreateFunctionStmt: /* CREATE FUNCTION */
3642 peter_e@gmx.net 1663 : 13174 : address = CreateFunction(pstate, (CreateFunctionStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1664 : 12812 : break;
1665 : :
1666 : 221 : case T_AlterFunctionStmt: /* ALTER FUNCTION */
3642 peter_e@gmx.net 1667 : 221 : address = AlterFunction(pstate, (AlterFunctionStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1668 : 201 : break;
1669 : :
1670 : 758 : case T_RuleStmt: /* CREATE RULE */
4126 alvherre@alvh.no-ip. 1671 : 758 : address = DefineRule((RuleStmt *) parsetree, queryString);
4870 tgl@sss.pgh.pa.us 1672 : 725 : break;
1673 : :
1674 : 1240 : case T_CreateSeqStmt:
3642 peter_e@gmx.net 1675 : 1240 : address = DefineSequence(pstate, (CreateSeqStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1676 : 1175 : break;
1677 : :
1678 : 959 : case T_AlterSeqStmt:
3642 peter_e@gmx.net 1679 : 959 : address = AlterSequence(pstate, (AlterSeqStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1680 : 927 : break;
1681 : :
1682 : 1177 : case T_CreateTableAsStmt:
2427 peter@eisentraut.org 1683 : 1177 : address = ExecCreateTableAs(pstate, (CreateTableAsStmt *) parsetree,
1684 : : params, queryEnv, qc);
4870 tgl@sss.pgh.pa.us 1685 : 1107 : break;
1686 : :
1687 : 174 : case T_RefreshMatViewStmt:
1688 : :
1689 : : /*
1690 : : * REFRESH CONCURRENTLY executes some DDL commands internally.
1691 : : * Inhibit DDL command collection here to avoid those commands
1692 : : * from showing up in the deparsed command queue. The refresh
1693 : : * command itself is queued, which is enough.
1694 : : */
4126 alvherre@alvh.no-ip. 1695 : 174 : EventTriggerInhibitCommandCollection();
1421 drowley@postgresql.o 1696 [ + + ]: 174 : PG_TRY(2);
1697 : : {
4126 alvherre@alvh.no-ip. 1698 : 174 : address = ExecRefreshMatView((RefreshMatViewStmt *) parsetree,
1699 : : queryString, qc);
1700 : : }
1421 drowley@postgresql.o 1701 : 48 : PG_FINALLY(2);
1702 : : {
4126 alvherre@alvh.no-ip. 1703 : 174 : EventTriggerUndoInhibitCommandCollection();
1704 : : }
1421 drowley@postgresql.o 1705 [ + + ]: 174 : PG_END_TRY(2);
4870 tgl@sss.pgh.pa.us 1706 : 126 : break;
1707 : :
1708 : 2146 : case T_CreateTrigStmt:
4126 alvherre@alvh.no-ip. 1709 : 2146 : address = CreateTrigger((CreateTrigStmt *) parsetree,
1710 : : queryString, InvalidOid, InvalidOid,
1711 : : InvalidOid, InvalidOid, InvalidOid,
1712 : : InvalidOid, NULL, false, false);
4870 tgl@sss.pgh.pa.us 1713 : 1993 : break;
1714 : :
1715 : 78 : case T_CreatePLangStmt:
4126 alvherre@alvh.no-ip. 1716 : 78 : address = CreateProceduralLanguage((CreatePLangStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1717 : 78 : break;
1718 : :
1719 : 1007 : case T_CreateDomainStmt:
619 michael@paquier.xyz 1720 : 1007 : address = DefineDomain(pstate, (CreateDomainStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1721 : 922 : break;
1722 : :
1723 : 42 : case T_CreateConversionStmt:
4126 alvherre@alvh.no-ip. 1724 : 42 : address = CreateConversionCommand((CreateConversionStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1725 : 34 : break;
1726 : :
1727 : 180 : case T_CreateCastStmt:
4126 alvherre@alvh.no-ip. 1728 : 180 : address = CreateCast((CreateCastStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1729 : 176 : break;
1730 : :
1731 : 295 : case T_CreateOpClassStmt:
1732 : 295 : DefineOpClass((CreateOpClassStmt *) parsetree);
1733 : : /* command is stashed in DefineOpClass */
4126 alvherre@alvh.no-ip. 1734 : 295 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1735 : 295 : break;
1736 : :
1737 : 95 : case T_CreateOpFamilyStmt:
4126 alvherre@alvh.no-ip. 1738 : 95 : address = DefineOpFamily((CreateOpFamilyStmt *) parsetree);
1739 : :
1740 : : /*
1741 : : * DefineOpFamily calls EventTriggerCollectSimpleCommand
1742 : : * directly.
1743 : : */
1560 1744 : 95 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1745 : 95 : break;
1746 : :
164 peter@eisentraut.org 1747 : 217 : case T_CreatePropGraphStmt:
1748 : 217 : address = CreatePropGraph(pstate, (CreatePropGraphStmt *) parsetree);
1749 : 137 : break;
1750 : :
1751 : 180 : case T_AlterPropGraphStmt:
1752 : 180 : address = AlterPropGraph(pstate, (AlterPropGraphStmt *) parsetree);
1753 : 104 : break;
1754 : :
4141 peter_e@gmx.net 1755 : 26 : case T_CreateTransformStmt:
4080 alvherre@alvh.no-ip. 1756 : 26 : address = CreateTransform((CreateTransformStmt *) parsetree);
4141 peter_e@gmx.net 1757 : 21 : break;
1758 : :
4870 tgl@sss.pgh.pa.us 1759 : 276 : case T_AlterOpFamilyStmt:
1760 : 276 : AlterOpFamily((AlterOpFamilyStmt *) parsetree);
1761 : : /* commands are stashed in AlterOpFamily */
4126 alvherre@alvh.no-ip. 1762 : 168 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1763 : 168 : break;
1764 : :
1765 : 23 : case T_AlterTSDictionaryStmt:
4126 alvherre@alvh.no-ip. 1766 : 23 : address = AlterTSDictionary((AlterTSDictionaryStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1767 : 18 : break;
1768 : :
1769 : 5064 : case T_AlterTSConfigurationStmt:
3535 sfrost@snowman.net 1770 : 5064 : AlterTSConfiguration((AlterTSConfigurationStmt *) parsetree);
1771 : :
1772 : : /*
1773 : : * Commands are stashed in MakeConfigurationMapping and
1774 : : * DropConfigurationMapping, which are called from
1775 : : * AlterTSConfiguration
1776 : : */
1777 : 5048 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1778 : 5048 : break;
1779 : :
4370 sfrost@snowman.net 1780 : 16 : case T_AlterTableMoveAllStmt:
1781 : 16 : AlterTableMoveAll((AlterTableMoveAllStmt *) parsetree);
1782 : : /* commands are stashed in AlterTableMoveAll */
4126 alvherre@alvh.no-ip. 1783 : 16 : commandCollected = true;
4370 sfrost@snowman.net 1784 : 16 : break;
1785 : :
4870 tgl@sss.pgh.pa.us 1786 : 17846 : case T_DropStmt:
1787 : 17846 : ExecDropStmt((DropStmt *) parsetree, isTopLevel);
1788 : : /* no commands stashed for DROP */
4126 alvherre@alvh.no-ip. 1789 : 17162 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1790 : 17162 : break;
1791 : :
1792 : 995 : case T_RenameStmt:
4126 alvherre@alvh.no-ip. 1793 : 995 : address = ExecRenameStmt((RenameStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1794 : 715 : break;
1795 : :
3796 alvherre@alvh.no-ip. 1796 : 23 : case T_AlterObjectDependsStmt:
1797 : : address =
1798 : 23 : ExecAlterObjectDependsStmt((AlterObjectDependsStmt *) parsetree,
1799 : : &secondaryObject);
1800 : 23 : break;
1801 : :
4870 tgl@sss.pgh.pa.us 1802 : 291 : case T_AlterObjectSchemaStmt:
1803 : : address =
4126 alvherre@alvh.no-ip. 1804 : 291 : ExecAlterObjectSchemaStmt((AlterObjectSchemaStmt *) parsetree,
1805 : : &secondaryObject);
4870 tgl@sss.pgh.pa.us 1806 : 187 : break;
1807 : :
1808 : 958 : case T_AlterOwnerStmt:
4126 alvherre@alvh.no-ip. 1809 : 958 : address = ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree);
4870 tgl@sss.pgh.pa.us 1810 : 782 : break;
1811 : :
4062 heikki.linnakangas@i 1812 : 332 : case T_AlterOperatorStmt:
1813 : 332 : address = AlterOperator((AlterOperatorStmt *) parsetree);
1814 : 288 : break;
1815 : :
2365 tgl@sss.pgh.pa.us 1816 : 36 : case T_AlterTypeStmt:
1817 : 36 : address = AlterType((AlterTypeStmt *) parsetree);
1818 : 28 : break;
1819 : :
4203 alvherre@alvh.no-ip. 1820 : 4145 : case T_CommentStmt:
4126 1821 : 4145 : address = CommentObject((CommentStmt *) parsetree);
4203 1822 : 4040 : break;
1823 : :
1824 : 12208 : case T_GrantStmt:
1825 : 12208 : ExecuteGrantStmt((GrantStmt *) parsetree);
1826 : : /* commands are stashed in ExecGrantStmt_oids */
4126 1827 : 12109 : commandCollected = true;
4203 1828 : 12109 : break;
1829 : :
4870 tgl@sss.pgh.pa.us 1830 : 96 : case T_DropOwnedStmt:
1831 : 96 : DropOwnedObjects((DropOwnedStmt *) parsetree);
1832 : : /* no commands stashed for DROP */
4126 alvherre@alvh.no-ip. 1833 : 84 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1834 : 84 : break;
1835 : :
1836 : 135 : case T_AlterDefaultPrivilegesStmt:
3642 peter_e@gmx.net 1837 : 135 : ExecAlterDefaultPrivilegesStmt(pstate, (AlterDefaultPrivilegesStmt *) parsetree);
4126 alvherre@alvh.no-ip. 1838 : 127 : EventTriggerCollectAlterDefPrivs((AlterDefaultPrivilegesStmt *) parsetree);
1839 : 127 : commandCollected = true;
4870 tgl@sss.pgh.pa.us 1840 : 127 : break;
1841 : :
4360 sfrost@snowman.net 1842 : 615 : case T_CreatePolicyStmt: /* CREATE POLICY */
4126 alvherre@alvh.no-ip. 1843 : 615 : address = CreatePolicy((CreatePolicyStmt *) parsetree);
4360 sfrost@snowman.net 1844 : 598 : break;
1845 : :
3354 tgl@sss.pgh.pa.us 1846 : 56 : case T_AlterPolicyStmt: /* ALTER POLICY */
4126 alvherre@alvh.no-ip. 1847 : 56 : address = AlterPolicy((AlterPolicyStmt *) parsetree);
4360 sfrost@snowman.net 1848 : 48 : break;
1849 : :
4203 alvherre@alvh.no-ip. 1850 : 44 : case T_SecLabelStmt:
4126 1851 : 44 : address = ExecSecLabelStmt((SecLabelStmt *) parsetree);
4203 1852 : 21 : break;
1853 : :
3809 1854 : 38 : case T_CreateAmStmt:
1855 : 38 : address = CreateAccessMethod((CreateAmStmt *) parsetree);
1856 : 22 : break;
1857 : :
3507 peter_e@gmx.net 1858 : 639 : case T_CreatePublicationStmt:
1869 dean.a.rasheed@gmail 1859 : 639 : address = CreatePublication(pstate, (CreatePublicationStmt *) parsetree);
3507 peter_e@gmx.net 1860 : 522 : break;
1861 : :
1862 : 782 : case T_AlterPublicationStmt:
1869 dean.a.rasheed@gmail 1863 : 782 : AlterPublication(pstate, (AlterPublicationStmt *) parsetree);
1864 : :
1865 : : /*
1866 : : * AlterPublication calls EventTriggerCollectSimpleCommand
1867 : : * directly
1868 : : */
3507 peter_e@gmx.net 1869 : 598 : commandCollected = true;
1870 : 598 : break;
1871 : :
1872 : 337 : case T_CreateSubscriptionStmt:
1869 dean.a.rasheed@gmail 1873 : 337 : address = CreateSubscription(pstate,
1874 : : (CreateSubscriptionStmt *) parsetree,
1875 : : isTopLevel);
3507 peter_e@gmx.net 1876 : 214 : break;
1877 : :
1878 : 443 : case T_AlterSubscriptionStmt:
1869 dean.a.rasheed@gmail 1879 : 443 : address = AlterSubscription(pstate,
1880 : : (AlterSubscriptionStmt *) parsetree,
1881 : : isTopLevel);
3507 peter_e@gmx.net 1882 : 356 : break;
1883 : :
1884 : 182 : case T_DropSubscriptionStmt:
3464 1885 : 182 : DropSubscription((DropSubscriptionStmt *) parsetree, isTopLevel);
1886 : : /* no commands stashed for DROP */
3507 1887 : 165 : commandCollected = true;
1888 : 165 : break;
1889 : :
3443 alvherre@alvh.no-ip. 1890 : 640 : case T_CreateStatsStmt:
1891 : : {
1892 : : Oid relid;
1980 tomas.vondra@postgre 1893 : 640 : CreateStatsStmt *stmt = (CreateStatsStmt *) parsetree;
1894 : : RangeVar *rel;
1895 : :
1896 : : /*
1897 : : * Examine the FROM clause. Currently, we only allow it
1898 : : * to be a single simple table, but later we'll probably
1899 : : * allow multiple tables and JOIN syntax. The grammar is
1900 : : * already prepared for that, so we have to check here
1901 : : * that what we got is what we can support.
1902 : : */
17 msawada@postgresql.o 1903 [ + + ]: 640 : if (list_length(stmt->relations) != 1)
1904 [ + - ]: 8 : ereport(ERROR,
1905 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1906 : : errmsg("only a single relation is allowed in CREATE STATISTICS")));
1907 : :
1908 : 632 : rel = (RangeVar *) linitial(stmt->relations);
1909 : :
1980 tomas.vondra@postgre 1910 [ + + ]: 632 : if (!IsA(rel, RangeVar))
1911 [ + - ]: 28 : ereport(ERROR,
1912 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1913 : : errmsg("CREATE STATISTICS only supports relation names in the FROM clause")));
1914 : :
1915 : : /*
1916 : : * CREATE STATISTICS will influence future execution plans
1917 : : * but does not interfere with currently executing plans.
1918 : : * So it should be enough to take ShareUpdateExclusiveLock
1919 : : * on relation, conflicting with ANALYZE and other DDL
1920 : : * that sets statistical information, but not with normal
1921 : : * queries.
1922 : : *
1923 : : * XXX RangeVarCallbackOwnsRelation not needed here, to
1924 : : * keep the same behavior as before.
1925 : : */
1926 : 604 : relid = RangeVarGetRelid(rel, ShareUpdateExclusiveLock, false);
1927 : :
1928 : : /* Run parse analysis ... */
1929 : 600 : stmt = transformStatsStmt(relid, stmt, queryString);
1930 : :
17 msawada@postgresql.o 1931 : 600 : address = CreateStatistics(list_make1_oid(relid), stmt,
1932 : : true);
1933 : : }
3443 alvherre@alvh.no-ip. 1934 : 504 : break;
1935 : :
2543 tomas.vondra@postgre 1936 : 17 : case T_AlterStatsStmt:
1937 : 17 : address = AlterStatistics((AlterStatsStmt *) parsetree);
1938 : 13 : break;
1939 : :
1938 tmunro@postgresql.or 1940 : 4 : case T_AlterCollationStmt:
1941 : 4 : address = AlterCollation((AlterCollationStmt *) parsetree);
1942 : 4 : break;
1943 : :
4870 tgl@sss.pgh.pa.us 1944 :UBC 0 : default:
1945 [ # # ]: 0 : elog(ERROR, "unrecognized node type: %d",
1946 : : (int) nodeTag(parsetree));
1947 : : break;
1948 : : }
1949 : :
1950 : : /*
1951 : : * Remember the object so that ddl_command_end event triggers have
1952 : : * access to it.
1953 : : */
4126 alvherre@alvh.no-ip. 1954 [ + + ]:CBC 137564 : if (!commandCollected)
1955 : 38225 : EventTriggerCollectSimpleCommand(address, secondaryObject,
1956 : : parsetree);
1957 : :
4870 tgl@sss.pgh.pa.us 1958 [ + + ]: 137564 : if (isCompleteQuery)
1959 : : {
1960 : 129483 : EventTriggerSQLDrop(parsetree);
1961 : 129471 : EventTriggerDDLCommandEnd(parsetree);
1962 : : }
1963 : : }
2491 peter@eisentraut.org 1964 : 9431 : PG_FINALLY();
1965 : : {
4870 tgl@sss.pgh.pa.us 1966 [ + + ]: 146983 : if (needCleanup)
1967 : 1942 : EventTriggerEndCompleteQuery();
1968 : : }
1969 [ + + ]: 146983 : PG_END_TRY();
11006 scrappy@hub.org 1970 : 137552 : }
1971 : :
1972 : : /*
1973 : : * ProcessUtilityForAlterTable
1974 : : * Recursive entry from ALTER TABLE
1975 : : *
1976 : : * ALTER TABLE sometimes generates subcommands such as CREATE INDEX.
1977 : : * It calls this, not the main entry point ProcessUtility, to execute
1978 : : * such subcommands.
1979 : : *
1980 : : * stmt: the utility command to execute
1981 : : * context: opaque passthrough struct with the info we need
1982 : : *
1983 : : * It's caller's responsibility to do CommandCounterIncrement after
1984 : : * calling this, if needed.
1985 : : */
1986 : : void
2416 tgl@sss.pgh.pa.us 1987 : 371 : ProcessUtilityForAlterTable(Node *stmt, AlterTableUtilityContext *context)
1988 : : {
1989 : : PlannedStmt *wrapper;
1990 : :
1991 : : /*
1992 : : * For event triggers, we must "close" the current complex-command set,
1993 : : * and start a new one afterwards; this is needed to ensure the ordering
1994 : : * of command events is consistent with the way they were executed.
1995 : : */
1996 : 371 : EventTriggerAlterTableEnd();
1997 : :
1998 : : /* Create a suitable wrapper */
1999 : 371 : wrapper = makeNode(PlannedStmt);
2000 : 371 : wrapper->commandType = CMD_UTILITY;
2001 : 371 : wrapper->canSetTag = false;
2002 : 371 : wrapper->utilityStmt = stmt;
2003 : 371 : wrapper->stmt_location = context->pstmt->stmt_location;
2004 : 371 : wrapper->stmt_len = context->pstmt->stmt_len;
392 michael@paquier.xyz 2005 : 371 : wrapper->planOrigin = PLAN_STMT_INTERNAL;
2006 : :
2416 tgl@sss.pgh.pa.us 2007 : 371 : ProcessUtility(wrapper,
2008 : : context->queryString,
2009 : : false,
2010 : : PROCESS_UTILITY_SUBCOMMAND,
2011 : : context->params,
2012 : : context->queryEnv,
2013 : : None_Receiver,
2014 : : NULL);
2015 : :
2016 : 363 : EventTriggerAlterTableStart(context->pstmt->utilityStmt);
2017 : 363 : EventTriggerAlterTableRelid(context->relid);
2018 : 363 : }
2019 : :
2020 : : /*
2021 : : * Dispatch function for DropStmt
2022 : : */
2023 : : static void
4870 2024 : 17927 : ExecDropStmt(DropStmt *stmt, bool isTopLevel)
2025 : : {
2026 [ + + + ]: 17927 : switch (stmt->removeType)
2027 : : {
2028 : 532 : case OBJECT_INDEX:
2029 [ + + ]: 532 : if (stmt->concurrent)
3114 peter_e@gmx.net 2030 : 82 : PreventInTransactionBlock(isTopLevel,
2031 : : "DROP INDEX CONCURRENTLY");
2032 : : pg_fallthrough;
2033 : :
2034 : : case OBJECT_TABLE:
2035 : : case OBJECT_SEQUENCE:
2036 : : case OBJECT_VIEW:
2037 : : case OBJECT_MATVIEW:
2038 : : case OBJECT_FOREIGN_TABLE:
2039 : : case OBJECT_PROPGRAPH:
4870 tgl@sss.pgh.pa.us 2040 : 11620 : RemoveRelations(stmt);
2041 : 11399 : break;
2042 : 6303 : default:
2043 : 6303 : RemoveObjects(stmt);
2044 : 5840 : break;
2045 : : }
2046 : 17239 : }
2047 : :
2048 : :
2049 : : /*
2050 : : * UtilityReturnsTuples
2051 : : * Return "true" if this utility statement will send output to the
2052 : : * destination.
2053 : : *
2054 : : * Generally, there should be a case here for each case in ProcessUtility
2055 : : * where "dest" is passed on.
2056 : : */
2057 : : bool
8514 2058 : 241647 : UtilityReturnsTuples(Node *parsetree)
2059 : : {
2060 [ + + + + : 241647 : switch (nodeTag(parsetree))
+ + + ]
2061 : : {
2971 peter_e@gmx.net 2062 : 284 : case T_CallStmt:
2063 : : {
2064 : 284 : CallStmt *stmt = (CallStmt *) parsetree;
2065 : :
2066 : 284 : return (stmt->funcexpr->funcresulttype == RECORDOID);
2067 : : }
8514 tgl@sss.pgh.pa.us 2068 : 4374 : case T_FetchStmt:
2069 : : {
8424 bruce@momjian.us 2070 : 4374 : FetchStmt *stmt = (FetchStmt *) parsetree;
2071 : : Portal portal;
2072 : :
8514 tgl@sss.pgh.pa.us 2073 [ + + ]: 4374 : if (stmt->ismove)
2074 : 37 : return false;
2075 : 4337 : portal = GetPortalByName(stmt->portalname);
2076 [ + + ]: 4337 : if (!PortalIsValid(portal))
3354 2077 : 19 : return false; /* not our business to raise error */
8514 2078 : 4318 : return portal->tupDesc ? true : false;
2079 : : }
2080 : :
2081 : 8667 : case T_ExecuteStmt:
2082 : : {
2083 : 8667 : ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
2084 : : PreparedStatement *entry;
2085 : :
2086 : 8667 : entry = FetchPreparedStatement(stmt->name, false);
2087 [ - + ]: 8667 : if (!entry)
3354 tgl@sss.pgh.pa.us 2088 :UBC 0 : return false; /* not our business to raise error */
7107 tgl@sss.pgh.pa.us 2089 [ + + ]:CBC 8667 : if (entry->plansource->resultDesc)
2090 : 8605 : return true;
8514 2091 : 62 : return false;
2092 : : }
2093 : :
2094 : 22318 : case T_ExplainStmt:
2095 : 22318 : return true;
2096 : :
2097 : 581 : case T_VariableShowStmt:
2098 : 581 : return true;
2099 : :
295 akorotkov@postgresql 2100 : 269 : case T_WaitStmt:
2101 : 269 : return true;
2102 : :
8514 tgl@sss.pgh.pa.us 2103 : 205154 : default:
2104 : 205154 : return false;
2105 : : }
2106 : : }
2107 : :
2108 : : /*
2109 : : * UtilityTupleDescriptor
2110 : : * Fetch the actual output tuple descriptor for a utility statement
2111 : : * for which UtilityReturnsTuples() previously returned "true".
2112 : : *
2113 : : * The returned descriptor is created in (or copied into) the current memory
2114 : : * context.
2115 : : */
2116 : : TupleDesc
2117 : 36208 : UtilityTupleDescriptor(Node *parsetree)
2118 : : {
2119 [ + + + + : 36208 : switch (nodeTag(parsetree))
+ + - ]
2120 : : {
2971 peter_e@gmx.net 2121 : 117 : case T_CallStmt:
2122 : 117 : return CallStmtResultDesc((CallStmt *) parsetree);
2123 : :
8514 tgl@sss.pgh.pa.us 2124 : 4318 : case T_FetchStmt:
2125 : : {
8424 bruce@momjian.us 2126 : 4318 : FetchStmt *stmt = (FetchStmt *) parsetree;
2127 : : Portal portal;
2128 : :
8514 tgl@sss.pgh.pa.us 2129 [ - + ]: 4318 : if (stmt->ismove)
8514 tgl@sss.pgh.pa.us 2130 :UBC 0 : return NULL;
8514 tgl@sss.pgh.pa.us 2131 :CBC 4318 : portal = GetPortalByName(stmt->portalname);
2132 [ - + ]: 4318 : if (!PortalIsValid(portal))
8424 bruce@momjian.us 2133 :UBC 0 : return NULL; /* not our business to raise error */
8514 tgl@sss.pgh.pa.us 2134 :CBC 4318 : return CreateTupleDescCopy(portal->tupDesc);
2135 : : }
2136 : :
2137 : 8605 : case T_ExecuteStmt:
2138 : : {
2139 : 8605 : ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
2140 : : PreparedStatement *entry;
2141 : :
2142 : 8605 : entry = FetchPreparedStatement(stmt->name, false);
2143 [ - + ]: 8605 : if (!entry)
8424 bruce@momjian.us 2144 :UBC 0 : return NULL; /* not our business to raise error */
8514 tgl@sss.pgh.pa.us 2145 :CBC 8605 : return FetchPreparedStatementResultDesc(entry);
2146 : : }
2147 : :
2148 : 22318 : case T_ExplainStmt:
2149 : 22318 : return ExplainResultDesc((ExplainStmt *) parsetree);
2150 : :
2151 : 581 : case T_VariableShowStmt:
2152 : : {
2153 : 581 : VariableShowStmt *n = (VariableShowStmt *) parsetree;
2154 : :
2155 : 581 : return GetPGVariableResultDesc(n->name);
2156 : : }
2157 : :
295 akorotkov@postgresql 2158 : 269 : case T_WaitStmt:
2159 : 269 : return WaitStmtResultDesc((WaitStmt *) parsetree);
2160 : :
8514 tgl@sss.pgh.pa.us 2161 :UBC 0 : default:
2162 : 0 : return NULL;
2163 : : }
2164 : : }
2165 : :
2166 : :
2167 : : /*
2168 : : * QueryReturnsTuples
2169 : : * Return "true" if this Query will send output to the destination.
2170 : : */
2171 : : #ifdef NOT_USED
2172 : : bool
2173 : : QueryReturnsTuples(Query *parsetree)
2174 : : {
2175 : : switch (parsetree->commandType)
2176 : : {
2177 : : case CMD_SELECT:
2178 : : /* returns tuples */
2179 : : return true;
2180 : : case CMD_INSERT:
2181 : : case CMD_UPDATE:
2182 : : case CMD_DELETE:
2183 : : case CMD_MERGE:
2184 : : /* the forms with RETURNING return tuples */
2185 : : if (parsetree->returningList)
2186 : : return true;
2187 : : break;
2188 : : case CMD_UTILITY:
2189 : : return UtilityReturnsTuples(parsetree->utilityStmt);
2190 : : case CMD_UNKNOWN:
2191 : : case CMD_NOTHING:
2192 : : /* probably shouldn't get here */
2193 : : break;
2194 : : }
2195 : : return false; /* default */
2196 : : }
2197 : : #endif
2198 : :
2199 : :
2200 : : /*
2201 : : * UtilityContainsQuery
2202 : : * Return the contained Query, or NULL if there is none
2203 : : *
2204 : : * Certain utility statements, such as EXPLAIN, contain a plannable Query.
2205 : : * This function encapsulates knowledge of exactly which ones do.
2206 : : * We assume it is invoked only on already-parse-analyzed statements
2207 : : * (else the contained parsetree isn't a Query yet).
2208 : : *
2209 : : * In some cases (currently, only EXPLAIN of CREATE TABLE AS/SELECT INTO and
2210 : : * CREATE MATERIALIZED VIEW), potentially Query-containing utility statements
2211 : : * can be nested. This function will drill down to a non-utility Query, or
2212 : : * return NULL if none.
2213 : : */
2214 : : Query *
5274 tgl@sss.pgh.pa.us 2215 :CBC 25108 : UtilityContainsQuery(Node *parsetree)
2216 : : {
2217 : : Query *qry;
2218 : :
2219 [ + + + + ]: 25108 : switch (nodeTag(parsetree))
2220 : : {
3512 2221 : 1860 : case T_DeclareCursorStmt:
3500 2222 : 1860 : qry = castNode(Query, ((DeclareCursorStmt *) parsetree)->query);
3512 2223 [ - + ]: 1860 : if (qry->commandType == CMD_UTILITY)
3512 tgl@sss.pgh.pa.us 2224 :UBC 0 : return UtilityContainsQuery(qry->utilityStmt);
3512 tgl@sss.pgh.pa.us 2225 :CBC 1860 : return qry;
2226 : :
5274 2227 : 10886 : case T_ExplainStmt:
3500 2228 : 10886 : qry = castNode(Query, ((ExplainStmt *) parsetree)->query);
5174 2229 [ + + ]: 10886 : if (qry->commandType == CMD_UTILITY)
2230 : 72 : return UtilityContainsQuery(qry->utilityStmt);
2231 : 10814 : return qry;
2232 : :
5274 2233 : 58 : case T_CreateTableAsStmt:
3500 2234 : 58 : qry = castNode(Query, ((CreateTableAsStmt *) parsetree)->query);
5060 2235 [ - + ]: 58 : if (qry->commandType == CMD_UTILITY)
5060 tgl@sss.pgh.pa.us 2236 :UBC 0 : return UtilityContainsQuery(qry->utilityStmt);
5060 tgl@sss.pgh.pa.us 2237 :CBC 58 : return qry;
2238 : :
5274 2239 : 12304 : default:
2240 : 12304 : return NULL;
2241 : : }
2242 : : }
2243 : :
2244 : :
2245 : : /*
2246 : : * AlterObjectTypeCommandTag
2247 : : * helper function for CreateCommandTag
2248 : : *
2249 : : * This covers most cases where ALTER is used with an ObjectType enum.
2250 : : */
2251 : : static CommandTag
5678 2252 : 38925 : AlterObjectTypeCommandTag(ObjectType objtype)
2253 : : {
2254 : : CommandTag tag;
2255 : :
2256 [ + + - + : 38925 : switch (objtype)
- + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + - ]
2257 : : {
2258 : 240 : case OBJECT_AGGREGATE:
2369 alvherre@alvh.no-ip. 2259 : 240 : tag = CMDTAG_ALTER_AGGREGATE;
5678 tgl@sss.pgh.pa.us 2260 : 240 : break;
2261 : 32 : case OBJECT_ATTRIBUTE:
2369 alvherre@alvh.no-ip. 2262 : 32 : tag = CMDTAG_ALTER_TYPE;
5678 tgl@sss.pgh.pa.us 2263 : 32 : break;
5678 tgl@sss.pgh.pa.us 2264 :UBC 0 : case OBJECT_CAST:
2369 alvherre@alvh.no-ip. 2265 : 0 : tag = CMDTAG_ALTER_CAST;
5678 tgl@sss.pgh.pa.us 2266 : 0 : break;
5675 peter_e@gmx.net 2267 :CBC 54 : case OBJECT_COLLATION:
2369 alvherre@alvh.no-ip. 2268 : 54 : tag = CMDTAG_ALTER_COLLATION;
5675 peter_e@gmx.net 2269 : 54 : break;
5678 tgl@sss.pgh.pa.us 2270 :UBC 0 : case OBJECT_COLUMN:
2369 alvherre@alvh.no-ip. 2271 : 0 : tag = CMDTAG_ALTER_TABLE;
5678 tgl@sss.pgh.pa.us 2272 : 0 : break;
5678 tgl@sss.pgh.pa.us 2273 :CBC 96 : case OBJECT_CONVERSION:
2369 alvherre@alvh.no-ip. 2274 : 96 : tag = CMDTAG_ALTER_CONVERSION;
5678 tgl@sss.pgh.pa.us 2275 : 96 : break;
2276 : 59 : case OBJECT_DATABASE:
2369 alvherre@alvh.no-ip. 2277 : 59 : tag = CMDTAG_ALTER_DATABASE;
5678 tgl@sss.pgh.pa.us 2278 : 59 : break;
2279 : 80 : case OBJECT_DOMAIN:
2280 : : case OBJECT_DOMCONSTRAINT:
2369 alvherre@alvh.no-ip. 2281 : 80 : tag = CMDTAG_ALTER_DOMAIN;
5678 tgl@sss.pgh.pa.us 2282 : 80 : break;
2283 : 12 : case OBJECT_EXTENSION:
2369 alvherre@alvh.no-ip. 2284 : 12 : tag = CMDTAG_ALTER_EXTENSION;
5678 tgl@sss.pgh.pa.us 2285 : 12 : break;
2286 : 58 : case OBJECT_FDW:
2369 alvherre@alvh.no-ip. 2287 : 58 : tag = CMDTAG_ALTER_FOREIGN_DATA_WRAPPER;
5678 tgl@sss.pgh.pa.us 2288 : 58 : break;
2289 : 122 : case OBJECT_FOREIGN_SERVER:
2369 alvherre@alvh.no-ip. 2290 : 122 : tag = CMDTAG_ALTER_SERVER;
5678 tgl@sss.pgh.pa.us 2291 : 122 : break;
2292 : 732 : case OBJECT_FOREIGN_TABLE:
2369 alvherre@alvh.no-ip. 2293 : 732 : tag = CMDTAG_ALTER_FOREIGN_TABLE;
5678 tgl@sss.pgh.pa.us 2294 : 732 : break;
2295 : 754 : case OBJECT_FUNCTION:
2369 alvherre@alvh.no-ip. 2296 : 754 : tag = CMDTAG_ALTER_FUNCTION;
5678 tgl@sss.pgh.pa.us 2297 : 754 : break;
2298 : 1161 : case OBJECT_INDEX:
2369 alvherre@alvh.no-ip. 2299 : 1161 : tag = CMDTAG_ALTER_INDEX;
5678 tgl@sss.pgh.pa.us 2300 : 1161 : break;
2301 : 72 : case OBJECT_LANGUAGE:
2369 alvherre@alvh.no-ip. 2302 : 72 : tag = CMDTAG_ALTER_LANGUAGE;
5678 tgl@sss.pgh.pa.us 2303 : 72 : break;
2304 : 18 : case OBJECT_LARGEOBJECT:
2369 alvherre@alvh.no-ip. 2305 : 18 : tag = CMDTAG_ALTER_LARGE_OBJECT;
5678 tgl@sss.pgh.pa.us 2306 : 18 : break;
2307 : 134 : case OBJECT_OPCLASS:
2369 alvherre@alvh.no-ip. 2308 : 134 : tag = CMDTAG_ALTER_OPERATOR_CLASS;
5678 tgl@sss.pgh.pa.us 2309 : 134 : break;
2310 : 78 : case OBJECT_OPERATOR:
2369 alvherre@alvh.no-ip. 2311 : 78 : tag = CMDTAG_ALTER_OPERATOR;
5678 tgl@sss.pgh.pa.us 2312 : 78 : break;
2313 : 142 : case OBJECT_OPFAMILY:
2369 alvherre@alvh.no-ip. 2314 : 142 : tag = CMDTAG_ALTER_OPERATOR_FAMILY;
5678 tgl@sss.pgh.pa.us 2315 : 142 : break;
4360 sfrost@snowman.net 2316 : 36 : case OBJECT_POLICY:
2369 alvherre@alvh.no-ip. 2317 : 36 : tag = CMDTAG_ALTER_POLICY;
4360 sfrost@snowman.net 2318 : 36 : break;
3192 peter_e@gmx.net 2319 : 24 : case OBJECT_PROCEDURE:
2369 alvherre@alvh.no-ip. 2320 : 24 : tag = CMDTAG_ALTER_PROCEDURE;
3192 peter_e@gmx.net 2321 : 24 : break;
164 peter@eisentraut.org 2322 : 156 : case OBJECT_PROPGRAPH:
2323 : 156 : tag = CMDTAG_ALTER_PROPERTY_GRAPH;
2324 : 156 : break;
5678 tgl@sss.pgh.pa.us 2325 : 20 : case OBJECT_ROLE:
2369 alvherre@alvh.no-ip. 2326 : 20 : tag = CMDTAG_ALTER_ROLE;
5678 tgl@sss.pgh.pa.us 2327 : 20 : break;
3192 peter_e@gmx.net 2328 : 32 : case OBJECT_ROUTINE:
2369 alvherre@alvh.no-ip. 2329 : 32 : tag = CMDTAG_ALTER_ROUTINE;
3192 peter_e@gmx.net 2330 : 32 : break;
5678 tgl@sss.pgh.pa.us 2331 : 60 : case OBJECT_RULE:
2369 alvherre@alvh.no-ip. 2332 : 60 : tag = CMDTAG_ALTER_RULE;
5678 tgl@sss.pgh.pa.us 2333 : 60 : break;
2334 : 108 : case OBJECT_SCHEMA:
2369 alvherre@alvh.no-ip. 2335 : 108 : tag = CMDTAG_ALTER_SCHEMA;
5678 tgl@sss.pgh.pa.us 2336 : 108 : break;
2337 : 122 : case OBJECT_SEQUENCE:
2369 alvherre@alvh.no-ip. 2338 : 122 : tag = CMDTAG_ALTER_SEQUENCE;
5678 tgl@sss.pgh.pa.us 2339 : 122 : break;
2340 : 32905 : case OBJECT_TABLE:
2341 : : case OBJECT_TABCONSTRAINT:
2369 alvherre@alvh.no-ip. 2342 : 32905 : tag = CMDTAG_ALTER_TABLE;
5678 tgl@sss.pgh.pa.us 2343 : 32905 : break;
2344 : 10 : case OBJECT_TABLESPACE:
2369 alvherre@alvh.no-ip. 2345 : 10 : tag = CMDTAG_ALTER_TABLESPACE;
5678 tgl@sss.pgh.pa.us 2346 : 10 : break;
2347 : 70 : case OBJECT_TRIGGER:
2369 alvherre@alvh.no-ip. 2348 : 70 : tag = CMDTAG_ALTER_TRIGGER;
5678 tgl@sss.pgh.pa.us 2349 : 70 : break;
5153 rhaas@postgresql.org 2350 : 17 : case OBJECT_EVENT_TRIGGER:
2369 alvherre@alvh.no-ip. 2351 : 17 : tag = CMDTAG_ALTER_EVENT_TRIGGER;
5153 rhaas@postgresql.org 2352 : 17 : break;
5678 tgl@sss.pgh.pa.us 2353 : 104 : case OBJECT_TSCONFIGURATION:
2369 alvherre@alvh.no-ip. 2354 : 104 : tag = CMDTAG_ALTER_TEXT_SEARCH_CONFIGURATION;
5678 tgl@sss.pgh.pa.us 2355 : 104 : break;
2356 : 114 : case OBJECT_TSDICTIONARY:
2369 alvherre@alvh.no-ip. 2357 : 114 : tag = CMDTAG_ALTER_TEXT_SEARCH_DICTIONARY;
5678 tgl@sss.pgh.pa.us 2358 : 114 : break;
2359 : 40 : case OBJECT_TSPARSER:
2369 alvherre@alvh.no-ip. 2360 : 40 : tag = CMDTAG_ALTER_TEXT_SEARCH_PARSER;
5678 tgl@sss.pgh.pa.us 2361 : 40 : break;
2362 : 40 : case OBJECT_TSTEMPLATE:
2369 alvherre@alvh.no-ip. 2363 : 40 : tag = CMDTAG_ALTER_TEXT_SEARCH_TEMPLATE;
5678 tgl@sss.pgh.pa.us 2364 : 40 : break;
2365 : 454 : case OBJECT_TYPE:
2369 alvherre@alvh.no-ip. 2366 : 454 : tag = CMDTAG_ALTER_TYPE;
5678 tgl@sss.pgh.pa.us 2367 : 454 : break;
2368 : 343 : case OBJECT_VIEW:
2369 alvherre@alvh.no-ip. 2369 : 343 : tag = CMDTAG_ALTER_VIEW;
5678 tgl@sss.pgh.pa.us 2370 : 343 : break;
4925 kgrittn@postgresql.o 2371 : 110 : case OBJECT_MATVIEW:
2369 alvherre@alvh.no-ip. 2372 : 110 : tag = CMDTAG_ALTER_MATERIALIZED_VIEW;
4925 kgrittn@postgresql.o 2373 : 110 : break;
3507 peter_e@gmx.net 2374 : 100 : case OBJECT_PUBLICATION:
2369 alvherre@alvh.no-ip. 2375 : 100 : tag = CMDTAG_ALTER_PUBLICATION;
3507 peter_e@gmx.net 2376 : 100 : break;
2377 : 104 : case OBJECT_SUBSCRIPTION:
2369 alvherre@alvh.no-ip. 2378 : 104 : tag = CMDTAG_ALTER_SUBSCRIPTION;
3441 2379 : 104 : break;
3443 2380 : 112 : case OBJECT_STATISTIC_EXT:
2369 2381 : 112 : tag = CMDTAG_ALTER_STATISTICS;
3507 peter_e@gmx.net 2382 : 112 : break;
5678 tgl@sss.pgh.pa.us 2383 :UBC 0 : default:
2369 alvherre@alvh.no-ip. 2384 : 0 : tag = CMDTAG_UNKNOWN;
5678 tgl@sss.pgh.pa.us 2385 : 0 : break;
2386 : : }
2387 : :
5678 tgl@sss.pgh.pa.us 2388 :CBC 38925 : return tag;
2389 : : }
2390 : :
2391 : : /*
2392 : : * CreateCommandTag
2393 : : * utility to get a CommandTag for the command operation,
2394 : : * given either a raw (un-analyzed) parsetree, an analyzed Query,
2395 : : * or a PlannedStmt.
2396 : : *
2397 : : * This must handle all command types, but since the vast majority
2398 : : * of 'em are utility commands, it seems sensible to keep it here.
2399 : : */
2400 : : CommandTag
8518 2401 : 610375 : CreateCommandTag(Node *parsetree)
2402 : : {
2403 : : CommandTag tag;
2404 : :
2405 [ - + + + : 610375 : switch (nodeTag(parsetree))
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + - ]
2406 : : {
2407 : : /* recurse if we're given a RawStmt */
3512 tgl@sss.pgh.pa.us 2408 :UBC 0 : case T_RawStmt:
2409 : 0 : tag = CreateCommandTag(((RawStmt *) parsetree)->stmt);
2410 : 0 : break;
2411 : :
2412 : : /* raw plannable queries */
8518 tgl@sss.pgh.pa.us 2413 :CBC 42834 : case T_InsertStmt:
2369 alvherre@alvh.no-ip. 2414 : 42834 : tag = CMDTAG_INSERT;
8518 tgl@sss.pgh.pa.us 2415 : 42834 : break;
2416 : :
2417 : 3122 : case T_DeleteStmt:
2369 alvherre@alvh.no-ip. 2418 : 3122 : tag = CMDTAG_DELETE;
8518 tgl@sss.pgh.pa.us 2419 : 3122 : break;
2420 : :
2421 : 8757 : case T_UpdateStmt:
2369 alvherre@alvh.no-ip. 2422 : 8757 : tag = CMDTAG_UPDATE;
8518 tgl@sss.pgh.pa.us 2423 : 8757 : break;
2424 : :
1613 alvherre@alvh.no-ip. 2425 : 1209 : case T_MergeStmt:
2426 : 1209 : tag = CMDTAG_MERGE;
2427 : 1209 : break;
2428 : :
8518 tgl@sss.pgh.pa.us 2429 : 201262 : case T_SelectStmt:
2369 alvherre@alvh.no-ip. 2430 : 201262 : tag = CMDTAG_SELECT;
8518 tgl@sss.pgh.pa.us 2431 : 201262 : break;
2432 : :
2061 2433 : 2280 : case T_PLAssignStmt:
2434 : 2280 : tag = CMDTAG_SELECT;
2435 : 2280 : break;
2436 : :
2437 : : /* utility statements --- same whether raw or cooked */
8518 2438 : 26974 : case T_TransactionStmt:
2439 : : {
2440 : 26974 : TransactionStmt *stmt = (TransactionStmt *) parsetree;
2441 : :
2442 [ + + + + : 26974 : switch (stmt->kind)
+ + + + +
- ]
2443 : : {
2444 : 11587 : case TRANS_STMT_BEGIN:
2369 alvherre@alvh.no-ip. 2445 : 11587 : tag = CMDTAG_BEGIN;
8518 tgl@sss.pgh.pa.us 2446 : 11587 : break;
2447 : :
2448 : 902 : case TRANS_STMT_START:
2369 alvherre@alvh.no-ip. 2449 : 902 : tag = CMDTAG_START_TRANSACTION;
8518 tgl@sss.pgh.pa.us 2450 : 902 : break;
2451 : :
2452 : 9704 : case TRANS_STMT_COMMIT:
2369 alvherre@alvh.no-ip. 2453 : 9704 : tag = CMDTAG_COMMIT;
8518 tgl@sss.pgh.pa.us 2454 : 9704 : break;
2455 : :
2456 : 2724 : case TRANS_STMT_ROLLBACK:
2457 : : case TRANS_STMT_ROLLBACK_TO:
2369 alvherre@alvh.no-ip. 2458 : 2724 : tag = CMDTAG_ROLLBACK;
8518 tgl@sss.pgh.pa.us 2459 : 2724 : break;
2460 : :
8066 2461 : 1164 : case TRANS_STMT_SAVEPOINT:
2369 alvherre@alvh.no-ip. 2462 : 1164 : tag = CMDTAG_SAVEPOINT;
8066 tgl@sss.pgh.pa.us 2463 : 1164 : break;
2464 : :
2465 : 193 : case TRANS_STMT_RELEASE:
2369 alvherre@alvh.no-ip. 2466 : 193 : tag = CMDTAG_RELEASE;
8066 tgl@sss.pgh.pa.us 2467 : 193 : break;
2468 : :
7741 2469 : 374 : case TRANS_STMT_PREPARE:
2369 alvherre@alvh.no-ip. 2470 : 374 : tag = CMDTAG_PREPARE_TRANSACTION;
7741 tgl@sss.pgh.pa.us 2471 : 374 : break;
2472 : :
2473 : 277 : case TRANS_STMT_COMMIT_PREPARED:
2369 alvherre@alvh.no-ip. 2474 : 277 : tag = CMDTAG_COMMIT_PREPARED;
7741 tgl@sss.pgh.pa.us 2475 : 277 : break;
2476 : :
2477 : 49 : case TRANS_STMT_ROLLBACK_PREPARED:
2369 alvherre@alvh.no-ip. 2478 : 49 : tag = CMDTAG_ROLLBACK_PREPARED;
7741 tgl@sss.pgh.pa.us 2479 : 49 : break;
2480 : :
8518 tgl@sss.pgh.pa.us 2481 :UBC 0 : default:
2369 alvherre@alvh.no-ip. 2482 : 0 : tag = CMDTAG_UNKNOWN;
8518 tgl@sss.pgh.pa.us 2483 : 0 : break;
2484 : : }
2485 : : }
8518 tgl@sss.pgh.pa.us 2486 :CBC 26974 : break;
2487 : :
2488 : 2816 : case T_DeclareCursorStmt:
2369 alvherre@alvh.no-ip. 2489 : 2816 : tag = CMDTAG_DECLARE_CURSOR;
8518 tgl@sss.pgh.pa.us 2490 : 2816 : break;
2491 : :
2492 : 1288 : case T_ClosePortalStmt:
2493 : : {
7077 neilc@samurai.com 2494 : 1288 : ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
2495 : :
2496 [ + + ]: 1288 : if (stmt->portalname == NULL)
2369 alvherre@alvh.no-ip. 2497 : 8 : tag = CMDTAG_CLOSE_CURSOR_ALL;
2498 : : else
2499 : 1280 : tag = CMDTAG_CLOSE_CURSOR;
2500 : : }
8518 tgl@sss.pgh.pa.us 2501 : 1288 : break;
2502 : :
2503 : 4527 : case T_FetchStmt:
2504 : : {
2505 : 4527 : FetchStmt *stmt = (FetchStmt *) parsetree;
2506 : :
2369 alvherre@alvh.no-ip. 2507 [ + + ]: 4527 : tag = (stmt->ismove) ? CMDTAG_MOVE : CMDTAG_FETCH;
2508 : : }
8518 tgl@sss.pgh.pa.us 2509 : 4527 : break;
2510 : :
2511 : 1765 : case T_CreateDomainStmt:
2369 alvherre@alvh.no-ip. 2512 : 1765 : tag = CMDTAG_CREATE_DOMAIN;
8518 tgl@sss.pgh.pa.us 2513 : 1765 : break;
2514 : :
2515 : 1501 : case T_CreateSchemaStmt:
2369 alvherre@alvh.no-ip. 2516 : 1501 : tag = CMDTAG_CREATE_SCHEMA;
8518 tgl@sss.pgh.pa.us 2517 : 1501 : break;
2518 : :
2519 : 51160 : case T_CreateStmt:
2369 alvherre@alvh.no-ip. 2520 : 51160 : tag = CMDTAG_CREATE_TABLE;
8518 tgl@sss.pgh.pa.us 2521 : 51160 : break;
2522 : :
8105 2523 : 75 : case T_CreateTableSpaceStmt:
2369 alvherre@alvh.no-ip. 2524 : 75 : tag = CMDTAG_CREATE_TABLESPACE;
8105 tgl@sss.pgh.pa.us 2525 : 75 : break;
2526 : :
2527 : 36 : case T_DropTableSpaceStmt:
2369 alvherre@alvh.no-ip. 2528 : 36 : tag = CMDTAG_DROP_TABLESPACE;
8105 tgl@sss.pgh.pa.us 2529 : 36 : break;
2530 : :
6078 rhaas@postgresql.org 2531 : 17 : case T_AlterTableSpaceOptionsStmt:
2369 alvherre@alvh.no-ip. 2532 : 17 : tag = CMDTAG_ALTER_TABLESPACE;
6078 rhaas@postgresql.org 2533 : 17 : break;
2534 : :
5679 tgl@sss.pgh.pa.us 2535 : 613 : case T_CreateExtensionStmt:
2369 alvherre@alvh.no-ip. 2536 : 613 : tag = CMDTAG_CREATE_EXTENSION;
5679 tgl@sss.pgh.pa.us 2537 : 613 : break;
2538 : :
5676 2539 : 39 : case T_AlterExtensionStmt:
2369 alvherre@alvh.no-ip. 2540 : 39 : tag = CMDTAG_ALTER_EXTENSION;
5676 tgl@sss.pgh.pa.us 2541 : 39 : break;
2542 : :
5677 2543 : 252 : case T_AlterExtensionContentsStmt:
2369 alvherre@alvh.no-ip. 2544 : 252 : tag = CMDTAG_ALTER_EXTENSION;
5678 tgl@sss.pgh.pa.us 2545 : 252 : break;
2546 : :
6460 peter_e@gmx.net 2547 : 306 : case T_CreateFdwStmt:
2369 alvherre@alvh.no-ip. 2548 : 306 : tag = CMDTAG_CREATE_FOREIGN_DATA_WRAPPER;
6460 peter_e@gmx.net 2549 : 306 : break;
2550 : :
2551 : 200 : case T_AlterFdwStmt:
2369 alvherre@alvh.no-ip. 2552 : 200 : tag = CMDTAG_ALTER_FOREIGN_DATA_WRAPPER;
6460 peter_e@gmx.net 2553 : 200 : break;
2554 : :
2555 : 398 : case T_CreateForeignServerStmt:
2369 alvherre@alvh.no-ip. 2556 : 398 : tag = CMDTAG_CREATE_SERVER;
6460 peter_e@gmx.net 2557 : 398 : break;
2558 : :
2559 : 258 : case T_AlterForeignServerStmt:
2369 alvherre@alvh.no-ip. 2560 : 258 : tag = CMDTAG_ALTER_SERVER;
6460 peter_e@gmx.net 2561 : 258 : break;
2562 : :
2563 : 347 : case T_CreateUserMappingStmt:
2369 alvherre@alvh.no-ip. 2564 : 347 : tag = CMDTAG_CREATE_USER_MAPPING;
6460 peter_e@gmx.net 2565 : 347 : break;
2566 : :
2567 : 146 : case T_AlterUserMappingStmt:
2369 alvherre@alvh.no-ip. 2568 : 146 : tag = CMDTAG_ALTER_USER_MAPPING;
6460 peter_e@gmx.net 2569 : 146 : break;
2570 : :
2571 : 158 : case T_DropUserMappingStmt:
2369 alvherre@alvh.no-ip. 2572 : 158 : tag = CMDTAG_DROP_USER_MAPPING;
6460 peter_e@gmx.net 2573 : 158 : break;
2574 : :
5717 rhaas@postgresql.org 2575 : 553 : case T_CreateForeignTableStmt:
2369 alvherre@alvh.no-ip. 2576 : 553 : tag = CMDTAG_CREATE_FOREIGN_TABLE;
5717 rhaas@postgresql.org 2577 : 553 : break;
2578 : :
4431 tgl@sss.pgh.pa.us 2579 : 56 : case T_ImportForeignSchemaStmt:
2369 alvherre@alvh.no-ip. 2580 : 56 : tag = CMDTAG_IMPORT_FOREIGN_SCHEMA;
4431 tgl@sss.pgh.pa.us 2581 : 56 : break;
2582 : :
8518 2583 : 36479 : case T_DropStmt:
2584 [ + + + + : 36479 : switch (((DropStmt *) parsetree)->removeType)
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + - ]
2585 : : {
8462 peter_e@gmx.net 2586 : 20650 : case OBJECT_TABLE:
2369 alvherre@alvh.no-ip. 2587 : 20650 : tag = CMDTAG_DROP_TABLE;
8518 tgl@sss.pgh.pa.us 2588 : 20650 : break;
8462 peter_e@gmx.net 2589 : 246 : case OBJECT_SEQUENCE:
2369 alvherre@alvh.no-ip. 2590 : 246 : tag = CMDTAG_DROP_SEQUENCE;
8518 tgl@sss.pgh.pa.us 2591 : 246 : break;
8462 peter_e@gmx.net 2592 : 1397 : case OBJECT_VIEW:
2369 alvherre@alvh.no-ip. 2593 : 1397 : tag = CMDTAG_DROP_VIEW;
8518 tgl@sss.pgh.pa.us 2594 : 1397 : break;
4925 kgrittn@postgresql.o 2595 : 174 : case OBJECT_MATVIEW:
2369 alvherre@alvh.no-ip. 2596 : 174 : tag = CMDTAG_DROP_MATERIALIZED_VIEW;
4925 kgrittn@postgresql.o 2597 : 174 : break;
8462 peter_e@gmx.net 2598 : 1108 : case OBJECT_INDEX:
2369 alvherre@alvh.no-ip. 2599 : 1108 : tag = CMDTAG_DROP_INDEX;
8518 tgl@sss.pgh.pa.us 2600 : 1108 : break;
164 peter@eisentraut.org 2601 : 114 : case OBJECT_PROPGRAPH:
2602 : 114 : tag = CMDTAG_DROP_PROPERTY_GRAPH;
2603 : 114 : break;
8462 peter_e@gmx.net 2604 : 1068 : case OBJECT_TYPE:
2369 alvherre@alvh.no-ip. 2605 : 1068 : tag = CMDTAG_DROP_TYPE;
8518 tgl@sss.pgh.pa.us 2606 : 1068 : break;
8462 peter_e@gmx.net 2607 : 848 : case OBJECT_DOMAIN:
2369 alvherre@alvh.no-ip. 2608 : 848 : tag = CMDTAG_DROP_DOMAIN;
8518 tgl@sss.pgh.pa.us 2609 : 848 : break;
5675 peter_e@gmx.net 2610 : 116 : case OBJECT_COLLATION:
2369 alvherre@alvh.no-ip. 2611 : 116 : tag = CMDTAG_DROP_COLLATION;
5675 peter_e@gmx.net 2612 : 116 : break;
8462 2613 : 48 : case OBJECT_CONVERSION:
2369 alvherre@alvh.no-ip. 2614 : 48 : tag = CMDTAG_DROP_CONVERSION;
8518 tgl@sss.pgh.pa.us 2615 : 48 : break;
8462 peter_e@gmx.net 2616 : 897 : case OBJECT_SCHEMA:
2369 alvherre@alvh.no-ip. 2617 : 897 : tag = CMDTAG_DROP_SCHEMA;
8518 tgl@sss.pgh.pa.us 2618 : 897 : break;
6946 2619 : 24 : case OBJECT_TSPARSER:
2369 alvherre@alvh.no-ip. 2620 : 24 : tag = CMDTAG_DROP_TEXT_SEARCH_PARSER;
6946 tgl@sss.pgh.pa.us 2621 : 24 : break;
2622 : 32 : case OBJECT_TSDICTIONARY:
2369 alvherre@alvh.no-ip. 2623 : 32 : tag = CMDTAG_DROP_TEXT_SEARCH_DICTIONARY;
6946 tgl@sss.pgh.pa.us 2624 : 32 : break;
2625 : 24 : case OBJECT_TSTEMPLATE:
2369 alvherre@alvh.no-ip. 2626 : 24 : tag = CMDTAG_DROP_TEXT_SEARCH_TEMPLATE;
6946 tgl@sss.pgh.pa.us 2627 : 24 : break;
2628 : 40 : case OBJECT_TSCONFIGURATION:
2369 alvherre@alvh.no-ip. 2629 : 40 : tag = CMDTAG_DROP_TEXT_SEARCH_CONFIGURATION;
6946 tgl@sss.pgh.pa.us 2630 : 40 : break;
5717 rhaas@postgresql.org 2631 : 230 : case OBJECT_FOREIGN_TABLE:
2369 alvherre@alvh.no-ip. 2632 : 230 : tag = CMDTAG_DROP_FOREIGN_TABLE;
5717 rhaas@postgresql.org 2633 : 230 : break;
5679 tgl@sss.pgh.pa.us 2634 : 222 : case OBJECT_EXTENSION:
2369 alvherre@alvh.no-ip. 2635 : 222 : tag = CMDTAG_DROP_EXTENSION;
5679 tgl@sss.pgh.pa.us 2636 : 222 : break;
5397 rhaas@postgresql.org 2637 : 4971 : case OBJECT_FUNCTION:
2369 alvherre@alvh.no-ip. 2638 : 4971 : tag = CMDTAG_DROP_FUNCTION;
5397 rhaas@postgresql.org 2639 : 4971 : break;
3192 peter_e@gmx.net 2640 : 196 : case OBJECT_PROCEDURE:
2369 alvherre@alvh.no-ip. 2641 : 196 : tag = CMDTAG_DROP_PROCEDURE;
3192 peter_e@gmx.net 2642 : 196 : break;
2643 : 40 : case OBJECT_ROUTINE:
2369 alvherre@alvh.no-ip. 2644 : 40 : tag = CMDTAG_DROP_ROUTINE;
3192 peter_e@gmx.net 2645 : 40 : break;
5397 rhaas@postgresql.org 2646 : 138 : case OBJECT_AGGREGATE:
2369 alvherre@alvh.no-ip. 2647 : 138 : tag = CMDTAG_DROP_AGGREGATE;
5397 rhaas@postgresql.org 2648 : 138 : break;
2649 : 264 : case OBJECT_OPERATOR:
2369 alvherre@alvh.no-ip. 2650 : 264 : tag = CMDTAG_DROP_OPERATOR;
5397 rhaas@postgresql.org 2651 : 264 : break;
2652 : 34 : case OBJECT_LANGUAGE:
2369 alvherre@alvh.no-ip. 2653 : 34 : tag = CMDTAG_DROP_LANGUAGE;
5397 rhaas@postgresql.org 2654 : 34 : break;
2655 : 108 : case OBJECT_CAST:
2369 alvherre@alvh.no-ip. 2656 : 108 : tag = CMDTAG_DROP_CAST;
5397 rhaas@postgresql.org 2657 : 108 : break;
2658 : 1042 : case OBJECT_TRIGGER:
2369 alvherre@alvh.no-ip. 2659 : 1042 : tag = CMDTAG_DROP_TRIGGER;
5397 rhaas@postgresql.org 2660 : 1042 : break;
5153 2661 : 81 : case OBJECT_EVENT_TRIGGER:
2369 alvherre@alvh.no-ip. 2662 : 81 : tag = CMDTAG_DROP_EVENT_TRIGGER;
5153 rhaas@postgresql.org 2663 : 81 : break;
5397 2664 : 368 : case OBJECT_RULE:
2369 alvherre@alvh.no-ip. 2665 : 368 : tag = CMDTAG_DROP_RULE;
5397 rhaas@postgresql.org 2666 : 368 : break;
2667 : 248 : case OBJECT_FDW:
2369 alvherre@alvh.no-ip. 2668 : 248 : tag = CMDTAG_DROP_FOREIGN_DATA_WRAPPER;
5397 rhaas@postgresql.org 2669 : 248 : break;
2670 : 226 : case OBJECT_FOREIGN_SERVER:
2369 alvherre@alvh.no-ip. 2671 : 226 : tag = CMDTAG_DROP_SERVER;
5397 rhaas@postgresql.org 2672 : 226 : break;
2673 : 74 : case OBJECT_OPCLASS:
2369 alvherre@alvh.no-ip. 2674 : 74 : tag = CMDTAG_DROP_OPERATOR_CLASS;
5397 rhaas@postgresql.org 2675 : 74 : break;
2676 : 150 : case OBJECT_OPFAMILY:
2369 alvherre@alvh.no-ip. 2677 : 150 : tag = CMDTAG_DROP_OPERATOR_FAMILY;
5397 rhaas@postgresql.org 2678 : 150 : break;
4360 sfrost@snowman.net 2679 : 342 : case OBJECT_POLICY:
2369 alvherre@alvh.no-ip. 2680 : 342 : tag = CMDTAG_DROP_POLICY;
4360 sfrost@snowman.net 2681 : 342 : break;
4141 peter_e@gmx.net 2682 : 17 : case OBJECT_TRANSFORM:
2369 alvherre@alvh.no-ip. 2683 : 17 : tag = CMDTAG_DROP_TRANSFORM;
4141 peter_e@gmx.net 2684 : 17 : break;
3809 alvherre@alvh.no-ip. 2685 : 48 : case OBJECT_ACCESS_METHOD:
2369 2686 : 48 : tag = CMDTAG_DROP_ACCESS_METHOD;
3809 2687 : 48 : break;
3507 peter_e@gmx.net 2688 : 612 : case OBJECT_PUBLICATION:
2369 alvherre@alvh.no-ip. 2689 : 612 : tag = CMDTAG_DROP_PUBLICATION;
3442 peter_e@gmx.net 2690 : 612 : break;
3443 alvherre@alvh.no-ip. 2691 : 282 : case OBJECT_STATISTIC_EXT:
2369 2692 : 282 : tag = CMDTAG_DROP_STATISTICS;
3507 peter_e@gmx.net 2693 : 282 : break;
8518 tgl@sss.pgh.pa.us 2694 :UBC 0 : default:
2369 alvherre@alvh.no-ip. 2695 : 0 : tag = CMDTAG_UNKNOWN;
2696 : : }
8518 tgl@sss.pgh.pa.us 2697 :CBC 36479 : break;
2698 : :
2699 : 1161 : case T_TruncateStmt:
2369 alvherre@alvh.no-ip. 2700 : 1161 : tag = CMDTAG_TRUNCATE_TABLE;
8518 tgl@sss.pgh.pa.us 2701 : 1161 : break;
2702 : :
2703 : 4791 : case T_CommentStmt:
2369 alvherre@alvh.no-ip. 2704 : 4791 : tag = CMDTAG_COMMENT;
8518 tgl@sss.pgh.pa.us 2705 : 4791 : break;
2706 : :
5813 rhaas@postgresql.org 2707 : 114 : case T_SecLabelStmt:
2369 alvherre@alvh.no-ip. 2708 : 114 : tag = CMDTAG_SECURITY_LABEL;
5813 rhaas@postgresql.org 2709 : 114 : break;
2710 : :
8518 tgl@sss.pgh.pa.us 2711 : 6705 : case T_CopyStmt:
2369 alvherre@alvh.no-ip. 2712 : 6705 : tag = CMDTAG_COPY;
8518 tgl@sss.pgh.pa.us 2713 : 6705 : break;
2714 : :
2715 : 2054 : case T_RenameStmt:
2716 : :
2717 : : /*
2718 : : * When the column is renamed, the command tag is created from its
2719 : : * relation type
2720 : : */
2401 alvherre@alvh.no-ip. 2721 [ + + ]: 2054 : tag = AlterObjectTypeCommandTag(((RenameStmt *) parsetree)->renameType == OBJECT_COLUMN ?
2722 : : ((RenameStmt *) parsetree)->relationType :
2723 : : ((RenameStmt *) parsetree)->renameType);
8518 tgl@sss.pgh.pa.us 2724 : 2054 : break;
2725 : :
3796 alvherre@alvh.no-ip. 2726 : 46 : case T_AlterObjectDependsStmt:
2727 : 46 : tag = AlterObjectTypeCommandTag(((AlterObjectDependsStmt *) parsetree)->objectType);
2728 : 46 : break;
2729 : :
7696 tgl@sss.pgh.pa.us 2730 : 590 : case T_AlterObjectSchemaStmt:
5678 2731 : 590 : tag = AlterObjectTypeCommandTag(((AlterObjectSchemaStmt *) parsetree)->objectType);
7696 2732 : 590 : break;
2733 : :
8098 2734 : 1864 : case T_AlterOwnerStmt:
5678 2735 : 1864 : tag = AlterObjectTypeCommandTag(((AlterOwnerStmt *) parsetree)->objectType);
8098 2736 : 1864 : break;
2737 : :
4389 sfrost@snowman.net 2738 : 47 : case T_AlterTableMoveAllStmt:
2739 : 47 : tag = AlterObjectTypeCommandTag(((AlterTableMoveAllStmt *) parsetree)->objtype);
2740 : 47 : break;
2741 : :
8518 tgl@sss.pgh.pa.us 2742 : 34324 : case T_AlterTableStmt:
2238 michael@paquier.xyz 2743 : 34324 : tag = AlterObjectTypeCommandTag(((AlterTableStmt *) parsetree)->objtype);
8042 bruce@momjian.us 2744 : 34324 : break;
2745 : :
8518 tgl@sss.pgh.pa.us 2746 : 392 : case T_AlterDomainStmt:
2369 alvherre@alvh.no-ip. 2747 : 392 : tag = CMDTAG_ALTER_DOMAIN;
8518 tgl@sss.pgh.pa.us 2748 : 392 : break;
2749 : :
7836 neilc@samurai.com 2750 : 357 : case T_AlterFunctionStmt:
3192 peter_e@gmx.net 2751 [ + + - - ]: 357 : switch (((AlterFunctionStmt *) parsetree)->objtype)
2752 : : {
2753 : 333 : case OBJECT_FUNCTION:
2369 alvherre@alvh.no-ip. 2754 : 333 : tag = CMDTAG_ALTER_FUNCTION;
3192 peter_e@gmx.net 2755 : 333 : break;
2756 : 24 : case OBJECT_PROCEDURE:
2369 alvherre@alvh.no-ip. 2757 : 24 : tag = CMDTAG_ALTER_PROCEDURE;
3192 peter_e@gmx.net 2758 : 24 : break;
3192 peter_e@gmx.net 2759 :UBC 0 : case OBJECT_ROUTINE:
2369 alvherre@alvh.no-ip. 2760 : 0 : tag = CMDTAG_ALTER_ROUTINE;
3192 peter_e@gmx.net 2761 : 0 : break;
2762 : 0 : default:
2369 alvherre@alvh.no-ip. 2763 : 0 : tag = CMDTAG_UNKNOWN;
2764 : : }
7836 neilc@samurai.com 2765 :CBC 357 : break;
2766 : :
8518 tgl@sss.pgh.pa.us 2767 : 15079 : case T_GrantStmt:
2768 : : {
2769 : 15079 : GrantStmt *stmt = (GrantStmt *) parsetree;
2770 : :
2369 alvherre@alvh.no-ip. 2771 [ + + ]: 15079 : tag = (stmt->is_grant) ? CMDTAG_GRANT : CMDTAG_REVOKE;
2772 : : }
8518 tgl@sss.pgh.pa.us 2773 : 15079 : break;
2774 : :
7730 2775 : 407 : case T_GrantRoleStmt:
2776 : : {
7621 bruce@momjian.us 2777 : 407 : GrantRoleStmt *stmt = (GrantRoleStmt *) parsetree;
2778 : :
2369 alvherre@alvh.no-ip. 2779 [ + + ]: 407 : tag = (stmt->is_grant) ? CMDTAG_GRANT_ROLE : CMDTAG_REVOKE_ROLE;
2780 : : }
7730 tgl@sss.pgh.pa.us 2781 : 407 : break;
2782 : :
6170 2783 : 288 : case T_AlterDefaultPrivilegesStmt:
2369 alvherre@alvh.no-ip. 2784 : 288 : tag = CMDTAG_ALTER_DEFAULT_PRIVILEGES;
6170 tgl@sss.pgh.pa.us 2785 : 288 : break;
2786 : :
8518 2787 : 6972 : case T_DefineStmt:
2788 [ + + + + : 6972 : switch (((DefineStmt *) parsetree)->kind)
+ + + + -
- ]
2789 : : {
8462 peter_e@gmx.net 2790 : 1155 : case OBJECT_AGGREGATE:
2369 alvherre@alvh.no-ip. 2791 : 1155 : tag = CMDTAG_CREATE_AGGREGATE;
8518 tgl@sss.pgh.pa.us 2792 : 1155 : break;
8462 peter_e@gmx.net 2793 : 1158 : case OBJECT_OPERATOR:
2369 alvherre@alvh.no-ip. 2794 : 1158 : tag = CMDTAG_CREATE_OPERATOR;
8518 tgl@sss.pgh.pa.us 2795 : 1158 : break;
8462 peter_e@gmx.net 2796 : 430 : case OBJECT_TYPE:
2369 alvherre@alvh.no-ip. 2797 : 430 : tag = CMDTAG_CREATE_TYPE;
8518 tgl@sss.pgh.pa.us 2798 : 430 : break;
6946 2799 : 54 : case OBJECT_TSPARSER:
2369 alvherre@alvh.no-ip. 2800 : 54 : tag = CMDTAG_CREATE_TEXT_SEARCH_PARSER;
6946 tgl@sss.pgh.pa.us 2801 : 54 : break;
2802 : 1827 : case OBJECT_TSDICTIONARY:
2369 alvherre@alvh.no-ip. 2803 : 1827 : tag = CMDTAG_CREATE_TEXT_SEARCH_DICTIONARY;
6946 tgl@sss.pgh.pa.us 2804 : 1827 : break;
2805 : 107 : case OBJECT_TSTEMPLATE:
2369 alvherre@alvh.no-ip. 2806 : 107 : tag = CMDTAG_CREATE_TEXT_SEARCH_TEMPLATE;
6946 tgl@sss.pgh.pa.us 2807 : 107 : break;
2808 : 1766 : case OBJECT_TSCONFIGURATION:
2369 alvherre@alvh.no-ip. 2809 : 1766 : tag = CMDTAG_CREATE_TEXT_SEARCH_CONFIGURATION;
6946 tgl@sss.pgh.pa.us 2810 : 1766 : break;
5675 peter_e@gmx.net 2811 : 475 : case OBJECT_COLLATION:
2369 alvherre@alvh.no-ip. 2812 : 475 : tag = CMDTAG_CREATE_COLLATION;
5675 peter_e@gmx.net 2813 : 475 : break;
3809 alvherre@alvh.no-ip. 2814 :UBC 0 : case OBJECT_ACCESS_METHOD:
2369 2815 : 0 : tag = CMDTAG_CREATE_ACCESS_METHOD;
3809 2816 : 0 : break;
8518 tgl@sss.pgh.pa.us 2817 : 0 : default:
2369 alvherre@alvh.no-ip. 2818 : 0 : tag = CMDTAG_UNKNOWN;
2819 : : }
8518 tgl@sss.pgh.pa.us 2820 :CBC 6972 : break;
2821 : :
2822 : 4767 : case T_CompositeTypeStmt:
2369 alvherre@alvh.no-ip. 2823 : 4767 : tag = CMDTAG_CREATE_TYPE;
8518 tgl@sss.pgh.pa.us 2824 : 4767 : break;
2825 : :
7087 2826 : 445 : case T_CreateEnumStmt:
2369 alvherre@alvh.no-ip. 2827 : 445 : tag = CMDTAG_CREATE_TYPE;
7087 tgl@sss.pgh.pa.us 2828 : 445 : break;
2829 : :
5411 heikki.linnakangas@i 2830 : 310 : case T_CreateRangeStmt:
2369 alvherre@alvh.no-ip. 2831 : 310 : tag = CMDTAG_CREATE_TYPE;
5411 heikki.linnakangas@i 2832 : 310 : break;
2833 : :
5786 tgl@sss.pgh.pa.us 2834 : 500 : case T_AlterEnumStmt:
2369 alvherre@alvh.no-ip. 2835 : 500 : tag = CMDTAG_ALTER_TYPE;
5786 tgl@sss.pgh.pa.us 2836 : 500 : break;
2837 : :
8518 2838 : 12740 : case T_ViewStmt:
2369 alvherre@alvh.no-ip. 2839 : 12740 : tag = CMDTAG_CREATE_VIEW;
8518 tgl@sss.pgh.pa.us 2840 : 12740 : break;
2841 : :
2842 : 19152 : case T_CreateFunctionStmt:
3192 peter_e@gmx.net 2843 [ + + ]: 19152 : if (((CreateFunctionStmt *) parsetree)->is_procedure)
2369 alvherre@alvh.no-ip. 2844 : 463 : tag = CMDTAG_CREATE_PROCEDURE;
2845 : : else
2846 : 18689 : tag = CMDTAG_CREATE_FUNCTION;
8518 tgl@sss.pgh.pa.us 2847 : 19152 : break;
2848 : :
2849 : 8767 : case T_IndexStmt:
2369 alvherre@alvh.no-ip. 2850 : 8767 : tag = CMDTAG_CREATE_INDEX;
8518 tgl@sss.pgh.pa.us 2851 : 8767 : break;
2852 : :
2853 : 1427 : case T_RuleStmt:
2369 alvherre@alvh.no-ip. 2854 : 1427 : tag = CMDTAG_CREATE_RULE;
8518 tgl@sss.pgh.pa.us 2855 : 1427 : break;
2856 : :
2857 : 879 : case T_CreateSeqStmt:
2369 alvherre@alvh.no-ip. 2858 : 879 : tag = CMDTAG_CREATE_SEQUENCE;
8518 tgl@sss.pgh.pa.us 2859 : 879 : break;
2860 : :
2861 : 298 : case T_AlterSeqStmt:
2369 alvherre@alvh.no-ip. 2862 : 298 : tag = CMDTAG_ALTER_SEQUENCE;
8518 tgl@sss.pgh.pa.us 2863 : 298 : break;
2864 : :
6183 2865 : 681 : case T_DoStmt:
2369 alvherre@alvh.no-ip. 2866 : 681 : tag = CMDTAG_DO;
6183 tgl@sss.pgh.pa.us 2867 : 681 : break;
2868 : :
8518 2869 : 442 : case T_CreatedbStmt:
2369 alvherre@alvh.no-ip. 2870 : 442 : tag = CMDTAG_CREATE_DATABASE;
8518 tgl@sss.pgh.pa.us 2871 : 442 : break;
2872 : :
7697 2873 : 714 : case T_AlterDatabaseStmt:
2874 : : case T_AlterDatabaseRefreshCollStmt:
2875 : : case T_AlterDatabaseSetStmt:
2369 alvherre@alvh.no-ip. 2876 : 714 : tag = CMDTAG_ALTER_DATABASE;
8518 tgl@sss.pgh.pa.us 2877 : 714 : break;
2878 : :
2879 : 78 : case T_DropdbStmt:
2369 alvherre@alvh.no-ip. 2880 : 78 : tag = CMDTAG_DROP_DATABASE;
8518 tgl@sss.pgh.pa.us 2881 : 78 : break;
2882 : :
2883 : 52 : case T_NotifyStmt:
2369 alvherre@alvh.no-ip. 2884 : 52 : tag = CMDTAG_NOTIFY;
8518 tgl@sss.pgh.pa.us 2885 : 52 : break;
2886 : :
2887 : 52 : case T_ListenStmt:
2369 alvherre@alvh.no-ip. 2888 : 52 : tag = CMDTAG_LISTEN;
8518 tgl@sss.pgh.pa.us 2889 : 52 : break;
2890 : :
2891 : 62 : case T_UnlistenStmt:
2369 alvherre@alvh.no-ip. 2892 : 62 : tag = CMDTAG_UNLISTEN;
8518 tgl@sss.pgh.pa.us 2893 : 62 : break;
2894 : :
2895 : 49 : case T_LoadStmt:
2369 alvherre@alvh.no-ip. 2896 : 49 : tag = CMDTAG_LOAD;
8518 tgl@sss.pgh.pa.us 2897 : 49 : break;
2898 : :
3192 peter_e@gmx.net 2899 : 301 : case T_CallStmt:
2369 alvherre@alvh.no-ip. 2900 : 301 : tag = CMDTAG_CALL;
3192 peter_e@gmx.net 2901 : 301 : break;
2902 : :
8518 tgl@sss.pgh.pa.us 2903 : 8764 : case T_VacuumStmt:
2719 rhaas@postgresql.org 2904 [ + + ]: 8764 : if (((VacuumStmt *) parsetree)->is_vacuumcmd)
2369 alvherre@alvh.no-ip. 2905 : 5613 : tag = CMDTAG_VACUUM;
2906 : : else
2907 : 3151 : tag = CMDTAG_ANALYZE;
8518 tgl@sss.pgh.pa.us 2908 : 8764 : break;
2909 : :
170 alvherre@kurilemu.de 2910 : 233 : case T_RepackStmt:
2911 [ + + ]: 233 : if (((RepackStmt *) parsetree)->command == REPACK_COMMAND_CLUSTER)
2912 : 174 : tag = CMDTAG_CLUSTER;
2913 : : else
2914 : 59 : tag = CMDTAG_REPACK;
2915 : 233 : break;
2916 : :
8518 tgl@sss.pgh.pa.us 2917 : 16884 : case T_ExplainStmt:
2369 alvherre@alvh.no-ip. 2918 : 16884 : tag = CMDTAG_EXPLAIN;
8518 tgl@sss.pgh.pa.us 2919 : 16884 : break;
2920 : :
5274 2921 : 2356 : case T_CreateTableAsStmt:
2238 michael@paquier.xyz 2922 [ + + - ]: 2356 : switch (((CreateTableAsStmt *) parsetree)->objtype)
2923 : : {
4925 kgrittn@postgresql.o 2924 : 1724 : case OBJECT_TABLE:
2925 [ + + ]: 1724 : if (((CreateTableAsStmt *) parsetree)->is_select_into)
2369 alvherre@alvh.no-ip. 2926 : 41 : tag = CMDTAG_SELECT_INTO;
2927 : : else
2928 : 1683 : tag = CMDTAG_CREATE_TABLE_AS;
4925 kgrittn@postgresql.o 2929 : 1724 : break;
2930 : 632 : case OBJECT_MATVIEW:
2369 alvherre@alvh.no-ip. 2931 : 632 : tag = CMDTAG_CREATE_MATERIALIZED_VIEW;
4925 kgrittn@postgresql.o 2932 : 632 : break;
4925 kgrittn@postgresql.o 2933 :UBC 0 : default:
2369 alvherre@alvh.no-ip. 2934 : 0 : tag = CMDTAG_UNKNOWN;
2935 : : }
4925 kgrittn@postgresql.o 2936 :CBC 2356 : break;
2937 : :
2938 : 356 : case T_RefreshMatViewStmt:
2369 alvherre@alvh.no-ip. 2939 : 356 : tag = CMDTAG_REFRESH_MATERIALIZED_VIEW;
5274 tgl@sss.pgh.pa.us 2940 : 356 : break;
2941 : :
4635 ishii@postgresql.org 2942 : 132 : case T_AlterSystemStmt:
2369 alvherre@alvh.no-ip. 2943 : 132 : tag = CMDTAG_ALTER_SYSTEM;
4635 ishii@postgresql.org 2944 : 132 : break;
2945 : :
8518 tgl@sss.pgh.pa.us 2946 : 18497 : case T_VariableSetStmt:
6933 2947 [ + + - ]: 18497 : switch (((VariableSetStmt *) parsetree)->kind)
2948 : : {
2949 : 15150 : case VAR_SET_VALUE:
2950 : : case VAR_SET_CURRENT:
2951 : : case VAR_SET_DEFAULT:
2952 : : case VAR_SET_MULTI:
2369 alvherre@alvh.no-ip. 2953 : 15150 : tag = CMDTAG_SET;
6933 tgl@sss.pgh.pa.us 2954 : 15150 : break;
2955 : 3347 : case VAR_RESET:
2956 : : case VAR_RESET_ALL:
2369 alvherre@alvh.no-ip. 2957 : 3347 : tag = CMDTAG_RESET;
6933 tgl@sss.pgh.pa.us 2958 : 3347 : break;
6933 tgl@sss.pgh.pa.us 2959 :UBC 0 : default:
2369 alvherre@alvh.no-ip. 2960 : 0 : tag = CMDTAG_UNKNOWN;
2961 : : }
8518 tgl@sss.pgh.pa.us 2962 :CBC 18497 : break;
2963 : :
2964 : 569 : case T_VariableShowStmt:
2369 alvherre@alvh.no-ip. 2965 : 569 : tag = CMDTAG_SHOW;
8518 tgl@sss.pgh.pa.us 2966 : 569 : break;
2967 : :
7063 neilc@samurai.com 2968 : 24 : case T_DiscardStmt:
6933 tgl@sss.pgh.pa.us 2969 [ + + + + : 24 : switch (((DiscardStmt *) parsetree)->target)
- ]
2970 : : {
7063 neilc@samurai.com 2971 : 4 : case DISCARD_ALL:
2369 alvherre@alvh.no-ip. 2972 : 4 : tag = CMDTAG_DISCARD_ALL;
7063 neilc@samurai.com 2973 : 4 : break;
2974 : 3 : case DISCARD_PLANS:
2369 alvherre@alvh.no-ip. 2975 : 3 : tag = CMDTAG_DISCARD_PLANS;
7063 neilc@samurai.com 2976 : 3 : break;
2977 : 9 : case DISCARD_TEMP:
2369 alvherre@alvh.no-ip. 2978 : 9 : tag = CMDTAG_DISCARD_TEMP;
7063 neilc@samurai.com 2979 : 9 : break;
4711 rhaas@postgresql.org 2980 : 8 : case DISCARD_SEQUENCES:
2369 alvherre@alvh.no-ip. 2981 : 8 : tag = CMDTAG_DISCARD_SEQUENCES;
4711 rhaas@postgresql.org 2982 : 8 : break;
7063 neilc@samurai.com 2983 :UBC 0 : default:
2369 alvherre@alvh.no-ip. 2984 : 0 : tag = CMDTAG_UNKNOWN;
2985 : : }
8518 tgl@sss.pgh.pa.us 2986 :CBC 24 : break;
2987 : :
164 peter@eisentraut.org 2988 : 446 : case T_CreatePropGraphStmt:
2989 : 446 : tag = CMDTAG_CREATE_PROPERTY_GRAPH;
2990 : 446 : break;
2991 : :
2992 : 376 : case T_AlterPropGraphStmt:
2993 : 376 : tag = CMDTAG_ALTER_PROPERTY_GRAPH;
2994 : 376 : break;
2995 : :
4141 peter_e@gmx.net 2996 : 47 : case T_CreateTransformStmt:
2369 alvherre@alvh.no-ip. 2997 : 47 : tag = CMDTAG_CREATE_TRANSFORM;
4141 peter_e@gmx.net 2998 : 47 : break;
2999 : :
8518 tgl@sss.pgh.pa.us 3000 : 4354 : case T_CreateTrigStmt:
2369 alvherre@alvh.no-ip. 3001 : 4354 : tag = CMDTAG_CREATE_TRIGGER;
8518 tgl@sss.pgh.pa.us 3002 : 4354 : break;
3003 : :
5153 rhaas@postgresql.org 3004 : 128 : case T_CreateEventTrigStmt:
2369 alvherre@alvh.no-ip. 3005 : 128 : tag = CMDTAG_CREATE_EVENT_TRIGGER;
5153 rhaas@postgresql.org 3006 : 128 : break;
3007 : :
3008 : 31 : case T_AlterEventTrigStmt:
2369 alvherre@alvh.no-ip. 3009 : 31 : tag = CMDTAG_ALTER_EVENT_TRIGGER;
5153 rhaas@postgresql.org 3010 : 31 : break;
3011 : :
8518 tgl@sss.pgh.pa.us 3012 : 34 : case T_CreatePLangStmt:
2369 alvherre@alvh.no-ip. 3013 : 34 : tag = CMDTAG_CREATE_LANGUAGE;
8518 tgl@sss.pgh.pa.us 3014 : 34 : break;
3015 : :
7730 3016 : 1291 : case T_CreateRoleStmt:
2369 alvherre@alvh.no-ip. 3017 : 1291 : tag = CMDTAG_CREATE_ROLE;
8518 tgl@sss.pgh.pa.us 3018 : 1291 : break;
3019 : :
7730 3020 : 291 : case T_AlterRoleStmt:
2369 alvherre@alvh.no-ip. 3021 : 291 : tag = CMDTAG_ALTER_ROLE;
8518 tgl@sss.pgh.pa.us 3022 : 291 : break;
3023 : :
7730 3024 : 52 : case T_AlterRoleSetStmt:
2369 alvherre@alvh.no-ip. 3025 : 52 : tag = CMDTAG_ALTER_ROLE;
8518 tgl@sss.pgh.pa.us 3026 : 52 : break;
3027 : :
7730 3028 : 1250 : case T_DropRoleStmt:
2369 alvherre@alvh.no-ip. 3029 : 1250 : tag = CMDTAG_DROP_ROLE;
8518 tgl@sss.pgh.pa.us 3030 : 1250 : break;
3031 : :
7584 alvherre@alvh.no-ip. 3032 : 206 : case T_DropOwnedStmt:
2369 3033 : 206 : tag = CMDTAG_DROP_OWNED;
7584 3034 : 206 : break;
3035 : :
3036 : 36 : case T_ReassignOwnedStmt:
2369 3037 : 36 : tag = CMDTAG_REASSIGN_OWNED;
7584 3038 : 36 : break;
3039 : :
8518 tgl@sss.pgh.pa.us 3040 : 597 : case T_LockStmt:
2369 alvherre@alvh.no-ip. 3041 : 597 : tag = CMDTAG_LOCK_TABLE;
8518 tgl@sss.pgh.pa.us 3042 : 597 : break;
3043 : :
3044 : 71 : case T_ConstraintsSetStmt:
2369 alvherre@alvh.no-ip. 3045 : 71 : tag = CMDTAG_SET_CONSTRAINTS;
8518 tgl@sss.pgh.pa.us 3046 : 71 : break;
3047 : :
3048 : 144 : case T_CheckPointStmt:
2369 alvherre@alvh.no-ip. 3049 : 144 : tag = CMDTAG_CHECKPOINT;
8518 tgl@sss.pgh.pa.us 3050 : 144 : break;
3051 : :
3052 : 1672 : case T_ReindexStmt:
2369 alvherre@alvh.no-ip. 3053 : 1672 : tag = CMDTAG_REINDEX;
8518 tgl@sss.pgh.pa.us 3054 : 1672 : break;
3055 : :
3056 : 89 : case T_CreateConversionStmt:
2369 alvherre@alvh.no-ip. 3057 : 89 : tag = CMDTAG_CREATE_CONVERSION;
8518 tgl@sss.pgh.pa.us 3058 : 89 : break;
3059 : :
3060 : 320 : case T_CreateCastStmt:
2369 alvherre@alvh.no-ip. 3061 : 320 : tag = CMDTAG_CREATE_CAST;
8518 tgl@sss.pgh.pa.us 3062 : 320 : break;
3063 : :
3064 : 392 : case T_CreateOpClassStmt:
2369 alvherre@alvh.no-ip. 3065 : 392 : tag = CMDTAG_CREATE_OPERATOR_CLASS;
8518 tgl@sss.pgh.pa.us 3066 : 392 : break;
3067 : :
7156 3068 : 195 : case T_CreateOpFamilyStmt:
2369 alvherre@alvh.no-ip. 3069 : 195 : tag = CMDTAG_CREATE_OPERATOR_FAMILY;
7156 tgl@sss.pgh.pa.us 3070 : 195 : break;
3071 : :
3072 : 474 : case T_AlterOpFamilyStmt:
2369 alvherre@alvh.no-ip. 3073 : 474 : tag = CMDTAG_ALTER_OPERATOR_FAMILY;
7156 tgl@sss.pgh.pa.us 3074 : 474 : break;
3075 : :
4062 heikki.linnakangas@i 3076 : 444 : case T_AlterOperatorStmt:
2369 alvherre@alvh.no-ip. 3077 : 444 : tag = CMDTAG_ALTER_OPERATOR;
4062 heikki.linnakangas@i 3078 : 444 : break;
3079 : :
2365 tgl@sss.pgh.pa.us 3080 : 56 : case T_AlterTypeStmt:
3081 : 56 : tag = CMDTAG_ALTER_TYPE;
3082 : 56 : break;
3083 : :
6946 3084 : 46 : case T_AlterTSDictionaryStmt:
2369 alvherre@alvh.no-ip. 3085 : 46 : tag = CMDTAG_ALTER_TEXT_SEARCH_DICTIONARY;
6946 tgl@sss.pgh.pa.us 3086 : 46 : break;
3087 : :
3088 : 5207 : case T_AlterTSConfigurationStmt:
2369 alvherre@alvh.no-ip. 3089 : 5207 : tag = CMDTAG_ALTER_TEXT_SEARCH_CONFIGURATION;
6946 tgl@sss.pgh.pa.us 3090 : 5207 : break;
3091 : :
4360 sfrost@snowman.net 3092 : 1274 : case T_CreatePolicyStmt:
2369 alvherre@alvh.no-ip. 3093 : 1274 : tag = CMDTAG_CREATE_POLICY;
4360 sfrost@snowman.net 3094 : 1274 : break;
3095 : :
3096 : 124 : case T_AlterPolicyStmt:
2369 alvherre@alvh.no-ip. 3097 : 124 : tag = CMDTAG_ALTER_POLICY;
4360 sfrost@snowman.net 3098 : 124 : break;
3099 : :
3809 alvherre@alvh.no-ip. 3100 : 71 : case T_CreateAmStmt:
2369 3101 : 71 : tag = CMDTAG_CREATE_ACCESS_METHOD;
3809 3102 : 71 : break;
3103 : :
3507 peter_e@gmx.net 3104 : 1288 : case T_CreatePublicationStmt:
2369 alvherre@alvh.no-ip. 3105 : 1288 : tag = CMDTAG_CREATE_PUBLICATION;
3507 peter_e@gmx.net 3106 : 1288 : break;
3107 : :
3108 : 1573 : case T_AlterPublicationStmt:
2369 alvherre@alvh.no-ip. 3109 : 1573 : tag = CMDTAG_ALTER_PUBLICATION;
3507 peter_e@gmx.net 3110 : 1573 : break;
3111 : :
3112 : 677 : case T_CreateSubscriptionStmt:
2369 alvherre@alvh.no-ip. 3113 : 677 : tag = CMDTAG_CREATE_SUBSCRIPTION;
3507 peter_e@gmx.net 3114 : 677 : break;
3115 : :
3116 : 886 : case T_AlterSubscriptionStmt:
2369 alvherre@alvh.no-ip. 3117 : 886 : tag = CMDTAG_ALTER_SUBSCRIPTION;
3507 peter_e@gmx.net 3118 : 886 : break;
3119 : :
3120 : 364 : case T_DropSubscriptionStmt:
2369 alvherre@alvh.no-ip. 3121 : 364 : tag = CMDTAG_DROP_SUBSCRIPTION;
3507 peter_e@gmx.net 3122 : 364 : break;
3123 : :
1938 tmunro@postgresql.or 3124 : 8 : case T_AlterCollationStmt:
3125 : 8 : tag = CMDTAG_ALTER_COLLATION;
3126 : 8 : break;
3127 : :
8518 tgl@sss.pgh.pa.us 3128 : 1883 : case T_PrepareStmt:
2369 alvherre@alvh.no-ip. 3129 : 1883 : tag = CMDTAG_PREPARE;
8518 tgl@sss.pgh.pa.us 3130 : 1883 : break;
3131 : :
3132 : 16249 : case T_ExecuteStmt:
2369 alvherre@alvh.no-ip. 3133 : 16249 : tag = CMDTAG_EXECUTE;
8518 tgl@sss.pgh.pa.us 3134 : 16249 : break;
3135 : :
3443 alvherre@alvh.no-ip. 3136 : 1208 : case T_CreateStatsStmt:
2369 3137 : 1208 : tag = CMDTAG_CREATE_STATISTICS;
3443 3138 : 1208 : break;
3139 : :
2543 tomas.vondra@postgre 3140 : 35 : case T_AlterStatsStmt:
2369 alvherre@alvh.no-ip. 3141 : 35 : tag = CMDTAG_ALTER_STATISTICS;
2543 tomas.vondra@postgre 3142 : 35 : break;
3143 : :
8518 tgl@sss.pgh.pa.us 3144 : 1235 : case T_DeallocateStmt:
3145 : : {
7077 neilc@samurai.com 3146 : 1235 : DeallocateStmt *stmt = (DeallocateStmt *) parsetree;
3147 : :
3148 [ + + ]: 1235 : if (stmt->name == NULL)
2369 alvherre@alvh.no-ip. 3149 : 37 : tag = CMDTAG_DEALLOCATE_ALL;
3150 : : else
3151 : 1198 : tag = CMDTAG_DEALLOCATE;
3152 : : }
8518 tgl@sss.pgh.pa.us 3153 : 1235 : break;
3154 : :
295 akorotkov@postgresql 3155 : 527 : case T_WaitStmt:
3156 : 527 : tag = CMDTAG_WAIT;
3157 : 527 : break;
3158 : :
3159 : : /* already-planned queries */
7128 tgl@sss.pgh.pa.us 3160 : 26 : case T_PlannedStmt:
3161 : : {
3162 : 26 : PlannedStmt *stmt = (PlannedStmt *) parsetree;
3163 : :
3164 [ - + + + : 26 : switch (stmt->commandType)
- - - ]
3165 : : {
7128 tgl@sss.pgh.pa.us 3166 :UBC 0 : case CMD_SELECT:
3167 : :
3168 : : /*
3169 : : * We take a little extra care here so that the result
3170 : : * will be useful for complaints about read-only
3171 : : * statements
3172 : : */
3512 3173 [ # # ]: 0 : if (stmt->rowMarks != NIL)
3174 : : {
3175 : : /* not 100% but probably close enough */
4183 3176 [ # # # # : 0 : switch (((PlanRowMark *) linitial(stmt->rowMarks))->strength)
# ]
3177 : : {
3178 : 0 : case LCS_FORKEYSHARE:
2369 alvherre@alvh.no-ip. 3179 : 0 : tag = CMDTAG_SELECT_FOR_KEY_SHARE;
4964 3180 : 0 : break;
4183 tgl@sss.pgh.pa.us 3181 : 0 : case LCS_FORSHARE:
2369 alvherre@alvh.no-ip. 3182 : 0 : tag = CMDTAG_SELECT_FOR_SHARE;
4964 3183 : 0 : break;
4183 tgl@sss.pgh.pa.us 3184 : 0 : case LCS_FORNOKEYUPDATE:
2369 alvherre@alvh.no-ip. 3185 : 0 : tag = CMDTAG_SELECT_FOR_NO_KEY_UPDATE;
4964 3186 : 0 : break;
4183 tgl@sss.pgh.pa.us 3187 : 0 : case LCS_FORUPDATE:
2369 alvherre@alvh.no-ip. 3188 : 0 : tag = CMDTAG_SELECT_FOR_UPDATE;
4964 3189 : 0 : break;
3190 : 0 : default:
2369 3191 : 0 : tag = CMDTAG_SELECT;
4964 3192 : 0 : break;
3193 : : }
3194 : : }
3195 : : else
2369 3196 : 0 : tag = CMDTAG_SELECT;
7128 tgl@sss.pgh.pa.us 3197 : 0 : break;
7128 tgl@sss.pgh.pa.us 3198 :CBC 16 : case CMD_UPDATE:
2369 alvherre@alvh.no-ip. 3199 : 16 : tag = CMDTAG_UPDATE;
7128 tgl@sss.pgh.pa.us 3200 : 16 : break;
3201 : 6 : case CMD_INSERT:
2369 alvherre@alvh.no-ip. 3202 : 6 : tag = CMDTAG_INSERT;
7128 tgl@sss.pgh.pa.us 3203 : 6 : break;
3204 : 4 : case CMD_DELETE:
2369 alvherre@alvh.no-ip. 3205 : 4 : tag = CMDTAG_DELETE;
7128 tgl@sss.pgh.pa.us 3206 : 4 : break;
1613 alvherre@alvh.no-ip. 3207 :UBC 0 : case CMD_MERGE:
3208 : 0 : tag = CMDTAG_MERGE;
3209 : 0 : break;
3512 tgl@sss.pgh.pa.us 3210 : 0 : case CMD_UTILITY:
3211 : 0 : tag = CreateCommandTag(stmt->utilityStmt);
3212 : 0 : break;
7128 3213 : 0 : default:
3214 [ # # ]: 0 : elog(WARNING, "unrecognized commandType: %d",
3215 : : (int) stmt->commandType);
2369 alvherre@alvh.no-ip. 3216 : 0 : tag = CMDTAG_UNKNOWN;
7128 tgl@sss.pgh.pa.us 3217 : 0 : break;
3218 : : }
3219 : : }
7128 tgl@sss.pgh.pa.us 3220 :CBC 26 : break;
3221 : :
3222 : : /* parsed-and-rewritten-but-not-planned queries */
3223 : 548 : case T_Query:
3224 : : {
6860 bruce@momjian.us 3225 : 548 : Query *stmt = (Query *) parsetree;
3226 : :
7128 tgl@sss.pgh.pa.us 3227 [ + + + + : 548 : switch (stmt->commandType)
- - - ]
3228 : : {
3229 : 536 : case CMD_SELECT:
3230 : :
3231 : : /*
3232 : : * We take a little extra care here so that the result
3233 : : * will be useful for complaints about read-only
3234 : : * statements
3235 : : */
3512 3236 [ - + ]: 536 : if (stmt->rowMarks != NIL)
3237 : : {
3238 : : /* not 100% but probably close enough */
4964 alvherre@alvh.no-ip. 3239 [ # # # # :UBC 0 : switch (((RowMarkClause *) linitial(stmt->rowMarks))->strength)
# ]
3240 : : {
3241 : 0 : case LCS_FORKEYSHARE:
2369 3242 : 0 : tag = CMDTAG_SELECT_FOR_KEY_SHARE;
4964 3243 : 0 : break;
3244 : 0 : case LCS_FORSHARE:
2369 3245 : 0 : tag = CMDTAG_SELECT_FOR_SHARE;
4964 3246 : 0 : break;
3247 : 0 : case LCS_FORNOKEYUPDATE:
2369 3248 : 0 : tag = CMDTAG_SELECT_FOR_NO_KEY_UPDATE;
4964 3249 : 0 : break;
3250 : 0 : case LCS_FORUPDATE:
2369 3251 : 0 : tag = CMDTAG_SELECT_FOR_UPDATE;
4964 3252 : 0 : break;
3253 : 0 : default:
2369 3254 : 0 : tag = CMDTAG_UNKNOWN;
4964 3255 : 0 : break;
3256 : : }
3257 : : }
3258 : : else
2369 alvherre@alvh.no-ip. 3259 :CBC 536 : tag = CMDTAG_SELECT;
7128 tgl@sss.pgh.pa.us 3260 : 536 : break;
3261 : 4 : case CMD_UPDATE:
2369 alvherre@alvh.no-ip. 3262 : 4 : tag = CMDTAG_UPDATE;
7128 tgl@sss.pgh.pa.us 3263 : 4 : break;
3264 : 4 : case CMD_INSERT:
2369 alvherre@alvh.no-ip. 3265 : 4 : tag = CMDTAG_INSERT;
7128 tgl@sss.pgh.pa.us 3266 : 4 : break;
3267 : 4 : case CMD_DELETE:
2369 alvherre@alvh.no-ip. 3268 : 4 : tag = CMDTAG_DELETE;
7128 tgl@sss.pgh.pa.us 3269 : 4 : break;
1613 alvherre@alvh.no-ip. 3270 :UBC 0 : case CMD_MERGE:
3271 : 0 : tag = CMDTAG_MERGE;
3272 : 0 : break;
7128 tgl@sss.pgh.pa.us 3273 : 0 : case CMD_UTILITY:
3274 : 0 : tag = CreateCommandTag(stmt->utilityStmt);
3275 : 0 : break;
3276 : 0 : default:
3277 [ # # ]: 0 : elog(WARNING, "unrecognized commandType: %d",
3278 : : (int) stmt->commandType);
2369 alvherre@alvh.no-ip. 3279 : 0 : tag = CMDTAG_UNKNOWN;
7128 tgl@sss.pgh.pa.us 3280 : 0 : break;
3281 : : }
3282 : : }
8018 tgl@sss.pgh.pa.us 3283 :CBC 548 : break;
3284 : :
8018 tgl@sss.pgh.pa.us 3285 :UBC 0 : default:
7128 3286 [ # # ]: 0 : elog(WARNING, "unrecognized node type: %d",
3287 : : (int) nodeTag(parsetree));
2369 alvherre@alvh.no-ip. 3288 : 0 : tag = CMDTAG_UNKNOWN;
8018 tgl@sss.pgh.pa.us 3289 : 0 : break;
3290 : : }
3291 : :
8018 tgl@sss.pgh.pa.us 3292 :CBC 610375 : return tag;
3293 : : }
3294 : :
3295 : :
3296 : : /*
3297 : : * GetCommandLogLevel
3298 : : * utility to get the minimum log_statement level for a command,
3299 : : * given either a raw (un-analyzed) parsetree, an analyzed Query,
3300 : : * or a PlannedStmt.
3301 : : *
3302 : : * This must handle all command types, but since the vast majority
3303 : : * of 'em are utility commands, it seems sensible to keep it here.
3304 : : */
3305 : : LogStmtLevel
7294 tgl@sss.pgh.pa.us 3306 :UBC 0 : GetCommandLogLevel(Node *parsetree)
3307 : : {
3308 : : LogStmtLevel lev;
3309 : :
3310 [ # # # # : 0 : switch (nodeTag(parsetree))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # ]
3311 : : {
3312 : : /* recurse if we're given a RawStmt */
3512 3313 : 0 : case T_RawStmt:
3314 : 0 : lev = GetCommandLogLevel(((RawStmt *) parsetree)->stmt);
3315 : 0 : break;
3316 : :
3317 : : /* raw plannable queries */
7294 3318 : 0 : case T_InsertStmt:
3319 : : case T_DeleteStmt:
3320 : : case T_UpdateStmt:
3321 : : case T_MergeStmt:
3322 : 0 : lev = LOGSTMT_MOD;
3323 : 0 : break;
3324 : :
3325 : 0 : case T_SelectStmt:
7062 3326 [ # # ]: 0 : if (((SelectStmt *) parsetree)->intoClause)
3354 3327 : 0 : lev = LOGSTMT_DDL; /* SELECT INTO */
3328 : : else
7294 3329 : 0 : lev = LOGSTMT_ALL;
3330 : 0 : break;
3331 : :
2061 3332 : 0 : case T_PLAssignStmt:
3333 : 0 : lev = LOGSTMT_ALL;
3334 : 0 : break;
3335 : :
3336 : : /* utility statements --- same whether raw or cooked */
7294 3337 : 0 : case T_TransactionStmt:
3338 : 0 : lev = LOGSTMT_ALL;
3339 : 0 : break;
3340 : :
3341 : 0 : case T_DeclareCursorStmt:
3342 : 0 : lev = LOGSTMT_ALL;
3343 : 0 : break;
3344 : :
3345 : 0 : case T_ClosePortalStmt:
3346 : 0 : lev = LOGSTMT_ALL;
3347 : 0 : break;
3348 : :
3349 : 0 : case T_FetchStmt:
3350 : 0 : lev = LOGSTMT_ALL;
3351 : 0 : break;
3352 : :
3353 : 0 : case T_CreateSchemaStmt:
3354 : 0 : lev = LOGSTMT_DDL;
3355 : 0 : break;
3356 : :
3357 : 0 : case T_CreateStmt:
3358 : : case T_CreateForeignTableStmt:
3359 : 0 : lev = LOGSTMT_DDL;
3360 : 0 : break;
3361 : :
3362 : 0 : case T_CreateTableSpaceStmt:
3363 : : case T_DropTableSpaceStmt:
3364 : : case T_AlterTableSpaceOptionsStmt:
6078 rhaas@postgresql.org 3365 : 0 : lev = LOGSTMT_DDL;
3366 : 0 : break;
3367 : :
5679 tgl@sss.pgh.pa.us 3368 : 0 : case T_CreateExtensionStmt:
3369 : : case T_AlterExtensionStmt:
3370 : : case T_AlterExtensionContentsStmt:
3371 : 0 : lev = LOGSTMT_DDL;
3372 : 0 : break;
3373 : :
6460 peter_e@gmx.net 3374 : 0 : case T_CreateFdwStmt:
3375 : : case T_AlterFdwStmt:
3376 : : case T_CreateForeignServerStmt:
3377 : : case T_AlterForeignServerStmt:
3378 : : case T_CreateUserMappingStmt:
3379 : : case T_AlterUserMappingStmt:
3380 : : case T_DropUserMappingStmt:
3381 : : case T_ImportForeignSchemaStmt:
3382 : 0 : lev = LOGSTMT_DDL;
3383 : 0 : break;
3384 : :
7294 tgl@sss.pgh.pa.us 3385 : 0 : case T_DropStmt:
3386 : 0 : lev = LOGSTMT_DDL;
3387 : 0 : break;
3388 : :
3389 : 0 : case T_TruncateStmt:
3390 : 0 : lev = LOGSTMT_MOD;
3391 : 0 : break;
3392 : :
3393 : 0 : case T_CommentStmt:
3394 : 0 : lev = LOGSTMT_DDL;
3395 : 0 : break;
3396 : :
5813 rhaas@postgresql.org 3397 : 0 : case T_SecLabelStmt:
3398 : 0 : lev = LOGSTMT_DDL;
3399 : 0 : break;
3400 : :
7294 tgl@sss.pgh.pa.us 3401 : 0 : case T_CopyStmt:
3402 [ # # ]: 0 : if (((CopyStmt *) parsetree)->is_from)
3403 : 0 : lev = LOGSTMT_MOD;
3404 : : else
3405 : 0 : lev = LOGSTMT_ALL;
3406 : 0 : break;
3407 : :
6530 3408 : 0 : case T_PrepareStmt:
3409 : : {
3410 : 0 : PrepareStmt *stmt = (PrepareStmt *) parsetree;
3411 : :
3412 : : /* Look through a PREPARE to the contained stmt */
3413 : 0 : lev = GetCommandLogLevel(stmt->query);
3414 : : }
3415 : 0 : break;
3416 : :
3417 : 0 : case T_ExecuteStmt:
3418 : : {
3419 : 0 : ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
3420 : : PreparedStatement *ps;
3421 : :
3422 : : /* Look through an EXECUTE to the referenced stmt */
3423 : 0 : ps = FetchPreparedStatement(stmt->name, false);
4306 3424 [ # # # # ]: 0 : if (ps && ps->plansource->raw_parse_tree)
3512 3425 : 0 : lev = GetCommandLogLevel(ps->plansource->raw_parse_tree->stmt);
3426 : : else
6530 3427 : 0 : lev = LOGSTMT_ALL;
3428 : : }
3429 : 0 : break;
3430 : :
3431 : 0 : case T_DeallocateStmt:
3432 : 0 : lev = LOGSTMT_ALL;
3433 : 0 : break;
3434 : :
7294 3435 : 0 : case T_RenameStmt:
3436 : 0 : lev = LOGSTMT_DDL;
3437 : 0 : break;
3438 : :
3796 alvherre@alvh.no-ip. 3439 : 0 : case T_AlterObjectDependsStmt:
3440 : 0 : lev = LOGSTMT_DDL;
3441 : 0 : break;
3442 : :
7294 tgl@sss.pgh.pa.us 3443 : 0 : case T_AlterObjectSchemaStmt:
3444 : 0 : lev = LOGSTMT_DDL;
3445 : 0 : break;
3446 : :
3447 : 0 : case T_AlterOwnerStmt:
3448 : 0 : lev = LOGSTMT_DDL;
3449 : 0 : break;
3450 : :
3269 rhaas@postgresql.org 3451 : 0 : case T_AlterOperatorStmt:
3452 : 0 : lev = LOGSTMT_DDL;
3453 : 0 : break;
3454 : :
2365 tgl@sss.pgh.pa.us 3455 : 0 : case T_AlterTypeStmt:
3456 : 0 : lev = LOGSTMT_DDL;
3457 : 0 : break;
3458 : :
4389 sfrost@snowman.net 3459 : 0 : case T_AlterTableMoveAllStmt:
3460 : : case T_AlterTableStmt:
7294 tgl@sss.pgh.pa.us 3461 : 0 : lev = LOGSTMT_DDL;
3462 : 0 : break;
3463 : :
3464 : 0 : case T_AlterDomainStmt:
3465 : 0 : lev = LOGSTMT_DDL;
3466 : 0 : break;
3467 : :
3468 : 0 : case T_GrantStmt:
3469 : 0 : lev = LOGSTMT_DDL;
3470 : 0 : break;
3471 : :
3472 : 0 : case T_GrantRoleStmt:
3473 : 0 : lev = LOGSTMT_DDL;
3474 : 0 : break;
3475 : :
6170 3476 : 0 : case T_AlterDefaultPrivilegesStmt:
3477 : 0 : lev = LOGSTMT_DDL;
3478 : 0 : break;
3479 : :
7294 3480 : 0 : case T_DefineStmt:
3481 : 0 : lev = LOGSTMT_DDL;
3482 : 0 : break;
3483 : :
3484 : 0 : case T_CompositeTypeStmt:
3485 : 0 : lev = LOGSTMT_DDL;
3486 : 0 : break;
3487 : :
7087 3488 : 0 : case T_CreateEnumStmt:
3489 : 0 : lev = LOGSTMT_DDL;
3490 : 0 : break;
3491 : :
5411 heikki.linnakangas@i 3492 : 0 : case T_CreateRangeStmt:
3493 : 0 : lev = LOGSTMT_DDL;
3494 : 0 : break;
3495 : :
5786 tgl@sss.pgh.pa.us 3496 : 0 : case T_AlterEnumStmt:
3497 : 0 : lev = LOGSTMT_DDL;
3498 : 0 : break;
3499 : :
7294 3500 : 0 : case T_ViewStmt:
3501 : 0 : lev = LOGSTMT_DDL;
3502 : 0 : break;
3503 : :
3504 : 0 : case T_CreateFunctionStmt:
3505 : 0 : lev = LOGSTMT_DDL;
3506 : 0 : break;
3507 : :
6530 3508 : 0 : case T_AlterFunctionStmt:
3509 : 0 : lev = LOGSTMT_DDL;
3510 : 0 : break;
3511 : :
7294 3512 : 0 : case T_IndexStmt:
3513 : 0 : lev = LOGSTMT_DDL;
3514 : 0 : break;
3515 : :
3516 : 0 : case T_RuleStmt:
3517 : 0 : lev = LOGSTMT_DDL;
3518 : 0 : break;
3519 : :
3520 : 0 : case T_CreateSeqStmt:
3521 : 0 : lev = LOGSTMT_DDL;
3522 : 0 : break;
3523 : :
3524 : 0 : case T_AlterSeqStmt:
3525 : 0 : lev = LOGSTMT_DDL;
3526 : 0 : break;
3527 : :
6183 3528 : 0 : case T_DoStmt:
3529 : 0 : lev = LOGSTMT_ALL;
3530 : 0 : break;
3531 : :
7294 3532 : 0 : case T_CreatedbStmt:
3533 : 0 : lev = LOGSTMT_DDL;
3534 : 0 : break;
3535 : :
3536 : 0 : case T_AlterDatabaseStmt:
3537 : : case T_AlterDatabaseRefreshCollStmt:
3538 : : case T_AlterDatabaseSetStmt:
3539 : 0 : lev = LOGSTMT_DDL;
3540 : 0 : break;
3541 : :
3542 : 0 : case T_DropdbStmt:
3543 : 0 : lev = LOGSTMT_DDL;
3544 : 0 : break;
3545 : :
3546 : 0 : case T_NotifyStmt:
3547 : 0 : lev = LOGSTMT_ALL;
3548 : 0 : break;
3549 : :
3550 : 0 : case T_ListenStmt:
3551 : 0 : lev = LOGSTMT_ALL;
3552 : 0 : break;
3553 : :
3554 : 0 : case T_UnlistenStmt:
3555 : 0 : lev = LOGSTMT_ALL;
3556 : 0 : break;
3557 : :
3558 : 0 : case T_LoadStmt:
3559 : 0 : lev = LOGSTMT_ALL;
3560 : 0 : break;
3561 : :
3192 peter_e@gmx.net 3562 : 0 : case T_CallStmt:
3563 : 0 : lev = LOGSTMT_ALL;
3564 : 0 : break;
3565 : :
170 alvherre@kurilemu.de 3566 : 0 : case T_RepackStmt:
7294 tgl@sss.pgh.pa.us 3567 : 0 : lev = LOGSTMT_DDL;
3568 : 0 : break;
3569 : :
3570 : 0 : case T_VacuumStmt:
3571 : 0 : lev = LOGSTMT_ALL;
3572 : 0 : break;
3573 : :
3574 : 0 : case T_ExplainStmt:
3575 : : {
7267 bruce@momjian.us 3576 : 0 : ExplainStmt *stmt = (ExplainStmt *) parsetree;
6026 3577 : 0 : bool analyze = false;
3578 : : ListCell *lc;
3579 : :
3580 : : /* Look through an EXPLAIN ANALYZE to the contained stmt */
6241 tgl@sss.pgh.pa.us 3581 [ # # # # : 0 : foreach(lc, stmt->options)
# # ]
3582 : : {
6026 bruce@momjian.us 3583 : 0 : DefElem *opt = (DefElem *) lfirst(lc);
3584 : :
6241 tgl@sss.pgh.pa.us 3585 [ # # ]: 0 : if (strcmp(opt->defname, "analyze") == 0)
3586 : 0 : analyze = defGetBoolean(opt);
3587 : : /* don't "break", as explain.c will use the last value */
3588 : : }
3589 [ # # ]: 0 : if (analyze)
7107 3590 : 0 : return GetCommandLogLevel(stmt->query);
3591 : :
3592 : : /* Plain EXPLAIN isn't so interesting */
7294 3593 : 0 : lev = LOGSTMT_ALL;
3594 : : }
3595 : 0 : break;
3596 : :
5274 3597 : 0 : case T_CreateTableAsStmt:
3598 : 0 : lev = LOGSTMT_DDL;
3599 : 0 : break;
3600 : :
4925 kgrittn@postgresql.o 3601 : 0 : case T_RefreshMatViewStmt:
3602 : 0 : lev = LOGSTMT_DDL;
3603 : 0 : break;
3604 : :
4635 ishii@postgresql.org 3605 : 0 : case T_AlterSystemStmt:
4357 sfrost@snowman.net 3606 : 0 : lev = LOGSTMT_DDL;
4635 ishii@postgresql.org 3607 : 0 : break;
3608 : :
7294 tgl@sss.pgh.pa.us 3609 : 0 : case T_VariableSetStmt:
3610 : 0 : lev = LOGSTMT_ALL;
3611 : 0 : break;
3612 : :
3613 : 0 : case T_VariableShowStmt:
3614 : 0 : lev = LOGSTMT_ALL;
3615 : 0 : break;
3616 : :
6530 3617 : 0 : case T_DiscardStmt:
3618 : 0 : lev = LOGSTMT_ALL;
3619 : 0 : break;
3620 : :
7294 3621 : 0 : case T_CreateTrigStmt:
3622 : 0 : lev = LOGSTMT_DDL;
3623 : 0 : break;
3624 : :
5153 rhaas@postgresql.org 3625 : 0 : case T_CreateEventTrigStmt:
3626 : 0 : lev = LOGSTMT_DDL;
3627 : 0 : break;
3628 : :
3629 : 0 : case T_AlterEventTrigStmt:
3630 : 0 : lev = LOGSTMT_DDL;
3631 : 0 : break;
3632 : :
7294 tgl@sss.pgh.pa.us 3633 : 0 : case T_CreatePLangStmt:
3634 : 0 : lev = LOGSTMT_DDL;
3635 : 0 : break;
3636 : :
6530 3637 : 0 : case T_CreateDomainStmt:
3638 : 0 : lev = LOGSTMT_DDL;
3639 : 0 : break;
3640 : :
7294 3641 : 0 : case T_CreateRoleStmt:
3642 : 0 : lev = LOGSTMT_DDL;
3643 : 0 : break;
3644 : :
3645 : 0 : case T_AlterRoleStmt:
3646 : 0 : lev = LOGSTMT_DDL;
3647 : 0 : break;
3648 : :
3649 : 0 : case T_AlterRoleSetStmt:
3650 : 0 : lev = LOGSTMT_DDL;
3651 : 0 : break;
3652 : :
3653 : 0 : case T_DropRoleStmt:
3654 : 0 : lev = LOGSTMT_DDL;
3655 : 0 : break;
3656 : :
3657 : 0 : case T_DropOwnedStmt:
3658 : 0 : lev = LOGSTMT_DDL;
3659 : 0 : break;
3660 : :
3661 : 0 : case T_ReassignOwnedStmt:
3662 : 0 : lev = LOGSTMT_DDL;
3663 : 0 : break;
3664 : :
3665 : 0 : case T_LockStmt:
3666 : 0 : lev = LOGSTMT_ALL;
3667 : 0 : break;
3668 : :
3669 : 0 : case T_ConstraintsSetStmt:
3670 : 0 : lev = LOGSTMT_ALL;
3671 : 0 : break;
3672 : :
3673 : 0 : case T_CheckPointStmt:
3674 : 0 : lev = LOGSTMT_ALL;
3675 : 0 : break;
3676 : :
3677 : 0 : case T_ReindexStmt:
7267 bruce@momjian.us 3678 : 0 : lev = LOGSTMT_ALL; /* should this be DDL? */
7294 tgl@sss.pgh.pa.us 3679 : 0 : break;
3680 : :
3681 : 0 : case T_CreateConversionStmt:
3682 : 0 : lev = LOGSTMT_DDL;
3683 : 0 : break;
3684 : :
3685 : 0 : case T_CreateCastStmt:
3686 : 0 : lev = LOGSTMT_DDL;
3687 : 0 : break;
3688 : :
3689 : 0 : case T_CreateOpClassStmt:
3690 : 0 : lev = LOGSTMT_DDL;
3691 : 0 : break;
3692 : :
7156 3693 : 0 : case T_CreateOpFamilyStmt:
3694 : 0 : lev = LOGSTMT_DDL;
3695 : 0 : break;
3696 : :
164 peter@eisentraut.org 3697 : 0 : case T_CreatePropGraphStmt:
3698 : 0 : lev = LOGSTMT_DDL;
3699 : 0 : break;
3700 : :
3701 : 0 : case T_AlterPropGraphStmt:
3702 : 0 : lev = LOGSTMT_DDL;
3703 : 0 : break;
3704 : :
4141 peter_e@gmx.net 3705 : 0 : case T_CreateTransformStmt:
3706 : 0 : lev = LOGSTMT_DDL;
3707 : 0 : break;
3708 : :
7156 tgl@sss.pgh.pa.us 3709 : 0 : case T_AlterOpFamilyStmt:
3710 : 0 : lev = LOGSTMT_DDL;
3711 : 0 : break;
3712 : :
4360 sfrost@snowman.net 3713 : 0 : case T_CreatePolicyStmt:
3714 : 0 : lev = LOGSTMT_DDL;
3715 : 0 : break;
3716 : :
3717 : 0 : case T_AlterPolicyStmt:
3718 : 0 : lev = LOGSTMT_DDL;
3719 : 0 : break;
3720 : :
6946 tgl@sss.pgh.pa.us 3721 : 0 : case T_AlterTSDictionaryStmt:
3722 : 0 : lev = LOGSTMT_DDL;
3723 : 0 : break;
3724 : :
3725 : 0 : case T_AlterTSConfigurationStmt:
3726 : 0 : lev = LOGSTMT_DDL;
3727 : 0 : break;
3728 : :
3809 alvherre@alvh.no-ip. 3729 : 0 : case T_CreateAmStmt:
3730 : 0 : lev = LOGSTMT_DDL;
3731 : 0 : break;
3732 : :
3507 peter_e@gmx.net 3733 : 0 : case T_CreatePublicationStmt:
3734 : 0 : lev = LOGSTMT_DDL;
3735 : 0 : break;
3736 : :
3737 : 0 : case T_AlterPublicationStmt:
3738 : 0 : lev = LOGSTMT_DDL;
3739 : 0 : break;
3740 : :
3741 : 0 : case T_CreateSubscriptionStmt:
3742 : 0 : lev = LOGSTMT_DDL;
3743 : 0 : break;
3744 : :
3745 : 0 : case T_AlterSubscriptionStmt:
3746 : 0 : lev = LOGSTMT_DDL;
3747 : 0 : break;
3748 : :
3749 : 0 : case T_DropSubscriptionStmt:
3750 : 0 : lev = LOGSTMT_DDL;
3751 : 0 : break;
3752 : :
3269 rhaas@postgresql.org 3753 : 0 : case T_CreateStatsStmt:
3754 : 0 : lev = LOGSTMT_DDL;
3755 : 0 : break;
3756 : :
2543 tomas.vondra@postgre 3757 : 0 : case T_AlterStatsStmt:
3758 : 0 : lev = LOGSTMT_DDL;
3759 : 0 : break;
3760 : :
1938 tmunro@postgresql.or 3761 : 0 : case T_AlterCollationStmt:
3762 : 0 : lev = LOGSTMT_DDL;
3763 : 0 : break;
3764 : :
295 akorotkov@postgresql 3765 : 0 : case T_WaitStmt:
3766 : 0 : lev = LOGSTMT_ALL;
3767 : 0 : break;
3768 : :
3769 : : /* already-planned queries */
7128 tgl@sss.pgh.pa.us 3770 : 0 : case T_PlannedStmt:
3771 : : {
3772 : 0 : PlannedStmt *stmt = (PlannedStmt *) parsetree;
3773 : :
3774 [ # # # # ]: 0 : switch (stmt->commandType)
3775 : : {
3776 : 0 : case CMD_SELECT:
5274 3777 : 0 : lev = LOGSTMT_ALL;
7128 3778 : 0 : break;
3779 : :
3780 : 0 : case CMD_UPDATE:
3781 : : case CMD_INSERT:
3782 : : case CMD_DELETE:
3783 : : case CMD_MERGE:
3784 : 0 : lev = LOGSTMT_MOD;
3785 : 0 : break;
3786 : :
3512 3787 : 0 : case CMD_UTILITY:
3788 : 0 : lev = GetCommandLogLevel(stmt->utilityStmt);
3789 : 0 : break;
3790 : :
7128 3791 : 0 : default:
3792 [ # # ]: 0 : elog(WARNING, "unrecognized commandType: %d",
3793 : : (int) stmt->commandType);
3794 : 0 : lev = LOGSTMT_ALL;
3795 : 0 : break;
3796 : : }
3797 : : }
7294 3798 : 0 : break;
3799 : :
3800 : : /* parsed-and-rewritten-but-not-planned queries */
7128 3801 : 0 : case T_Query:
3802 : : {
6860 bruce@momjian.us 3803 : 0 : Query *stmt = (Query *) parsetree;
3804 : :
7128 tgl@sss.pgh.pa.us 3805 [ # # # # ]: 0 : switch (stmt->commandType)
3806 : : {
3807 : 0 : case CMD_SELECT:
5274 3808 : 0 : lev = LOGSTMT_ALL;
7128 3809 : 0 : break;
3810 : :
3811 : 0 : case CMD_UPDATE:
3812 : : case CMD_INSERT:
3813 : : case CMD_DELETE:
3814 : : case CMD_MERGE:
3815 : 0 : lev = LOGSTMT_MOD;
3816 : 0 : break;
3817 : :
3818 : 0 : case CMD_UTILITY:
3819 : 0 : lev = GetCommandLogLevel(stmt->utilityStmt);
3820 : 0 : break;
3821 : :
3822 : 0 : default:
3823 [ # # ]: 0 : elog(WARNING, "unrecognized commandType: %d",
3824 : : (int) stmt->commandType);
3825 : 0 : lev = LOGSTMT_ALL;
3826 : 0 : break;
3827 : : }
3828 : : }
7294 3829 : 0 : break;
3830 : :
3831 : 0 : default:
7128 3832 [ # # ]: 0 : elog(WARNING, "unrecognized node type: %d",
3833 : : (int) nodeTag(parsetree));
7294 3834 : 0 : lev = LOGSTMT_ALL;
3835 : 0 : break;
3836 : : }
3837 : :
3838 : 0 : return lev;
3839 : : }
|