Files
openGauss-server/src/include/utils/guc.h

399 lines
17 KiB
C
Executable File

/* --------------------------------------------------------------------
* guc.h
*
* External declarations pertaining to backend/utils/misc/guc.c and
* backend/utils/misc/guc-file.l
*
* Copyright (c) 2000-2012, PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* src/include/utils/guc.h
* --------------------------------------------------------------------
*/
#ifndef GUC_H
#define GUC_H
#include "nodes/parsenodes.h"
#include "tcop/dest.h"
#include "utils/array.h"
/* upper limit for GUC variables measured in kilobytes of memory */
/* note that various places assume the byte size fits in a "long" variable */
#if SIZEOF_SIZE_T > 4 && SIZEOF_LONG > 4
#define MAX_KILOBYTES INT_MAX
#else
#define MAX_KILOBYTES (INT_MAX / 1024)
#endif
/*
* Certain options can only be set at certain times. The rules are
* like this:
*
* INTERNAL options cannot be set by the user at all, but only through
* internal processes ("server_version" is an example). These are GUC
* variables only so they can be shown by SHOW, etc.
*
* POSTMASTER options can only be set when the postmaster starts,
* either from the configuration file or the command line.
*
* SIGHUP options can only be set at postmaster startup or by changing
* the configuration file and sending the HUP signal to the postmaster
* or a backend process. (Notice that the signal receipt will not be
* evaluated immediately. The postmaster and the backend check it at a
* certain point in their main loop. It's safer to wait than to read a
* file asynchronously.)
*
* BACKEND options can only be set at postmaster startup, from the
* configuration file, or by client request in the connection startup
* packet (e.g., from libpq's PGOPTIONS variable). Furthermore, an
* already-started backend will ignore changes to such an option in the
* configuration file. The idea is that these options are fixed for a
* given backend once it's started, but they can vary across backends.
*
* SUSET options can be set at postmaster startup, with the SIGHUP
* mechanism, or from SQL if you're a superuser.
*
* USERSET options can be set by anyone any time.
*/
typedef enum { PGC_INTERNAL, PGC_POSTMASTER, PGC_SIGHUP, PGC_BACKEND, PGC_SUSET, PGC_USERSET } GucContext;
/*
* The following type records the source of the current setting. A
* new setting can only take effect if the previous setting had the
* same or lower level. (E.g, changing the config file doesn't
* override the postmaster command line.) Tracking the source allows us
* to process sources in any convenient order without affecting results.
* Sources <= PGC_S_OVERRIDE will set the default used by RESET, as well
* as the current value. Note that source == PGC_S_OVERRIDE should be
* used when setting a PGC_INTERNAL option.
*
* PGC_S_INTERACTIVE isn't actually a source value, but is the
* dividing line between "interactive" and "non-interactive" sources for
* error reporting purposes.
*
* PGC_S_TEST is used when testing values to be stored as per-database or
* per-user defaults ("doit" will always be false, so this never gets stored
* as the actual source of any value). This is an interactive case, but
* it needs its own source value because some assign hooks need to make
* different validity checks in this case.
*
* NB: see GucSource_Names in guc.c if you change this.
*/
typedef enum {
PGC_S_DEFAULT, /* hard-wired default ("boot_val") */
PGC_S_DYNAMIC_DEFAULT, /* default computed during initialization */
PGC_S_ENV_VAR, /* postmaster environment variable */
PGC_S_FILE, /* postgresql.conf */
PGC_S_ARGV, /* postmaster command line */
PGC_S_DATABASE, /* per-database setting */
PGC_S_USER, /* per-user setting */
PGC_S_DATABASE_USER, /* per-user-and-database setting */
PGC_S_CLIENT, /* from client connection request */
PGC_S_OVERRIDE, /* special case to forcibly set default */
PGC_S_INTERACTIVE, /* dividing line for error reporting */
PGC_S_TEST, /* test per-database or per-user setting */
PGC_S_SESSION /* SET command */
} GucSource;
/*
* Parsing the configuration file will return a list of name-value pairs
* with source location info.
*/
typedef struct ConfigVariable {
char* name;
char* value;
char* filename;
int sourceline;
struct ConfigVariable* next;
} ConfigVariable;
extern bool ParseConfigFile(const char* config_file, const char* calling_file, bool strict, int depth, int elevel,
ConfigVariable** head_p, ConfigVariable** tail_p);
extern bool ParseConfigFp(
FILE* fp, const char* config_file, int depth, int elevel, ConfigVariable** head_p, ConfigVariable** tail_p);
extern void FreeConfigVariables(ConfigVariable* list);
/*
* The possible values of an enum variable are specified by an array of
* name-value pairs. The "hidden" flag means the value is accepted but
* won't be displayed when guc.c is asked for a list of acceptable values.
*/
struct config_enum_entry {
const char* name;
int val;
bool hidden;
};
/*
* Signatures for per-variable check/assign/show hook functions
*/
typedef bool (*GucBoolCheckHook)(bool* newval, void** extra, GucSource source);
typedef bool (*GucIntCheckHook)(int* newval, void** extra, GucSource source);
typedef bool (*GucInt64CheckHook)(int64* newval, void** extra, GucSource source);
typedef bool (*GucRealCheckHook)(double* newval, void** extra, GucSource source);
typedef bool (*GucStringCheckHook)(char** newval, void** extra, GucSource source);
typedef bool (*GucEnumCheckHook)(int* newval, void** extra, GucSource source);
typedef void (*GucBoolAssignHook)(bool newval, void* extra);
typedef void (*GucIntAssignHook)(int newval, void* extra);
typedef void (*GucInt64AssignHook)(int64 newval, void* extra);
typedef void (*GucRealAssignHook)(double newval, void* extra);
typedef void (*GucStringAssignHook)(const char* newval, void* extra);
typedef void (*GucEnumAssignHook)(int newval, void* extra);
typedef const char* (*GucShowHook)(void);
/*
* Miscellaneous
*/
typedef enum {
/* Types of set_config_option actions */
GUC_ACTION_SET, /* regular SET command */
GUC_ACTION_LOCAL, /* SET LOCAL command */
GUC_ACTION_SAVE /* function SET option, or temp assignment */
} GucAction;
/* set params entry */
typedef struct {
char name[NAMEDATALEN]; /* param name */
char* query; /* set query string */
} GucParamsEntry;
#define GUC_QUALIFIER_SEPARATOR '.'
/*
* bit values in "flags" of a GUC variable
*/
#define GUC_LIST_INPUT 0x0001 /* input can be list format */
#define GUC_LIST_QUOTE 0x0002 /* double-quote list elements */
#define GUC_NO_SHOW_ALL 0x0004 /* exclude from SHOW ALL */
#define GUC_NO_RESET_ALL 0x0008 /* exclude from RESET ALL */
#define GUC_REPORT 0x0010 /* auto-report changes to client */
#define GUC_NOT_IN_SAMPLE 0x0020 /* not in postgresql.conf.sample */
#define GUC_DISALLOW_IN_FILE 0x0040 /* can't set in postgresql.conf */
#define GUC_CUSTOM_PLACEHOLDER 0x0080 /* placeholder for custom variable */
#define GUC_SUPERUSER_ONLY 0x0100 /* show only to superusers */
#define GUC_IS_NAME 0x0200 /* limit string to NAMEDATALEN-1 */
#define GUC_UNIT_KB 0x0400 /* value is in kilobytes */
#define GUC_UNIT_BLOCKS 0x0800 /* value is in blocks */
#define GUC_UNIT_XBLOCKS 0x0C00 /* value is in xlog blocks */
#define GUC_UNIT_MEMORY 0x0C00 /* mask for KB, BLOCKS, XBLOCKS */
#define GUC_UNIT_MS 0x1000 /* value is in milliseconds */
#define GUC_UNIT_S 0x2000 /* value is in seconds */
#define GUC_UNIT_MIN 0x4000 /* value is in minutes */
#define GUC_UNIT_HOUR 0x5000 /* value is in hour */
#define GUC_UNIT_TIME 0x7000 /* mask for MS, S, MIN */
#define GUC_NOT_WHILE_SEC_REST 0x8000 /* can't set if security restricted */
extern THR_LOCAL int log_min_messages;
extern THR_LOCAL bool force_backtrace_messages;
extern THR_LOCAL int client_min_messages;
extern THR_LOCAL int comm_ackchk_time;
#define SHOW_DEBUG_MESSAGE() (SECUREC_UNLIKELY(log_min_messages <= DEBUG1))
/*
* Functions exported by guc.c
*/
extern void SetConfigOption(const char* name, const char* value, GucContext context, GucSource source);
extern void DefineCustomBoolVariable(const char* name, const char* short_desc, const char* long_desc, bool* valueAddr,
bool bootValue, GucContext context, int flags, GucBoolCheckHook check_hook, GucBoolAssignHook assign_hook,
GucShowHook show_hook);
extern void DefineCustomIntVariable(const char* name, const char* short_desc, const char* long_desc, int* valueAddr,
int bootValue, int minValue, int maxValue, GucContext context, int flags, GucIntCheckHook check_hook,
GucIntAssignHook assign_hook, GucShowHook show_hook);
extern void DefineCustomInt64Variable(const char* name, const char* short_desc, const char* long_desc, int64* valueAddr,
int64 bootValue, int64 minValue, int64 maxValue, GucContext context, int flags, GucInt64CheckHook check_hook,
GucInt64AssignHook assign_hook, GucShowHook show_hook);
extern void DefineCustomRealVariable(const char* name, const char* short_desc, const char* long_desc, double* valueAddr,
double bootValue, double minValue, double maxValue, GucContext context, int flags, GucRealCheckHook check_hook,
GucRealAssignHook assign_hook, GucShowHook show_hook);
extern void DefineCustomStringVariable(const char* name, const char* short_desc, const char* long_desc,
char** valueAddr, const char* bootValue, GucContext context, int flags, GucStringCheckHook check_hook,
GucStringAssignHook assign_hook, GucShowHook show_hook);
extern void DefineCustomEnumVariable(const char* name, const char* short_desc, const char* long_desc, int* valueAddr,
int bootValue, const struct config_enum_entry* options, GucContext context, int flags, GucEnumCheckHook check_hook,
GucEnumAssignHook assign_hook, GucShowHook show_hook);
extern void EmitWarningsOnPlaceholders(const char* className);
extern const char* GetConfigOption(const char* name, bool missing_ok, bool restrict_superuser);
extern const char* GetConfigOptionResetString(const char* name);
extern void ProcessConfigFile(GucContext context);
extern void InitializeGUCOptions(void);
extern void InitializePostmasterGUC();
extern void init_sync_guc_variables(void);
extern void repair_guc_variables(void);
extern bool SelectConfigFiles(const char* userDoption, const char* progname);
extern void ResetAllOptions(void);
extern void AtStart_GUC(void);
extern int NewGUCNestLevel(void);
extern void AtEOXact_GUC(bool isCommit, int nestLevel);
extern void BeginReportingGUCOptions(void);
extern void ParseLongOption(const char* string, char** name, char** value);
extern bool parse_int(const char* value, int* result, int flags, const char** hintmsg);
extern bool parse_int64(const char* value, int64* result, const char** hintmsg);
extern bool parse_real(const char* value, double* result);
extern int set_config_option(const char* name, const char* value, GucContext context, GucSource source,
GucAction action, bool changeVal, int elevel, bool isReload = false);
extern void AlterSystemSetConfigFile(AlterSystemStmt * setstmt);
extern char* GetConfigOptionByName(const char* name, const char** varname);
extern void GetConfigOptionByNum(int varnum, const char** values, bool* noshow);
extern int GetNumConfigOptions(void);
extern void SetPGVariable(const char* name, List* args, bool is_local);
extern void GetPGVariable(const char* name, const char* likename, DestReceiver* dest);
extern TupleDesc GetPGVariableResultDesc(const char* name);
#ifdef PGXC
extern char* RewriteBeginQuery(char* query_string, const char* name, List* args);
#endif
extern void ExecSetVariableStmt(VariableSetStmt* stmt);
extern char* ExtractSetVariableArgs(VariableSetStmt* stmt);
extern void ProcessGUCArray(ArrayType* array, GucContext context, GucSource source, GucAction action);
extern ArrayType* GUCArrayAdd(ArrayType* array, const char* name, const char* value);
extern ArrayType* GUCArrayDelete(ArrayType* array, const char* name);
extern ArrayType* GUCArrayReset(ArrayType* array);
extern Size EstimateGUCStateSpace(void);
extern void SerializeGUCState(Size maxsize, char *start_address);
extern void RestoreGUCState(char *gucstate);
#ifdef EXEC_BACKEND
extern void write_nondefault_variables(GucContext context);
extern void read_nondefault_variables(void);
#endif
extern void GUC_check_errcode(int sqlerrcode);
#define GUC_check_errmsg \
pre_format_elog_string(errno, TEXTDOMAIN), u_sess->utils_cxt.GUC_check_errmsg_string = format_elog_string
#define GUC_check_errdetail \
pre_format_elog_string(errno, TEXTDOMAIN), u_sess->utils_cxt.GUC_check_errdetail_string = format_elog_string
#define GUC_check_errhint \
pre_format_elog_string(errno, TEXTDOMAIN), u_sess->utils_cxt.GUC_check_errhint_string = format_elog_string
#define guc_free(p) \
do { \
if (p != NULL) { \
free(p); \
p = NULL; \
} \
} while (0)
/*
* The following functions are not in guc.c, but are declared here to avoid
* having to include guc.h in some widely used headers that it really doesn't
* belong in.
*/
/* in commands/tablespace.c */
extern bool check_default_tablespace(char** newval, void** extra, GucSource source);
extern bool check_temp_tablespaces(char** newval, void** extra, GucSource source);
extern void assign_temp_tablespaces(const char* newval, void* extra);
/* in catalog/namespace.c */
extern bool check_search_path(char** newval, void** extra, GucSource source);
extern void assign_search_path(const char* newval, void* extra);
extern bool check_percentile(char** newval, void** extra, GucSource source);
extern bool check_numa_distribute_mode(char** newval, void** extra, GucSource source);
/* in access/transam/xlog.c */
extern bool check_wal_buffers(int* newval, void** extra, GucSource source);
extern void assign_xlog_sync_method(int new_sync_method, void* extra);
/* in tcop/stmt_retry.cpp */
extern bool check_errcode_list(char** newval, void** extra, GucSource source);
#define RESERVE_SIZE 32
/*
* Error code for config file
*/
typedef enum {
CODE_OK = 0, /* success */
CODE_UNKNOW_CONFFILE_PATH, /* fail to get the specified config file */
CODE_OPEN_CONFFILE_FAILED, /* fail to open config file */
CODE_CLOSE_CONFFILE_FAILED, /* fail to close config file */
CODE_READE_CONFFILE_ERROR, /* fail to read config file */
CODE_WRITE_CONFFILE_ERROR, /* fail to write config file */
CODE_LOCK_CONFFILE_FAILED,
CODE_UNLOCK_CONFFILE_FAILED,
CODE_INTERNAL_ERROR
} ErrCode;
typedef enum {
NO_REWRITE = 0, /* not allow lazy agg and magic set rewrite*/
LAZY_AGG = 1, /* allow lazy agg */
MAGIC_SET = 2 /* allow query qual push */
} rewrite_param;
typedef enum {
SUMMARY = 0, /* not collect multi column statistics info */
DETAIL = 1, /* collect multi column statistics info */
} resource_track_log_param;
typedef struct {
FILE* fp;
size_t size;
} ConfFileLock;
#define PG_LOCKFILE_SIZE 1024
extern void* pg_malloc(size_t size);
extern char* xstrdup(const char* s);
extern char** read_guc_file(const char* path);
extern ErrCode write_guc_file(const char* path, char** lines);
extern int find_guc_option(
char** optlines, const char* opt_name, int* name_offset, int* name_len, int* value_offset, int* value_len);
extern void modify_guc_lines(char** optlines, const char** opt_name, char** copy_from_line);
extern ErrCode copy_guc_lines(char** copy_to_line, char** optlines, const char** opt_name);
extern ErrCode copy_asyn_lines(char* path, char** copy_to_line, const char** opt_name);
extern ErrCode generate_temp_file(char* buf, char* temppath, size_t size);
extern ErrCode update_temp_file(char* tempfilepath, char** copy_to_line, const char** opt_name);
extern ErrCode get_file_lock(const char* path, ConfFileLock* filelock);
extern void release_file_lock(ConfFileLock* filelock);
/*Add for set command in transaction*/
extern char* get_set_string();
extern void reset_set_message(bool);
extern void append_set_message(const char* str);
extern void init_set_params_htab(void);
extern void make_set_message(void);
extern int check_set_message_to_send(const VariableSetStmt* stmt, const char* queryString);
#define TRANS_ENCRYPT_SAMPLE_RNDM "1234567890ABCDEF"
#define TRANS_ENCRYPT_SAMPLE_STRING "TRANS_ENCRY_SAMPLE_STRING"
/* For transparent encryption. For more information,
* see the definition of this variable.
*/
extern THR_LOCAL char* transparent_encrypted_string;
extern THR_LOCAL char* transparent_encrypt_kms_url;
extern THR_LOCAL char* transparent_encrypt_kms_region;
extern bool check_bbox_corepath(char** newval, void** extra, GucSource source);
extern void assign_bbox_corepath(const char* newval, void* extra);
extern void release_opt_lines(char** opt_lines);
extern char** alloc_opt_lines(int opt_lines_num);
#ifdef ENABLE_QUNIT
extern void set_qunit_case_number_hook(int newval, void* extra);
#endif
#endif /* GUC_H */