1/*-------------------------------------------------------------------------
2 *
3 * guc_tables.h
4 * Declarations of tables used by GUC.
5 *
6 * See src/backend/utils/misc/README for design notes.
7 *
8 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
9 *
10 * src/include/utils/guc_tables.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef GUC_TABLES_H
15#define GUC_TABLES_H 1
16
17#include "utils/guc.h"
18
19/*
20 * GUC supports these types of variables:
21 */
22enum config_type
23{
24 PGC_BOOL,
25 PGC_INT,
26 PGC_REAL,
27 PGC_STRING,
28 PGC_ENUM
29};
30
31union config_var_val
32{
33 bool boolval;
34 int intval;
35 double realval;
36 char *stringval;
37 int enumval;
38};
39
40/*
41 * The actual value of a GUC variable can include a malloc'd opaque struct
42 * "extra", which is created by its check_hook and used by its assign_hook.
43 */
44typedef struct config_var_value
45{
46 union config_var_val val;
47 void *extra;
48} config_var_value;
49
50/*
51 * Groupings to help organize all the run-time options for display
52 */
53enum config_group
54{
55 UNGROUPED,
56 FILE_LOCATIONS,
57 CONN_AUTH,
58 CONN_AUTH_SETTINGS,
59 CONN_AUTH_AUTH,
60 CONN_AUTH_SSL,
61 RESOURCES,
62 RESOURCES_MEM,
63 RESOURCES_DISK,
64 RESOURCES_KERNEL,
65 RESOURCES_VACUUM_DELAY,
66 RESOURCES_BGWRITER,
67 RESOURCES_ASYNCHRONOUS,
68 WAL,
69 WAL_SETTINGS,
70 WAL_CHECKPOINTS,
71 WAL_ARCHIVING,
72 WAL_ARCHIVE_RECOVERY,
73 WAL_RECOVERY_TARGET,
74 REPLICATION,
75 REPLICATION_SENDING,
76 REPLICATION_MASTER,
77 REPLICATION_STANDBY,
78 REPLICATION_SUBSCRIBERS,
79 QUERY_TUNING,
80 QUERY_TUNING_METHOD,
81 QUERY_TUNING_COST,
82 QUERY_TUNING_GEQO,
83 QUERY_TUNING_OTHER,
84 LOGGING,
85 LOGGING_WHERE,
86 LOGGING_WHEN,
87 LOGGING_WHAT,
88 PROCESS_TITLE,
89 STATS,
90 STATS_MONITORING,
91 STATS_COLLECTOR,
92 AUTOVACUUM,
93 CLIENT_CONN,
94 CLIENT_CONN_STATEMENT,
95 CLIENT_CONN_LOCALE,
96 CLIENT_CONN_PRELOAD,
97 CLIENT_CONN_OTHER,
98 LOCK_MANAGEMENT,
99 COMPAT_OPTIONS,
100 COMPAT_OPTIONS_PREVIOUS,
101 COMPAT_OPTIONS_CLIENT,
102 ERROR_HANDLING_OPTIONS,
103 PRESET_OPTIONS,
104 CUSTOM_OPTIONS,
105 DEVELOPER_OPTIONS
106};
107
108/*
109 * Stack entry for saving the state a variable had prior to an uncommitted
110 * transactional change
111 */
112typedef enum
113{
114 /* This is almost GucAction, but we need a fourth state for SET+LOCAL */
115 GUC_SAVE, /* entry caused by function SET option */
116 GUC_SET, /* entry caused by plain SET command */
117 GUC_LOCAL, /* entry caused by SET LOCAL command */
118 GUC_SET_LOCAL /* entry caused by SET then SET LOCAL */
119} GucStackState;
120
121typedef struct guc_stack
122{
123 struct guc_stack *prev; /* previous stack item, if any */
124 int nest_level; /* nesting depth at which we made entry */
125 GucStackState state; /* see enum above */
126 GucSource source; /* source of the prior value */
127 /* masked value's source must be PGC_S_SESSION, so no need to store it */
128 GucContext scontext; /* context that set the prior value */
129 GucContext masked_scontext; /* context that set the masked value */
130 config_var_value prior; /* previous value of variable */
131 config_var_value masked; /* SET value in a GUC_SET_LOCAL entry */
132} GucStack;
133
134/*
135 * Generic fields applicable to all types of variables
136 *
137 * The short description should be less than 80 chars in length. Some
138 * applications may use the long description as well, and will append
139 * it to the short description. (separated by a newline or '. ')
140 *
141 * Note that sourcefile/sourceline are kept here, and not pushed into stacked
142 * values, although in principle they belong with some stacked value if the
143 * active value is session- or transaction-local. This is to avoid bloating
144 * stack entries. We know they are only relevant when source == PGC_S_FILE.
145 */
146struct config_generic
147{
148 /* constant fields, must be set correctly in initial value: */
149 const char *name; /* name of variable - MUST BE FIRST */
150 GucContext context; /* context required to set the variable */
151 enum config_group group; /* to help organize variables by function */
152 const char *short_desc; /* short desc. of this variable's purpose */
153 const char *long_desc; /* long desc. of this variable's purpose */
154 int flags; /* flag bits, see guc.h */
155 /* variable fields, initialized at runtime: */
156 enum config_type vartype; /* type of variable (set only at startup) */
157 int status; /* status bits, see below */
158 GucSource source; /* source of the current actual value */
159 GucSource reset_source; /* source of the reset_value */
160 GucContext scontext; /* context that set the current value */
161 GucContext reset_scontext; /* context that set the reset value */
162 GucStack *stack; /* stacked prior values */
163 void *extra; /* "extra" pointer for current actual value */
164 char *sourcefile; /* file current setting is from (NULL if not
165 * set in config file) */
166 int sourceline; /* line in source file */
167};
168
169/* bit values in status field */
170#define GUC_IS_IN_FILE 0x0001 /* found it in config file */
171/*
172 * Caution: the GUC_IS_IN_FILE bit is transient state for ProcessConfigFile.
173 * Do not assume that its value represents useful information elsewhere.
174 */
175#define GUC_PENDING_RESTART 0x0002
176
177
178/* GUC records for specific variable types */
179
180struct config_bool
181{
182 struct config_generic gen;
183 /* constant fields, must be set correctly in initial value: */
184 bool *variable;
185 bool boot_val;
186 GucBoolCheckHook check_hook;
187 GucBoolAssignHook assign_hook;
188 GucShowHook show_hook;
189 /* variable fields, initialized at runtime: */
190 bool reset_val;
191 void *reset_extra;
192};
193
194struct config_int
195{
196 struct config_generic gen;
197 /* constant fields, must be set correctly in initial value: */
198 int *variable;
199 int boot_val;
200 int min;
201 int max;
202 GucIntCheckHook check_hook;
203 GucIntAssignHook assign_hook;
204 GucShowHook show_hook;
205 /* variable fields, initialized at runtime: */
206 int reset_val;
207 void *reset_extra;
208};
209
210struct config_real
211{
212 struct config_generic gen;
213 /* constant fields, must be set correctly in initial value: */
214 double *variable;
215 double boot_val;
216 double min;
217 double max;
218 GucRealCheckHook check_hook;
219 GucRealAssignHook assign_hook;
220 GucShowHook show_hook;
221 /* variable fields, initialized at runtime: */
222 double reset_val;
223 void *reset_extra;
224};
225
226struct config_string
227{
228 struct config_generic gen;
229 /* constant fields, must be set correctly in initial value: */
230 char **variable;
231 const char *boot_val;
232 GucStringCheckHook check_hook;
233 GucStringAssignHook assign_hook;
234 GucShowHook show_hook;
235 /* variable fields, initialized at runtime: */
236 char *reset_val;
237 void *reset_extra;
238};
239
240struct config_enum
241{
242 struct config_generic gen;
243 /* constant fields, must be set correctly in initial value: */
244 int *variable;
245 int boot_val;
246 const struct config_enum_entry *options;
247 GucEnumCheckHook check_hook;
248 GucEnumAssignHook assign_hook;
249 GucShowHook show_hook;
250 /* variable fields, initialized at runtime: */
251 int reset_val;
252 void *reset_extra;
253};
254
255/* constant tables corresponding to enums above and in guc.h */
256extern const char *const config_group_names[];
257extern const char *const config_type_names[];
258extern const char *const GucContext_Names[];
259extern const char *const GucSource_Names[];
260
261/* get the current set of variables */
262extern struct config_generic **get_guc_variables(void);
263
264extern void build_guc_variables(void);
265
266/* search in enum options */
267extern const char *config_enum_lookup_by_value(struct config_enum *record, int val);
268extern bool config_enum_lookup_by_name(struct config_enum *record,
269 const char *value, int *retval);
270extern struct config_generic **get_explain_guc_options(int *num);
271
272#endif /* GUC_TABLES_H */
273