1 /*--------------------------------------------------------------------
2  * guc.h
3  *
4  * External declarations pertaining to backend/utils/misc/guc.c and
5  * backend/utils/misc/guc-file.l
6  *
7  * Copyright (c) 2000-2021, PostgreSQL Global Development Group
8  * Written by Peter Eisentraut <peter_e@gmx.net>.
9  *
10  * src/include/utils/guc.h
11  *--------------------------------------------------------------------
12  */
13 #ifndef GUC_H
14 #define GUC_H
15 
16 #include "nodes/parsenodes.h"
17 #include "tcop/dest.h"
18 #include "utils/array.h"
19 
20 
21 /* upper limit for GUC variables measured in kilobytes of memory */
22 /* note that various places assume the byte size fits in a "long" variable */
23 #if SIZEOF_SIZE_T > 4 && SIZEOF_LONG > 4
24 #define MAX_KILOBYTES	INT_MAX
25 #else
26 #define MAX_KILOBYTES	(INT_MAX / 1024)
27 #endif
28 
29 /*
30  * Automatic configuration file name for ALTER SYSTEM.
31  * This file will be used to store values of configuration parameters
32  * set by ALTER SYSTEM command.
33  */
34 #define PG_AUTOCONF_FILENAME		"postgresql.auto.conf"
35 
36 /*
37  * Certain options can only be set at certain times. The rules are
38  * like this:
39  *
40  * INTERNAL options cannot be set by the user at all, but only through
41  * internal processes ("server_version" is an example).  These are GUC
42  * variables only so they can be shown by SHOW, etc.
43  *
44  * POSTMASTER options can only be set when the postmaster starts,
45  * either from the configuration file or the command line.
46  *
47  * SIGHUP options can only be set at postmaster startup or by changing
48  * the configuration file and sending the HUP signal to the postmaster
49  * or a backend process. (Notice that the signal receipt will not be
50  * evaluated immediately. The postmaster and the backend check it at a
51  * certain point in their main loop. It's safer to wait than to read a
52  * file asynchronously.)
53  *
54  * BACKEND and SU_BACKEND options can only be set at postmaster startup,
55  * from the configuration file, or by client request in the connection
56  * startup packet (e.g., from libpq's PGOPTIONS variable).  SU_BACKEND
57  * options can be set from the startup packet only when the user is a
58  * superuser.  Furthermore, an already-started backend will ignore changes
59  * to such an option in the configuration file.  The idea is that these
60  * options are fixed for a given backend once it's started, but they can
61  * vary across backends.
62  *
63  * SUSET options can be set at postmaster startup, with the SIGHUP
64  * mechanism, or from the startup packet or SQL if you're a superuser.
65  *
66  * USERSET options can be set by anyone any time.
67  */
68 typedef enum
69 {
70 	PGC_INTERNAL,
71 	PGC_POSTMASTER,
72 	PGC_SIGHUP,
73 	PGC_SU_BACKEND,
74 	PGC_BACKEND,
75 	PGC_SUSET,
76 	PGC_USERSET
77 } GucContext;
78 
79 /*
80  * The following type records the source of the current setting.  A
81  * new setting can only take effect if the previous setting had the
82  * same or lower level.  (E.g, changing the config file doesn't
83  * override the postmaster command line.)  Tracking the source allows us
84  * to process sources in any convenient order without affecting results.
85  * Sources <= PGC_S_OVERRIDE will set the default used by RESET, as well
86  * as the current value.  Note that source == PGC_S_OVERRIDE should be
87  * used when setting a PGC_INTERNAL option.
88  *
89  * PGC_S_INTERACTIVE isn't actually a source value, but is the
90  * dividing line between "interactive" and "non-interactive" sources for
91  * error reporting purposes.
92  *
93  * PGC_S_TEST is used when testing values to be used later.  For example,
94  * ALTER DATABASE/ROLE tests proposed per-database or per-user defaults this
95  * way, and CREATE FUNCTION tests proposed function SET clauses this way.
96  * This is an interactive case, but it needs its own source value because
97  * some assign hooks need to make different validity checks in this case.
98  * In particular, references to nonexistent database objects generally
99  * shouldn't throw hard errors in this case, at most NOTICEs, since the
100  * objects might exist by the time the setting is used for real.
101  *
102  * NB: see GucSource_Names in guc.c if you change this.
103  */
104 typedef enum
105 {
106 	PGC_S_DEFAULT,				/* hard-wired default ("boot_val") */
107 	PGC_S_DYNAMIC_DEFAULT,		/* default computed during initialization */
108 	PGC_S_ENV_VAR,				/* postmaster environment variable */
109 	PGC_S_FILE,					/* postgresql.conf */
110 	PGC_S_ARGV,					/* postmaster command line */
111 	PGC_S_GLOBAL,				/* global in-database setting */
112 	PGC_S_DATABASE,				/* per-database setting */
113 	PGC_S_USER,					/* per-user setting */
114 	PGC_S_DATABASE_USER,		/* per-user-and-database setting */
115 	PGC_S_CLIENT,				/* from client connection request */
116 	PGC_S_OVERRIDE,				/* special case to forcibly set default */
117 	PGC_S_INTERACTIVE,			/* dividing line for error reporting */
118 	PGC_S_TEST,					/* test per-database or per-user setting */
119 	PGC_S_SESSION				/* SET command */
120 } GucSource;
121 
122 /*
123  * Parsing the configuration file(s) will return a list of name-value pairs
124  * with source location info.  We also abuse this data structure to carry
125  * error reports about the config files.  An entry reporting an error will
126  * have errmsg != NULL, and might have NULLs for name, value, and/or filename.
127  *
128  * If "ignore" is true, don't attempt to apply the item (it might be an error
129  * report, or an item we determined to be duplicate).  "applied" is set true
130  * if we successfully applied, or could have applied, the setting.
131  */
132 typedef struct ConfigVariable
133 {
134 	char	   *name;
135 	char	   *value;
136 	char	   *errmsg;
137 	char	   *filename;
138 	int			sourceline;
139 	bool		ignore;
140 	bool		applied;
141 	struct ConfigVariable *next;
142 } ConfigVariable;
143 
144 extern bool ParseConfigFile(const char *config_file, bool strict,
145 							const char *calling_file, int calling_lineno,
146 							int depth, int elevel,
147 							ConfigVariable **head_p, ConfigVariable **tail_p);
148 extern bool ParseConfigFp(FILE *fp, const char *config_file,
149 						  int depth, int elevel,
150 						  ConfigVariable **head_p, ConfigVariable **tail_p);
151 extern bool ParseConfigDirectory(const char *includedir,
152 								 const char *calling_file, int calling_lineno,
153 								 int depth, int elevel,
154 								 ConfigVariable **head_p,
155 								 ConfigVariable **tail_p);
156 extern void FreeConfigVariables(ConfigVariable *list);
157 extern char *DeescapeQuotedString(const char *s);
158 
159 /*
160  * The possible values of an enum variable are specified by an array of
161  * name-value pairs.  The "hidden" flag means the value is accepted but
162  * won't be displayed when guc.c is asked for a list of acceptable values.
163  */
164 struct config_enum_entry
165 {
166 	const char *name;
167 	int			val;
168 	bool		hidden;
169 };
170 
171 /*
172  * Signatures for per-variable check/assign/show hook functions
173  */
174 typedef bool (*GucBoolCheckHook) (bool *newval, void **extra, GucSource source);
175 typedef bool (*GucIntCheckHook) (int *newval, void **extra, GucSource source);
176 typedef bool (*GucRealCheckHook) (double *newval, void **extra, GucSource source);
177 typedef bool (*GucStringCheckHook) (char **newval, void **extra, GucSource source);
178 typedef bool (*GucEnumCheckHook) (int *newval, void **extra, GucSource source);
179 
180 typedef void (*GucBoolAssignHook) (bool newval, void *extra);
181 typedef void (*GucIntAssignHook) (int newval, void *extra);
182 typedef void (*GucRealAssignHook) (double newval, void *extra);
183 typedef void (*GucStringAssignHook) (const char *newval, void *extra);
184 typedef void (*GucEnumAssignHook) (int newval, void *extra);
185 
186 typedef const char *(*GucShowHook) (void);
187 
188 /*
189  * Miscellaneous
190  */
191 typedef enum
192 {
193 	/* Types of set_config_option actions */
194 	GUC_ACTION_SET,				/* regular SET command */
195 	GUC_ACTION_LOCAL,			/* SET LOCAL command */
196 	GUC_ACTION_SAVE				/* function SET option, or temp assignment */
197 } GucAction;
198 
199 #define GUC_QUALIFIER_SEPARATOR '.'
200 
201 /*
202  * bit values in "flags" of a GUC variable
203  */
204 #define GUC_LIST_INPUT			0x0001	/* input can be list format */
205 #define GUC_LIST_QUOTE			0x0002	/* double-quote list elements */
206 #define GUC_NO_SHOW_ALL			0x0004	/* exclude from SHOW ALL */
207 #define GUC_NO_RESET_ALL		0x0008	/* exclude from RESET ALL */
208 #define GUC_REPORT				0x0010	/* auto-report changes to client */
209 #define GUC_NOT_IN_SAMPLE		0x0020	/* not in postgresql.conf.sample */
210 #define GUC_DISALLOW_IN_FILE	0x0040	/* can't set in postgresql.conf */
211 #define GUC_CUSTOM_PLACEHOLDER	0x0080	/* placeholder for custom variable */
212 #define GUC_SUPERUSER_ONLY		0x0100	/* show only to superusers */
213 #define GUC_IS_NAME				0x0200	/* limit string to NAMEDATALEN-1 */
214 #define GUC_NOT_WHILE_SEC_REST	0x0400	/* can't set if security restricted */
215 #define GUC_DISALLOW_IN_AUTO_FILE 0x0800	/* can't set in
216 											 * PG_AUTOCONF_FILENAME */
217 
218 #define GUC_UNIT_KB				0x1000	/* value is in kilobytes */
219 #define GUC_UNIT_BLOCKS			0x2000	/* value is in blocks */
220 #define GUC_UNIT_XBLOCKS		0x3000	/* value is in xlog blocks */
221 #define GUC_UNIT_MB				0x4000	/* value is in megabytes */
222 #define GUC_UNIT_BYTE			0x8000	/* value is in bytes */
223 #define GUC_UNIT_MEMORY			0xF000	/* mask for size-related units */
224 
225 #define GUC_UNIT_MS			   0x10000	/* value is in milliseconds */
226 #define GUC_UNIT_S			   0x20000	/* value is in seconds */
227 #define GUC_UNIT_MIN		   0x30000	/* value is in minutes */
228 #define GUC_UNIT_TIME		   0xF0000	/* mask for time-related units */
229 
230 #define GUC_EXPLAIN			  0x100000	/* include in explain */
231 
232 #define GUC_UNIT				(GUC_UNIT_MEMORY | GUC_UNIT_TIME)
233 
234 
235 /* GUC vars that are actually declared in guc.c, rather than elsewhere */
236 extern bool Debug_print_plan;
237 extern bool Debug_print_parse;
238 extern bool Debug_print_rewritten;
239 extern bool Debug_pretty_print;
240 
241 extern bool log_parser_stats;
242 extern bool log_planner_stats;
243 extern bool log_executor_stats;
244 extern bool log_statement_stats;
245 extern bool log_btree_build_stats;
246 
247 extern PGDLLIMPORT bool check_function_bodies;
248 extern bool session_auth_is_superuser;
249 
250 extern bool log_duration;
251 extern int	log_parameter_max_length;
252 extern int	log_parameter_max_length_on_error;
253 extern int	log_min_error_statement;
254 extern PGDLLIMPORT int log_min_messages;
255 extern PGDLLIMPORT int client_min_messages;
256 extern int	log_min_duration_sample;
257 extern int	log_min_duration_statement;
258 extern int	log_temp_files;
259 extern double log_statement_sample_rate;
260 extern double log_xact_sample_rate;
261 extern char *backtrace_functions;
262 extern char *backtrace_symbol_list;
263 
264 extern int	temp_file_limit;
265 
266 extern int	num_temp_buffers;
267 
268 extern char *cluster_name;
269 extern PGDLLIMPORT char *ConfigFileName;
270 extern char *HbaFileName;
271 extern char *IdentFileName;
272 extern char *external_pid_file;
273 
274 extern PGDLLIMPORT char *application_name;
275 
276 extern int	tcp_keepalives_idle;
277 extern int	tcp_keepalives_interval;
278 extern int	tcp_keepalives_count;
279 extern int	tcp_user_timeout;
280 
281 #ifdef TRACE_SORT
282 extern bool trace_sort;
283 #endif
284 
285 /*
286  * Functions exported by guc.c
287  */
288 extern void SetConfigOption(const char *name, const char *value,
289 							GucContext context, GucSource source);
290 
291 extern void DefineCustomBoolVariable(const char *name,
292 									 const char *short_desc,
293 									 const char *long_desc,
294 									 bool *valueAddr,
295 									 bool bootValue,
296 									 GucContext context,
297 									 int flags,
298 									 GucBoolCheckHook check_hook,
299 									 GucBoolAssignHook assign_hook,
300 									 GucShowHook show_hook);
301 
302 extern void DefineCustomIntVariable(const char *name,
303 									const char *short_desc,
304 									const char *long_desc,
305 									int *valueAddr,
306 									int bootValue,
307 									int minValue,
308 									int maxValue,
309 									GucContext context,
310 									int flags,
311 									GucIntCheckHook check_hook,
312 									GucIntAssignHook assign_hook,
313 									GucShowHook show_hook);
314 
315 extern void DefineCustomRealVariable(const char *name,
316 									 const char *short_desc,
317 									 const char *long_desc,
318 									 double *valueAddr,
319 									 double bootValue,
320 									 double minValue,
321 									 double maxValue,
322 									 GucContext context,
323 									 int flags,
324 									 GucRealCheckHook check_hook,
325 									 GucRealAssignHook assign_hook,
326 									 GucShowHook show_hook);
327 
328 extern void DefineCustomStringVariable(const char *name,
329 									   const char *short_desc,
330 									   const char *long_desc,
331 									   char **valueAddr,
332 									   const char *bootValue,
333 									   GucContext context,
334 									   int flags,
335 									   GucStringCheckHook check_hook,
336 									   GucStringAssignHook assign_hook,
337 									   GucShowHook show_hook);
338 
339 extern void DefineCustomEnumVariable(const char *name,
340 									 const char *short_desc,
341 									 const char *long_desc,
342 									 int *valueAddr,
343 									 int bootValue,
344 									 const struct config_enum_entry *options,
345 									 GucContext context,
346 									 int flags,
347 									 GucEnumCheckHook check_hook,
348 									 GucEnumAssignHook assign_hook,
349 									 GucShowHook show_hook);
350 
351 extern void EmitWarningsOnPlaceholders(const char *className);
352 
353 extern const char *GetConfigOption(const char *name, bool missing_ok,
354 								   bool restrict_privileged);
355 extern const char *GetConfigOptionResetString(const char *name);
356 extern int	GetConfigOptionFlags(const char *name, bool missing_ok);
357 extern void ProcessConfigFile(GucContext context);
358 extern void InitializeGUCOptions(void);
359 extern bool SelectConfigFiles(const char *userDoption, const char *progname);
360 extern void ResetAllOptions(void);
361 extern void AtStart_GUC(void);
362 extern int	NewGUCNestLevel(void);
363 extern void AtEOXact_GUC(bool isCommit, int nestLevel);
364 extern void BeginReportingGUCOptions(void);
365 extern void ReportChangedGUCOptions(void);
366 extern void ParseLongOption(const char *string, char **name, char **value);
367 extern bool parse_int(const char *value, int *result, int flags,
368 					  const char **hintmsg);
369 extern bool parse_real(const char *value, double *result, int flags,
370 					   const char **hintmsg);
371 extern int	set_config_option(const char *name, const char *value,
372 							  GucContext context, GucSource source,
373 							  GucAction action, bool changeVal, int elevel,
374 							  bool is_reload);
375 extern void AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt);
376 extern char *GetConfigOptionByName(const char *name, const char **varname,
377 								   bool missing_ok);
378 extern void GetConfigOptionByNum(int varnum, const char **values, bool *noshow);
379 extern int	GetNumConfigOptions(void);
380 
381 extern void SetPGVariable(const char *name, List *args, bool is_local);
382 extern void GetPGVariable(const char *name, DestReceiver *dest);
383 extern TupleDesc GetPGVariableResultDesc(const char *name);
384 
385 extern void ExecSetVariableStmt(VariableSetStmt *stmt, bool isTopLevel);
386 extern char *ExtractSetVariableArgs(VariableSetStmt *stmt);
387 
388 extern void ProcessGUCArray(ArrayType *array,
389 							GucContext context, GucSource source, GucAction action);
390 extern ArrayType *GUCArrayAdd(ArrayType *array, const char *name, const char *value);
391 extern ArrayType *GUCArrayDelete(ArrayType *array, const char *name);
392 extern ArrayType *GUCArrayReset(ArrayType *array);
393 
394 #ifdef EXEC_BACKEND
395 extern void write_nondefault_variables(GucContext context);
396 extern void read_nondefault_variables(void);
397 #endif
398 
399 /* GUC serialization */
400 extern Size EstimateGUCStateSpace(void);
401 extern void SerializeGUCState(Size maxsize, char *start_address);
402 extern void RestoreGUCState(void *gucstate);
403 
404 /* Support for messages reported from GUC check hooks */
405 
406 extern PGDLLIMPORT char *GUC_check_errmsg_string;
407 extern PGDLLIMPORT char *GUC_check_errdetail_string;
408 extern PGDLLIMPORT char *GUC_check_errhint_string;
409 
410 extern void GUC_check_errcode(int sqlerrcode);
411 
412 #define GUC_check_errmsg \
413 	pre_format_elog_string(errno, TEXTDOMAIN), \
414 	GUC_check_errmsg_string = format_elog_string
415 
416 #define GUC_check_errdetail \
417 	pre_format_elog_string(errno, TEXTDOMAIN), \
418 	GUC_check_errdetail_string = format_elog_string
419 
420 #define GUC_check_errhint \
421 	pre_format_elog_string(errno, TEXTDOMAIN), \
422 	GUC_check_errhint_string = format_elog_string
423 
424 
425 /*
426  * The following functions are not in guc.c, but are declared here to avoid
427  * having to include guc.h in some widely used headers that it really doesn't
428  * belong in.
429  */
430 
431 /* in commands/tablespace.c */
432 extern bool check_default_tablespace(char **newval, void **extra, GucSource source);
433 extern bool check_temp_tablespaces(char **newval, void **extra, GucSource source);
434 extern void assign_temp_tablespaces(const char *newval, void *extra);
435 
436 /* in catalog/namespace.c */
437 extern bool check_search_path(char **newval, void **extra, GucSource source);
438 extern void assign_search_path(const char *newval, void *extra);
439 
440 /* in access/transam/xlog.c */
441 extern bool check_wal_buffers(int *newval, void **extra, GucSource source);
442 extern void assign_xlog_sync_method(int new_sync_method, void *extra);
443 
444 #endif							/* GUC_H */
445