PostgreSQL Source Code git master
Loading...
Searching...
No Matches
utility.c File Reference
#include "postgres.h"
#include "access/reloptions.h"
#include "access/twophase.h"
#include "access/xact.h"
#include "access/xlog.h"
#include "catalog/namespace.h"
#include "catalog/pg_authid.h"
#include "catalog/pg_inherits.h"
#include "catalog/toasting.h"
#include "commands/alter.h"
#include "commands/async.h"
#include "commands/collationcmds.h"
#include "commands/comment.h"
#include "commands/conversioncmds.h"
#include "commands/copy.h"
#include "commands/createas.h"
#include "commands/dbcommands.h"
#include "commands/defrem.h"
#include "commands/discard.h"
#include "commands/event_trigger.h"
#include "commands/explain.h"
#include "commands/extension.h"
#include "commands/lockcmds.h"
#include "commands/matview.h"
#include "commands/policy.h"
#include "commands/portalcmds.h"
#include "commands/prepare.h"
#include "commands/proclang.h"
#include "commands/propgraphcmds.h"
#include "commands/publicationcmds.h"
#include "commands/repack.h"
#include "commands/schemacmds.h"
#include "commands/seclabel.h"
#include "commands/sequence.h"
#include "commands/subscriptioncmds.h"
#include "commands/tablecmds.h"
#include "commands/tablespace.h"
#include "commands/trigger.h"
#include "commands/typecmds.h"
#include "commands/user.h"
#include "commands/vacuum.h"
#include "commands/view.h"
#include "commands/wait.h"
#include "miscadmin.h"
#include "parser/parse_utilcmd.h"
#include "postmaster/bgwriter.h"
#include "rewrite/rewriteDefine.h"
#include "storage/fd.h"
#include "tcop/utility.h"
#include "utils/acl.h"
#include "utils/guc.h"
#include "utils/lsyscache.h"
Include dependency graph for utility.c:

Go to the source code of this file.

Functions

static int ClassifyUtilityCommandAsReadOnly (Node *parsetree)
 
