Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * utility.h
4 : : * prototypes for utility.c.
5 : : *
6 : : *
7 : : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
8 : : * Portions Copyright (c) 1994, Regents of the University of California
9 : : *
10 : : * src/include/tcop/utility.h
11 : : *
12 : : *-------------------------------------------------------------------------
13 : : */
14 : : #ifndef UTILITY_H
15 : : #define UTILITY_H
16 : :
17 : : #include "tcop/cmdtag.h"
18 : : #include "tcop/tcopprot.h"
19 : :
20 : : typedef enum
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 */
27 : : } ProcessUtilityContext;
28 : :
29 : : /* Info needed when recursing from ALTER TABLE */
30 : : typedef struct AlterTableUtilityContext
31 : : {
32 : : PlannedStmt *pstmt; /* PlannedStmt for outer ALTER TABLE command */
33 : : const char *queryString; /* its query string */
34 : : Oid relid; /* OID of ALTER's target table */
35 : : ParamListInfo params; /* any parameters available to ALTER TABLE */
36 : : QueryEnvironment *queryEnv; /* execution environment for ALTER TABLE */
37 : : } AlterTableUtilityContext;
38 : :
39 : : /*
40 : : * These constants are used to describe the extent to which a particular
41 : : * command is read-only.
42 : : *
43 : : * COMMAND_OK_IN_READ_ONLY_TXN means that the command is permissible even when
44 : : * XactReadOnly is set. This bit should be set for commands that don't change
45 : : * the state of the database (data or schema) in a way that would affect the
46 : : * output of pg_dump.
47 : : *
48 : : * COMMAND_OK_IN_PARALLEL_MODE means that the command is permissible even
49 : : * when in parallel mode. Writing tuples is forbidden, as is anything that
50 : : * might confuse cooperating processes.
51 : : *
52 : : * COMMAND_OK_IN_RECOVERY means that the command is permissible even when in
53 : : * recovery. It can't write WAL, nor can it do things that would imperil
54 : : * replay of future WAL received from the primary.
55 : : */
56 : : #define COMMAND_OK_IN_READ_ONLY_TXN 0x0001
57 : : #define COMMAND_OK_IN_PARALLEL_MODE 0x0002
58 : : #define COMMAND_OK_IN_RECOVERY 0x0004
59 : :
60 : : /*
61 : : * We say that a command is strictly read-only if it is sufficiently read-only
62 : : * for all purposes. For clarity, we also have a constant for commands that are
63 : : * in no way read-only.
64 : : */
65 : : #define COMMAND_IS_STRICTLY_READ_ONLY \
66 : : (COMMAND_OK_IN_READ_ONLY_TXN | COMMAND_OK_IN_RECOVERY | \
67 : : COMMAND_OK_IN_PARALLEL_MODE)
68 : : #define COMMAND_IS_NOT_READ_ONLY 0
69 : :
70 : : /* Hook for plugins to get control in ProcessUtility() */
71 : : typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt,
72 : : const char *queryString,
73 : : bool readOnlyTree,
74 : : ProcessUtilityContext context,
75 : : ParamListInfo params,
76 : : QueryEnvironment *queryEnv,
77 : : DestReceiver *dest, QueryCompletion *qc);
78 : : extern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;
79 : :
80 : : extern void ProcessUtility(PlannedStmt *pstmt, const char *queryString,
81 : : bool readOnlyTree,
82 : : ProcessUtilityContext context, ParamListInfo params,
83 : : QueryEnvironment *queryEnv,
84 : : DestReceiver *dest, QueryCompletion *qc);
85 : : extern void standard_ProcessUtility(PlannedStmt *pstmt, const char *queryString,
86 : : bool readOnlyTree,
87 : : ProcessUtilityContext context, ParamListInfo params,
88 : : QueryEnvironment *queryEnv,
89 : : DestReceiver *dest, QueryCompletion *qc);
90 : :
91 : : extern void ProcessUtilityForAlterTable(Node *stmt,
92 : : AlterTableUtilityContext *context);
93 : :
94 : : extern bool UtilityReturnsTuples(Node *parsetree);
95 : :
96 : : extern TupleDesc UtilityTupleDescriptor(Node *parsetree);
97 : :
98 : : extern Query *UtilityContainsQuery(Node *parsetree);
99 : :
100 : : extern CommandTag CreateCommandTag(Node *parsetree);
101 : :
102 : : static inline const char *
1504 alvherre@alvh.no-ip. 103 :CBC 500 : CreateCommandName(Node *parsetree)
104 : : {
105 : 500 : return GetCommandTagName(CreateCommandTag(parsetree));
106 : : }
107 : :
108 : : extern LogStmtLevel GetCommandLogLevel(Node *parsetree);
109 : :
110 : : extern bool CommandIsReadOnly(PlannedStmt *pstmt);
111 : :
112 : : #endif /* UTILITY_H */
|