*
* See src/backend/utils/misc/README for design notes.
*
- * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
*
- * $Id: guc_tables.h,v 1.4 2003/07/28 19:31:32 tgl Exp $
+ * src/include/utils/guc_tables.h
*
*-------------------------------------------------------------------------
*/
-#ifndef GUC_TABLES
-#define GUC_TABLES 1
+#ifndef GUC_TABLES_H
+#define GUC_TABLES_H 1
+
+#include "utils/guc.h"
+
+/*
+ * GUC supports these types of variables:
+ */
+enum config_type
+{
+ PGC_BOOL,
+ PGC_INT,
+ PGC_REAL,
+ PGC_STRING,
+ PGC_ENUM
+};
+
+union config_var_val
+{
+ bool boolval;
+ int intval;
+ double realval;
+ char *stringval;
+ int enumval;
+};
+
+/*
+ * The actual value of a GUC variable can include a malloc'd opaque struct
+ * "extra", which is created by its check_hook and used by its assign_hook.
+ */
+typedef struct config_var_value
+{
+ union config_var_val val;
+ void *extra;
+} config_var_value;
/*
* Groupings to help organize all the run-time options for display
enum config_group
{
UNGROUPED,
+ FILE_LOCATIONS,
CONN_AUTH,
CONN_AUTH_SETTINGS,
- CONN_AUTH_SECURITY,
+ CONN_AUTH_AUTH,
+ CONN_AUTH_SSL,
RESOURCES,
RESOURCES_MEM,
- RESOURCES_FSM,
+ RESOURCES_DISK,
RESOURCES_KERNEL,
+ RESOURCES_VACUUM_DELAY,
+ RESOURCES_BGWRITER,
+ RESOURCES_ASYNCHRONOUS,
WAL,
WAL_SETTINGS,
WAL_CHECKPOINTS,
+ WAL_ARCHIVING,
+ WAL_ARCHIVE_RECOVERY,
+ WAL_RECOVERY_TARGET,
+ REPLICATION,
+ REPLICATION_SENDING,
+ REPLICATION_MASTER,
+ REPLICATION_STANDBY,
+ REPLICATION_SUBSCRIBERS,
QUERY_TUNING,
QUERY_TUNING_METHOD,
QUERY_TUNING_COST,
QUERY_TUNING_GEQO,
QUERY_TUNING_OTHER,
LOGGING,
- LOGGING_SYSLOG,
+ LOGGING_WHERE,
LOGGING_WHEN,
LOGGING_WHAT,
+ PROCESS_TITLE,
STATS,
STATS_MONITORING,
STATS_COLLECTOR,
+ AUTOVACUUM,
CLIENT_CONN,
CLIENT_CONN_STATEMENT,
CLIENT_CONN_LOCALE,
+ CLIENT_CONN_PRELOAD,
CLIENT_CONN_OTHER,
LOCK_MANAGEMENT,
COMPAT_OPTIONS,
COMPAT_OPTIONS_PREVIOUS,
COMPAT_OPTIONS_CLIENT,
+ ERROR_HANDLING_OPTIONS,
+ PRESET_OPTIONS,
+ CUSTOM_OPTIONS,
DEVELOPER_OPTIONS
};
/*
- * GUC supports these types of variables:
+ * Stack entry for saving the state a variable had prior to an uncommitted
+ * transactional change
*/
-enum config_type
+typedef enum
{
- PGC_BOOL,
- PGC_INT,
- PGC_REAL,
- PGC_STRING
-};
+ /* This is almost GucAction, but we need a fourth state for SET+LOCAL */
+ GUC_SAVE, /* entry caused by function SET option */
+ GUC_SET, /* entry caused by plain SET command */
+ GUC_LOCAL, /* entry caused by SET LOCAL command */
+ GUC_SET_LOCAL /* entry caused by SET then SET LOCAL */
+} GucStackState;
+
+typedef struct guc_stack
+{
+ struct guc_stack *prev; /* previous stack item, if any */
+ int nest_level; /* nesting depth at which we made entry */
+ GucStackState state; /* see enum above */
+ GucSource source; /* source of the prior value */
+ /* masked value's source must be PGC_S_SESSION, so no need to store it */
+ GucContext scontext; /* context that set the prior value */
+ GucContext masked_scontext; /* context that set the masked value */
+ config_var_value prior; /* previous value of variable */
+ config_var_value masked; /* SET value in a GUC_SET_LOCAL entry */
+} GucStack;
/*
* Generic fields applicable to all types of variables
*
* The short description should be less than 80 chars in length. Some
- * applications may use the long description as well, and will append
- * it to the short description. (separated by a newline or '. ')
+ * applications may use the long description as well, and will append
+ * it to the short description. (separated by a newline or '. ')
+ *
+ * Note that sourcefile/sourceline are kept here, and not pushed into stacked
+ * values, although in principle they belong with some stacked value if the
+ * active value is session- or transaction-local. This is to avoid bloating
+ * stack entries. We know they are only relevant when source == PGC_S_FILE.
*/
struct config_generic
{
/* constant fields, must be set correctly in initial value: */
const char *name; /* name of variable - MUST BE FIRST */
GucContext context; /* context required to set the variable */
- enum config_group group; /* to help organize variables by function */
- const char *short_desc; /* short desc. of this variable's purpose */
- const char *long_desc; /* long desc. of this variable's purpose */
- int flags; /* flag bits, see below */
+ enum config_group group; /* to help organize variables by function */
+ const char *short_desc; /* short desc. of this variable's purpose */
+ const char *long_desc; /* long desc. of this variable's purpose */
+ int flags; /* flag bits, see guc.h */
/* variable fields, initialized at runtime: */
enum config_type vartype; /* type of variable (set only at startup) */
int status; /* status bits, see below */
- GucSource reset_source; /* source of the reset_value */
- GucSource session_source; /* source of the session_value */
- GucSource tentative_source; /* source of the tentative_value */
GucSource source; /* source of the current actual value */
+ GucSource reset_source; /* source of the reset_value */
+ GucContext scontext; /* context that set the current value */
+ GucContext reset_scontext; /* context that set the reset value */
+ GucStack *stack; /* stacked prior values */
+ void *extra; /* "extra" pointer for current actual value */
+ char *sourcefile; /* file current setting is from (NULL if not
+ * set in config file) */
+ int sourceline; /* line in source file */
};
-/* bit values in flags field */
-#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 */
-
/* bit values in status field */
-#define GUC_HAVE_TENTATIVE 0x0001 /* tentative value is defined */
-#define GUC_HAVE_LOCAL 0x0002 /* a SET LOCAL has been executed */
+#define GUC_IS_IN_FILE 0x0001 /* found it in config file */
+/*
+ * Caution: the GUC_IS_IN_FILE bit is transient state for ProcessConfigFile.
+ * Do not assume that its value represents useful information elsewhere.
+ */
+#define GUC_PENDING_RESTART 0x0002
/* GUC records for specific variable types */
struct config_bool
{
struct config_generic gen;
- /* these fields must be set correctly in initial value: */
- /* (all but reset_val are constants) */
+ /* constant fields, must be set correctly in initial value: */
bool *variable;
- bool reset_val;
- bool (*assign_hook) (bool newval, bool doit, bool interactive);
- const char *(*show_hook) (void);
+ bool boot_val;
+ GucBoolCheckHook check_hook;
+ GucBoolAssignHook assign_hook;
+ GucShowHook show_hook;
/* variable fields, initialized at runtime: */
- bool session_val;
- bool tentative_val;
+ bool reset_val;
+ void *reset_extra;
};
struct config_int
{
struct config_generic gen;
- /* these fields must be set correctly in initial value: */
- /* (all but reset_val are constants) */
+ /* constant fields, must be set correctly in initial value: */
int *variable;
- int reset_val;
+ int boot_val;
int min;
int max;
- bool (*assign_hook) (int newval, bool doit, bool interactive);
- const char *(*show_hook) (void);
+ GucIntCheckHook check_hook;
+ GucIntAssignHook assign_hook;
+ GucShowHook show_hook;
/* variable fields, initialized at runtime: */
- int session_val;
- int tentative_val;
+ int reset_val;
+ void *reset_extra;
};
struct config_real
{
struct config_generic gen;
- /* these fields must be set correctly in initial value: */
- /* (all but reset_val are constants) */
+ /* constant fields, must be set correctly in initial value: */
double *variable;
- double reset_val;
+ double boot_val;
double min;
double max;
- bool (*assign_hook) (double newval, bool doit, bool interactive);
- const char *(*show_hook) (void);
+ GucRealCheckHook check_hook;
+ GucRealAssignHook assign_hook;
+ GucShowHook show_hook;
/* variable fields, initialized at runtime: */
- double session_val;
- double tentative_val;
+ double reset_val;
+ void *reset_extra;
};
struct config_string
{
struct config_generic gen;
- /* these fields must be set correctly in initial value: */
- /* (all are constants) */
+ /* constant fields, must be set correctly in initial value: */
char **variable;
const char *boot_val;
- const char *(*assign_hook) (const char *newval, bool doit, bool interactive);
- const char *(*show_hook) (void);
+ GucStringCheckHook check_hook;
+ GucStringAssignHook assign_hook;
+ GucShowHook show_hook;
/* variable fields, initialized at runtime: */
char *reset_val;
- char *session_val;
- char *tentative_val;
+ void *reset_extra;
+};
+
+struct config_enum
+{
+ struct config_generic gen;
+ /* constant fields, must be set correctly in initial value: */
+ int *variable;
+ int boot_val;
+ const struct config_enum_entry *options;
+ GucEnumCheckHook check_hook;
+ GucEnumAssignHook assign_hook;
+ GucShowHook show_hook;
+ /* variable fields, initialized at runtime: */
+ int reset_val;
+ void *reset_extra;
};
/* constant tables corresponding to enums above and in guc.h */
-extern const char * const config_group_names[];
-extern const char * const config_type_names[];
-extern const char * const GucContext_Names[];
-extern const char * const GucSource_Names[];
+extern const char *const config_group_names[];
+extern const char *const config_type_names[];
+extern const char *const GucContext_Names[];
+extern const char *const GucSource_Names[];
-/* the current set of variables */
-extern struct config_generic **guc_variables;
-extern int num_guc_variables;
+/* get the current set of variables */
+extern struct config_generic **get_guc_variables(void);
extern void build_guc_variables(void);
-#endif
+/* search in enum options */
+extern const char *config_enum_lookup_by_value(struct config_enum *record, int val);
+extern bool config_enum_lookup_by_name(struct config_enum *record,
+ const char *value, int *retval);
+extern struct config_generic **get_explain_guc_options(int *num);
+
+#endif /* GUC_TABLES_H */