static void ProcessUtilitySlow (ParseState *pstate, PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
 
static void ExecDropStmt (DropStmt *stmt, bool isTopLevel)
 
bool CommandIsReadOnly (PlannedStmt *pstmt)
 
void PreventCommandIfReadOnly (const char *cmdname)
 
void PreventCommandIfParallelMode (const char *cmdname)
 
void PreventCommandDuringRecovery (const char *cmdname)
 
static void CheckRestrictedOperation (const char *cmdname)
 
void ProcessUtility (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
 
void standard_ProcessUtility (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
 
void ProcessUtilityForAlterTable (Node *stmt, AlterTableUtilityContext *context)
 
bool UtilityReturnsTuples (Node *parsetree)
 
TupleDesc UtilityTupleDescriptor (Node *parsetree)
 
QueryUtilityContainsQuery (Node *parsetree)
 
static CommandTag AlterObjectTypeCommandTag (ObjectType objtype)
 
CommandTag CreateCommandTag (Node *parsetree)
 
LogStmtLevel GetCommandLogLevel (Node *parsetree)
 

Variables

ProcessUtility_hook_type ProcessUtility_hook = NULL
 

Function Documentation

◆ AlterObjectTypeCommandTag()

static CommandTag AlterObjectTypeCommandTag ( ObjectType  objtype)
static

Definition at line 2236 of file utility.c.

2237{
2238 CommandTag tag;
2239
2240 switch (objtype)
2241 {
2242 case OBJECT_AGGREGATE:
2244 break;
2245 case OBJECT_ATTRIBUTE:
2246 tag = CMDTAG_ALTER_TYPE;
2247 break;
2248 case OBJECT_CAST:
2249 tag = CMDTAG_ALTER_CAST;
2250 break;
2251 case OBJECT_COLLATION:
2253 break;
2254 case OBJECT_COLUMN:
2255 tag = CMDTAG_ALTER_TABLE;
2256 break;
2257 case OBJECT_CONVERSION:
2259 break;
2260 case OBJECT_DATABASE:
2262 break;
2263 case OBJECT_DOMAIN:
2265 tag = CMDTAG_ALTER_DOMAIN;
2266 break;
2267 case OBJECT_EXTENSION:
2269 break;
2270 case OBJECT_FDW:
2272 break;
2274 tag = CMDTAG_ALTER_SERVER;
2275 break;
2278 break;
2279 case OBJECT_FUNCTION:
2281 break;
2282 case OBJECT_INDEX:
2283 tag = CMDTAG_ALTER_INDEX;
2284 break;
2285 case OBJECT_LANGUAGE:
2287 break;
2288 case OBJECT_LARGEOBJECT:
2290 break;
2291 case OBJECT_OPCLASS:
2293 break;
2294 case OBJECT_OPERATOR:
2296 break;
2297 case OBJECT_OPFAMILY:
2299 break;
2300 case OBJECT_POLICY:
2301 tag = CMDTAG_ALTER_POLICY;
2302 break;
2303 case OBJECT_PROCEDURE:
2305 break;
2306 case OBJECT_PROPGRAPH:
2308 break;
2309 case OBJECT_ROLE:
2310 tag = CMDTAG_ALTER_ROLE;
2311 break;
2312 case OBJECT_ROUTINE:
2314 break;
2315 case OBJECT_RULE:
2316 tag = CMDTAG_ALTER_RULE;
2317 break;
2318 case OBJECT_SCHEMA:
2319 tag = CMDTAG_ALTER_SCHEMA;
2320 break;
2321 case OBJECT_SEQUENCE:
2323 break;
2324 case OBJECT_TABLE:
2326 tag = CMDTAG_ALTER_TABLE;
2327 break;
2328 case OBJECT_TABLESPACE:
2330 break;
2331 case OBJECT_TRIGGER:
2333 break;
2336 break;
2339 break;
2342 break;
2343 case OBJECT_TSPARSER:
2345 break;
2346 case OBJECT_TSTEMPLATE:
2348 break;
2349 case OBJECT_TYPE:
2350 tag = CMDTAG_ALTER_TYPE;
2351 break;
2352 case OBJECT_VIEW:
2353 tag = CMDTAG_ALTER_VIEW;
2354 break;
2355 case OBJECT_MATVIEW:
2357 break;
2358 case OBJECT_PUBLICATION:
2360 break;
2363 break;
2366 break;
2367 default:
2368 tag = CMDTAG_UNKNOWN;
2369 break;
2370 }
2371
2372 return tag;
2373}
CommandTag
Definition cmdtag.h:23
@ OBJECT_EVENT_TRIGGER
@ OBJECT_FDW
@ OBJECT_TSPARSER
@ OBJECT_COLLATION
@ OBJECT_PROPGRAPH
@ OBJECT_OPCLASS
@ OBJECT_AGGREGATE
@ OBJECT_MATVIEW
@ OBJECT_SCHEMA
@ OBJECT_POLICY
@ OBJECT_OPERATOR
@ OBJECT_FOREIGN_TABLE
@ OBJECT_TSCONFIGURATION
@ OBJECT_OPFAMILY
@ OBJECT_DOMAIN
@ OBJECT_COLUMN
@ OBJECT_TABLESPACE
@ OBJECT_ROLE
@ OBJECT_ROUTINE
@ OBJECT_LARGEOBJECT
@ OBJECT_PROCEDURE
@ OBJECT_EXTENSION
@ OBJECT_INDEX
@ OBJECT_DATABASE
@ OBJECT_SEQUENCE
@ OBJECT_TSTEMPLATE
@ OBJECT_LANGUAGE
@ OBJECT_FOREIGN_SERVER
@ OBJECT_TSDICTIONARY
@ OBJECT_ATTRIBUTE
@ OBJECT_PUBLICATION
@ OBJECT_RULE
@ OBJECT_CONVERSION
@ OBJECT_TABLE
@ OBJECT_VIEW
@ OBJECT_TYPE
@ OBJECT_FUNCTION
@ OBJECT_TABCONSTRAINT
@ OBJECT_DOMCONSTRAINT
@ OBJECT_SUBSCRIPTION
@ OBJECT_STATISTIC_EXT
@ OBJECT_CAST
@ OBJECT_TRIGGER
static int fb(int x)

References fb(), OBJECT_AGGREGATE, OBJECT_ATTRIBUTE, OBJECT_CAST, OBJECT_COLLATION, OBJECT_COLUMN, OBJECT_CONVERSION, OBJECT_DATABASE, OBJECT_DOMAIN, OBJECT_DOMCONSTRAINT, OBJECT_EVENT_TRIGGER, OBJECT_EXTENSION, OBJECT_FDW, OBJECT_FOREIGN_SERVER, OBJECT_FOREIGN_TABLE, OBJECT_FUNCTION, OBJECT_INDEX, OBJECT_LANGUAGE, OBJECT_LARGEOBJECT, OBJECT_MATVIEW, OBJECT_OPCLASS, OBJECT_OPERATOR, OBJECT_OPFAMILY, OBJECT_POLICY, OBJECT_PROCEDURE, OBJECT_PROPGRAPH, OBJECT_PUBLICATION, OBJECT_ROLE, OBJECT_ROUTINE, OBJECT_RULE, OBJECT_SCHEMA, OBJECT_SEQUENCE, OBJECT_STATISTIC_EXT, OBJECT_SUBSCRIPTION, OBJECT_TABCONSTRAINT, OBJECT_TABLE, OBJECT_TABLESPACE, OBJECT_TRIGGER, OBJECT_TSCONFIGURATION, OBJECT_TSDICTIONARY, OBJECT_TSPARSER, OBJECT_TSTEMPLATE, OBJECT_TYPE, and OBJECT_VIEW.

Referenced by CreateCommandTag().

◆ CheckRestrictedOperation()

static void CheckRestrictedOperation ( const char cmdname)
static

Definition at line 464 of file utility.c.

465{
469 /* translator: %s is name of a SQL command, eg PREPARE */
470 errmsg("cannot execute %s within security-restricted operation",
471 cmdname)));
472}
int errcode(int sqlerrcode)
Definition elog.c:875
#define ERROR
Definition elog.h:40
#define ereport(elevel,...)
Definition elog.h:152
bool InSecurityRestrictedOperation(void)
Definition miscinit.c:640
static char * errmsg

References ereport, errcode(), errmsg, ERROR, fb(), and InSecurityRestrictedOperation().

Referenced by standard_ProcessUtility().

◆ ClassifyUtilityCommandAsReadOnly()

static int ClassifyUtilityCommandAsReadOnly ( Node parsetree)
static

Definition at line 130 of file utility.c.

131{
132 switch (nodeTag(parsetree))
133 {
140 case T_AlterEnumStmt:
144 case T_AlterFdwStmt:
151 case T_AlterOwnerStmt:
156 case T_AlterRoleStmt:
157 case T_AlterSeqStmt:
158 case T_AlterStatsStmt:
164 case T_AlterTableStmt:
165 case T_AlterTypeStmt:
167 case T_CommentStmt:
169 case T_CreateAmStmt:
170 case T_CreateCastStmt:
173 case T_CreateEnumStmt:
176 case T_CreateFdwStmt:
187 case T_CreateRoleStmt:
189 case T_CreateSeqStmt:
191 case T_CreateStmt:
196 case T_CreateTrigStmt:
198 case T_CreatedbStmt:
199 case T_DefineStmt:
200 case T_DropOwnedStmt:
201 case T_DropRoleStmt:
202 case T_DropStmt:
206 case T_DropdbStmt:
207 case T_GrantRoleStmt:
208 case T_GrantStmt:
210 case T_IndexStmt:
213 case T_RenameStmt:
214 case T_RuleStmt:
215 case T_SecLabelStmt:
216 case T_TruncateStmt:
217 case T_ViewStmt:
218 {
219 /* DDL is not read-only, and neither is TRUNCATE. */
221 }
222
224 {
225 /*
226 * Surprisingly, ALTER SYSTEM meets all our definitions of
227 * read-only: it changes nothing that affects the output of
228 * pg_dump, it doesn't write WAL or imperil the application of
229 * future WAL, and it doesn't depend on any state that needs
230 * to be synchronized with parallel workers.
231 *
232 * So, despite the fact that it writes to a file, it's read
233 * only!
234 */
236 }
237
238 case T_CallStmt:
239 case T_DoStmt:
240 {
241 /*
242 * Commands inside the DO block or the called procedure might
243 * not be read only, but they'll be checked separately when we
244 * try to execute them. Here we only need to worry about the
245 * DO or CALL command itself.
246 */
248 }
249
250 case T_CheckPointStmt:
251 {
252 /*
253 * You might think that this should not be permitted in
254 * recovery, but we interpret a CHECKPOINT command during
255 * recovery as a request for a restartpoint instead. We allow
256 * this since it can be a useful way of reducing switchover
257 * time when using various forms of replication.
258 */
260 }
261
264 case T_DeallocateStmt:
266 case T_DiscardStmt:
267 case T_ExecuteStmt:
268 case T_FetchStmt:
269 case T_LoadStmt:
270 case T_PrepareStmt:
271 case T_UnlistenStmt:
273 case T_WaitStmt:
274 {
275 /*
276 * These modify only backend-local state, so they're OK to run
277 * in a read-only transaction or on a standby. However, they
278 * are disallowed in parallel mode, because they either rely
279 * upon or modify backend-local state that might not be
280 * synchronized among cooperating backends.
281 */
283 }
284
285 case T_ReindexStmt:
286 case T_VacuumStmt:
287 case T_RepackStmt:
288 {
289 /*
290 * These commands write WAL, so they're not strictly
291 * read-only, and running them in parallel workers isn't
292 * supported.
293 *
294 * However, they don't change the database state in a way that
295 * would affect pg_dump output, so it's fine to run them in a
296 * read-only transaction. (REPACK/CLUSTER might change the
297 * order of rows on disk, which could affect the ordering of
298 * pg_dump output, but that's not semantically significant.)
299 */
301 }
302
303 case T_CopyStmt:
304 {
305 CopyStmt *stmt = (CopyStmt *) parsetree;
306
307 /*
308 * You might think that COPY FROM is not at all read only, but
309 * it's OK to copy into a temporary table, because that
310 * wouldn't change the output of pg_dump. If the target table
311 * turns out to be non-temporary, DoCopy itself will call
312 * PreventCommandIfReadOnly.
313 */
314 if (stmt->is_from)
316 else
318 }
319
320 case T_ExplainStmt:
322 {
323 /*
324 * These commands don't modify any data and are safe to run in
325 * a parallel worker.
326 */
328 }
329
330 case T_ListenStmt:
331 case T_NotifyStmt:
332 {
333 /*
334 * NOTIFY requires an XID assignment, so it can't be permitted
335 * on a standby. Perhaps LISTEN could, since without NOTIFY it
336 * would be OK to just do nothing, at least until promotion,
337 * but we currently prohibit it lest the user get the wrong
338 * idea.
339 *
340 * (We do allow T_UnlistenStmt on a standby, though, because
341 * it's a no-op.)
342 */
344 }
345
346 case T_LockStmt:
347 {
348 LockStmt *stmt = (LockStmt *) parsetree;
349
350 /*
351 * Only weaker locker modes are allowed during recovery. The
352 * restrictions here must match those in
353 * LockAcquireExtended().
354 */
355 if (stmt->mode > RowExclusiveLock)
357 else
359 }
360
362 {
363 TransactionStmt *stmt = (TransactionStmt *) parsetree;
364
365 /*
366 * PREPARE, COMMIT PREPARED, and ROLLBACK PREPARED all write
367 * WAL, so they're not read-only in the strict sense; but the
368 * first and third do not change pg_dump output, so they're OK
369 * in a read-only transactions.
370 *
371 * We also consider COMMIT PREPARED to be OK in a read-only
372 * transaction environment, by way of exception.
373 */
374 switch (stmt->kind)
375 {
376 case TRANS_STMT_BEGIN:
377 case TRANS_STMT_START:
384
389 }
390 elog(ERROR, "unrecognized TransactionStmtKind: %d",
391 (int) stmt->kind);
392 return 0; /* silence stupider compilers */
393 }
394
395 default:
396 elog(ERROR, "unrecognized node type: %d",
397 (int) nodeTag(parsetree));
398 return 0; /* silence stupider compilers */
399 }
400}
#define elog(elevel,...)
Definition elog.h:228
#define stmt
#define RowExclusiveLock
Definition lockdefs.h:38
#define nodeTag(nodeptr)
Definition nodes.h:139
@ TRANS_STMT_ROLLBACK_TO
@ TRANS_STMT_START
@ TRANS_STMT_SAVEPOINT
@ TRANS_STMT_BEGIN
@ TRANS_STMT_ROLLBACK
@ TRANS_STMT_COMMIT_PREPARED
@ TRANS_STMT_COMMIT
@ TRANS_STMT_ROLLBACK_PREPARED
@ TRANS_STMT_PREPARE
@ TRANS_STMT_RELEASE
#define COMMAND_OK_IN_RECOVERY
Definition utility.h:58
#define COMMAND_IS_STRICTLY_READ_ONLY
Definition utility.h:65
#define COMMAND_IS_NOT_READ_ONLY
Definition utility.h:68
#define COMMAND_OK_IN_READ_ONLY_TXN
Definition utility.h:56

References COMMAND_IS_NOT_READ_ONLY, COMMAND_IS_STRICTLY_READ_ONLY, COMMAND_OK_IN_READ_ONLY_TXN, COMMAND_OK_IN_RECOVERY, elog, ERROR, fb(), nodeTag, RowExclusiveLock, stmt, TRANS_STMT_BEGIN, TRANS_STMT_COMMIT, TRANS_STMT_COMMIT_PREPARED, TRANS_STMT_PREPARE, TRANS_STMT_RELEASE, TRANS_STMT_ROLLBACK, TRANS_STMT_ROLLBACK_PREPARED, TRANS_STMT_ROLLBACK_TO, TRANS_STMT_SAVEPOINT, and TRANS_STMT_START.

Referenced by standard_ProcessUtility().

◆ CommandIsReadOnly()

bool CommandIsReadOnly ( PlannedStmt pstmt)

Definition at line 96 of file utility.c.

97{
98 Assert(IsA(pstmt, PlannedStmt));
99 switch (pstmt->commandType)
100 {
101 case CMD_SELECT:
102 if (pstmt->rowMarks != NIL)
103 return false; /* SELECT FOR [KEY] UPDATE/SHARE */
104 else if (pstmt->hasModifyingCTE)
105 return false; /* data-modifying CTE */
106 else
107 return true;
108 case CMD_UPDATE:
109 case CMD_INSERT:
110 case CMD_DELETE:
111 case CMD_MERGE:
112 return false;
113 case CMD_UTILITY:
114 /* For now, treat all utility commands as read/write */
115 return false;
116 default:
117 elog(WARNING, "unrecognized commandType: %d",
118 (int) pstmt->commandType);
119 break;
120 }
121 return false;
122}
#define Assert(condition)
Definition c.h:943
#define WARNING
Definition elog.h:37
#define IsA(nodeptr, _type_)
Definition nodes.h:164
@ CMD_MERGE
Definition nodes.h:279
@ CMD_UTILITY
Definition nodes.h:280
@ CMD_INSERT
Definition nodes.h:277
@ CMD_DELETE
Definition nodes.h:278
@ CMD_UPDATE
Definition nodes.h:276
@ CMD_SELECT
Definition nodes.h:275
#define NIL
Definition pg_list.h:68
bool hasModifyingCTE
Definition plannodes.h:81
List * rowMarks
Definition plannodes.h:138
CmdType commandType
Definition plannodes.h:66

References Assert, CMD_DELETE, CMD_INSERT, CMD_MERGE, CMD_SELECT, CMD_UPDATE, CMD_UTILITY, PlannedStmt::commandType, elog, PlannedStmt::hasModifyingCTE, IsA, NIL, PlannedStmt::rowMarks, and WARNING.

Referenced by _SPI_execute_plan(), init_execution_state(), and SPI_cursor_open_internal().

◆ CreateCommandTag()

CommandTag CreateCommandTag ( Node parsetree)

Definition at line 2385 of file utility.c.

2386{
2387 CommandTag tag;
2388
2389 switch (nodeTag(parsetree))
2390 {
2391 /* recurse if we're given a RawStmt */
2392 case T_RawStmt:
2393 tag = CreateCommandTag(((RawStmt *) parsetree)->stmt);
2394 break;
2395
2396 /* raw plannable queries */
2397 case T_InsertStmt:
2398 tag = CMDTAG_INSERT;
2399 break;
2400
2401 case T_DeleteStmt:
2402 tag = CMDTAG_DELETE;
2403 break;
2404
2405 case T_UpdateStmt:
2406 tag = CMDTAG_UPDATE;
2407 break;
2408
2409 case T_MergeStmt:
2410 tag = CMDTAG_MERGE;
2411 break;
2412
2413 case T_SelectStmt:
2414 tag = CMDTAG_SELECT;
2415 break;
2416
2417 case T_PLAssignStmt:
2418 tag = CMDTAG_SELECT;
2419 break;
2420
2421 /* utility statements --- same whether raw or cooked */
2422 case T_TransactionStmt:
2423 {
2424 TransactionStmt *stmt = (TransactionStmt *) parsetree;
2425
2426 switch (stmt->kind)
2427 {
2428 case TRANS_STMT_BEGIN:
2429 tag = CMDTAG_BEGIN;
2430 break;
2431
2432 case TRANS_STMT_START:
2434 break;
2435
2436 case TRANS_STMT_COMMIT:
2437 tag = CMDTAG_COMMIT;
2438 break;
2439
2442 tag = CMDTAG_ROLLBACK;
2443 break;
2444
2446 tag = CMDTAG_SAVEPOINT;
2447 break;
2448
2449 case TRANS_STMT_RELEASE:
2450 tag = CMDTAG_RELEASE;
2451 break;
2452
2453 case TRANS_STMT_PREPARE:
2455 break;
2456
2459 break;
2460
2463 break;
2464
2465 default:
2466 tag = CMDTAG_UNKNOWN;
2467 break;
2468 }
2469 }
2470 break;
2471
2474 break;
2475
2476 case T_ClosePortalStmt:
2477 {
2478 ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
2479
2480 if (stmt->portalname == NULL)
2482 else
2483 tag = CMDTAG_CLOSE_CURSOR;
2484 }
2485 break;
2486
2487 case T_FetchStmt:
2488 {
2489 FetchStmt *stmt = (FetchStmt *) parsetree;
2490
2491 tag = (stmt->ismove) ? CMDTAG_MOVE : CMDTAG_FETCH;
2492 }
2493 break;
2494
2495 case T_CreateDomainStmt:
2497 break;
2498
2499 case T_CreateSchemaStmt:
2501 break;
2502
2503 case T_CreateStmt:
2504 tag = CMDTAG_CREATE_TABLE;
2505 break;
2506
2509 break;
2510
2513 break;
2514
2517 break;
2518
2521 break;
2522
2525 break;
2526
2529 break;
2530
2531 case T_CreateFdwStmt:
2533 break;
2534
2535 case T_AlterFdwStmt:
2537 break;
2538
2541 break;
2542
2544 tag = CMDTAG_ALTER_SERVER;
2545 break;
2546
2549 break;
2550
2553 break;
2554
2557 break;
2558
2561 break;
2562
2565 break;
2566
2567 case T_DropStmt:
2568 switch (((DropStmt *) parsetree)->removeType)
2569 {
2570 case OBJECT_TABLE:
2571 tag = CMDTAG_DROP_TABLE;
2572 break;
2573 case OBJECT_SEQUENCE:
2575 break;
2576 case OBJECT_VIEW:
2577 tag = CMDTAG_DROP_VIEW;
2578 break;
2579 case OBJECT_MATVIEW:
2581 break;
2582 case OBJECT_INDEX:
2583 tag = CMDTAG_DROP_INDEX;
2584 break;
2585 case OBJECT_PROPGRAPH:
2587 break;
2588 case OBJECT_TYPE:
2589 tag = CMDTAG_DROP_TYPE;
2590 break;
2591 case OBJECT_DOMAIN:
2592 tag = CMDTAG_DROP_DOMAIN;
2593 break;
2594 case OBJECT_COLLATION:
2596 break;
2597 case OBJECT_CONVERSION:
2599 break;
2600 case OBJECT_SCHEMA:
2601 tag = CMDTAG_DROP_SCHEMA;
2602 break;
2603 case OBJECT_TSPARSER:
2605 break;
2608 break;
2609 case OBJECT_TSTEMPLATE:
2611 break;
2614 break;
2617 break;
2618 case OBJECT_EXTENSION:
2620 break;
2621 case OBJECT_FUNCTION:
2623 break;
2624 case OBJECT_PROCEDURE:
2626 break;
2627 case OBJECT_ROUTINE:
2628 tag = CMDTAG_DROP_ROUTINE;
2629 break;
2630 case OBJECT_AGGREGATE:
2632 break;
2633 case OBJECT_OPERATOR:
2635 break;
2636 case OBJECT_LANGUAGE:
2638 break;
2639 case OBJECT_CAST:
2640 tag = CMDTAG_DROP_CAST;
2641 break;
2642 case OBJECT_TRIGGER:
2643 tag = CMDTAG_DROP_TRIGGER;
2644 break;
2647 break;
2648 case OBJECT_RULE:
2649 tag = CMDTAG_DROP_RULE;
2650 break;
2651 case OBJECT_FDW:
2653 break;
2655 tag = CMDTAG_DROP_SERVER;
2656 break;
2657 case OBJECT_OPCLASS:
2659 break;
2660 case OBJECT_OPFAMILY:
2662 break;
2663 case OBJECT_POLICY:
2664 tag = CMDTAG_DROP_POLICY;
2665 break;
2666 case OBJECT_TRANSFORM:
2668 break;
2671 break;
2672 case OBJECT_PUBLICATION:
2674 break;
2677 break;
2678 default:
2679 tag = CMDTAG_UNKNOWN;
2680 }
2681 break;
2682
2683 case T_TruncateStmt:
2685 break;
2686
2687 case T_CommentStmt:
2688 tag = CMDTAG_COMMENT;
2689 break;
2690
2691 case T_SecLabelStmt:
2693 break;
2694
2695 case T_CopyStmt:
2696 tag = CMDTAG_COPY;
2697 break;
2698
2699 case T_RenameStmt:
2700
2701 /*
2702 * When the column is renamed, the command tag is created from its
2703 * relation type
2704 */
2705 tag = AlterObjectTypeCommandTag(((RenameStmt *) parsetree)->renameType == OBJECT_COLUMN ?
2706 ((RenameStmt *) parsetree)->relationType :
2707 ((RenameStmt *) parsetree)->renameType);
2708 break;
2709
2711 tag = AlterObjectTypeCommandTag(((AlterObjectDependsStmt *) parsetree)->objectType);
2712 break;
2713
2715 tag = AlterObjectTypeCommandTag(((AlterObjectSchemaStmt *) parsetree)->objectType);
2716 break;
2717
2718 case T_AlterOwnerStmt:
2719 tag = AlterObjectTypeCommandTag(((AlterOwnerStmt *) parsetree)->objectType);
2720 break;
2721
2723 tag = AlterObjectTypeCommandTag(((AlterTableMoveAllStmt *) parsetree)->objtype);
2724 break;
2725
2726 case T_AlterTableStmt:
2727 tag = AlterObjectTypeCommandTag(((AlterTableStmt *) parsetree)->objtype);
2728 break;
2729
2730 case T_AlterDomainStmt:
2731 tag = CMDTAG_ALTER_DOMAIN;
2732 break;
2733
2735 switch (((AlterFunctionStmt *) parsetree)->objtype)
2736 {
2737 case OBJECT_FUNCTION:
2739 break;
2740 case OBJECT_PROCEDURE:
2742 break;
2743 case OBJECT_ROUTINE:
2745 break;
2746 default:
2747 tag = CMDTAG_UNKNOWN;
2748 }
2749 break;
2750
2751 case T_GrantStmt:
2752 {
2753 GrantStmt *stmt = (GrantStmt *) parsetree;
2754
2755 tag = (stmt->is_grant) ? CMDTAG_GRANT : CMDTAG_REVOKE;
2756 }
2757 break;
2758
2759 case T_GrantRoleStmt:
2760 {
2761 GrantRoleStmt *stmt = (GrantRoleStmt *) parsetree;
2762
2763 tag = (stmt->is_grant) ? CMDTAG_GRANT_ROLE : CMDTAG_REVOKE_ROLE;
2764 }
2765 break;
2766
2769 break;
2770
2771 case T_DefineStmt:
2772 switch (((DefineStmt *) parsetree)->kind)
2773 {
2774 case OBJECT_AGGREGATE:
2776 break;
2777 case OBJECT_OPERATOR:
2779 break;
2780 case OBJECT_TYPE:
2781 tag = CMDTAG_CREATE_TYPE;
2782 break;
2783 case OBJECT_TSPARSER:
2785 break;
2788 break;
2789 case OBJECT_TSTEMPLATE:
2791 break;
2794 break;
2795 case OBJECT_COLLATION:
2797 break;
2800 break;
2801 default:
2802 tag = CMDTAG_UNKNOWN;
2803 }
2804 break;
2805
2807 tag = CMDTAG_CREATE_TYPE;
2808 break;
2809
2810 case T_CreateEnumStmt:
2811 tag = CMDTAG_CREATE_TYPE;
2812 break;
2813
2814 case T_CreateRangeStmt:
2815 tag = CMDTAG_CREATE_TYPE;
2816 break;
2817
2818 case T_AlterEnumStmt:
2819 tag = CMDTAG_ALTER_TYPE;
2820 break;
2821
2822 case T_ViewStmt:
2823 tag = CMDTAG_CREATE_VIEW;
2824 break;
2825
2827 if (((CreateFunctionStmt *) parsetree)->is_procedure)
2829 else
2831 break;
2832
2833 case T_IndexStmt:
2834 tag = CMDTAG_CREATE_INDEX;
2835 break;
2836
2837 case T_RuleStmt:
2838 tag = CMDTAG_CREATE_RULE;
2839 break;
2840
2841 case T_CreateSeqStmt:
2843 break;
2844
2845 case T_AlterSeqStmt:
2847 break;
2848
2849 case T_DoStmt:
2850 tag = CMDTAG_DO;
2851 break;
2852
2853 case T_CreatedbStmt:
2855 break;
2856
2861 break;
2862
2863 case T_DropdbStmt:
2865 break;
2866
2867 case T_NotifyStmt:
2868 tag = CMDTAG_NOTIFY;
2869 break;
2870
2871 case T_ListenStmt:
2872 tag = CMDTAG_LISTEN;
2873 break;
2874
2875 case T_UnlistenStmt:
2876 tag = CMDTAG_UNLISTEN;
2877 break;
2878
2879 case T_LoadStmt:
2880 tag = CMDTAG_LOAD;
2881 break;
2882
2883 case T_CallStmt:
2884 tag = CMDTAG_CALL;
2885 break;
2886
2887 case T_VacuumStmt:
2888 if (((VacuumStmt *) parsetree)->is_vacuumcmd)
2889 tag = CMDTAG_VACUUM;
2890 else
2891 tag = CMDTAG_ANALYZE;
2892 break;
2893
2894 case T_RepackStmt:
2895 if (((RepackStmt *) parsetree)->command == REPACK_COMMAND_CLUSTER)
2896 tag = CMDTAG_CLUSTER;
2897 else
2898 tag = CMDTAG_REPACK;
2899 break;
2900
2901 case T_ExplainStmt:
2902 tag = CMDTAG_EXPLAIN;
2903 break;
2904
2906 switch (((CreateTableAsStmt *) parsetree)->objtype)
2907 {
2908 case OBJECT_TABLE:
2909 if (((CreateTableAsStmt *) parsetree)->is_select_into)
2910 tag = CMDTAG_SELECT_INTO;
2911 else
2913 break;
2914 case OBJECT_MATVIEW:
2916 break;
2917 default:
2918 tag = CMDTAG_UNKNOWN;
2919 }
2920 break;
2921
2924 break;
2925
2926 case T_AlterSystemStmt:
2927 tag = CMDTAG_ALTER_SYSTEM;
2928 break;
2929
2930 case T_VariableSetStmt:
2931 switch (((VariableSetStmt *) parsetree)->kind)
2932 {
2933 case VAR_SET_VALUE:
2934 case VAR_SET_CURRENT:
2935 case VAR_SET_DEFAULT:
2936 case VAR_SET_MULTI:
2937 tag = CMDTAG_SET;
2938 break;
2939 case VAR_RESET:
2940 case VAR_RESET_ALL:
2941 tag = CMDTAG_RESET;
2942 break;
2943 default:
2944 tag = CMDTAG_UNKNOWN;
2945 }
2946 break;
2947
2948 case T_VariableShowStmt:
2949 tag = CMDTAG_SHOW;
2950 break;
2951
2952 case T_DiscardStmt:
2953 switch (((DiscardStmt *) parsetree)->target)
2954 {
2955 case DISCARD_ALL:
2956 tag = CMDTAG_DISCARD_ALL;
2957 break;
2958 case DISCARD_PLANS:
2960 break;
2961 case DISCARD_TEMP:
2962 tag = CMDTAG_DISCARD_TEMP;
2963 break;
2964 case DISCARD_SEQUENCES:
2966 break;
2967 default:
2968 tag = CMDTAG_UNKNOWN;
2969 }
2970 break;
2971
2974 break;
2975
2978 break;
2979
2982 break;
2983
2984 case T_CreateTrigStmt:
2986 break;
2987
2990 break;
2991
2994 break;
2995
2996 case T_CreatePLangStmt:
2998 break;
2999
3000 case T_CreateRoleStmt:
3001 tag = CMDTAG_CREATE_ROLE;
3002 break;
3003
3004 case T_AlterRoleStmt:
3005 tag = CMDTAG_ALTER_ROLE;
3006 break;
3007
3008 case T_AlterRoleSetStmt:
3009 tag = CMDTAG_ALTER_ROLE;
3010 break;
3011
3012 case T_DropRoleStmt:
3013 tag = CMDTAG_DROP_ROLE;
3014 break;
3015
3016 case T_DropOwnedStmt:
3017 tag = CMDTAG_DROP_OWNED;
3018 break;
3019
3022 break;
3023
3024 case T_LockStmt:
3025 tag = CMDTAG_LOCK_TABLE;
3026 break;
3027
3030 break;
3031
3032 case T_CheckPointStmt:
3033 tag = CMDTAG_CHECKPOINT;
3034 break;
3035
3036 case T_ReindexStmt:
3037 tag = CMDTAG_REINDEX;
3038 break;
3039
3042 break;
3043
3044 case T_CreateCastStmt:
3045 tag = CMDTAG_CREATE_CAST;
3046 break;
3047
3050 break;
3051
3054 break;
3055
3058 break;
3059
3062 break;
3063
3064 case T_AlterTypeStmt:
3065 tag = CMDTAG_ALTER_TYPE;
3066 break;
3067
3070 break;
3071
3074 break;
3075
3076 case T_CreatePolicyStmt:
3078 break;
3079
3080 case T_AlterPolicyStmt:
3081 tag = CMDTAG_ALTER_POLICY;
3082 break;
3083
3084 case T_CreateAmStmt:
3086 break;
3087
3090 break;
3091
3094 break;
3095
3098 break;
3099
3102 break;
3103
3106 break;
3107
3110 break;
3111
3112 case T_PrepareStmt:
3113 tag = CMDTAG_PREPARE;
3114 break;
3115
3116 case T_ExecuteStmt:
3117 tag = CMDTAG_EXECUTE;
3118 break;
3119
3120 case T_CreateStatsStmt:
3122 break;
3123
3124 case T_AlterStatsStmt:
3126 break;
3127
3128 case T_DeallocateStmt:
3129 {
3130 DeallocateStmt *stmt = (DeallocateStmt *) parsetree;
3131
3132 if (stmt->name == NULL)
3134 else
3135 tag = CMDTAG_DEALLOCATE;
3136 }
3137 break;
3138
3139 case T_WaitStmt:
3140 tag = CMDTAG_WAIT;
3141 break;
3142
3143 /* already-planned queries */
3144 case T_PlannedStmt:
3145 {
3146 PlannedStmt *stmt = (PlannedStmt *) parsetree;
3147
3148 switch (stmt->commandType)
3149 {
3150 case CMD_SELECT:
3151
3152 /*
3153 * We take a little extra care here so that the result
3154 * will be useful for complaints about read-only
3155 * statements
3156 */
3157 if (stmt->rowMarks != NIL)
3158 {
3159 /* not 100% but probably close enough */
3160 switch (((PlanRowMark *) linitial(stmt->rowMarks))->strength)
3161 {
3162 case LCS_FORKEYSHARE:
3164 break;
3165 case LCS_FORSHARE:
3167 break;
3168 case LCS_FORNOKEYUPDATE:
3170 break;
3171 case LCS_FORUPDATE:
3173 break;
3174 default:
3175 tag = CMDTAG_SELECT;
3176 break;
3177 }
3178 }
3179 else
3180 tag = CMDTAG_SELECT;
3181 break;
3182 case CMD_UPDATE:
3183 tag = CMDTAG_UPDATE;
3184 break;
3185 case CMD_INSERT:
3186 tag = CMDTAG_INSERT;
3187 break;
3188 case CMD_DELETE:
3189 tag = CMDTAG_DELETE;
3190 break;
3191 case CMD_MERGE:
3192 tag = CMDTAG_MERGE;
3193 break;
3194 case CMD_UTILITY:
3195 tag = CreateCommandTag(stmt->utilityStmt);
3196 break;
3197 default:
3198 elog(WARNING, "unrecognized commandType: %d",
3199 (int) stmt->commandType);
3200 tag = CMDTAG_UNKNOWN;
3201 break;
3202 }
3203 }
3204 break;
3205
3206 /* parsed-and-rewritten-but-not-planned queries */
3207 case T_Query:
3208 {
3209 Query *stmt = (Query *) parsetree;
3210
3211 switch (stmt->commandType)
3212 {
3213 case CMD_SELECT:
3214
3215 /*
3216 * We take a little extra care here so that the result
3217 * will be useful for complaints about read-only
3218 * statements
3219 */
3220 if (stmt->rowMarks != NIL)
3221 {
3222 /* not 100% but probably close enough */
3223 switch (((RowMarkClause *) linitial(stmt->rowMarks))->strength)
3224 {
3225 case LCS_FORKEYSHARE:
3227 break;
3228 case LCS_FORSHARE:
3230 break;
3231 case LCS_FORNOKEYUPDATE:
3233 break;
3234 case LCS_FORUPDATE:
3236 break;
3237 default:
3238 tag = CMDTAG_UNKNOWN;
3239 break;
3240 }
3241 }
3242 else
3243 tag = CMDTAG_SELECT;
3244 break;
3245 case CMD_UPDATE:
3246 tag = CMDTAG_UPDATE;
3247 break;
3248 case CMD_INSERT:
3249 tag = CMDTAG_INSERT;
3250 break;
3251 case CMD_DELETE:
3252 tag = CMDTAG_DELETE;
3253 break;
3254 case CMD_MERGE:
3255 tag = CMDTAG_MERGE;
3256 break;
3257 case CMD_UTILITY:
3258 tag = CreateCommandTag(stmt->utilityStmt);
3259 break;
3260 default:
3261 elog(WARNING, "unrecognized commandType: %d",
3262 (int) stmt->commandType);
3263 tag = CMDTAG_UNKNOWN;
3264 break;
3265 }
3266 }
3267 break;
3268
3269 default:
3270 elog(WARNING, "unrecognized node type: %d",
3271 (int) nodeTag(parsetree));
3272 tag = CMDTAG_UNKNOWN;
3273 break;
3274 }
3275
3276 return tag;
3277}
@ LCS_FORUPDATE
Definition lockoptions.h:28
@ LCS_FORSHARE
Definition lockoptions.h:26
@ LCS_FORKEYSHARE
Definition lockoptions.h:25
@ LCS_FORNOKEYUPDATE
Definition lockoptions.h:27
@ REPACK_COMMAND_CLUSTER
@ VAR_SET_DEFAULT
@ VAR_RESET
@ VAR_SET_MULTI
@ VAR_SET_VALUE
@ VAR_SET_CURRENT
@ VAR_RESET_ALL
@ OBJECT_ACCESS_METHOD
@ OBJECT_TRANSFORM
@ DISCARD_ALL
@ DISCARD_PLANS
@ DISCARD_SEQUENCES
@ DISCARD_TEMP
#define linitial(l)
Definition pg_list.h:178
CommandTag CreateCommandTag(Node *parsetree)
Definition utility.c:2385
static CommandTag AlterObjectTypeCommandTag(ObjectType objtype)
Definition utility.c:2236

References AlterObjectTypeCommandTag(), CMD_DELETE, CMD_INSERT, CMD_MERGE, CMD_SELECT, CMD_UPDATE, CMD_UTILITY, CreateCommandTag(), DISCARD_ALL, DISCARD_PLANS, DISCARD_SEQUENCES, DISCARD_TEMP, elog, fb(), LCS_FORKEYSHARE, LCS_FORNOKEYUPDATE, LCS_FORSHARE, LCS_FORUPDATE, linitial, NIL, nodeTag, OBJECT_ACCESS_METHOD, OBJECT_AGGREGATE, OBJECT_CAST, OBJECT_COLLATION, OBJECT_COLUMN, OBJECT_CONVERSION, OBJECT_DOMAIN, OBJECT_EVENT_TRIGGER, OBJECT_EXTENSION, OBJECT_FDW, OBJECT_FOREIGN_SERVER, OBJECT_FOREIGN_TABLE, OBJECT_FUNCTION, OBJECT_INDEX, OBJECT_LANGUAGE, OBJECT_MATVIEW, OBJECT_OPCLASS, OBJECT_OPERATOR, OBJECT_OPFAMILY, OBJECT_POLICY, OBJECT_PROCEDURE, OBJECT_PROPGRAPH, OBJECT_PUBLICATION, OBJECT_ROUTINE, OBJECT_RULE, OBJECT_SCHEMA, OBJECT_SEQUENCE, OBJECT_STATISTIC_EXT, OBJECT_TABLE, OBJECT_TRANSFORM, OBJECT_TRIGGER, OBJECT_TSCONFIGURATION, OBJECT_TSDICTIONARY, OBJECT_TSPARSER, OBJECT_TSTEMPLATE, OBJECT_TYPE, OBJECT_VIEW, REPACK_COMMAND_CLUSTER, stmt, TRANS_STMT_BEGIN, TRANS_STMT_COMMIT, TRANS_STMT_COMMIT_PREPARED, TRANS_STMT_PREPARE, TRANS_STMT_RELEASE, TRANS_STMT_ROLLBACK, TRANS_STMT_ROLLBACK_PREPARED, TRANS_STMT_ROLLBACK_TO, TRANS_STMT_SAVEPOINT, TRANS_STMT_START, VAR_RESET, VAR_RESET_ALL, VAR_SET_CURRENT, VAR_SET_DEFAULT, VAR_SET_MULTI, VAR_SET_VALUE, and WARNING.

Referenced by _SPI_prepare_oneshot_plan(), _SPI_prepare_plan(), CreateCommandName(), CreateCommandTag(), EventTriggerGetTag(), exec_parse_message(), exec_simple_query(), interpret_AS_clause(), prepare_next_query(), PrepareQuery(), REGRESS_utility_command(), and standard_ProcessUtility().

◆ ExecDropStmt()

static void ExecDropStmt ( DropStmt stmt,
bool  isTopLevel 
)
static

Definition at line 2008 of file utility.c.

2009{
2010 switch (stmt->removeType)
2011 {
2012 case OBJECT_INDEX:
2013 if (stmt->concurrent)
2015 "DROP INDEX CONCURRENTLY");
2017
2018 case OBJECT_TABLE:
2019 case OBJECT_SEQUENCE:
2020 case OBJECT_VIEW:
2021 case OBJECT_MATVIEW:
2023 case OBJECT_PROPGRAPH:
2025 break;
2026 default:
2028 break;
2029 }
2030}
#define pg_fallthrough
Definition c.h:161
void RemoveObjects(DropStmt *stmt)
Definition dropcmds.c:53
void RemoveRelations(DropStmt *drop)
Definition tablecmds.c:1563
void PreventInTransactionBlock(bool isTopLevel, const char *stmtType)
Definition xact.c:3698

