PostgreSQL Source Code git master
Loading...
Searching...
No Matches
utility.h File Reference
#include "tcop/cmdtag.h"
#include "tcop/tcopprot.h"
Include dependency graph for utility.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  AlterTableUtilityContext
 

Macros

#define COMMAND_OK_IN_READ_ONLY_TXN   0x0001
 
#define COMMAND_OK_IN_PARALLEL_MODE   0x0002
 
#define COMMAND_OK_IN_RECOVERY   0x0004
 
#define COMMAND_IS_STRICTLY_READ_ONLY
 
#define COMMAND_IS_NOT_READ_ONLY   0
 

Typedefs

typedef struct AlterTableUtilityContext AlterTableUtilityContext
 
typedef void(* ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
 

Enumerations

enum  ProcessUtilityContext { PROCESS_UTILITY_TOPLEVEL , PROCESS_UTILITY_QUERY , PROCESS_UTILITY_QUERY_NONATOMIC , PROCESS_UTILITY_SUBCOMMAND }
 

Functions

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)
 
CommandTag CreateCommandTag (Node *parsetree)
 
static const charCreateCommandName (Node *parsetree)
 
LogStmtLevel GetCommandLogLevel (Node *parsetree)
 
bool CommandIsReadOnly (PlannedStmt *pstmt)
 

Variables

PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook
 

Macro Definition Documentation

◆ COMMAND_IS_NOT_READ_ONLY

#define COMMAND_IS_NOT_READ_ONLY   0

Definition at line 68 of file utility.h.

◆ COMMAND_IS_STRICTLY_READ_ONLY

#define COMMAND_IS_STRICTLY_READ_ONLY
Value:
#define COMMAND_OK_IN_PARALLEL_MODE
Definition utility.h:57
#define COMMAND_OK_IN_RECOVERY
Definition utility.h:58
#define COMMAND_OK_IN_READ_ONLY_TXN
Definition utility.h:56

Definition at line 65 of file utility.h.

104{
105 return GetCommandTagName(CreateCommandTag(parsetree));
106}
107
108extern LogStmtLevel GetCommandLogLevel(Node *parsetree);
109
110extern bool CommandIsReadOnly(PlannedStmt *pstmt);
111
112#endif /* UTILITY_H */
const char * GetCommandTagName(CommandTag commandTag)
Definition cmdtag.c:47
Definition nodes.h:135
LogStmtLevel
Definition tcopprot.h:33
bool CommandIsReadOnly(PlannedStmt *pstmt)
Definition utility.c:96
CommandTag CreateCommandTag(Node *parsetree)
Definition utility.c:2384
LogStmtLevel GetCommandLogLevel(Node *parsetree)
Definition utility.c:3289

◆ COMMAND_OK_IN_PARALLEL_MODE

#define COMMAND_OK_IN_PARALLEL_MODE   0x0002

Definition at line 57 of file utility.h.

◆ COMMAND_OK_IN_READ_ONLY_TXN

#define COMMAND_OK_IN_READ_ONLY_TXN   0x0001

Definition at line 56 of file utility.h.

◆ COMMAND_OK_IN_RECOVERY

#define COMMAND_OK_IN_RECOVERY   0x0004

Definition at line 58 of file utility.h.

Typedef Documentation

◆ AlterTableUtilityContext

◆ ProcessUtility_hook_type

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

Definition at line 71 of file utility.h.

Enumeration Type Documentation

◆ ProcessUtilityContext

Enumerator
PROCESS_UTILITY_TOPLEVEL 
PROCESS_UTILITY_QUERY 
PROCESS_UTILITY_QUERY_NONATOMIC 
PROCESS_UTILITY_SUBCOMMAND 

Definition at line 20 of file utility.h.

