]> granicus.if.org Git - postgresql/blobdiff - src/include/utils/guc_tables.h
Fix initialization of fake LSN for unlogged relations
[postgresql] / src / include / utils / guc_tables.h
index b1abc0b1074010ddacb1bc9631e9e0533ea4ab47..d68976fafa94defa8d637ae59f3d24697c7f030f 100644 (file)
@@ -5,14 +5,47 @@
  *
  * 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 */
@@ -108,74 +180,93 @@ struct config_generic
 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 */