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