References fb(), OBJECT_FOREIGN_TABLE, OBJECT_INDEX, OBJECT_MATVIEW, OBJECT_PROPGRAPH, OBJECT_SEQUENCE, OBJECT_TABLE, OBJECT_VIEW, pg_fallthrough, PreventInTransactionBlock(), RemoveObjects(), RemoveRelations(), and stmt.

Referenced by ProcessUtilitySlow(), and standard_ProcessUtility().

◆ GetCommandLogLevel()

LogStmtLevel GetCommandLogLevel ( Node parsetree)

Definition at line 3290 of file utility.c.

3291{
3293
3294 switch (nodeTag(parsetree))
3295 {
3296 /* recurse if we're given a RawStmt */
3297 case T_RawStmt:
3298 lev = GetCommandLogLevel(((RawStmt *) parsetree)->stmt);
3299 break;
3300
3301 /* raw plannable queries */
3302 case T_InsertStmt:
3303 case T_DeleteStmt:
3304 case T_UpdateStmt:
3305 case T_MergeStmt:
3306 lev = LOGSTMT_MOD;
3307 break;
3308
3309 case T_SelectStmt:
3310 if (((SelectStmt *) parsetree)->intoClause)
3311 lev = LOGSTMT_DDL; /* SELECT INTO */
3312 else
3313 lev = LOGSTMT_ALL;
3314 break;
3315
3316 case T_PLAssignStmt:
3317 lev = LOGSTMT_ALL;
3318 break;
3319
3320 /* utility statements --- same whether raw or cooked */
3321 case T_TransactionStmt:
3322 lev = LOGSTMT_ALL;
3323 break;
3324
3326 lev = LOGSTMT_ALL;
3327 break;
3328
3329 case T_ClosePortalStmt:
3330 lev = LOGSTMT_ALL;
3331 break;
3332
3333 case T_FetchStmt:
3334 lev = LOGSTMT_ALL;
3335 break;
3336
3337 case T_CreateSchemaStmt:
3338 lev = LOGSTMT_DDL;
3339 break;
3340
3341 case T_CreateStmt:
3343 lev = LOGSTMT_DDL;
3344 break;
3345
3349 lev = LOGSTMT_DDL;
3350 break;
3351
3355 lev = LOGSTMT_DDL;
3356 break;
3357
3358 case T_CreateFdwStmt:
3359 case T_AlterFdwStmt:
3366 lev = LOGSTMT_DDL;
3367 break;
3368
3369 case T_DropStmt:
3370 lev = LOGSTMT_DDL;
3371 break;
3372
3373 case T_TruncateStmt:
3374 lev = LOGSTMT_MOD;
3375 break;
3376
3377 case T_CommentStmt:
3378 lev = LOGSTMT_DDL;
3379 break;
3380
3381 case T_SecLabelStmt:
3382 lev = LOGSTMT_DDL;
3383 break;
3384
3385 case T_CopyStmt:
3386 if (((CopyStmt *) parsetree)->is_from)
3387 lev = LOGSTMT_MOD;
3388 else
3389 lev = LOGSTMT_ALL;
3390 break;
3391
3392 case T_PrepareStmt:
3393 {
3394 PrepareStmt *stmt = (PrepareStmt *) parsetree;
3395
3396 /* Look through a PREPARE to the contained stmt */
3397 lev = GetCommandLogLevel(stmt->query);
3398 }
3399 break;
3400
3401 case T_ExecuteStmt:
3402 {
3403 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
3405
3406 /* Look through an EXECUTE to the referenced stmt */
3407 ps = FetchPreparedStatement(stmt->name, false);
3408 if (ps && ps->plansource->raw_parse_tree)
3409 lev = GetCommandLogLevel(ps->plansource->raw_parse_tree->stmt);
3410 else
3411 lev = LOGSTMT_ALL;
3412 }
3413 break;
3414
3415 case T_DeallocateStmt:
3416 lev = LOGSTMT_ALL;
3417 break;
3418
3419 case T_RenameStmt:
3420 lev = LOGSTMT_DDL;
3421 break;
3422
3424 lev = LOGSTMT_DDL;
3425 break;
3426
3428 lev = LOGSTMT_DDL;
3429 break;
3430
3431 case T_AlterOwnerStmt:
3432 lev = LOGSTMT_DDL;
3433 break;
3434
3436 lev = LOGSTMT_DDL;
3437 break;
3438
3439 case T_AlterTypeStmt:
3440 lev = LOGSTMT_DDL;
3441 break;
3442
3444 case T_AlterTableStmt:
3445 lev = LOGSTMT_DDL;
3446 break;
3447
3448 case T_AlterDomainStmt:
3449 lev = LOGSTMT_DDL;
3450 break;
3451
3452 case T_GrantStmt:
3453 lev = LOGSTMT_DDL;
3454 break;
3455
3456 case T_GrantRoleStmt:
3457 lev = LOGSTMT_DDL;
3458 break;
3459
3461 lev = LOGSTMT_DDL;
3462 break;
3463
3464 case T_DefineStmt:
3465 lev = LOGSTMT_DDL;
3466 break;
3467
3469 lev = LOGSTMT_DDL;
3470 break;
3471
3472 case T_CreateEnumStmt:
3473 lev = LOGSTMT_DDL;
3474 break;
3475
3476 case T_CreateRangeStmt:
3477 lev = LOGSTMT_DDL;
3478 break;
3479
3480 case T_AlterEnumStmt:
3481 lev = LOGSTMT_DDL;
3482 break;
3483
3484 case T_ViewStmt:
3485 lev = LOGSTMT_DDL;
3486 break;
3487
3489 lev = LOGSTMT_DDL;
3490 break;
3491
3493 lev = LOGSTMT_DDL;
3494 break;
3495
3496 case T_IndexStmt:
3497 lev = LOGSTMT_DDL;
3498 break;
3499
3500 case T_RuleStmt:
3501 lev = LOGSTMT_DDL;
3502 break;
3503
3504 case T_CreateSeqStmt:
3505 lev = LOGSTMT_DDL;
3506 break;
3507
3508 case T_AlterSeqStmt:
3509 lev = LOGSTMT_DDL;
3510 break;
3511
3512 case T_DoStmt:
3513 lev = LOGSTMT_ALL;
3514 break;
3515
3516 case T_CreatedbStmt:
3517 lev = LOGSTMT_DDL;
3518 break;
3519
3523 lev = LOGSTMT_DDL;
3524 break;
3525
3526 case T_DropdbStmt:
3527 lev = LOGSTMT_DDL;
3528 break;
3529
3530 case T_NotifyStmt:
3531 lev = LOGSTMT_ALL;
3532 break;
3533
3534 case T_ListenStmt:
3535 lev = LOGSTMT_ALL;
3536 break;
3537
3538 case T_UnlistenStmt:
3539 lev = LOGSTMT_ALL;
3540 break;
3541
3542 case T_LoadStmt:
3543 lev = LOGSTMT_ALL;
3544 break;
3545
3546 case T_CallStmt:
3547 lev = LOGSTMT_ALL;
3548 break;
3549
3550 case T_RepackStmt:
3551 lev = LOGSTMT_DDL;
3552 break;
3553
3554 case T_VacuumStmt:
3555 lev = LOGSTMT_ALL;
3556 break;
3557
3558 case T_ExplainStmt:
3559 {
3560 ExplainStmt *stmt = (ExplainStmt *) parsetree;
3561 bool analyze = false;
3562 ListCell *lc;
3563
3564 /* Look through an EXPLAIN ANALYZE to the contained stmt */
3565 foreach(lc, stmt->options)
3566 {
3567 DefElem *opt = (DefElem *) lfirst(lc);
3568
3569 if (strcmp(opt->defname, "analyze") == 0)
3570 analyze = defGetBoolean(opt);
3571 /* don't "break", as explain.c will use the last value */
3572 }
3573 if (analyze)
3574 return GetCommandLogLevel(stmt->query);
3575
3576 /* Plain EXPLAIN isn't so interesting */
3577 lev = LOGSTMT_ALL;
3578 }
3579 break;
3580
3582 lev = LOGSTMT_DDL;
3583 break;
3584
3586 lev = LOGSTMT_DDL;
3587 break;
3588
3589 case T_AlterSystemStmt:
3590 lev = LOGSTMT_DDL;
3591 break;
3592
3593 case T_VariableSetStmt:
3594 lev = LOGSTMT_ALL;
3595 break;
3596
3597 case T_VariableShowStmt:
3598 lev = LOGSTMT_ALL;
3599 break;
3600
3601 case T_DiscardStmt:
3602 lev = LOGSTMT_ALL;
3603 break;
3604
3605 case T_CreateTrigStmt:
3606 lev = LOGSTMT_DDL;
3607 break;
3608
3610 lev = LOGSTMT_DDL;
3611 break;
3612
3614 lev = LOGSTMT_DDL;
3615 break;
3616
3617 case T_CreatePLangStmt:
3618 lev = LOGSTMT_DDL;
3619 break;
3620
3621 case T_CreateDomainStmt:
3622 lev = LOGSTMT_DDL;
3623 break;
3624
3625 case T_CreateRoleStmt:
3626 lev = LOGSTMT_DDL;
3627 break;
3628
3629 case T_AlterRoleStmt:
3630 lev = LOGSTMT_DDL;
3631 break;
3632
3633 case T_AlterRoleSetStmt:
3634 lev = LOGSTMT_DDL;
3635 break;
3636
3637 case T_DropRoleStmt:
3638 lev = LOGSTMT_DDL;
3639 break;
3640
3641 case T_DropOwnedStmt:
3642 lev = LOGSTMT_DDL;
3643 break;
3644
3646 lev = LOGSTMT_DDL;
3647 break;
3648
3649 case T_LockStmt:
3650 lev = LOGSTMT_ALL;
3651 break;
3652
3654 lev = LOGSTMT_ALL;
3655 break;
3656
3657 case T_CheckPointStmt:
3658 lev = LOGSTMT_ALL;
3659 break;
3660
3661 case T_ReindexStmt:
3662 lev = LOGSTMT_ALL; /* should this be DDL? */
3663 break;
3664
3666 lev = LOGSTMT_DDL;
3667 break;
3668
3669 case T_CreateCastStmt:
3670 lev = LOGSTMT_DDL;
3671 break;
3672
3674 lev = LOGSTMT_DDL;
3675 break;
3676
3678 lev = LOGSTMT_DDL;
3679 break;
3680
3682 lev = LOGSTMT_DDL;
3683 break;
3684
3686 lev = LOGSTMT_DDL;
3687 break;
3688
3690 lev = LOGSTMT_DDL;
3691 break;
3692
3694 lev = LOGSTMT_DDL;
3695 break;
3696
3697 case T_CreatePolicyStmt:
3698 lev = LOGSTMT_DDL;
3699 break;
3700
3701 case T_AlterPolicyStmt:
3702 lev = LOGSTMT_DDL;
3703 break;
3704
3706 lev = LOGSTMT_DDL;
3707 break;
3708
3710 lev = LOGSTMT_DDL;
3711 break;
3712
3713 case T_CreateAmStmt:
3714 lev = LOGSTMT_DDL;
3715 break;
3716
3718 lev = LOGSTMT_DDL;
3719 break;
3720
3722 lev = LOGSTMT_DDL;
3723 break;
3724
3726 lev = LOGSTMT_DDL;
3727 break;
3728
3730 lev = LOGSTMT_DDL;
3731 break;
3732
3734 lev = LOGSTMT_DDL;
3735 break;
3736
3737 case T_CreateStatsStmt:
3738 lev = LOGSTMT_DDL;
3739 break;
3740
3741 case T_AlterStatsStmt:
3742 lev = LOGSTMT_DDL;
3743 break;
3744
3746 lev = LOGSTMT_DDL;
3747 break;
3748
3749 case T_WaitStmt:
3750 lev = LOGSTMT_ALL;
3751 break;
3752
3753 /* already-planned queries */
3754 case T_PlannedStmt:
3755 {
3756 PlannedStmt *stmt = (PlannedStmt *) parsetree;
3757
3758 switch (stmt->commandType)
3759 {
3760 case CMD_SELECT:
3761 lev = LOGSTMT_ALL;
3762 break;
3763
3764 case CMD_UPDATE:
3765 case CMD_INSERT:
3766 case CMD_DELETE:
3767 case CMD_MERGE:
3768 lev = LOGSTMT_MOD;
3769 break;
3770
3771 case CMD_UTILITY:
3772 lev = GetCommandLogLevel(stmt->utilityStmt);
3773 break;
3774
3775 default:
3776 elog(WARNING, "unrecognized commandType: %d",
3777 (int) stmt->commandType);
3778 lev = LOGSTMT_ALL;
3779 break;
3780 }
3781 }
3782 break;
3783
3784 /* parsed-and-rewritten-but-not-planned queries */
3785 case T_Query:
3786 {
3787 Query *stmt = (Query *) parsetree;
3788
3789 switch (stmt->commandType)
3790 {
3791 case CMD_SELECT:
3792 lev = LOGSTMT_ALL;
3793 break;
3794
3795 case CMD_UPDATE:
3796 case CMD_INSERT:
3797 case CMD_DELETE:
3798 case CMD_MERGE:
3799 lev = LOGSTMT_MOD;
3800 break;
3801
3802 case CMD_UTILITY:
3803 lev = GetCommandLogLevel(stmt->utilityStmt);
3804 break;
3805
3806 default:
3807 elog(WARNING, "unrecognized commandType: %d",
3808 (int) stmt->commandType);
3809 lev = LOGSTMT_ALL;
3810 break;
3811 }
3812 }
3813 break;
3814
3815 default:
3816 elog(WARNING, "unrecognized node type: %d",
3817 (int) nodeTag(parsetree));
3818 lev = LOGSTMT_ALL;
3819 break;
3820 }
3821
3822 return lev;
3823}
PreparedStatement * FetchPreparedStatement(const char *stmt_name, bool throwError)
Definition prepare.c:436
bool defGetBoolean(DefElem *def)
Definition define.c:93
struct parser_state ps
#define lfirst(lc)
Definition pg_list.h:172
static long analyze(struct nfa *nfa)
Definition regc_nfa.c:3051
char * defname
Definition parsenodes.h:860
LogStmtLevel
Definition tcopprot.h:33
@ LOGSTMT_MOD
Definition tcopprot.h:36
@ LOGSTMT_DDL
Definition tcopprot.h:35
@ LOGSTMT_ALL
Definition tcopprot.h:37
LogStmtLevel GetCommandLogLevel(Node *parsetree)
Definition utility.c:3290