21{
22 PROCESS_UTILITY_TOPLEVEL, /* toplevel interactive command */
23 PROCESS_UTILITY_QUERY, /* a complete query, but not toplevel */
24 PROCESS_UTILITY_QUERY_NONATOMIC, /* a complete query, nonatomic
25 * execution context */
26 PROCESS_UTILITY_SUBCOMMAND, /* a portion of a query */
ProcessUtilityContext
Definition utility.h:21
@ PROCESS_UTILITY_SUBCOMMAND
Definition utility.h:26
@ PROCESS_UTILITY_TOPLEVEL
Definition utility.h:22
@ PROCESS_UTILITY_QUERY_NONATOMIC
Definition utility.h:24
@ PROCESS_UTILITY_QUERY
Definition utility.h:23

Function Documentation

◆ CommandIsReadOnly()

bool CommandIsReadOnly ( PlannedStmt pstmt)
extern

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:945
#define WARNING
Definition elog.h:36
#define elog(elevel,...)
Definition elog.h:226
#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:139
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().

◆ CreateCommandName()

static const char * CreateCommandName ( Node parsetree)
inlinestatic

◆ CreateCommandTag()

CommandTag CreateCommandTag ( Node parsetree)
extern

Definition at line 2384 of file utility.c.

2385{
2386 CommandTag tag;
2387
2388 switch (nodeTag(parsetree))
2389 {
2390 /* recurse if we're given a RawStmt */
2391 case T_RawStmt:
2392 tag = CreateCommandTag(((RawStmt *) parsetree)->stmt);
2393 break;
2394
2395 /* raw plannable queries */
2396 case T_InsertStmt:
2397 tag = CMDTAG_INSERT;
2398 break;
2399
2400 case T_DeleteStmt:
2401 tag = CMDTAG_DELETE;
2402 break;
2403
2404 case T_UpdateStmt:
2405 tag = CMDTAG_UPDATE;
2406 break;
2407
2408 case T_MergeStmt:
2409 tag = CMDTAG_MERGE;
2410 break;
2411
2412 case T_SelectStmt:
2413 tag = CMDTAG_SELECT;
2414 break;
2415
2416 case T_PLAssignStmt:
2417 tag = CMDTAG_SELECT;
2418 break;
2419
2420 /* utility statements --- same whether raw or cooked */
2421 case T_TransactionStmt:
2422 {
2423 TransactionStmt *stmt = (TransactionStmt *) parsetree;
2424
2425 switch (stmt->kind)
2426 {
2427 case TRANS_STMT_BEGIN:
2428 tag = CMDTAG_BEGIN;
2429 break;
2430
2431 case TRANS_STMT_START:
2433 break;
2434
2435 case TRANS_STMT_COMMIT:
2436 tag = CMDTAG_COMMIT;
2437 break;
2438
2441 tag = CMDTAG_ROLLBACK;
2442 break;
2443
2445 tag = CMDTAG_SAVEPOINT;
2446 break;
2447
2448 case TRANS_STMT_RELEASE:
2449 tag = CMDTAG_RELEASE;
2450 break;
2451
2452 case TRANS_STMT_PREPARE:
2454 break;
2455
2458 break;
2459
2462 break;
2463
2464 default:
2465 tag = CMDTAG_UNKNOWN;
2466 break;
2467 }
2468 }
2469 break;
2470
2473 break;
2474
2475 case T_ClosePortalStmt:
2476 {
2477 ClosePortalStmt *stmt = (ClosePortalStmt *) parsetree;
2478
2479 if (stmt->portalname == NULL)
2481 else
2482 tag = CMDTAG_CLOSE_CURSOR;
2483 }
2484 break;
2485
2486 case T_FetchStmt:
2487 {
2488 FetchStmt *stmt = (FetchStmt *) parsetree;
2489
2490 tag = (stmt->ismove) ? CMDTAG_MOVE : CMDTAG_FETCH;
2491 }
2492 break;
2493
2494 case T_CreateDomainStmt:
2496 break;
2497
2498 case T_CreateSchemaStmt:
2500 break;
2501
2502 case T_CreateStmt:
2503 tag = CMDTAG_CREATE_TABLE;
2504 break;
2505
2508 break;
2509
2512 break;
2513
2516 break;
2517
2520 break;
2521
2524 break;
2525
2528 break;
2529
2530 case T_CreateFdwStmt:
2532 break;
2533
2534 case T_AlterFdwStmt:
2536 break;
2537
2540 break;
2541
2543 tag = CMDTAG_ALTER_SERVER;
2544 break;
2545
2548 break;
2549
2552 break;
2553
2556 break;
2557
2560 break;
2561
2564 break;
2565
2566 case T_DropStmt:
2567 switch (((DropStmt *) parsetree)->removeType)
2568 {
2569 case OBJECT_TABLE:
2570 tag = CMDTAG_DROP_TABLE;
2571 break;
2572 case OBJECT_SEQUENCE:
2574 break;
2575 case OBJECT_VIEW:
2576 tag = CMDTAG_DROP_VIEW;
2577 break;
2578 case OBJECT_MATVIEW:
2580 break;
2581 case OBJECT_INDEX:
2582 tag = CMDTAG_DROP_INDEX;
2583 break;
2584 case OBJECT_PROPGRAPH:
2586 break;
2587 case OBJECT_TYPE:
2588 tag = CMDTAG_DROP_TYPE;
2589 break;
2590 case OBJECT_DOMAIN:
2591 tag = CMDTAG_DROP_DOMAIN;
2592 break;
2593 case OBJECT_COLLATION:
2595 break;
2596 case OBJECT_CONVERSION:
2598 break;
2599 case OBJECT_SCHEMA:
2600 tag = CMDTAG_DROP_SCHEMA;
2601 break;
2602 case OBJECT_TSPARSER:
2604 break;
2607 break;
2608 case OBJECT_TSTEMPLATE:
2610 break;
2613 break;
2616 break;
2617 case OBJECT_EXTENSION:
2619 break;
2620 case OBJECT_FUNCTION:
2622 break;
2623 case OBJECT_PROCEDURE:
2625 break;
2626 case OBJECT_ROUTINE:
2627 tag = CMDTAG_DROP_ROUTINE;
2628 break;
2629 case OBJECT_AGGREGATE:
2631 break;
2632 case OBJECT_OPERATOR:
2634 break;
2635 case OBJECT_LANGUAGE:
2637 break;
2638 case OBJECT_CAST:
2639 tag = CMDTAG_DROP_CAST;
2640 break;
2641 case OBJECT_TRIGGER:
2642 tag = CMDTAG_DROP_TRIGGER;
2643 break;
2646 break;
2647 case OBJECT_RULE:
2648 tag = CMDTAG_DROP_RULE;
2649 break;
2650 case OBJECT_FDW:
2652 break;
2654 tag = CMDTAG_DROP_SERVER;
2655 break;
2656 case OBJECT_OPCLASS:
2658 break;
2659 case OBJECT_OPFAMILY:
2661 break;
2662 case OBJECT_POLICY:
2663 tag = CMDTAG_DROP_POLICY;
2664 break;
2665 case OBJECT_TRANSFORM:
2667 break;
2670 break;
2671 case OBJECT_PUBLICATION:
2673 break;
2676 break;
2677 default:
2678 tag = CMDTAG_UNKNOWN;
2679 }
2680 break;
2681
2682 case T_TruncateStmt:
2684 break;
2685
2686 case T_CommentStmt:
2687 tag = CMDTAG_COMMENT;
2688 break;
2689
2690 case T_SecLabelStmt:
2692 break;
2693
2694 case T_CopyStmt:
2695 tag = CMDTAG_COPY;
2696 break;
2697
2698 case T_RenameStmt:
2699
2700 /*
2701 * When the column is renamed, the command tag is created from its
2702 * relation type
2703 */
2704 tag = AlterObjectTypeCommandTag(((RenameStmt *) parsetree)->renameType == OBJECT_COLUMN ?
2705 ((RenameStmt *) parsetree)->relationType :
2706 ((RenameStmt *) parsetree)->renameType);
2707 break;
2708
2710 tag = AlterObjectTypeCommandTag(((AlterObjectDependsStmt *) parsetree)->objectType);
2711 break;
2712
2714 tag = AlterObjectTypeCommandTag(((AlterObjectSchemaStmt *) parsetree)->objectType);
2715 break;
2716
2717 case T_AlterOwnerStmt:
2718 tag = AlterObjectTypeCommandTag(((AlterOwnerStmt *) parsetree)->objectType);
2719 break;
2720
2722 tag = AlterObjectTypeCommandTag(((AlterTableMoveAllStmt *) parsetree)->objtype);
2723 break;
2724
2725 case T_AlterTableStmt:
2726 tag = AlterObjectTypeCommandTag(((AlterTableStmt *) parsetree)->objtype);
2727 break;
2728
2729 case T_AlterDomainStmt:
2730 tag = CMDTAG_ALTER_DOMAIN;
2731 break;
2732
2734 switch (((AlterFunctionStmt *) parsetree)->objtype)
2735 {
2736 case OBJECT_FUNCTION:
2738 break;
2739 case OBJECT_PROCEDURE:
2741 break;
2742 case OBJECT_ROUTINE:
2744 break;
2745 default:
2746 tag = CMDTAG_UNKNOWN;
2747 }
2748 break;
2749
2750 case T_GrantStmt:
2751 {
2752 GrantStmt *stmt = (GrantStmt *) parsetree;
2753
2754 tag = (stmt->is_grant) ? CMDTAG_GRANT : CMDTAG_REVOKE;
2755 }
2756 break;
2757
2758 case T_GrantRoleStmt:
2759 {
2760 GrantRoleStmt *stmt = (GrantRoleStmt *) parsetree;
2761
2762 tag = (stmt->is_grant) ? CMDTAG_GRANT_ROLE : CMDTAG_REVOKE_ROLE;
2763 }
2764 break;
2765
2768 break;
2769
2770 case T_DefineStmt:
2771 switch (((DefineStmt *) parsetree)->kind)
2772 {
2773 case OBJECT_AGGREGATE:
2775 break;
2776 case OBJECT_OPERATOR:
2778 break;
2779 case OBJECT_TYPE:
2780 tag = CMDTAG_CREATE_TYPE;
2781 break;
2782 case OBJECT_TSPARSER:
2784 break;
2787 break;
2788 case OBJECT_TSTEMPLATE:
2790 break;
2793 break;
2794 case OBJECT_COLLATION:
2796 break;
2799 break;
2800 default:
2801 tag = CMDTAG_UNKNOWN;
2802 }
2803 break;
2804
2806 tag = CMDTAG_CREATE_TYPE;
2807 break;
2808
2809 case T_CreateEnumStmt:
2810 tag = CMDTAG_CREATE_TYPE;
2811 break;
2812
2813 case T_CreateRangeStmt:
2814 tag = CMDTAG_CREATE_TYPE;
2815 break;
2816
2817 case T_AlterEnumStmt:
2818 tag = CMDTAG_ALTER_TYPE;
2819 break;
2820
2821 case T_ViewStmt:
2822 tag = CMDTAG_CREATE_VIEW;
2823 break;
2824
2826 if (((CreateFunctionStmt *) parsetree)->is_procedure)
2828 else
2830 break;
2831
2832 case T_IndexStmt:
2833 tag = CMDTAG_CREATE_INDEX;
2834 break;
2835
2836 case T_RuleStmt:
2837 tag = CMDTAG_CREATE_RULE;
2838 break;
2839
2840 case T_CreateSeqStmt:
2842 break;
2843
2844 case T_AlterSeqStmt:
2846 break;
2847
2848 case T_DoStmt:
2849 tag = CMDTAG_DO;
2850 break;
2851
2852 case T_CreatedbStmt:
2854 break;
2855
2860 break;
2861
2862 case T_DropdbStmt:
2864 break;
2865
2866 case T_NotifyStmt:
2867 tag = CMDTAG_NOTIFY;
2868 break;
2869
2870 case T_ListenStmt:
2871 tag = CMDTAG_LISTEN;
2872 break;
2873
2874 case T_UnlistenStmt:
2875 tag = CMDTAG_UNLISTEN;
2876 break;
2877
2878 case T_LoadStmt:
2879 tag = CMDTAG_LOAD;
2880 break;
2881
2882 case T_CallStmt:
2883 tag = CMDTAG_CALL;
2884 break;
2885
2886 case T_VacuumStmt:
2887 if (((VacuumStmt *) parsetree)->is_vacuumcmd)
2888 tag = CMDTAG_VACUUM;
2889 else
2890 tag = CMDTAG_ANALYZE;
2891 break;
2892
2893 case T_RepackStmt:
2894 if (((RepackStmt *) parsetree)->command == REPACK_COMMAND_CLUSTER)
2895 tag = CMDTAG_CLUSTER;
2896 else
2897 tag = CMDTAG_REPACK;
2898 break;
2899
2900 case T_ExplainStmt:
2901 tag = CMDTAG_EXPLAIN;
2902 break;
2903
2905 switch (((CreateTableAsStmt *) parsetree)->objtype)
2906 {
2907 case OBJECT_TABLE:
2908 if (((CreateTableAsStmt *) parsetree)->is_select_into)
2909 tag = CMDTAG_SELECT_INTO;
2910 else
2912 break;
2913 case OBJECT_MATVIEW:
2915 break;
2916 default:
2917 tag = CMDTAG_UNKNOWN;
2918 }
2919 break;
2920
2923 break;
2924
2925 case T_AlterSystemStmt:
2926 tag = CMDTAG_ALTER_SYSTEM;
2927 break;
2928
2929 case T_VariableSetStmt:
2930 switch (((VariableSetStmt *) parsetree)->kind)
2931 {
2932 case VAR_SET_VALUE:
2933 case VAR_SET_CURRENT:
2934 case VAR_SET_DEFAULT:
2935 case VAR_SET_MULTI:
2936 tag = CMDTAG_SET;
2937 break;
2938 case VAR_RESET:
2939 case VAR_RESET_ALL:
2940 tag = CMDTAG_RESET;
2941 break;
2942 default:
2943 tag = CMDTAG_UNKNOWN;
2944 }
2945 break;
2946
2947 case T_VariableShowStmt:
2948 tag = CMDTAG_SHOW;
2949 break;
2950
2951 case T_DiscardStmt:
2952 switch (((DiscardStmt *) parsetree)->target)
2953 {
2954 case DISCARD_ALL:
2955 tag = CMDTAG_DISCARD_ALL;
2956 break;
2957 case DISCARD_PLANS:
2959 break;
2960 case DISCARD_TEMP:
2961 tag = CMDTAG_DISCARD_TEMP;
2962 break;
2963 case DISCARD_SEQUENCES:
2965 break;
2966 default:
2967 tag = CMDTAG_UNKNOWN;
2968 }
2969 break;
2970
2973 break;
2974
2977 break;
2978
2981 break;
2982
2983 case T_CreateTrigStmt:
2985 break;
2986
2989 break;
2990
2993 break;
2994
2995 case T_CreatePLangStmt:
2997 break;
2998
2999 case T_CreateRoleStmt:
3000 tag = CMDTAG_CREATE_ROLE;
3001 break;
3002
3003 case T_AlterRoleStmt:
3004 tag = CMDTAG_ALTER_ROLE;
3005 break;
3006
3007 case T_AlterRoleSetStmt:
3008 tag = CMDTAG_ALTER_ROLE;
3009 break;
3010
3011 case T_DropRoleStmt:
3012 tag = CMDTAG_DROP_ROLE;
3013 break;
3014
3015 case T_DropOwnedStmt:
3016 tag = CMDTAG_DROP_OWNED;
3017 break;
3018
3021 break;
3022
3023 case T_LockStmt:
3024 tag = CMDTAG_LOCK_TABLE;
3025 break;
3026
3029 break;
3030
3031 case T_CheckPointStmt:
3032 tag = CMDTAG_CHECKPOINT;
3033 break;
3034
3035 case T_ReindexStmt:
3036 tag = CMDTAG_REINDEX;
3037 break;
3038
3041 break;
3042
3043 case T_CreateCastStmt:
3044 tag = CMDTAG_CREATE_CAST;
3045 break;
3046
3049 break;
3050
3053 break;
3054
3057 break;
3058
3061 break;
3062
3063 case T_AlterTypeStmt:
3064 tag = CMDTAG_ALTER_TYPE;
3065 break;
3066
3069 break;
3070
3073 break;
3074
3075 case T_CreatePolicyStmt:
3077 break;
3078
3079 case T_AlterPolicyStmt:
3080 tag = CMDTAG_ALTER_POLICY;
3081 break;
3082
3083 case T_CreateAmStmt:
3085 break;
3086
3089 break;
3090
3093 break;
3094
3097 break;
3098
3101 break;
3102
3105 break;
3106
3109 break;
3110
3111 case T_PrepareStmt:
3112 tag = CMDTAG_PREPARE;
3113 break;
3114
3115 case T_ExecuteStmt:
3116 tag = CMDTAG_EXECUTE;
3117 break;
3118
3119 case T_CreateStatsStmt:
3121 break;
3122
3123 case T_AlterStatsStmt:
3125 break;
3126
3127 case T_DeallocateStmt:
3128 {
3129 DeallocateStmt *stmt = (DeallocateStmt *) parsetree;
3130
3131 if (stmt->name == NULL)
3133 else
3134 tag = CMDTAG_DEALLOCATE;
3135 }
3136 break;
3137
3138 case T_WaitStmt:
3139 tag = CMDTAG_WAIT;
3140 break;
3141
3142 /* already-planned queries */
3143 case T_PlannedStmt:
3144 {
3145 PlannedStmt *stmt = (PlannedStmt *) parsetree;
3146
3147 switch (stmt->commandType)
3148 {
3149 case CMD_SELECT:
3150
3151 /*
3152 * We take a little extra care here so that the result
3153 * will be useful for complaints about read-only
3154 * statements
3155 */
3156 if (stmt->rowMarks != NIL)
3157 {
3158 /* not 100% but probably close enough */
3159 switch (((PlanRowMark *) linitial(stmt->rowMarks))->strength)
3160 {
3161 case LCS_FORKEYSHARE:
3163 break;
3164 case LCS_FORSHARE:
3166 break;
3167 case LCS_FORNOKEYUPDATE:
3169 break;
3170 case LCS_FORUPDATE:
3172 break;
3173 default:
3174 tag = CMDTAG_SELECT;
3175 break;
3176 }
3177 }
3178 else
3179 tag = CMDTAG_SELECT;
3180 break;
3181 case CMD_UPDATE:
3182 tag = CMDTAG_UPDATE;
3183 break;
3184 case CMD_INSERT:
3185 tag = CMDTAG_INSERT;
3186 break;
3187 case CMD_DELETE:
3188 tag = CMDTAG_DELETE;
3189 break;
3190 case CMD_MERGE:
3191 tag = CMDTAG_MERGE;
3192 break;
3193 case CMD_UTILITY:
3194 tag = CreateCommandTag(stmt->utilityStmt);
3195 break;
3196 default:
3197 elog(WARNING, "unrecognized commandType: %d",
3198 (int) stmt->commandType);
3199 tag = CMDTAG_UNKNOWN;
3200 break;
3201 }
3202 }
3203 break;
3204
3205 /* parsed-and-rewritten-but-not-planned queries */
3206 case T_Query:
3207 {
3208 Query *stmt = (Query *) parsetree;
3209
3210 switch (stmt->commandType)
3211 {
3212 case CMD_SELECT:
3213
3214 /*
3215 * We take a little extra care here so that the result
3216 * will be useful for complaints about read-only
3217 * statements
3218 */
3219 if (stmt->rowMarks != NIL)
3220 {
3221 /* not 100% but probably close enough */
3222 switch (((RowMarkClause *) linitial(stmt->rowMarks))->strength)
3223 {
3224 case LCS_FORKEYSHARE:
3226 break;
3227 case LCS_FORSHARE:
3229 break;
3230 case LCS_FORNOKEYUPDATE:
3232 break;
3233 case LCS_FORUPDATE:
3235 break;
3236 default:
3237 tag = CMDTAG_UNKNOWN;
3238 break;
3239 }
3240 }
3241 else
3242 tag = CMDTAG_SELECT;
3243 break;
3244 case CMD_UPDATE:
3245 tag = CMDTAG_UPDATE;
3246 break;
3247 case CMD_INSERT:
3248 tag = CMDTAG_INSERT;
3249 break;
3250 case CMD_DELETE:
3251 tag = CMDTAG_DELETE;
3252 break;
3253 case CMD_MERGE:
3254 tag = CMDTAG_MERGE;
3255 break;
3256 case CMD_UTILITY:
3257 tag = CreateCommandTag(stmt->utilityStmt);
3258 break;
3259 default:
3260 elog(WARNING, "unrecognized commandType: %d",
3261 (int) stmt->commandType);
3262 tag = CMDTAG_UNKNOWN;
3263 break;
3264 }
3265 }
3266 break;
3267
3268 default:
3269 elog(WARNING, "unrecognized node type: %d",
3270 (int) nodeTag(parsetree));
3271 tag = CMDTAG_UNKNOWN;
3272 break;
3273 }
3274
3275 return tag;
3276}
CommandTag
Definition cmdtag.h:23
#define stmt
@ LCS_FORUPDATE
Definition lockoptions.h:28
@ LCS_FORSHARE
Definition lockoptions.h:26
@ LCS_FORKEYSHARE
Definition lockoptions.h:25
@ LCS_FORNOKEYUPDATE
Definition lockoptions.h:27
#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
@ REPACK_COMMAND_CLUSTER
@ VAR_SET_DEFAULT
@ VAR_RESET
@ VAR_SET_MULTI
@ VAR_SET_VALUE
@ VAR_SET_CURRENT
@ VAR_RESET_ALL
@ OBJECT_EVENT_TRIGGER
@ OBJECT_FDW
@ OBJECT_TSPARSER
@ OBJECT_COLLATION
@ OBJECT_PROPGRAPH
@ OBJECT_ACCESS_METHOD
@ OBJECT_OPCLASS
@ OBJECT_AGGREGATE
@ OBJECT_MATVIEW
@ OBJECT_SCHEMA
@ OBJECT_POLICY
@ OBJECT_OPERATOR
@ OBJECT_FOREIGN_TABLE
@ OBJECT_TSCONFIGURATION
@ OBJECT_OPFAMILY
@ OBJECT_DOMAIN
@ OBJECT_COLUMN
@ OBJECT_ROUTINE
@ OBJECT_PROCEDURE
@ OBJECT_EXTENSION
@ OBJECT_INDEX
@ OBJECT_SEQUENCE
@ OBJECT_TSTEMPLATE
@ OBJECT_LANGUAGE
@ OBJECT_FOREIGN_SERVER
@ OBJECT_TSDICTIONARY
@ OBJECT_PUBLICATION
@ OBJECT_RULE
@ OBJECT_CONVERSION
@ OBJECT_TABLE
@ OBJECT_VIEW
@ OBJECT_TYPE
@ OBJECT_FUNCTION
@ OBJECT_STATISTIC_EXT
@ OBJECT_CAST
@ OBJECT_TRIGGER
@ OBJECT_TRANSFORM
@ DISCARD_ALL
@ DISCARD_PLANS
@ DISCARD_SEQUENCES
@ DISCARD_TEMP
#define linitial(l)
Definition pg_list.h:178
static int fb(int x)
CommandTag CreateCommandTag(Node *parsetree)
Definition utility.c:2384
static CommandTag AlterObjectTypeCommandTag(ObjectType objtype)
Definition utility.c:2235

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().

◆ GetCommandLogLevel()

LogStmtLevel GetCommandLogLevel ( Node parsetree)
extern

Definition at line 3289 of file utility.c.

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

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().

◆ ProcessUtility()

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

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 
)
extern

