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