References analyze(), CMD_DELETE, CMD_INSERT, CMD_MERGE, CMD_SELECT, CMD_UPDATE, CMD_UTILITY, defGetBoolean(), DefElem::defname, elog, fb(), FetchPreparedStatement(), GetCommandLogLevel(), lfirst, LOGSTMT_ALL, LOGSTMT_DDL, LOGSTMT_MOD, nodeTag, ps, stmt, and WARNING.

Referenced by check_log_statement(), and GetCommandLogLevel().

◆ PreventCommandDuringRecovery()

void PreventCommandDuringRecovery ( const char cmdname)

Definition at line 446 of file utility.c.

447{
448 if (RecoveryInProgress())
451 /* translator: %s is name of a SQL command, eg CREATE */
452 errmsg("cannot execute %s during recovery",
453 cmdname)));
454}
bool RecoveryInProgress(void)
Definition xlog.c:6830

References ereport, errcode(), errmsg, ERROR, fb(), and RecoveryInProgress().

Referenced by pg_current_xact_id(), pg_notify(), and standard_ProcessUtility().

◆ PreventCommandIfParallelMode()

void PreventCommandIfParallelMode ( const char cmdname)

Definition at line 427 of file utility.c.

428{
429 if (IsInParallelMode())
432 /* translator: %s is name of a SQL command, eg CREATE */
433 errmsg("cannot execute %s during a parallel operation",
434 cmdname)));
435}
bool IsInParallelMode(void)
Definition xact.c:1119

References ereport, errcode(), errmsg, ERROR, fb(), and IsInParallelMode().

Referenced by ExecCheckXactReadOnly(), nextval_internal(), SetSequence(), and standard_ProcessUtility().

◆ PreventCommandIfReadOnly()

void PreventCommandIfReadOnly ( const char cmdname)

Definition at line 409 of file utility.c.

410{
411 if (XactReadOnly)
414 /* translator: %s is name of a SQL command, eg CREATE */
415 errmsg("cannot execute %s in a read-only transaction",
416 cmdname)));
417}
bool XactReadOnly
Definition xact.c:84

References ereport, errcode(), errmsg, ERROR, fb(), and XactReadOnly.

Referenced by be_lo_creat(), be_lo_create(), be_lo_from_bytea(), be_lo_open(), be_lo_put(), be_lo_truncate(), be_lo_truncate64(), be_lo_unlink(), be_lowrite(), DoCopy(), ExecCheckXactReadOnly(), lo_import_internal(), nextval_internal(), SetSequence(), and standard_ProcessUtility().

◆ ProcessUtility()

void ProcessUtility ( PlannedStmt pstmt,
const char queryString,
bool  readOnlyTree,
ProcessUtilityContext  context,
ParamListInfo  params,
QueryEnvironment queryEnv,
DestReceiver dest,
QueryCompletion qc 
)

Definition at line 504 of file utility.c.