Definition at line 1970 of file utility.c.

1971{
1972 PlannedStmt *wrapper;
1973
1974 /*
1975 * For event triggers, we must "close" the current complex-command set,
1976 * and start a new one afterwards; this is needed to ensure the ordering
1977 * of command events is consistent with the way they were executed.
1978 */
1980
1981 /* Create a suitable wrapper */
1982 wrapper = makeNode(PlannedStmt);
1983 wrapper->commandType = CMD_UTILITY;
1984 wrapper->canSetTag = false;
1985 wrapper->utilityStmt = stmt;
1986 wrapper->stmt_location = context->pstmt->stmt_location;
1987 wrapper->stmt_len = context->pstmt->stmt_len;
1988 wrapper->planOrigin = PLAN_STMT_INTERNAL;
1989
1990 ProcessUtility(wrapper,
1991 context->queryString,
1992 false,
1994 context->params,
1995 context->queryEnv,
1997 NULL);
1998
2001}
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:169
PlannedStmtOrigin planOrigin
Definition plannodes.h:75
ParseLoc stmt_location
Definition plannodes.h:167
Node * utilityStmt
Definition plannodes.h:151
void ProcessUtility(PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc)
Definition utility.c:504

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().

◆ standard_ProcessUtility()

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

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, dest);
1066 }
1067 break;
1068
1069 default:
1070 /* All other statement types have event trigger support */
1071 ProcessUtilitySlow(pstate, pstmt, queryString,
1072 context, params, queryEnv,
1073 dest, qc);
1074 break;
1075 }
1076
1077 free_parsestate(pstate);
1078
1079 /*
1080 * Make effects of commands visible, for instance so that
1081 * PreCommit_on_commit_actions() can see them (see for example bug
1082 * #15631).
1083 */
1085}
void ExecuteGrantStmt(GrantStmt *stmt)
Definition aclchk.c:395
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
void Async_UnlistenAll(void)
Definition async.c:1078
void Async_Unlisten(const char *channel)
Definition async.c:1060
void Async_Listen(const char *channel)
Definition async.c:1046
void Async_Notify(const char *channel, const char *payload)
Definition async.c:897
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:402
Oid CreateTableSpace(CreateTableSpaceStmt *stmt)
Definition tablespace.c:209
uint64_t uint64
Definition c.h:619
void ExecCheckpoint(ParseState *pstate, CheckPointStmt *stmt)
void ExecRepack(ParseState *pstate, RepackStmt *stmt, bool isTopLevel)
Definition cluster.c:113
static void SetQueryCompletion(QueryCompletion *qc, CommandTag commandTag, uint64 nprocessed)
Definition cmdtag.h:37
ObjectAddress CommentObject(CommentStmt *stmt)
Definition comment.c:40
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:31
int errcode(int sqlerrcode)
Definition elog.c:874
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:150
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:178
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:4502
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:342
BackendType MyBackendType
Definition miscinit.c:65
#define copyObject(obj)
Definition nodes.h:232
#define castNode(_type_, nodeptr)
Definition nodes.h:182
static char * errmsg
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:212
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
ObjectAddress ExecSecLabelStmt(SecLabelStmt *stmt)
Definition seclabel.c:116
void check_stack_depth(void)
Definition stack_depth.c:95
Node * arg
Definition parsenodes.h:858
QueryEnvironment * p_queryEnv
Definition parse_node.h:237
const char * p_sourcetext
Definition parse_node.h:210
bool superuser(void)
Definition superuser.c:47
void ExecuteTruncate(TruncateStmt *stmt)
Definition tablecmds.c:1890
void AfterTriggerSetState(ConstraintsSetStmt *stmt)
Definition trigger.c:5768
void FinishPreparedTransaction(const char *gid, bool isCommit)
Definition twophase.c:1500
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 ExecDropStmt(DropStmt *stmt, bool isTopLevel)
Definition utility.c:2007
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:1093
#define COMMAND_IS_STRICTLY_READ_ONLY
Definition utility.h:65
void ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
Definition vacuum.c:163
void ExecWaitStmt(ParseState *pstate, WaitStmt *stmt, DestReceiver *dest)
Definition wait.c:34
void WarnNoTransactionBlock(bool isTopLevel, const char *stmtType)
Definition xact.c:3733
void UserAbortTransactionBlock(bool chain)
Definition xact.c:4227
bool PrepareTransactionBlock(const char *gid)
Definition xact.c:4015
void RequireTransactionBlock(bool isTopLevel, const char *stmtType)
Definition xact.c:3739
void DefineSavepoint(const char *name)
Definition xact.c:4396
bool XactReadOnly
Definition xact.c:84
void CommandCounterIncrement(void)
Definition xact.c:1102
void PreventInTransactionBlock(bool isTopLevel, const char *stmtType)
Definition xact.c:3670
void ReleaseSavepoint(const char *name)
Definition xact.c:4481
bool IsTransactionBlock(void)
Definition xact.c:4994
bool IsInParallelMode(void)
Definition xact.c:1091
void BeginTransactionBlock(void)
Definition xact.c:3947
void RollbackToSavepoint(const char *name)
Definition xact.c:4590
bool EndTransactionBlock(bool chain)
Definition xact.c:4067

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)
extern

