| /*------------------------------------------------------------------------- |
| * |
| * utility.h |
| * prototypes for utility.c. |
| * |
| * |
| * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * src/include/tcop/utility.h |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #ifndef UTILITY_H |
| #define UTILITY_H |
| |
| #include "tcop/cmdtag.h" |
| #include "tcop/tcopprot.h" |
| |
| typedef enum |
| { |
| PROCESS_UTILITY_TOPLEVEL, /* toplevel interactive command */ |
| PROCESS_UTILITY_QUERY, /* a complete query, but not toplevel */ |
| PROCESS_UTILITY_QUERY_NONATOMIC, /* a complete query, nonatomic |
| * execution context */ |
| PROCESS_UTILITY_SUBCOMMAND /* a portion of a query */ |
| } ProcessUtilityContext; |
| |
| /* Info needed when recursing from ALTER TABLE */ |
| typedef struct AlterTableUtilityContext |
| { |
| PlannedStmt *pstmt; /* PlannedStmt for outer ALTER TABLE command */ |
| const char *queryString; /* its query string */ |
| Oid relid; /* OID of ALTER's target table */ |
| ParamListInfo params; /* any parameters available to ALTER TABLE */ |
| QueryEnvironment *queryEnv; /* execution environment for ALTER TABLE */ |
| } AlterTableUtilityContext; |
| |
| /* |
| * These constants are used to describe the extent to which a particular |
| * command is read-only. |
| * |
| * COMMAND_OK_IN_READ_ONLY_TXN means that the command is permissible even when |
| * XactReadOnly is set. This bit should be set for commands that don't change |
| * the state of the database (data or schema) in a way that would affect the |
| * output of pg_dump. |
| * |
| * COMMAND_OK_IN_PARALLEL_MODE means that the command is permissible even |
| * when in parallel mode. Writing tuples is forbidden, as is anything that |
| * might confuse cooperating processes. |
| * |
| * COMMAND_OK_IN_RECOVERY means that the command is permissible even when in |
| * recovery. It can't write WAL, nor can it do things that would imperil |
| * replay of future WAL received from the primary. |
| */ |
| #define COMMAND_OK_IN_READ_ONLY_TXN 0x0001 |
| #define COMMAND_OK_IN_PARALLEL_MODE 0x0002 |
| #define COMMAND_OK_IN_RECOVERY 0x0004 |
| |
| /* |
| * We say that a command is strictly read-only if it is sufficiently read-only |
| * for all purposes. For clarity, we also have a constant for commands that are |
| * in no way read-only. |
| */ |
| #define COMMAND_IS_STRICTLY_READ_ONLY \ |
| (COMMAND_OK_IN_READ_ONLY_TXN | COMMAND_OK_IN_RECOVERY | \ |
| COMMAND_OK_IN_PARALLEL_MODE) |
| #define COMMAND_IS_NOT_READ_ONLY 0 |
| |
| /* Hook for plugins to get control in ProcessUtility() */ |
| typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, |
| const char *queryString, |
| bool readOnlyTree, |
| ProcessUtilityContext context, |
| ParamListInfo params, |
| QueryEnvironment *queryEnv, |
| DestReceiver *dest, QueryCompletion *qc); |
| extern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook; |
| |
| extern void ProcessUtility(PlannedStmt *pstmt, const char *queryString, |
| bool readOnlyTree, |
| ProcessUtilityContext context, ParamListInfo params, |
| QueryEnvironment *queryEnv, |
| DestReceiver *dest, QueryCompletion *qc); |
| extern void standard_ProcessUtility(PlannedStmt *pstmt, const char *queryString, |
| bool readOnlyTree, |
| ProcessUtilityContext context, ParamListInfo params, |
| QueryEnvironment *queryEnv, |
| DestReceiver *dest, QueryCompletion *qc); |
| |
| extern void ProcessUtilityForAlterTable(Node *stmt, |
| AlterTableUtilityContext *context); |
| |
| extern bool UtilityReturnsTuples(Node *parsetree); |
| |
| extern TupleDesc UtilityTupleDescriptor(Node *parsetree); |
| |
| extern Query *UtilityContainsQuery(Node *parsetree); |
| |
| extern CommandTag CreateCommandTag(Node *parsetree); |
| |
| static inline const char * |
| CreateCommandName(Node *parsetree) |
| { |
| return GetCommandTagName(CreateCommandTag(parsetree)); |
| } |
| |
| extern LogStmtLevel GetCommandLogLevel(Node *parsetree); |
| |
| extern bool CommandIsReadOnly(PlannedStmt *pstmt); |
| |
| extern bool utility_nested(void); |
| |
| #endif /* UTILITY_H */ |