512{
513 Assert(IsA(pstmt, PlannedStmt));
514 Assert(pstmt->commandType == CMD_UTILITY);
515 Assert(queryString != NULL); /* required as of 8.4 */
516 Assert(qc == NULL || qc->commandTag == CMDTAG_UNKNOWN);
517
518 /*
519 * We provide a function hook variable that lets loadable plugins get
520 * control when ProcessUtility is called. Such a plugin would normally
521 * call standard_ProcessUtility().
522 */
524 (*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,
525 context, params, queryEnv,
526 dest, qc);
527 else
528 standard_ProcessUtility(pstmt, queryString, readOnlyTree,
529 context, params, queryEnv,
530 dest, qc);
531}
CommandTag commandTag
Definition cmdtag.h:31
void standard_ProcessUtility(PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
Definition utility.c:548
ProcessUtility_hook_type ProcessUtility_hook
Definition utility.c:72

References Assert, CMD_UTILITY, QueryCompletion::commandTag, PlannedStmt::commandType, fb(), IsA, ProcessUtility_hook, and standard_ProcessUtility().

Referenced by _SPI_execute_plan(), CreateSchemaCommand(), execute_sql_string(), ImportForeignSchema(), PortalRunUtility(), postquel_getnext(), ProcessUtilityForAlterTable(), and ProcessUtilitySlow().

◆ ProcessUtilityForAlterTable()

void ProcessUtilityForAlterTable ( Node stmt,
AlterTableUtilityContext context 
)

Definition at line 1971 of file utility.c.

1972{
1973 PlannedStmt *wrapper;
1974
1975 /*
1976 * For event triggers, we must "close" the current complex-command set,
1977 * and start a new one afterwards; this is needed to ensure the ordering
1978 * of command events is consistent with the way they were executed.
1979 */
1981
1982 /* Create a suitable wrapper */
1983 wrapper = makeNode(PlannedStmt);
1984 wrapper->commandType = CMD_UTILITY;
1985 wrapper->canSetTag = false;
1986 wrapper->utilityStmt = stmt;
1987 wrapper->stmt_location = context->pstmt->stmt_location;
1988 wrapper->stmt_len = context->pstmt->stmt_len;
1989 wrapper->planOrigin = PLAN_STMT_INTERNAL;
1990
1991 ProcessUtility(wrapper,
1992 context->queryString,
1993 false,
1995 context->params,
1996 context->queryEnv,
1998 NULL);
1999
2002}
DestReceiver * None_Receiver
Definition dest.c:96
void EventTriggerAlterTableRelid(Oid objectId)
void EventTriggerAlterTableStart(const Node *parsetree)
void EventTriggerAlterTableEnd(void)
#define makeNode(_type_)
Definition nodes.h:161
@ PLAN_STMT_INTERNAL
Definition plannodes.h:38
ParamListInfo params
Definition utility.h:35
QueryEnvironment * queryEnv
Definition utility.h:36
PlannedStmt * pstmt
Definition utility.h:32
const char * queryString
Definition utility.h:33
bool canSetTag
Definition plannodes.h:84
ParseLoc stmt_len
Definition plannodes.h:171
PlannedStmtOrigin planOrigin
Definition plannodes.h:75
ParseLoc stmt_location
Definition plannodes.h:169
Node * utilityStmt
Definition plannodes.h:153
void ProcessUtility(PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
Definition utility.c:504
@ PROCESS_UTILITY_SUBCOMMAND
Definition utility.h:26

References PlannedStmt::canSetTag, CMD_UTILITY, PlannedStmt::commandType, EventTriggerAlterTableEnd(), EventTriggerAlterTableRelid(), EventTriggerAlterTableStart(), fb(), makeNode, None_Receiver, AlterTableUtilityContext::params, PLAN_STMT_INTERNAL, PlannedStmt::planOrigin, PROCESS_UTILITY_SUBCOMMAND, ProcessUtility(), AlterTableUtilityContext::pstmt, AlterTableUtilityContext::queryEnv, AlterTableUtilityContext::queryString, AlterTableUtilityContext::relid, stmt, PlannedStmt::stmt_len, PlannedStmt::stmt_location, and PlannedStmt::utilityStmt.

Referenced by ATParseTransformCmd(), and ATRewriteTables().

◆ ProcessUtilitySlow()

static void ProcessUtilitySlow ( ParseState pstate,
PlannedStmt pstmt,
const char queryString,
ProcessUtilityContext  context,
ParamListInfo  params,
QueryEnvironment queryEnv,
DestReceiver dest,
QueryCompletion qc 
)
static

Definition at line 1094 of file utility.c.

1102{
1103 Node *parsetree = pstmt->utilityStmt;
1104 bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
1105 bool isCompleteQuery = (context != PROCESS_UTILITY_SUBCOMMAND);
1106 bool needCleanup;
1107 bool commandCollected = false;
1108 ObjectAddress address;
1109 ObjectAddress secondaryObject = InvalidObjectAddress;
1110
1111 /* All event trigger calls are done only when isCompleteQuery is true */
1113
1114 /* PG_TRY block is to ensure we call EventTriggerEndCompleteQuery */
1115 PG_TRY();
1116 {
1117 if (isCompleteQuery)
1118 EventTriggerDDLCommandStart(parsetree);
1119
1120 switch (nodeTag(parsetree))
1121 {
1122 /*
1123 * relation and attribute manipulation
1124 */
1125 case T_CreateSchemaStmt:
1126 CreateSchemaCommand(pstate,
1127 (CreateSchemaStmt *) parsetree,
1128 pstmt->stmt_location,
1129 pstmt->stmt_len);
1130
1131 /*
1132 * EventTriggerCollectSimpleCommand called by
1133 * CreateSchemaCommand
1134 */
1135 commandCollected = true;
1136 break;
1137
1138 case T_CreateStmt:
1140 {
1141 List *stmts;
1143
1144 /* Run parse analysis ... */
1145 stmts = transformCreateStmt((CreateStmt *) parsetree,
1146 queryString);
1147
1148 /*
1149 * ... and do it. We can't use foreach() because we may
1150 * modify the list midway through, so pick off the
1151 * elements one at a time, the hard way.
1152 */
1153 while (stmts != NIL)
1154 {
1155 Node *stmt = (Node *) linitial(stmts);
1156
1157 stmts = list_delete_first(stmts);
1158
1159 if (IsA(stmt, CreateStmt))
1160 {
1163 const char *const validnsps[] = HEAP_RELOPT_NAMESPACES;
1164
1165 /* Remember transformed RangeVar for LIKE */
1167
1168 /* Create the table itself */
1169 address = DefineRelation(cstmt,
1172 queryString);
1174 secondaryObject,
1175 stmt);
1176
1177 /*
1178 * Let NewRelationCreateToastTable decide if this
1179 * one needs a secondary relation too.
1180 */
1182
1183 /*
1184 * parse and validate reloptions for the toast
1185 * table
1186 */
1188 cstmt->options,
1189 "toast",
1190 validnsps,
1191 true,
1192 false);
1195 true);
1196
1199 }
1200 else if (IsA(stmt, CreateForeignTableStmt))
1201 {
1203
1204 /* Remember transformed RangeVar for LIKE */
1206
1207 /* Create the table itself */
1208 address = DefineRelation(&cstmt->base,
1211 queryString);
1213 address.objectId);
1215 secondaryObject,
1216 stmt);
1217 }
1218 else if (IsA(stmt, TableLikeClause))
1219 {
1220 /*
1221 * Do delayed processing of LIKE options. This
1222 * will result in additional sub-statements for us
1223 * to process. Those should get done before any
1224 * remaining actions, so prepend them to "stmts".
1225 */
1227 List *morestmts;
1228
1229 Assert(table_rv != NULL);
1230
1232 stmts = list_concat(morestmts, stmts);
1233 }
1234 else
1235 {
1236 /*
1237 * Recurse for anything else. Note the recursive
1238 * call will stash the objects so created into our
1239 * event trigger context.
1240 */
1241 PlannedStmt *wrapper;
1242
1243 wrapper = makeNode(PlannedStmt);
1244 wrapper->commandType = CMD_UTILITY;
1245 wrapper->canSetTag = false;
1246 wrapper->utilityStmt = stmt;
1247 wrapper->stmt_location = pstmt->stmt_location;
1248 wrapper->stmt_len = pstmt->stmt_len;
1249 wrapper->planOrigin = PLAN_STMT_INTERNAL;
1250
1251 ProcessUtility(wrapper,
1252 queryString,
1253 false,
1255 params,
1256 NULL,
1258 NULL);
1259 }
1260
1261 /* Need CCI between commands */
1262 if (stmts != NIL)
1264 }
1265
1266 /*
1267 * The multiple commands generated here are stashed
1268 * individually, so disable collection below.
1269 */
1270 commandCollected = true;
1271 }
1272 break;
1273
1274 case T_AlterTableStmt:
1275 {
1276 AlterTableStmt *atstmt = (AlterTableStmt *) parsetree;
1277 Oid relid;
1278 LOCKMODE lockmode;
1279 ListCell *cell;
1280
1281 /*
1282 * Disallow ALTER TABLE .. DETACH CONCURRENTLY in a
1283 * transaction block or function. (Perhaps it could be
1284 * allowed in a procedure, but don't hold your breath.)
1285 */
1286 foreach(cell, atstmt->cmds)
1287 {
1288 AlterTableCmd *cmd = (AlterTableCmd *) lfirst(cell);
1289
1290 /* Disallow DETACH CONCURRENTLY in a transaction block */
1291 if (cmd->subtype == AT_DetachPartition)
1292 {
1293 if (((PartitionCmd *) cmd->def)->concurrent)
1295 "ALTER TABLE ... DETACH CONCURRENTLY");
1296 }
1297 }
1298
1299 /*
1300 * Figure out lock mode, and acquire lock. This also does
1301 * basic permissions checks, so that we won't wait for a
1302 * lock on (for example) a relation on which we have no
1303 * permissions.
1304 */
1305 lockmode = AlterTableGetLockLevel(atstmt->cmds);
1306 relid = AlterTableLookupRelation(atstmt, lockmode);
1307
1308 if (OidIsValid(relid))
1309 {
1311
1312 /* Set up info needed for recursive callbacks ... */
1313 atcontext.pstmt = pstmt;
1314 atcontext.queryString = queryString;
1315 atcontext.relid = relid;
1316 atcontext.params = params;
1317 atcontext.queryEnv = queryEnv;
1318
1319 /* ... ensure we have an event trigger context ... */
1320 EventTriggerAlterTableStart(parsetree);
1322
1323 /* ... and do it */
1324 AlterTable(atstmt, lockmode, &atcontext);
1325
1326 /* done */
1328 }
1329 else
1331 (errmsg("relation \"%s\" does not exist, skipping",
1332 atstmt->relation->relname)));
1333 }
1334
1335 /* ALTER TABLE stashes commands internally */
1336 commandCollected = true;
1337 break;
1338
1339 case T_AlterDomainStmt:
1340 {
1341 AlterDomainStmt *stmt = (AlterDomainStmt *) parsetree;
1342
1343 /*
1344 * Some or all of these functions are recursive to cover
1345 * inherited things, so permission checks are done there.
1346 */
1347 switch (stmt->subtype)
1348 {
1349 case AD_AlterDefault:
1350
1351 /*
1352 * Recursively alter column default for table and,
1353 * if requested, for descendants
1354 */
1355 address =
1356 AlterDomainDefault(stmt->typeName,
1357 stmt->def);
1358 break;
1359 case AD_DropNotNull:
1360 address =
1361 AlterDomainNotNull(stmt->typeName,
1362 false);
1363 break;
1364 case AD_SetNotNull:
1365 address =
1366 AlterDomainNotNull(stmt->typeName,
1367 true);
1368 break;
1369 case AD_AddConstraint:
1370 address =
1372 stmt->def,
1373 &secondaryObject);
1374 break;
1375 case AD_DropConstraint:
1376 address =
1378 stmt->name,
1379 stmt->behavior,
1380 stmt->missing_ok);
1381 break;
1383 address =
1385 stmt->name);
1386 break;
1387 default: /* oops */
1388 elog(ERROR, "unrecognized alter domain type: %d",
1389 (int) stmt->subtype);
1390 break;
1391 }
1392 }
1393 break;
1394
1395 /*
1396 * ************* object creation / destruction **************
1397 */
1398 case T_DefineStmt:
1399 {
1400 DefineStmt *stmt = (DefineStmt *) parsetree;
1401
1402 switch (stmt->kind)
1403 {
1404 case OBJECT_AGGREGATE:
1405 address =
1406 DefineAggregate(pstate, stmt->defnames, stmt->args,
1407 stmt->oldstyle,
1408 stmt->definition,
1409 stmt->replace);
1410 break;
1411 case OBJECT_OPERATOR:
1412 Assert(stmt->args == NIL);
1413 address = DefineOperator(stmt->defnames,
1414 stmt->definition);
1415 break;
1416 case OBJECT_TYPE:
1417 Assert(stmt->args == NIL);
1418 address = DefineType(pstate,
1419 stmt->defnames,
1420 stmt->definition);
1421 break;
1422 case OBJECT_TSPARSER:
1423 Assert(stmt->args == NIL);
1424 address = DefineTSParser(stmt->defnames,
1425 stmt->definition);
1426 break;
1428 Assert(stmt->args == NIL);
1429 address = DefineTSDictionary(stmt->defnames,
1430 stmt->definition);
1431 break;
1432 case OBJECT_TSTEMPLATE:
1433 Assert(stmt->args == NIL);
1434 address = DefineTSTemplate(stmt->defnames,
1435 stmt->definition);
1436 break;
1438 Assert(stmt->args == NIL);
1439 address = DefineTSConfiguration(stmt->defnames,
1440 stmt->definition,
1441 &secondaryObject);
1442 break;
1443 case OBJECT_COLLATION:
1444 Assert(stmt->args == NIL);
1445 address = DefineCollation(pstate,
1446 stmt->defnames,
1447 stmt->definition,
1448 stmt->if_not_exists);
1449 break;
1450 default:
1451 elog(ERROR, "unrecognized define stmt type: %d",
1452 (int) stmt->kind);
1453 break;
1454 }
1455 }
1456 break;
1457
1458 case T_IndexStmt: /* CREATE INDEX */
1459 {
1460 IndexStmt *stmt = (IndexStmt *) parsetree;
1461 Oid relid;
1462 LOCKMODE lockmode;
1463 int nparts = -1;
1464 bool is_alter_table;
1465
1466 if (stmt->concurrent)
1468 "CREATE INDEX CONCURRENTLY");
1469
1470 /*
1471 * Look up the relation OID just once, right here at the
1472 * beginning, so that we don't end up repeating the name
1473 * lookup later and latching onto a different relation
1474 * partway through. To avoid lock upgrade hazards, it's
1475 * important that we take the strongest lock that will
1476 * eventually be needed here, so the lockmode calculation
1477 * needs to match what DefineIndex() does.
1478 */
1479 lockmode = stmt->concurrent ? ShareUpdateExclusiveLock
1480 : ShareLock;
1481 relid =
1482 RangeVarGetRelidExtended(stmt->relation, lockmode,
1483 0,
1485 NULL);
1486
1487 /*
1488 * CREATE INDEX on partitioned tables (but not regular
1489 * inherited tables) recurses to partitions, so we must
1490 * acquire locks early to avoid deadlocks.
1491 *
1492 * We also take the opportunity to verify that all
1493 * partitions are something we can put an index on, to
1494 * avoid building some indexes only to fail later. While
1495 * at it, also count the partitions, so that DefineIndex
1496 * needn't do a duplicative find_all_inheritors search.
1497 */
1498 if (stmt->relation->inh &&
1500 {
1501 ListCell *lc;
1502 List *inheritors = NIL;
1503
1504 inheritors = find_all_inheritors(relid, lockmode, NULL);
1505 foreach(lc, inheritors)
1506 {
1508 char relkind = get_rel_relkind(partrelid);
1509
1510 if (relkind != RELKIND_RELATION &&
1511 relkind != RELKIND_MATVIEW &&
1512 relkind != RELKIND_PARTITIONED_TABLE &&
1513 relkind != RELKIND_FOREIGN_TABLE)
1514 elog(ERROR, "unexpected relkind \"%c\" on partition \"%s\"",
1515 relkind, stmt->relation->relname);
1516
1517 if (relkind == RELKIND_FOREIGN_TABLE &&
1518 (stmt->unique || stmt->primary))
1519 ereport(ERROR,
1521 errmsg("cannot create unique index on partitioned table \"%s\"",
1522 stmt->relation->relname),
1523 errdetail("Table \"%s\" contains partitions that are foreign tables.",
1524 stmt->relation->relname)));
1525 }
1526 /* count direct and indirect children, but not rel */
1527 nparts = list_length(inheritors) - 1;
1529 }
1530
1531 /*
1532 * If the IndexStmt is already transformed, it must have
1533 * come from generateClonedIndexStmt, which in current
1534 * usage means it came from expandTableLikeClause rather
1535 * than from original parse analysis. And that means we
1536 * must treat it like ALTER TABLE ADD INDEX, not CREATE.
1537 * (This is a bit grotty, but currently it doesn't seem
1538 * worth adding a separate bool field for the purpose.)
1539 */
1540 is_alter_table = stmt->transformed;
1541
1542 /* Run parse analysis ... */
1543 stmt = transformIndexStmt(relid, stmt, queryString);
1544
1545 /* ... and do it */
1546 EventTriggerAlterTableStart(parsetree);
1547 address =
1548 DefineIndex(pstate,
1549 relid, /* OID of heap relation */
1550 stmt,
1551 InvalidOid, /* no predefined OID */
1552 InvalidOid, /* no parent index */
1553 InvalidOid, /* no parent constraint */
1554 nparts, /* # of partitions, or -1 */
1556 true, /* check_rights */
1557 true, /* check_not_in_use */
1558 false, /* skip_build */
1559 false); /* quiet */
1560
1561 /*
1562 * Add the CREATE INDEX node itself to stash right away;
1563 * if there were any commands stashed in the ALTER TABLE
1564 * code, we need them to appear after this one.
1565 */
1566 EventTriggerCollectSimpleCommand(address, secondaryObject,
1567 parsetree);
1568 commandCollected = true;
1570 }
1571 break;
1572
1573 case T_ReindexStmt:
1574 ExecReindex(pstate, (ReindexStmt *) parsetree, isTopLevel);
1575
1576 /* EventTriggerCollectSimpleCommand is called directly */
1577 commandCollected = true;
1578 break;
1579
1581 address = CreateExtension(pstate, (CreateExtensionStmt *) parsetree);
1582 break;
1583
1585 address = ExecAlterExtensionStmt(pstate, (AlterExtensionStmt *) parsetree);
1586 break;
1587
1590 &secondaryObject);
1591 break;
1592
1593 case T_CreateFdwStmt:
1594 address = CreateForeignDataWrapper(pstate, (CreateFdwStmt *) parsetree);
1595 break;
1596
1597 case T_AlterFdwStmt:
1598 address = AlterForeignDataWrapper(pstate, (AlterFdwStmt *) parsetree);
1599 break;
1600
1602 address = CreateForeignServer((CreateForeignServerStmt *) parsetree);
1603 break;
1604
1606 address = AlterForeignServer((AlterForeignServerStmt *) parsetree);
1607 break;
1608
1610 address = CreateUserMapping((CreateUserMappingStmt *) parsetree);
1611 break;
1612
1614 address = AlterUserMapping((AlterUserMappingStmt *) parsetree);
1615 break;
1616
1619 /* no commands stashed for DROP */
1620 commandCollected = true;
1621 break;
1622
1625 /* commands are stashed inside ImportForeignSchema */
1626 commandCollected = true;
1627 break;
1628
1629 case T_CompositeTypeStmt: /* CREATE TYPE (composite) */
1630 {
1631 CompositeTypeStmt *stmt = (CompositeTypeStmt *) parsetree;
1632
1633 address = DefineCompositeType(stmt->typevar,
1634 stmt->coldeflist);
1635 }
1636 break;
1637
1638 case T_CreateEnumStmt: /* CREATE TYPE AS ENUM */
1639 address = DefineEnum((CreateEnumStmt *) parsetree);
1640 break;
1641
1642 case T_CreateRangeStmt: /* CREATE TYPE AS RANGE */
1643 address = DefineRange(pstate, (CreateRangeStmt *) parsetree);
1644 break;
1645
1646 case T_AlterEnumStmt: /* ALTER TYPE (enum) */
1647 address = AlterEnum((AlterEnumStmt *) parsetree);
1648 break;
1649
1650 case T_ViewStmt: /* CREATE VIEW */
1651 EventTriggerAlterTableStart(parsetree);
1652 address = DefineView((ViewStmt *) parsetree, queryString,
1653 pstmt->stmt_location, pstmt->stmt_len);
1654 EventTriggerCollectSimpleCommand(address, secondaryObject,
1655 parsetree);
1656 /* stashed internally */
1657 commandCollected = true;
1659 break;
1660
1661 case T_CreateFunctionStmt: /* CREATE FUNCTION */
1662 address = CreateFunction(pstate, (CreateFunctionStmt *) parsetree);
1663 break;
1664
1665 case T_AlterFunctionStmt: /* ALTER FUNCTION */
1666 address = AlterFunction(pstate, (AlterFunctionStmt *) parsetree);
1667 break;
1668
1669 case T_RuleStmt: /* CREATE RULE */
1670 address = DefineRule((RuleStmt *) parsetree, queryString);
1671 break;
1672
1673 case T_CreateSeqStmt:
1674 address = DefineSequence(pstate, (CreateSeqStmt *) parsetree);
1675 break;
1676
1677 case T_AlterSeqStmt:
1678 address = AlterSequence(pstate, (AlterSeqStmt *) parsetree);
1679 break;
1680
1682 address = ExecCreateTableAs(pstate, (CreateTableAsStmt *) parsetree,
1683 params, queryEnv, qc);
1684 break;
1685
1687
1688 /*
1689 * REFRESH CONCURRENTLY executes some DDL commands internally.
1690 * Inhibit DDL command collection here to avoid those commands
1691 * from showing up in the deparsed command queue. The refresh
1692 * command itself is queued, which is enough.
1693 */
1695 PG_TRY(2);
1696 {
1697 address = ExecRefreshMatView((RefreshMatViewStmt *) parsetree,
1698 queryString, qc);
1699 }
1700 PG_FINALLY(2);
1701 {
1703 }
1704 PG_END_TRY(2);
1705 break;
1706
1707 case T_CreateTrigStmt:
1708 address = CreateTrigger((CreateTrigStmt *) parsetree,
1709 queryString, InvalidOid, InvalidOid,
1711 InvalidOid, NULL, false, false);
1712 break;
1713
1714 case T_CreatePLangStmt:
1715 address = CreateProceduralLanguage((CreatePLangStmt *) parsetree);
1716 break;
1717
1718 case T_CreateDomainStmt:
1719 address = DefineDomain(pstate, (CreateDomainStmt *) parsetree);
1720 break;
1721
1723 address = CreateConversionCommand((CreateConversionStmt *) parsetree);
1724 break;
1725
1726 case T_CreateCastStmt:
1727 address = CreateCast((CreateCastStmt *) parsetree);
1728 break;
1729
1731 DefineOpClass((CreateOpClassStmt *) parsetree);
1732 /* command is stashed in DefineOpClass */
1733 commandCollected = true;
1734 break;
1735
1737 address = DefineOpFamily((CreateOpFamilyStmt *) parsetree);
1738
1739 /*
1740 * DefineOpFamily calls EventTriggerCollectSimpleCommand
1741 * directly.
1742 */
1743 commandCollected = true;
1744 break;
1745
1747 address = CreatePropGraph(pstate, (CreatePropGraphStmt *) parsetree);
1748 break;
1749
1751 address = AlterPropGraph(pstate, (AlterPropGraphStmt *) parsetree);
1752 break;
1753
1755 address = CreateTransform((CreateTransformStmt *) parsetree);
1756 break;
1757
1759 AlterOpFamily((AlterOpFamilyStmt *) parsetree);
1760 /* commands are stashed in AlterOpFamily */
1761 commandCollected = true;
1762 break;
1763
1765 address = AlterTSDictionary((AlterTSDictionaryStmt *) parsetree);
1766 break;
1767
1770
1771 /*
1772 * Commands are stashed in MakeConfigurationMapping and
1773 * DropConfigurationMapping, which are called from
1774 * AlterTSConfiguration
1775 */
1776 commandCollected = true;
1777 break;
1778
1781 /* commands are stashed in AlterTableMoveAll */
1782 commandCollected = true;
1783 break;
1784
1785 case T_DropStmt:
1786 ExecDropStmt((DropStmt *) parsetree, isTopLevel);
1787 /* no commands stashed for DROP */
1788 commandCollected = true;
1789 break;
1790
1791 case T_RenameStmt:
1792 address = ExecRenameStmt((RenameStmt *) parsetree);
1793 break;
1794
1796 address =
1798 &secondaryObject);
1799 break;
1800
1802 address =
1804 &secondaryObject);
1805 break;
1806
1807 case T_AlterOwnerStmt:
1808 address = ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree);
1809 break;
1810
1812 address = AlterOperator((AlterOperatorStmt *) parsetree);
1813 break;
1814
1815 case T_AlterTypeStmt:
1816 address = AlterType((AlterTypeStmt *) parsetree);
1817 break;
1818
1819 case T_CommentStmt:
1820 address = CommentObject((CommentStmt *) parsetree);
1821 break;
1822
1823 case T_GrantStmt:
1824 ExecuteGrantStmt((GrantStmt *) parsetree);
1825 /* commands are stashed in ExecGrantStmt_oids */
1826 commandCollected = true;
1827 break;
1828
1829 case T_DropOwnedStmt:
1830 DropOwnedObjects((DropOwnedStmt *) parsetree);
1831 /* no commands stashed for DROP */
1832 commandCollected = true;
1833 break;
1834
1838 commandCollected = true;
1839 break;
1840
1841 case T_CreatePolicyStmt: /* CREATE POLICY */
1842 address = CreatePolicy((CreatePolicyStmt *) parsetree);
1843 break;
1844
1845 case T_AlterPolicyStmt: /* ALTER POLICY */
1846 address = AlterPolicy((AlterPolicyStmt *) parsetree);
1847 break;
1848
1849 case T_SecLabelStmt:
1850 address = ExecSecLabelStmt((SecLabelStmt *) parsetree);
1851 break;
1852
1853 case T_CreateAmStmt:
1854 address = CreateAccessMethod((CreateAmStmt *) parsetree);
1855 break;
1856
1858 address = CreatePublication(pstate, (CreatePublicationStmt *) parsetree);
1859 break;
1860
1862 AlterPublication(pstate, (AlterPublicationStmt *) parsetree);
1863
1864 /*
1865 * AlterPublication calls EventTriggerCollectSimpleCommand
1866 * directly
1867 */
1868 commandCollected = true;
1869 break;
1870
1872 address = CreateSubscription(pstate,
1873 (CreateSubscriptionStmt *) parsetree,
1874 isTopLevel);
1875 break;
1876
1878 address = AlterSubscription(pstate,
1879 (AlterSubscriptionStmt *) parsetree,
1880 isTopLevel);
1881 break;
1882
1885 /* no commands stashed for DROP */
1886 commandCollected = true;
1887 break;
1888
1889 case T_CreateStatsStmt:
1890 {
1891 Oid relid;
1892 CreateStatsStmt *stmt = (CreateStatsStmt *) parsetree;
1893 RangeVar *rel = (RangeVar *) linitial(stmt->relations);
1894
1895 if (!IsA(rel, RangeVar))
1896 ereport(ERROR,
1898 errmsg("CREATE STATISTICS only supports relation names in the FROM clause")));
1899
1900 /*
1901 * CREATE STATISTICS will influence future execution plans
1902 * but does not interfere with currently executing plans.
1903 * So it should be enough to take ShareUpdateExclusiveLock
1904 * on relation, conflicting with ANALYZE and other DDL
1905 * that sets statistical information, but not with normal
1906 * queries.
1907 *
1908 * XXX RangeVarCallbackOwnsRelation not needed here, to
1909 * keep the same behavior as before.
1910 */
1911 relid = RangeVarGetRelid(rel, ShareUpdateExclusiveLock, false);
1912
1913 /* Run parse analysis ... */
1914 stmt = transformStatsStmt(relid, stmt, queryString);
1915
1916 address = CreateStatistics(stmt, true);
1917 }
1918 break;
1919
1920 case T_AlterStatsStmt:
1921 address = AlterStatistics((AlterStatsStmt *) parsetree);
1922 break;
1923
1925 address = AlterCollation((AlterCollationStmt *) parsetree);
1926 break;
1927
1928 default:
1929 elog(ERROR, "unrecognized node type: %d",
1930 (int) nodeTag(parsetree));
1931 break;
1932 }
1933
1934 /*
1935 * Remember the object so that ddl_command_end event triggers have
1936 * access to it.
1937 */
1938 if (!commandCollected)
1939 EventTriggerCollectSimpleCommand(address, secondaryObject,
1940 parsetree);
1941
1942 if (isCompleteQuery)
1943 {
1944 EventTriggerSQLDrop(parsetree);
1945 EventTriggerDDLCommandEnd(parsetree);
1946 }
1947 }
1948 PG_FINALLY();
1949 {
1950 if (needCleanup)
1952 }
1953 PG_END_TRY();
1954}
void ExecuteGrantStmt(GrantStmt *stmt)
Definition aclchk.c:395
void ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *stmt)
Definition aclchk.c:915
ObjectAddress DefineAggregate(ParseState *pstate, List *name, List *args, bool oldstyle, List *parameters, bool replace)
ObjectAddress ExecAlterOwnerStmt(AlterOwnerStmt *stmt)
Definition alter.c:833
ObjectAddress ExecAlterObjectDependsStmt(AlterObjectDependsStmt *stmt, ObjectAddress *refAddress)
Definition alter.c:466
ObjectAddress ExecRenameStmt(RenameStmt *stmt)
Definition alter.c:367
ObjectAddress ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt, ObjectAddress *oldSchemaAddr)
Definition alter.c:529
ObjectAddress CreateAccessMethod(CreateAmStmt *stmt)
Definition amcmds.c:43
#define OidIsValid(objectId)
Definition c.h:858
ObjectAddress AlterCollation(AlterCollationStmt *stmt)
ObjectAddress DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_exists)
ObjectAddress DefineSequence(ParseState *pstate, CreateSeqStmt *seq)
Definition sequence.c:112
ObjectAddress AlterSequence(ParseState *pstate, AlterSeqStmt *stmt)
Definition sequence.c:429
ObjectAddress CommentObject(CommentStmt *stmt)
Definition comment.c:40
ObjectAddress CreateConversionCommand(CreateConversionStmt *stmt)
ObjectAddress ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt, ParamListInfo params, QueryEnvironment *queryEnv, QueryCompletion *qc)
Definition createas.c:223
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define PG_TRY(...)
Definition elog.h:374
#define PG_END_TRY(...)
Definition elog.h:399
#define NOTICE
Definition elog.h:36
#define PG_FINALLY(...)
Definition elog.h:391
void EventTriggerUndoInhibitCommandCollection(void)
void EventTriggerDDLCommandStart(Node *parsetree)
void EventTriggerInhibitCommandCollection(void)
bool EventTriggerBeginCompleteQuery(void)
void EventTriggerSQLDrop(Node *parsetree)
void EventTriggerEndCompleteQuery(void)
void EventTriggerCollectAlterDefPrivs(const AlterDefaultPrivilegesStmt *stmt)
void EventTriggerDDLCommandEnd(Node *parsetree)
void EventTriggerCollectSimpleCommand(ObjectAddress address, ObjectAddress secondaryObject, const Node *parsetree)
ObjectAddress CreateExtension(ParseState *pstate, CreateExtensionStmt *stmt)
Definition extension.c:2147
ObjectAddress ExecAlterExtensionStmt(ParseState *pstate, AlterExtensionStmt *stmt)
Definition extension.c:3471
ObjectAddress ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt, ObjectAddress *objAddr)
Definition extension.c:3776
void ImportForeignSchema(ImportForeignSchemaStmt *stmt)
ObjectAddress AlterForeignServer(AlterForeignServerStmt *stmt)
ObjectAddress AlterForeignDataWrapper(ParseState *pstate, AlterFdwStmt *stmt)
ObjectAddress CreateForeignServer(CreateForeignServerStmt *stmt)
Oid RemoveUserMapping(DropUserMappingStmt *stmt)
ObjectAddress CreateForeignDataWrapper(ParseState *pstate, CreateFdwStmt *stmt)
ObjectAddress AlterUserMapping(AlterUserMappingStmt *stmt)
void CreateForeignTable(CreateForeignTableStmt *stmt, Oid relid)
ObjectAddress CreateUserMapping(CreateUserMappingStmt *stmt)
ObjectAddress CreateCast(CreateCastStmt *stmt)
ObjectAddress CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt)
ObjectAddress AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt)
ObjectAddress CreateTransform(CreateTransformStmt *stmt)
void ExecReindex(ParseState *pstate, const ReindexStmt *stmt, bool isTopLevel)
Definition indexcmds.c:2852
ObjectAddress DefineIndex(ParseState *pstate, Oid tableId, const IndexStmt *stmt, Oid indexRelationId, Oid parentIndexId, Oid parentConstraintId, int total_parts, bool is_alter_table, bool check_rights, bool check_not_in_use, bool skip_build, bool quiet)
Definition indexcmds.c:545
List * list_delete_first(List *list)
Definition list.c:943
List * list_concat(List *list1, const List *list2)
Definition list.c:561
void list_free(List *list)
Definition list.c:1546
int LOCKMODE
Definition lockdefs.h:26
#define ShareUpdateExclusiveLock
Definition lockdefs.h:39
#define ShareLock
Definition lockdefs.h:40
char get_rel_relkind(Oid relid)
Definition lsyscache.c:2196
ObjectAddress ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, QueryCompletion *qc)
Definition matview.c:120
Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, uint32 flags, RangeVarGetRelidCallback callback, void *callback_arg)
Definition namespace.c:442
#define RangeVarGetRelid(relation, lockmode, missing_ok)
Definition namespace.h:98
const ObjectAddress InvalidObjectAddress
ObjectAddress DefineOpClass(CreateOpClassStmt *stmt)
ObjectAddress DefineOpFamily(CreateOpFamilyStmt *stmt)
Oid AlterOpFamily(AlterOpFamilyStmt *stmt)
ObjectAddress AlterOperator(AlterOperatorStmt *stmt)
ObjectAddress DefineOperator(List *names, List *parameters)
List * transformCreateStmt(CreateStmt *stmt, const char *queryString)
IndexStmt * transformIndexStmt(Oid relid, IndexStmt *stmt, const char *queryString)
List * expandTableLikeClause(RangeVar *heapRel, TableLikeClause *table_like_clause)
CreateStatsStmt * transformStatsStmt(Oid relid, CreateStatsStmt *stmt, const char *queryString)
@ AD_AddConstraint
@ AD_DropConstraint
@ AD_AlterDefault
@ AD_DropNotNull
@ AD_ValidateConstraint
@ AD_SetNotNull
@ AT_DetachPartition
List * find_all_inheritors(Oid parentrelId, LOCKMODE lockmode, List **numparents)
static int list_length(const List *l)
Definition pg_list.h:152
#define lfirst_oid(lc)
Definition pg_list.h:174
ObjectAddress CreatePolicy(CreatePolicyStmt *stmt)
Definition policy.c:569
ObjectAddress AlterPolicy(AlterPolicyStmt *stmt)
Definition policy.c:768
uint64_t Datum
Definition postgres.h:70
#define InvalidOid
unsigned int Oid
ObjectAddress CreateProceduralLanguage(CreatePLangStmt *stmt)
Definition proclang.c:38
ObjectAddress AlterPropGraph(ParseState *pstate, const AlterPropGraphStmt *stmt)
ObjectAddress CreatePropGraph(ParseState *pstate, const CreatePropGraphStmt *stmt)
ObjectAddress CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt)
void AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt)
Datum transformRelOptions(Datum oldOptions, List *defList, const char *nameSpace, const char *const validnsps[], bool acceptOidsOff, bool isReset)
bytea * heap_reloptions(char relkind, Datum reloptions, bool validate)
#define HEAP_RELOPT_NAMESPACES
Definition reloptions.h:61
ObjectAddress DefineRule(RuleStmt *stmt, const char *queryString)
Oid CreateSchemaCommand(ParseState *pstate, CreateSchemaStmt *stmt, int stmt_location, int stmt_len)
Definition schemacmds.c:52
ObjectAddress ExecSecLabelStmt(SecLabelStmt *stmt)
Definition seclabel.c:116
ObjectAddress CreateStatistics(CreateStatsStmt *stmt, bool check_rights)
Definition statscmds.c:64
ObjectAddress AlterStatistics(AlterStatsStmt *stmt)
Definition statscmds.c:655
AlterTableType subtype
RangeVar * relation
Definition pg_list.h:54
Definition nodes.h:135
void DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel)
ObjectAddress CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, bool isTopLevel)
ObjectAddress AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, bool isTopLevel)
void AlterTable(AlterTableStmt *stmt, LOCKMODE lockmode, AlterTableUtilityContext *context)
Definition tablecmds.c:4565
LOCKMODE AlterTableGetLockLevel(List *cmds)
Definition tablecmds.c:4639
Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode)
Definition tablecmds.c:4506
ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, ObjectAddress *typaddress, const char *queryString)
Definition tablecmds.c:784
Oid AlterTableMoveAll(AlterTableMoveAllStmt *stmt)
void RangeVarCallbackOwnsRelation(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
void NewRelationCreateToastTable(Oid relOid, Datum reloptions)
Definition toasting.c:72
ObjectAddress CreateTrigger(const CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, Oid funcoid, Oid parentTriggerOid, Node *whenClause, bool isInternal, bool in_partition)
Definition trigger.c:162
ObjectAddress AlterTSConfiguration(AlterTSConfigurationStmt *stmt)
ObjectAddress DefineTSTemplate(List *names, List *parameters)
ObjectAddress DefineTSDictionary(List *names, List *parameters)
ObjectAddress DefineTSConfiguration(List *names, List *parameters, ObjectAddress *copied)
ObjectAddress AlterTSDictionary(AlterTSDictionaryStmt *stmt)
ObjectAddress DefineTSParser(List *names, List *parameters)
ObjectAddress AlterDomainNotNull(List *names, bool notNull)
Definition typecmds.c:2768
ObjectAddress DefineType(ParseState *pstate, List *names, List *parameters)
Definition typecmds.c:154
ObjectAddress DefineEnum(CreateEnumStmt *stmt)
Definition typecmds.c:1183
ObjectAddress AlterDomainDropConstraint(List *names, const char *constrName, DropBehavior behavior, bool missing_ok)
Definition typecmds.c:2854
ObjectAddress AlterEnum(AlterEnumStmt *stmt)
Definition typecmds.c:1307
ObjectAddress AlterDomainAddConstraint(List *names, Node *newConstraint, ObjectAddress *constrAddr)
Definition typecmds.c:2960
ObjectAddress DefineDomain(ParseState *pstate, CreateDomainStmt *stmt)
Definition typecmds.c:699
ObjectAddress AlterDomainValidateConstraint(List *names, const char *constrName)
Definition typecmds.c:3060
ObjectAddress AlterDomainDefault(List *names, Node *defaultRaw)
Definition typecmds.c:2639
ObjectAddress DefineCompositeType(RangeVar *typevar, List *coldeflist)
Definition typecmds.c:2581
ObjectAddress AlterType(AlterTypeStmt *stmt)
Definition typecmds.c:4355
ObjectAddress DefineRange(ParseState *pstate, CreateRangeStmt *stmt)
Definition typecmds.c:1382
void DropOwnedObjects(DropOwnedStmt *stmt)
Definition user.c:1596
static void ExecDropStmt(DropStmt *stmt, bool isTopLevel)
Definition utility.c:2008
@ PROCESS_UTILITY_TOPLEVEL
Definition utility.h:22
ObjectAddress DefineView(ViewStmt *stmt, const char *queryString, int stmt_location, int stmt_len)
Definition view.c:355
void CommandCounterIncrement(void)
Definition xact.c:1130

References AD_AddConstraint, AD_AlterDefault, AD_DropConstraint, AD_DropNotNull, AD_SetNotNull, AD_ValidateConstraint, AlterCollation(), AlterDomainAddConstraint(), AlterDomainDefault(), AlterDomainDropConstraint(), AlterDomainNotNull(), AlterDomainValidateConstraint(), AlterEnum(), AlterForeignDataWrapper(), AlterForeignServer(), AlterFunction(), AlterOperator(), AlterOpFamily(), AlterPolicy(), AlterPropGraph(), AlterPublication(), AlterSequence(), AlterStatistics(), AlterSubscription(), AlterTable(), AlterTableGetLockLevel(), AlterTableLookupRelation(), AlterTableMoveAll(), AlterTSConfiguration(), AlterTSDictionary(), AlterType(), AlterUserMapping(), Assert, AT_DetachPartition, CreateForeignTableStmt::base, PlannedStmt::canSetTag, CMD_UTILITY, CommandCounterIncrement(), PlannedStmt::commandType, CommentObject(), CreateAccessMethod(), CreateCast(), CreateConversionCommand(), CreateExtension(), CreateForeignDataWrapper(), CreateForeignServer(), CreateForeignTable(), CreateFunction(), CreatePolicy(), CreateProceduralLanguage(), CreatePropGraph(), CreatePublication(), CreateSchemaCommand(), CreateStatistics(), CreateSubscription(), CreateTransform(), CreateTrigger(), CreateUserMapping(), AlterTableCmd::def, DefineAggregate(), DefineCollation(), DefineCompositeType(), DefineDomain(), DefineEnum(), DefineIndex(), DefineOpClass(), DefineOperator(), DefineOpFamily(), DefineRange(), DefineRelation(), DefineRule(), DefineSequence(), DefineTSConfiguration(), DefineTSDictionary(), DefineTSParser(), DefineTSTemplate(), DefineType(), DefineView(), DropOwnedObjects(), DropSubscription(), elog, ereport, errcode(), errdetail(), errmsg, ERROR, EventTriggerAlterTableEnd(), EventTriggerAlterTableRelid(), EventTriggerAlterTableStart(), EventTriggerBeginCompleteQuery(), EventTriggerCollectAlterDefPrivs(), EventTriggerCollectSimpleCommand(), EventTriggerDDLCommandEnd(), EventTriggerDDLCommandStart(), EventTriggerEndCompleteQuery(), EventTriggerInhibitCommandCollection(), EventTriggerSQLDrop(), EventTriggerUndoInhibitCommandCollection(), ExecAlterDefaultPrivilegesStmt(), ExecAlterExtensionContentsStmt(), ExecAlterExtensionStmt(), ExecAlterObjectDependsStmt(), ExecAlterObjectSchemaStmt(), ExecAlterOwnerStmt(), ExecCreateTableAs(), ExecDropStmt(), ExecRefreshMatView(), ExecReindex(), ExecRenameStmt(), ExecSecLabelStmt(), ExecuteGrantStmt(), expandTableLikeClause(), fb(), find_all_inheritors(), get_rel_relkind(), HEAP_RELOPT_NAMESPACES, heap_reloptions(), ImportForeignSchema(), InvalidObjectAddress, InvalidOid, IsA, lfirst, lfirst_oid, linitial, list_concat(), list_delete_first(), list_free(), list_length(), makeNode, NewRelationCreateToastTable(), NIL, nodeTag, None_Receiver, NOTICE, OBJECT_AGGREGATE, OBJECT_COLLATION, OBJECT_OPERATOR, OBJECT_TSCONFIGURATION, OBJECT_TSDICTIONARY, OBJECT_TSPARSER, OBJECT_TSTEMPLATE, OBJECT_TYPE, ObjectAddress::objectId, OidIsValid, PG_END_TRY, PG_FINALLY, PG_TRY, PLAN_STMT_INTERNAL, PlannedStmt::planOrigin, PreventInTransactionBlock(), PROCESS_UTILITY_SUBCOMMAND, PROCESS_UTILITY_TOPLEVEL, ProcessUtility(), AlterTableUtilityContext::pstmt, RangeVarCallbackOwnsRelation(), RangeVarGetRelid, RangeVarGetRelidExtended(), CreateStmt::relation, RemoveUserMapping(), ShareLock, ShareUpdateExclusiveLock, stmt, PlannedStmt::stmt_len, PlannedStmt::stmt_location, AlterTableCmd::subtype, transformCreateStmt(), transformIndexStmt(), transformRelOptions(), transformStatsStmt(), and PlannedStmt::utilityStmt.

Referenced by standard_ProcessUtility().

◆ standard_ProcessUtility()

void standard_ProcessUtility ( PlannedStmt pstmt,
const char queryString,
bool  readOnlyTree,
ProcessUtilityContext  context,
ParamListInfo  params,
QueryEnvironment queryEnv,
DestReceiver dest,
QueryCompletion qc 
)

Definition at line 548 of file utility.c.

556{
557 Node *parsetree;
558 bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL);
560 ParseState *pstate;
561 int readonly_flags;
562
563 /* This can recurse, so check for excessive recursion */
565
566 /*
567 * If the given node tree is read-only, make a copy to ensure that parse
568 * transformations don't damage the original tree. This could be
569 * refactored to avoid making unnecessary copies in more cases, but it's
570 * not clear that it's worth a great deal of trouble over. Statements
571 * that are complex enough to be expensive to copy are exactly the ones
572 * we'd need to copy, so that only marginal savings seem possible.
573 */
574 if (readOnlyTree)
575 pstmt = copyObject(pstmt);
576 parsetree = pstmt->utilityStmt;
577
578 /* Prohibit read/write commands in read-only states. */
582 {
584
591 }
592
593 pstate = make_parsestate(NULL);
594 pstate->p_sourcetext = queryString;
595 pstate->p_queryEnv = queryEnv;
596
597 switch (nodeTag(parsetree))
598 {
599 /*
600 * ******************** transactions ********************
601 */
603 {
604 TransactionStmt *stmt = (TransactionStmt *) parsetree;
605
606 switch (stmt->kind)
607 {
608 /*
609 * START TRANSACTION, as defined by SQL99: Identical
610 * to BEGIN. Same code for both.
611 */
612 case TRANS_STMT_BEGIN:
613 case TRANS_STMT_START:
614 {
615 ListCell *lc;
616
618 foreach(lc, stmt->options)
619 {
620 DefElem *item = (DefElem *) lfirst(lc);
621
622 if (strcmp(item->defname, "transaction_isolation") == 0)
623 SetPGVariable("transaction_isolation",
624 list_make1(item->arg),
625 true);
626 else if (strcmp(item->defname, "transaction_read_only") == 0)
627 SetPGVariable("transaction_read_only",
628 list_make1(item->arg),
629 true);
630 else if (strcmp(item->defname, "transaction_deferrable") == 0)
631 SetPGVariable("transaction_deferrable",
632 list_make1(item->arg),
633 true);
634 }
635 }
636 break;
637
639 if (!EndTransactionBlock(stmt->chain))
640 {
641 /* report unsuccessful commit in qc */
642 if (qc)
644 }
645 break;
646
648 if (!PrepareTransactionBlock(stmt->gid))
649 {
650 /* report unsuccessful commit in qc */
651 if (qc)
653 }
654 break;
655
657 PreventInTransactionBlock(isTopLevel, "COMMIT PREPARED");
659 break;
660
662 PreventInTransactionBlock(isTopLevel, "ROLLBACK PREPARED");
663 FinishPreparedTransaction(stmt->gid, false);
664 break;
665
668 break;
669
672 DefineSavepoint(stmt->savepoint_name);
673 break;
674
676 RequireTransactionBlock(isTopLevel, "RELEASE SAVEPOINT");
677 ReleaseSavepoint(stmt->savepoint_name);
678 break;
679
681 RequireTransactionBlock(isTopLevel, "ROLLBACK TO SAVEPOINT");
682 RollbackToSavepoint(stmt->savepoint_name);
683
684 /*
685 * CommitTransactionCommand is in charge of
686 * re-defining the savepoint again
687 */
688 break;
689 }
690 }
691 break;
692
693 /*
694 * Portal (cursor) manipulation
695 */
697 PerformCursorOpen(pstate, (DeclareCursorStmt *) parsetree, params,
698 isTopLevel);
699 break;
700
702 {
703 ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
704
706 PerformPortalClose(stmt->portalname);
707 }
708 break;
709
710 case T_FetchStmt:
711 PerformPortalFetch((FetchStmt *) parsetree, dest, qc);
712 break;
713
714 case T_DoStmt:
715 ExecuteDoStmt(pstate, (DoStmt *) parsetree, isAtomicContext);
716 break;
717
719 /* no event triggers for global objects */
720 PreventInTransactionBlock(isTopLevel, "CREATE TABLESPACE");
722 break;
723
725 /* no event triggers for global objects */
726 PreventInTransactionBlock(isTopLevel, "DROP TABLESPACE");
727 DropTableSpace((DropTableSpaceStmt *) parsetree);
728 break;
729
731 /* no event triggers for global objects */
733 break;
734
735 case T_TruncateStmt:
736 ExecuteTruncate((TruncateStmt *) parsetree);
737 break;
738
739 case T_CopyStmt:
740 {
741 uint64 processed;
742
743 DoCopy(pstate, (CopyStmt *) parsetree,
744 pstmt->stmt_location, pstmt->stmt_len,
745 &processed);
746 if (qc)
747 SetQueryCompletion(qc, CMDTAG_COPY, processed);
748 }
749 break;
750
751 case T_PrepareStmt:
752 CheckRestrictedOperation("PREPARE");
753 PrepareQuery(pstate, (PrepareStmt *) parsetree,
754 pstmt->stmt_location, pstmt->stmt_len);
755 break;
756
757 case T_ExecuteStmt:
758 ExecuteQuery(pstate,
759 (ExecuteStmt *) parsetree, NULL,
760 params,
761 dest, qc);
762 break;
763
764 case T_DeallocateStmt:
765 CheckRestrictedOperation("DEALLOCATE");
766 DeallocateQuery((DeallocateStmt *) parsetree);
767 break;
768
769 case T_GrantRoleStmt:
770 /* no event triggers for global objects */
771 GrantRole(pstate, (GrantRoleStmt *) parsetree);
772 break;
773
774 case T_CreatedbStmt:
775 /* no event triggers for global objects */
776 PreventInTransactionBlock(isTopLevel, "CREATE DATABASE");
777 createdb(pstate, (CreatedbStmt *) parsetree);
778 break;
779
781 /* no event triggers for global objects */
782 AlterDatabase(pstate, (AlterDatabaseStmt *) parsetree, isTopLevel);
783 break;
784
786 /* no event triggers for global objects */
788 break;
789
791 /* no event triggers for global objects */
793 break;
794
795 case T_DropdbStmt:
796 /* no event triggers for global objects */
797 PreventInTransactionBlock(isTopLevel, "DROP DATABASE");
798 DropDatabase(pstate, (DropdbStmt *) parsetree);
799 break;
800
801 /* Query-level asynchronous notification */
802 case T_NotifyStmt:
803 {
804 NotifyStmt *stmt = (NotifyStmt *) parsetree;
805
806 Async_Notify(stmt->conditionname, stmt->payload);
807 }
808 break;
809
810 case T_ListenStmt:
811 {
812 ListenStmt *stmt = (ListenStmt *) parsetree;
813
814 CheckRestrictedOperation("LISTEN");
815
816 /*
817 * We don't allow LISTEN in background processes, as there is
818 * no mechanism for them to collect NOTIFY messages, so they'd
819 * just block cleanout of the async SLRU indefinitely.
820 * (Authors of custom background workers could bypass this
821 * restriction by calling Async_Listen directly, but then it's
822 * on them to provide some mechanism to process the message
823 * queue.) Note there seems no reason to forbid UNLISTEN.
824 */
828 /* translator: %s is name of a SQL command, eg LISTEN */
829 errmsg("cannot execute %s within a background process",
830 "LISTEN")));
831
832 Async_Listen(stmt->conditionname);
833 }
834 break;
835
836 case T_UnlistenStmt:
837 {
838 UnlistenStmt *stmt = (UnlistenStmt *) parsetree;
839
840 CheckRestrictedOperation("UNLISTEN");
841 if (stmt->conditionname)
842 Async_Unlisten(stmt->conditionname);
843 else
845 }
846 break;
847
848 case T_LoadStmt:
849 {
850 LoadStmt *stmt = (LoadStmt *) parsetree;
851
852 closeAllVfds(); /* probably not necessary... */
853 /* Allowed names are restricted if you're not superuser */
854 load_file(stmt->filename, !superuser());
855 }
856 break;
857
858 case T_CallStmt:
859 ExecuteCallStmt(castNode(CallStmt, parsetree), params, isAtomicContext, dest);
860 break;
861
862 case T_VacuumStmt:
863 ExecVacuum(pstate, (VacuumStmt *) parsetree, isTopLevel);
864 break;
865
866 case T_RepackStmt:
867 ExecRepack(pstate, (RepackStmt *) parsetree, isTopLevel);
868 break;
869
870 case T_ExplainStmt:
871 ExplainQuery(pstate, (ExplainStmt *) parsetree, params, dest);
872 break;
873
875 PreventInTransactionBlock(isTopLevel, "ALTER SYSTEM");
877 break;
878
881 break;
882
884 {
885 VariableShowStmt *n = (VariableShowStmt *) parsetree;
886
887 GetPGVariable(n->name, dest);
888 }
889 break;
890
891 case T_DiscardStmt:
892 /* should we allow DISCARD PLANS? */
893 CheckRestrictedOperation("DISCARD");
894 DiscardCommand((DiscardStmt *) parsetree, isTopLevel);
895 break;
896
898 /* no event triggers on event triggers */
900 break;
901
903 /* no event triggers on event triggers */
905 break;
906
907 /*
908 * ******************************** ROLE statements ****
909 */
910 case T_CreateRoleStmt:
911 /* no event triggers for global objects */
912 CreateRole(pstate, (CreateRoleStmt *) parsetree);
913 break;
914
915 case T_AlterRoleStmt:
916 /* no event triggers for global objects */
917 AlterRole(pstate, (AlterRoleStmt *) parsetree);
918 break;
919
921 /* no event triggers for global objects */
922 AlterRoleSet((AlterRoleSetStmt *) parsetree);
923 break;
924
925 case T_DropRoleStmt:
926 /* no event triggers for global objects */
927 DropRole((DropRoleStmt *) parsetree);
928 break;
929
931 /* no event triggers for global objects */
933 break;
934
935 case T_LockStmt:
936
937 /*
938 * Since the lock would just get dropped immediately, LOCK TABLE
939 * outside a transaction block is presumed to be user error.
940 */
941 RequireTransactionBlock(isTopLevel, "LOCK TABLE");
942 LockTableCommand((LockStmt *) parsetree);
943 break;
944
946 WarnNoTransactionBlock(isTopLevel, "SET CONSTRAINTS");
948 break;
949
950 case T_CheckPointStmt:
951 ExecCheckpoint(pstate, (CheckPointStmt *) parsetree);
952 break;
953
954 /*
955 * The following statements are supported by Event Triggers only
956 * in some cases, so we "fast path" them in the other cases.
957 */
958
959 case T_GrantStmt:
960 {
961 GrantStmt *stmt = (GrantStmt *) parsetree;
962
964 ProcessUtilitySlow(pstate, pstmt, queryString,
965 context, params, queryEnv,
966 dest, qc);
967 else
969 }
970 break;
971
972 case T_DropStmt:
973 {
974 DropStmt *stmt = (DropStmt *) parsetree;
975
976 if (EventTriggerSupportsObjectType(stmt->removeType))
977 ProcessUtilitySlow(pstate, pstmt, queryString,
978 context, params, queryEnv,
979 dest, qc);
980 else
982 }
983 break;
984
985 case T_RenameStmt:
986 {
987 RenameStmt *stmt = (RenameStmt *) parsetree;
988
989 if (EventTriggerSupportsObjectType(stmt->renameType))
990 ProcessUtilitySlow(pstate, pstmt, queryString,
991 context, params, queryEnv,
992 dest, qc);
993 else
995 }
996 break;
997
999 {
1001
1002 if (EventTriggerSupportsObjectType(stmt->objectType))
1003 ProcessUtilitySlow(pstate, pstmt, queryString,
1004 context, params, queryEnv,
1005 dest, qc);
1006 else
1008 }
1009 break;
1010
1012 {
1014
1015 if (EventTriggerSupportsObjectType(stmt->objectType))
1016 ProcessUtilitySlow(pstate, pstmt, queryString,
1017 context, params, queryEnv,
1018 dest, qc);
1019 else
1021 }
1022 break;
1023
1024 case T_AlterOwnerStmt:
1025 {
1026 AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree;
1027
1028 if (EventTriggerSupportsObjectType(stmt->objectType))
1029 ProcessUtilitySlow(pstate, pstmt, queryString,
1030 context, params, queryEnv,
1031 dest, qc);
1032 else
1034 }
1035 break;
1036
1037 case T_CommentStmt:
1038 {
1039 CommentStmt *stmt = (CommentStmt *) parsetree;
1040
1042 ProcessUtilitySlow(pstate, pstmt, queryString,
1043 context, params, queryEnv,
1044 dest, qc);
1045 else
1047 break;
1048 }
1049
1050 case T_SecLabelStmt:
1051 {
1052 SecLabelStmt *stmt = (SecLabelStmt *) parsetree;
1053
1055 ProcessUtilitySlow(pstate, pstmt, queryString,
1056 context, params, queryEnv,
1057 dest, qc);
1058 else
1060 break;
1061 }
1062
1063 case T_WaitStmt:
1064 {
1065 ExecWaitStmt(pstate, (WaitStmt *) parsetree, isTopLevel,
1066 dest);
1067 }
1068 break;
1069
1070 default:
1071 /* All other statement types have event trigger support */
1072 ProcessUtilitySlow(pstate, pstmt, queryString,
1073 context, params, queryEnv,
1074 dest, qc);
1075 break;
1076 }
1077
1078 free_parsestate(pstate);
1079
1080 /*
1081 * Make effects of commands visible, for instance so that
1082 * PreCommit_on_commit_actions() can see them (see for example bug
1083 * #15631).
1084 */
1086}
void Async_UnlistenAll(void)
Definition async.c:1075
void Async_Unlisten(const char *channel)
Definition async.c:1057
void Async_Listen(const char *channel)
Definition async.c:1043
void Async_Notify(const char *channel, const char *payload)
Definition async.c:894
void DoCopy(ParseState *pstate, const CopyStmt *stmt, int stmt_location, int stmt_len, uint64 *processed)
Definition copy.c:63
void PrepareQuery(ParseState *pstate, PrepareStmt *stmt, int stmt_location, int stmt_len)
Definition prepare.c:61
void ExecuteQuery(ParseState *pstate, ExecuteStmt *stmt, IntoClause *intoClause, ParamListInfo params, DestReceiver *dest, QueryCompletion *qc)
Definition prepare.c:152
void DeallocateQuery(DeallocateStmt *stmt)
Definition prepare.c:507
Oid AlterTableSpaceOptions(AlterTableSpaceOptionsStmt *stmt)
void DropTableSpace(DropTableSpaceStmt *stmt)
Definition tablespace.c:403
Oid CreateTableSpace(CreateTableSpaceStmt *stmt)
Definition tablespace.c:210
uint64_t uint64
Definition c.h:625
void ExecCheckpoint(ParseState *pstate, CheckPointStmt *stmt)
const char * GetCommandTagName(CommandTag commandTag)
Definition cmdtag.c:47
static void SetQueryCompletion(QueryCompletion *qc, CommandTag commandTag, uint64 nprocessed)
Definition cmdtag.h:37
ObjectAddress AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt)
Oid createdb(ParseState *pstate, const CreatedbStmt *stmt)
Definition dbcommands.c:687
Oid AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel)
void DropDatabase(ParseState *pstate, DropdbStmt *stmt)
Oid AlterDatabaseSet(AlterDatabaseSetStmt *stmt)
void load_file(const char *filename, bool restricted)
Definition dfmgr.c:149
void DiscardCommand(DiscardStmt *stmt, bool isTopLevel)
Definition discard.c:32
bool EventTriggerSupportsObjectType(ObjectType obtype)
Oid CreateEventTrigger(CreateEventTrigStmt *stmt)
Oid AlterEventTrigger(AlterEventTrigStmt *stmt)
void ExplainQuery(ParseState *pstate, ExplainStmt *stmt, ParamListInfo params, DestReceiver *dest)
Definition explain.c:181
void closeAllVfds(void)
Definition fd.c:3068
void ExecuteCallStmt(CallStmt *stmt, ParamListInfo params, bool atomic, DestReceiver *dest)
void ExecuteDoStmt(ParseState *pstate, DoStmt *stmt, bool atomic)
void AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
Definition guc.c:4508
void GetPGVariable(const char *name, DestReceiver *dest)
Definition guc_funcs.c:410
void SetPGVariable(const char *name, List *args, bool is_local)
Definition guc_funcs.c:343
void ExecSetVariableStmt(VariableSetStmt *stmt, bool isTopLevel)
Definition guc_funcs.c:45
void LockTableCommand(LockStmt *lockstmt)
Definition lockcmds.c:41
@ B_BACKEND
Definition miscadmin.h:354
BackendType MyBackendType
Definition miscinit.c:65
#define copyObject(obj)
Definition nodes.h:232
#define castNode(_type_, nodeptr)
Definition nodes.h:182
void free_parsestate(ParseState *pstate)
Definition parse_node.c:72
ParseState * make_parsestate(ParseState *parentParseState)
Definition parse_node.c:39
#define list_make1(x1)
Definition pg_list.h:244
void PerformCursorOpen(ParseState *pstate, DeclareCursorStmt *cstmt, ParamListInfo params, bool isTopLevel)
Definition portalcmds.c:45
void PerformPortalClose(const char *name)
Definition portalcmds.c:225
void PerformPortalFetch(FetchStmt *stmt, DestReceiver *dest, QueryCompletion *qc)
Definition portalcmds.c:178
void ExecRepack(ParseState *pstate, RepackStmt *stmt, bool isTopLevel)
Definition repack.c:237
void check_stack_depth(void)
Definition stack_depth.c:95
Node * arg
Definition parsenodes.h:861
QueryEnvironment * p_queryEnv
Definition parse_node.h:241
const char * p_sourcetext
Definition parse_node.h:214
bool superuser(void)
Definition superuser.c:47
void ExecuteTruncate(TruncateStmt *stmt)
Definition tablecmds.c:1890
void AfterTriggerSetState(ConstraintsSetStmt *stmt)
Definition trigger.c:5821
void FinishPreparedTransaction(const char *gid, bool isCommit)
Definition twophase.c:1503
void ReassignOwnedObjects(ReassignOwnedStmt *stmt)
Definition user.c:1624
Oid AlterRole(ParseState *pstate, AlterRoleStmt *stmt)
Definition user.c:626
Oid AlterRoleSet(AlterRoleSetStmt *stmt)
Definition user.c:1007
void DropRole(DropRoleStmt *stmt)
Definition user.c:1097
Oid CreateRole(ParseState *pstate, CreateRoleStmt *stmt)
Definition user.c:133
void GrantRole(ParseState *pstate, GrantRoleStmt *stmt)
Definition user.c:1493
static int ClassifyUtilityCommandAsReadOnly(Node *parsetree)
Definition utility.c:130
void PreventCommandIfReadOnly(const char *cmdname)
Definition utility.c:409
void PreventCommandIfParallelMode(const char *cmdname)
Definition utility.c:427
static void CheckRestrictedOperation(const char *cmdname)
Definition utility.c:464
void PreventCommandDuringRecovery(const char *cmdname)
Definition utility.c:446
static void ProcessUtilitySlow(ParseState *pstate, PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
Definition utility.c:1094
#define COMMAND_OK_IN_PARALLEL_MODE
Definition utility.h:57
@ PROCESS_UTILITY_QUERY_NONATOMIC
Definition utility.h:24
void ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
Definition vacuum.c:163
void ExecWaitStmt(ParseState *pstate, WaitStmt *stmt, bool isTopLevel, DestReceiver *dest)
Definition wait.c:34
void WarnNoTransactionBlock(bool isTopLevel, const char *stmtType)
Definition xact.c:3761
void UserAbortTransactionBlock(bool chain)
Definition xact.c:4255
bool PrepareTransactionBlock(const char *gid)
Definition xact.c:4043
void RequireTransactionBlock(bool isTopLevel, const char *stmtType)
Definition xact.c:3767
void DefineSavepoint(const char *name)
Definition xact.c:4424
void ReleaseSavepoint(const char *name)
Definition xact.c:4509
bool IsTransactionBlock(void)
Definition xact.c:5022
void BeginTransactionBlock(void)
Definition xact.c:3975
void RollbackToSavepoint(const char *name)
Definition xact.c:4618
bool EndTransactionBlock(bool chain)
Definition xact.c:4095

References AfterTriggerSetState(), AlterDatabase(), AlterDatabaseRefreshColl(), AlterDatabaseSet(), AlterEventTrigger(), AlterRole(), AlterRoleSet(), AlterSystemSetConfigFile(), AlterTableSpaceOptions(), DefElem::arg, Async_Listen(), Async_Notify(), Async_Unlisten(), Async_UnlistenAll(), B_BACKEND, BeginTransactionBlock(), castNode, check_stack_depth(), CheckRestrictedOperation(), ClassifyUtilityCommandAsReadOnly(), closeAllVfds(), COMMAND_IS_STRICTLY_READ_ONLY, COMMAND_OK_IN_PARALLEL_MODE, COMMAND_OK_IN_READ_ONLY_TXN, COMMAND_OK_IN_RECOVERY, CommandCounterIncrement(), CommentObject(), copyObject, CreateCommandTag(), createdb(), CreateEventTrigger(), CreateRole(), CreateTableSpace(), DeallocateQuery(), DefineSavepoint(), DefElem::defname, DiscardCommand(), DoCopy(), DropDatabase(), DropRole(), DropTableSpace(), EndTransactionBlock(), ereport, errcode(), errmsg, ERROR, EventTriggerSupportsObjectType(), ExecAlterObjectDependsStmt(), ExecAlterObjectSchemaStmt(), ExecAlterOwnerStmt(), ExecCheckpoint(), ExecDropStmt(), ExecRenameStmt(), ExecRepack(), ExecSecLabelStmt(), ExecSetVariableStmt(), ExecuteCallStmt(), ExecuteDoStmt(), ExecuteGrantStmt(), ExecuteQuery(), ExecuteTruncate(), ExecVacuum(), ExecWaitStmt(), ExplainQuery(), fb(), FinishPreparedTransaction(), free_parsestate(), GetCommandTagName(), GetPGVariable(), GrantRole(), IsInParallelMode(), IsTransactionBlock(), lfirst, list_make1, load_file(), LockTableCommand(), make_parsestate(), MyBackendType, VariableShowStmt::name, nodeTag, ParseState::p_queryEnv, ParseState::p_sourcetext, PerformCursorOpen(), PerformPortalClose(), PerformPortalFetch(), PrepareQuery(), PrepareTransactionBlock(), PreventCommandDuringRecovery(), PreventCommandIfParallelMode(), PreventCommandIfReadOnly(), PreventInTransactionBlock(), PROCESS_UTILITY_QUERY_NONATOMIC, PROCESS_UTILITY_TOPLEVEL, ProcessUtilitySlow(), ReassignOwnedObjects(), ReleaseSavepoint(), RequireTransactionBlock(), RollbackToSavepoint(), SetPGVariable(), SetQueryCompletion(), stmt, PlannedStmt::stmt_len, PlannedStmt::stmt_location, superuser(), TRANS_STMT_BEGIN, TRANS_STMT_COMMIT, TRANS_STMT_COMMIT_PREPARED, TRANS_STMT_PREPARE, TRANS_STMT_RELEASE, TRANS_STMT_ROLLBACK, TRANS_STMT_ROLLBACK_PREPARED, TRANS_STMT_ROLLBACK_TO, TRANS_STMT_SAVEPOINT, TRANS_STMT_START, UserAbortTransactionBlock(), PlannedStmt::utilityStmt, WarnNoTransactionBlock(), and XactReadOnly.

Referenced by pgss_ProcessUtility(), ProcessUtility(), REGRESS_utility_command(), and sepgsql_utility_command().

◆ UtilityContainsQuery()

Query * UtilityContainsQuery ( Node parsetree)

Definition at line 2199 of file utility.c.

2200{
2201 Query *qry;
2202
2203 switch (nodeTag(parsetree))
2204 {
2206 qry = castNode(Query, ((DeclareCursorStmt *) parsetree)->query);
2207 if (qry->commandType == CMD_UTILITY)
2208 return UtilityContainsQuery(qry->utilityStmt);
2209 return qry;
2210
2211 case T_ExplainStmt:
2212 qry = castNode(Query, ((ExplainStmt *) parsetree)->query);
2213 if (qry->commandType == CMD_UTILITY)
2214 return UtilityContainsQuery(qry->utilityStmt);
2215 return qry;
2216
2218 qry = castNode(Query, ((CreateTableAsStmt *) parsetree)->query);
2219 if (qry->commandType == CMD_UTILITY)
2220 return UtilityContainsQuery(qry->utilityStmt);
2221 return qry;
2222
2223 default:
2224 return NULL;
2225 }
2226}
CmdType commandType
Definition parsenodes.h:121
Node * utilityStmt
Definition parsenodes.h:141
Query * UtilityContainsQuery(Node *parsetree)
Definition utility.c:2199

References castNode, CMD_UTILITY, Query::commandType, fb(), nodeTag, UtilityContainsQuery(), and Query::utilityStmt.

Referenced by AcquireExecutorLocks(), AcquirePlannerLocks(), extract_query_dependencies_walker(), and UtilityContainsQuery().

◆ UtilityReturnsTuples()

bool UtilityReturnsTuples ( Node parsetree)

Definition at line 2042 of file utility.c.

2043{
2044 switch (nodeTag(parsetree))
2045 {
2046 case T_CallStmt:
2047 {
2048 CallStmt *stmt = (CallStmt *) parsetree;
2049
2050 return (stmt->funcexpr->funcresulttype == RECORDOID);
2051 }
2052 case T_FetchStmt:
2053 {
2054 FetchStmt *stmt = (FetchStmt *) parsetree;
2055 Portal portal;
2056
2057 if (stmt->ismove)
2058 return false;
2059 portal = GetPortalByName(stmt->portalname);
2060 if (!PortalIsValid(portal))
2061 return false; /* not our business to raise error */
2062 return portal->tupDesc ? true : false;
2063 }
2064
2065 case T_ExecuteStmt:
2066 {
2067 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
2068 PreparedStatement *entry;
2069
2070 entry = FetchPreparedStatement(stmt->name, false);
2071 if (!entry)
2072 return false; /* not our business to raise error */
2073 if (entry->plansource->resultDesc)
2074 return true;
2075 return false;
2076 }
2077
2078 case T_ExplainStmt:
2079 return true;
2080
2081 case T_VariableShowStmt:
2082 return true;
2083
2084 case T_WaitStmt:
2085 return true;
2086
2087 default:
2088 return false;
2089 }
2090}
return true
Definition isn.c:130
#define PortalIsValid(p)
Definition portal.h:211
Portal GetPortalByName(const char *name)
Definition portalmem.c:132
TupleDesc resultDesc
Definition plancache.h:120
TupleDesc tupDesc
Definition portal.h:159
CachedPlanSource * plansource
Definition prepare.h:32

References fb(), FetchPreparedStatement(), GetPortalByName(), nodeTag, PreparedStatement::plansource, PortalIsValid, CachedPlanSource::resultDesc, stmt, true, and PortalData::tupDesc.

Referenced by ChoosePortalStrategy().

◆ UtilityTupleDescriptor()

TupleDesc UtilityTupleDescriptor ( Node parsetree)

Definition at line 2101 of file utility.c.

2102{
2103 switch (nodeTag(parsetree))
2104 {
2105 case T_CallStmt:
2106 return CallStmtResultDesc((CallStmt *) parsetree);
2107
2108 case T_FetchStmt:
2109 {
2110 FetchStmt *stmt = (FetchStmt *) parsetree;
2111 Portal portal;
2112
2113 if (stmt->ismove)
2114 return NULL;
2115 portal = GetPortalByName(stmt->portalname);
2116 if (!PortalIsValid(portal))
2117 return NULL; /* not our business to raise error */
2118 return CreateTupleDescCopy(portal->tupDesc);
2119 }
2120
2121 case T_ExecuteStmt:
2122 {
2123 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
2124 PreparedStatement *entry;
2125
2126 entry = FetchPreparedStatement(stmt->name, false);
2127 if (!entry)
2128 return NULL; /* not our business to raise error */
2130 }
2131
2132 case T_ExplainStmt:
2133 return ExplainResultDesc((ExplainStmt *) parsetree);
2134
2135 case T_VariableShowStmt:
2136 {
2137 VariableShowStmt *n = (VariableShowStmt *) parsetree;
2138
2139 return GetPGVariableResultDesc(n->name);
2140 }
2141
2142 case T_WaitStmt:
2143 return WaitStmtResultDesc((WaitStmt *) parsetree);
2144
2145 default:
2146 return NULL;
2147 }
2148}
TupleDesc FetchPreparedStatementResultDesc(PreparedStatement *stmt)
Definition prepare.c:468
TupleDesc ExplainResultDesc(ExplainStmt *stmt)
Definition explain.c:259
TupleDesc CallStmtResultDesc(CallStmt *stmt)
TupleDesc GetPGVariableResultDesc(const char *name)
Definition guc_funcs.c:422
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
Definition tupdesc.c:242
TupleDesc WaitStmtResultDesc(WaitStmt *stmt)
Definition wait.c:345

References CallStmtResultDesc(), CreateTupleDescCopy(), ExplainResultDesc(), fb(), FetchPreparedStatement(), FetchPreparedStatementResultDesc(), GetPGVariableResultDesc(), GetPortalByName(), VariableShowStmt::name, nodeTag, PortalIsValid, stmt, PortalData::tupDesc, and WaitStmtResultDesc().

Referenced by PlanCacheComputeResultDesc(), and PortalStart().

Variable Documentation

◆ ProcessUtility_hook

ProcessUtility_hook_type ProcessUtility_hook = NULL

Definition at line 72 of file utility.c.

Referenced by _PG_init(), and ProcessUtility().