Definition at line 2198 of file utility.c.

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

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)
extern

Definition at line 2041 of file utility.c.

2042{
2043 switch (nodeTag(parsetree))
2044 {
2045 case T_CallStmt:
2046 {
2047 CallStmt *stmt = (CallStmt *) parsetree;
2048
2049 return (stmt->funcexpr->funcresulttype == RECORDOID);
2050 }
2051 case T_FetchStmt:
2052 {
2053 FetchStmt *stmt = (FetchStmt *) parsetree;
2054 Portal portal;
2055
2056 if (stmt->ismove)
2057 return false;
2058 portal = GetPortalByName(stmt->portalname);
2059 if (!PortalIsValid(portal))
2060 return false; /* not our business to raise error */
2061 return portal->tupDesc ? true : false;
2062 }
2063
2064 case T_ExecuteStmt:
2065 {
2066 ExecuteStmt *stmt = (ExecuteStmt *) parsetree;
2067 PreparedStatement *entry;
2068
2069 entry = FetchPreparedStatement(stmt->name, false);
2070 if (!entry)
2071 return false; /* not our business to raise error */
2072 if (entry->plansource->resultDesc)
2073 return true;
2074 return false;
2075 }
2076
2077 case T_ExplainStmt:
2078 return true;
2079
2080 case T_VariableShowStmt:
2081 return true;
2082
2083 case T_WaitStmt:
2084 return true;
2085
2086 default:
2087 return false;
2088 }
2089}
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)
extern

Definition at line 2100 of file utility.c.

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

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

PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook
extern

Definition at line 72 of file utility.c.

Referenced by _PG_init(), and ProcessUtility().