The attached patch adds the --long-help option to the server executable.
This option displays all the available runtime options for that
particular server version, along with Max, Min and Reset values if
applicable and a description. It also groups the runtime options
together in accordance with the documentation.

--long-help -h provides details, (including):

With no options specified, it will output all available runtime options
in human friendly format, grouped by category and sorted by name.
 
Usage:
  Usage for --long-help option: [-g <group>] [-h] [-H] [-G] [-l]
[string]
 
 
General Options:
  [string]      All options with names that match this string
  -g GROUP      All options in categories that match GROUP
  -G            Do not sort output, by group or name
 
Output Options:
  -m            Machine friendly format. All fields are tab separated.
  -M            Same as m, except header with column names is suppressed
  -l            Prints list of all currently defined groups \ subgroups
  -h            Prints this help message


The human readable option can be used to help manually configure the
postgresql.conf file, while the machine readable format can be used by
server side utilities to help configure GUC variables. (for example a
GUI, for which this was created)


Thanks,
Aizaz Ahmed


Attachments 
-----------
patch file: pg_guc.patch,
new files: src/include/utils/guc_vars.h, /src/include/utils/pg_guc.h,
src/backend/utils/misc/pg_guc.c

To be applied to 7.4 devel.

? build
? src/backend/utils/misc/pg_guc.c
? src/include/utils/guc_vars.h
? src/include/utils/pg_guc.h
Index: src/backend/nls.mk
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/nls.mk,v
retrieving revision 1.4
diff -c -p -r1.4 nls.mk
*** src/backend/nls.mk  28 Jun 2003 22:30:59 -0000      1.4
--- src/backend/nls.mk  30 Jun 2003 19:18:41 -0000
***************
*** 2,8 ****
  CATALOG_NAME  := postgres
  AVAIL_LANGUAGES       := cs de es hr hu ru sv tr zh_CN zh_TW
  GETTEXT_FILES := + gettext-files
! GETTEXT_TRIGGERS:= elog:2 postmaster_error yyerror
  
  gettext-files:
        find $(srcdir)/ -name '*.c' -print >$@
--- 2,8 ----
  CATALOG_NAME  := postgres
  AVAIL_LANGUAGES       := cs de es hr hu ru sv tr zh_CN zh_TW
  GETTEXT_FILES := + gettext-files
! GETTEXT_TRIGGERS:= elog:2 postmaster_error yyerror translatable
  
  gettext-files:
        find $(srcdir)/ -name '*.c' -print >$@
Index: src/backend/main/main.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/main/main.c,v
retrieving revision 1.57
diff -c -p -r1.57 main.c
*** src/backend/main/main.c     15 May 2003 16:35:28 -0000      1.57
--- src/backend/main/main.c     30 Jun 2003 19:18:41 -0000
*************** main(int argc, char *argv[])
*** 203,210 ****
         * argument) we were called with.  The lack of consistency here is
         * historical.
         */
-       len = strlen(new_argv[0]);
  
        if (len >= 10 && strcmp(new_argv[0] + len - 10, "postmaster") == 0)
        {
                /* Called as "postmaster" */
--- 203,220 ----
         * argument) we were called with.  The lack of consistency here is
         * historical.
         */
  
+       /*
+        * If the first argument is "--long-help", then invoke display details
+        * about all available runtime configuration options.
+        * We remove "--long-help" from the arguments passed on to GucInfoMain.
+        */
+       if (argc > 1 && strcmp(new_argv[1], "--long-help") == 0)
+       {
+               exit(GucInfoMain(argc - 1, new_argv + 1));
+       }
+ 
+       len = strlen(new_argv[0]);
        if (len >= 10 && strcmp(new_argv[0] + len - 10, "postmaster") == 0)
        {
                /* Called as "postmaster" */
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v
retrieving revision 1.333
diff -c -p -r1.333 postmaster.c
*** src/backend/postmaster/postmaster.c 12 Jun 2003 07:36:51 -0000      1.333
--- src/backend/postmaster/postmaster.c 30 Jun 2003 19:18:42 -0000
*************** usage(const char *progname)
*** 961,966 ****
--- 961,967 ----
        printf(gettext("  -o OPTIONS      pass 'OPTIONS' to each backend server\n"));
        printf(gettext("  -p PORT         port number to listen on\n"));
        printf(gettext("  -S              silent mode (start in background without 
logging output)\n"));
+       printf(gettext("  --long-help     List runtime options, then exit. Details: 
--long-help -h\n"));
        printf(gettext("  --help          show this help, then exit\n"));
        printf(gettext("  --version       output version information, then exit\n"));
  
Index: src/backend/utils/misc/Makefile
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/Makefile,v
retrieving revision 1.20
diff -c -p -r1.20 Makefile
*** src/backend/utils/misc/Makefile     1 Nov 2002 22:52:33 -0000       1.20
--- src/backend/utils/misc/Makefile     30 Jun 2003 19:18:42 -0000
*************** include $(top_builddir)/src/Makefile.glo
*** 6,12 ****
  
  override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
  
! OBJS = database.o superuser.o guc.o ps_status.o
  
  # This location might depend on the installation directories. Therefore
  # we can't subsitute it into config.h.
--- 6,12 ----
  
  override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
  
! OBJS = database.o superuser.o guc.o ps_status.o pg_guc.o
  
  # This location might depend on the installation directories. Therefore
  # we can't subsitute it into config.h.
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.132
diff -c -p -r1.132 guc.c
*** src/backend/utils/misc/guc.c        27 Jun 2003 19:08:38 -0000      1.132
--- src/backend/utils/misc/guc.c        30 Jun 2003 19:18:44 -0000
***************
*** 15,20 ****
--- 15,26 ----
   *--------------------------------------------------------------------
   */
  
+ /*
+  * The translatable macro is used to mark string literals for translation
+  * by the gettext system
+  */
+ #define translatable(x) (x)
+ 
  #include "postgres.h"
  
  #include <errno.h>
*************** static char *XactIsoLevel_string;
*** 154,261 ****
  
  
  /*
   * Declarations for GUC tables
   *
   * See src/backend/utils/misc/README for design notes.
   */
! enum config_type
! {
!       PGC_BOOL,
!       PGC_INT,
!       PGC_REAL,
!       PGC_STRING
! };
! 
! /* Generic fields applicable to all types of variables */
! 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 */
!       int                     flags;                  /* flag bits, see below */
!       /* 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 
*/
! };
! 
! /* 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 */
! 
! /* 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 */
! 
! 
! /* 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) */
!       bool       *variable;
!       bool            reset_val;
!       bool            (*assign_hook) (bool newval, bool doit, bool interactive);
!       const char *(*show_hook) (void);
!       /* variable fields, initialized at runtime: */
!       bool            session_val;
!       bool            tentative_val;
! };
! 
! struct config_int
! {
!       struct config_generic gen;
!       /* these fields must be set correctly in initial value: */
!       /* (all but reset_val are constants) */
!       int                *variable;
!       int                     reset_val;
!       int                     min;
!       int                     max;
!       bool            (*assign_hook) (int newval, bool doit, bool interactive);
!       const char *(*show_hook) (void);
!       /* variable fields, initialized at runtime: */
!       int                     session_val;
!       int                     tentative_val;
! };
! 
! struct config_real
! {
!       struct config_generic gen;
!       /* these fields must be set correctly in initial value: */
!       /* (all but reset_val are constants) */
!       double     *variable;
!       double          reset_val;
!       double          min;
!       double          max;
!       bool            (*assign_hook) (double newval, bool doit, bool interactive);
!       const char *(*show_hook) (void);
!       /* variable fields, initialized at runtime: */
!       double          session_val;
!       double          tentative_val;
! };
! 
! struct config_string
! {
!       struct config_generic gen;
!       /* these fields must be set correctly in initial value: */
!       /* (all are constants) */
!       char      **variable;
!       const char *boot_val;
!       const char *(*assign_hook) (const char *newval, bool doit, bool interactive);
!       const char *(*show_hook) (void);
!       /* variable fields, initialized at runtime: */
!       char       *reset_val;
!       char       *session_val;
!       char       *tentative_val;
! };
  
  /* Macros for freeing malloc'd pointers only if appropriate to do so */
  /* Some of these tests are probably redundant, but be safe ... */
--- 160,211 ----
  
  
  /*
+  * The display name for each of the groupings defined in enum config_group
+  * This array needs to be kept in sync with enum config_group.
+  * This array however needs to be NULL terminated.
+  */
+ char *config_group_names [] = { 
+                       translatable("Ungrouped"),
+                       translatable("Connections & Authentication"),
+                       translatable("Connections & Authentication / Connection 
Settings"),
+                       translatable("Connections & Authentication / Security & 
Authentication"),
+                       translatable("Resource Usage"),
+                       translatable("Resource Usage / Memory"),
+                       translatable("Resource Usage / Free Space Map"),
+                       translatable("Resource Usage / Disk Usage"),
+                       translatable("Write Ahead Log"),
+                       translatable("Write Ahead Log / Settings"),
+                       translatable("Write Ahead Log / Checkpoints"),
+                       translatable("Query Tuning"),
+                       translatable("Query Tuning / Planner Method Enabling"),
+                       translatable("Query Tuning / Planner Cost Constants"),
+                       translatable("Query Tuning / Genetic Estimate Query 
Optimizer"),
+                       translatable("Query Tuning / Other Query Modifiers"),
+                       translatable("Client Connection Defaults"),
+                       translatable("Client Connection Defaults / Statement 
Behaviour"),
+                       translatable("Client Connection Defaults / Locale and 
Formatting"),
+                       translatable("Client Connection Defaults / Other Defaults"),
+                       translatable("Logging & Debugging"),
+                       translatable("Logging & Debugging / When To Log"),
+                       translatable("Logging & Debugging / What To Log"),
+                       translatable("Logging & Debugging / Syslog"),
+                       translatable("Statistics"),
+                       translatable("Statistics / Monitoring"),
+                       translatable("Statistics / Query & Index Statistics 
Collector"),
+                       translatable("Lock Management"),
+                       translatable("Version & Platform Compatibility"),
+                       translatable("Version & Platform Compatibility / Previous 
Postgres Versions"),
+                       translatable("Version & Platform Compatibility / Platform & 
Client"),
+                       translatable("Source Developer Options"),
+                       NULL
+                                       };
+ 
+ /*
   * Declarations for GUC tables
   *
   * See src/backend/utils/misc/README for design notes.
   */
! #include "utils/guc_vars.h"
  
  /* Macros for freeing malloc'd pointers only if appropriate to do so */
  /* Some of these tests are probably redundant, but be safe ... */
*************** struct config_string
*** 322,621 ****
  
  /******** option records follow ********/
  
! static struct config_bool
                        ConfigureNamesBool[] =
  {
        {
!               {"enable_seqscan", PGC_USERSET}, &enable_seqscan,
!               true, NULL, NULL
!       },
!       {
!               {"enable_indexscan", PGC_USERSET}, &enable_indexscan,
!               true, NULL, NULL
!       },
!       {
!               {"enable_tidscan", PGC_USERSET}, &enable_tidscan,
!               true, NULL, NULL
!       },
!       {
!               {"enable_sort", PGC_USERSET}, &enable_sort,
!               true, NULL, NULL
!       },
!       {
!               {"enable_hashagg", PGC_USERSET}, &enable_hashagg,
!               true, NULL, NULL
!       },
!       {
!               {"enable_nestloop", PGC_USERSET}, &enable_nestloop,
!               true, NULL, NULL
        },
        {
!               {"enable_mergejoin", PGC_USERSET}, &enable_mergejoin,
!               true, NULL, NULL
        },
        {
!               {"enable_hashjoin", PGC_USERSET}, &enable_hashjoin,
!               true, NULL, NULL
        },
        {
!               {"geqo", PGC_USERSET}, &enable_geqo,
!               true, NULL, NULL
        },
- 
-       /* Not for general use --- used by SET SESSION AUTHORIZATION */
        {
!               {"is_superuser", PGC_INTERNAL, GUC_REPORT | GUC_NO_SHOW_ALL | 
GUC_NO_RESET_ALL},
!               &session_auth_is_superuser,
!               false, NULL, NULL
        },
- 
        {
!               {"tcpip_socket", PGC_POSTMASTER}, &NetServer,
!               false, NULL, NULL
        },
        {
!               {"ssl", PGC_POSTMASTER}, &EnableSSL,
!               false, NULL, NULL
        },
!       {
!               {"fsync", PGC_SIGHUP}, &enableFsync,
!               true, NULL, NULL
        },
        {
!               {"zero_damaged_pages", PGC_SUSET}, &zero_damaged_pages,
!               false, NULL, NULL
        },
        {
!               {"silent_mode", PGC_POSTMASTER}, &SilentMode,
!               false, NULL, NULL
!       },
! 
!       {
!               {"log_connections", PGC_BACKEND}, &Log_connections,
!               false, NULL, NULL
!       },
!       {
!               {"log_timestamp", PGC_SIGHUP}, &Log_timestamp,
!               false, NULL, NULL
        },
        {
!               {"log_pid", PGC_SIGHUP}, &Log_pid,
!               false, NULL, NULL
        },
  
  #ifdef USE_ASSERT_CHECKING
        {
!               {"debug_assertions", PGC_USERSET}, &assert_enabled,
!               true, NULL, NULL
        },
  #endif
  
!       {
                /* currently undocumented, so don't show in SHOW ALL */
!               {"exit_on_error", PGC_USERSET, GUC_NO_SHOW_ALL}, &ExitOnAnyError,
!               false, NULL, NULL
!       },
! 
        {
!               {"log_statement", PGC_SUSET}, &log_statement,
!               false, NULL, NULL
        },
        {
!               {"log_duration", PGC_SUSET}, &log_duration,
!               false, NULL, NULL
        },
        {
!               {"debug_print_parse", PGC_USERSET}, &Debug_print_parse,
!               false, NULL, NULL
        },
        {
!               {"debug_print_rewritten", PGC_USERSET}, &Debug_print_rewritten,
!               false, NULL, NULL
        },
        {
!               {"debug_print_plan", PGC_USERSET}, &Debug_print_plan,
!               false, NULL, NULL
        },
        {
!               {"debug_pretty_print", PGC_USERSET}, &Debug_pretty_print,
!               false, NULL, NULL
        },
  
        {
!               {"log_parser_stats", PGC_SUSET}, &log_parser_stats,
!               false, NULL, NULL
        },
        {
!               {"log_planner_stats", PGC_SUSET}, &log_planner_stats,
!               false, NULL, NULL
        },
        {
!               {"log_executor_stats", PGC_SUSET}, &log_executor_stats,
!               false, NULL, NULL
        },
        {
!               {"log_statement_stats", PGC_SUSET}, &log_statement_stats,
!               false, NULL, NULL
        },
  #ifdef BTREE_BUILD_STATS
        {
!               {"log_btree_build_stats", PGC_SUSET}, &log_btree_build_stats,
!               false, NULL, NULL
        },
  #endif
  
        {
!               {"explain_pretty_print", PGC_USERSET}, &Explain_pretty_print,
!               true, NULL, NULL
        },
  
        {
!               {"stats_start_collector", PGC_POSTMASTER}, 
&pgstat_collect_startcollector,
!               true, NULL, NULL
        },
        {
!               {"stats_reset_on_server_start", PGC_POSTMASTER}, 
&pgstat_collect_resetonpmstart,
!               true, NULL, NULL
        },
        {
!               {"stats_command_string", PGC_SUSET}, &pgstat_collect_querystring,
!               false, NULL, NULL
        },
        {
!               {"stats_row_level", PGC_SUSET}, &pgstat_collect_tuplelevel,
!               false, NULL, NULL
        },
        {
!               {"stats_block_level", PGC_SUSET}, &pgstat_collect_blocklevel,
!               false, NULL, NULL
        },
  
        {
!               {"trace_notify", PGC_USERSET}, &Trace_notify,
!               false, NULL, NULL
        },
  
  #ifdef LOCK_DEBUG
        {
!               {"trace_locks", PGC_SUSET}, &Trace_locks,
!               false, NULL, NULL
!       },
!       {
!               {"trace_userlocks", PGC_SUSET}, &Trace_userlocks,
!               false, NULL, NULL
!       },
!       {
!               {"trace_lwlocks", PGC_SUSET}, &Trace_lwlocks,
!               false, NULL, NULL
!       },
!       {
!               {"debug_deadlocks", PGC_SUSET}, &Debug_deadlocks,
!               false, NULL, NULL
        },
  #endif
  
        {
!               {"log_hostname", PGC_SIGHUP}, &log_hostname,
!               false, NULL, NULL
!       },
!       {
!               {"log_source_port", PGC_SIGHUP}, &LogSourcePort,
!               false, NULL, NULL
        },
  
        {
!               {"sql_inheritance", PGC_USERSET}, &SQL_inheritance,
!               true, NULL, NULL
!       },
!       {
!               {"australian_timezones", PGC_USERSET}, &Australian_timezones,
!               false, ClearDateCache, NULL
!       },
!       {
!               {"password_encryption", PGC_USERSET}, &Password_encryption,
!               true, NULL, NULL
!       },
!       {
!               {"transform_null_equals", PGC_USERSET}, &Transform_null_equals,
!               false, NULL, NULL
!       },
!       {
!               {"db_user_namespace", PGC_SIGHUP}, &Db_user_namespace,
!               false, NULL, NULL
        },
        {
                /*
                 * This var doesn't do anything; it's just here so that we won't
                 * choke on SET AUTOCOMMIT TO ON from 7.3-vintage clients.
!                */
!               {"autocommit", PGC_USERSET, GUC_NO_SHOW_ALL}, &phony_autocommit,
!               true, assign_phony_autocommit, NULL
!       },
!       {
!               {"default_transaction_read_only", PGC_USERSET}, &DefaultXactReadOnly,
!               false, NULL, NULL
!       },
!       {
!               {"transaction_read_only", PGC_USERSET, GUC_NO_RESET_ALL}, 
&XactReadOnly,
!               false, NULL, NULL
!       },
!       {
!               {"add_missing_from", PGC_USERSET}, &add_missing_from,
!               true, NULL, NULL
        },
  
        /* End-of-list marker */
        {
!               {NULL, 0}, NULL, false, NULL, NULL
!       },
  };
  
  
! static struct config_int
                        ConfigureNamesInt[] =
  {
        {
!               {"default_statistics_target", PGC_USERSET}, &default_statistics_target,
!               10, 1, 1000, NULL, NULL
!       },
!       {
!               {"from_collapse_limit", PGC_USERSET}, &from_collapse_limit,
!               8, 1, INT_MAX, NULL, NULL
!       },
!       {
!               {"join_collapse_limit", PGC_USERSET}, &join_collapse_limit,
!               8, 1, INT_MAX, NULL, NULL
!       },
!       {
!               {"geqo_threshold", PGC_USERSET}, &geqo_threshold,
!               11, 2, INT_MAX, NULL, NULL
!       },
!       {
!               {"geqo_pool_size", PGC_USERSET}, &Geqo_pool_size,
!               DEFAULT_GEQO_POOL_SIZE, 0, MAX_GEQO_POOL_SIZE, NULL, NULL
!       },
!       {
!               {"geqo_effort", PGC_USERSET}, &Geqo_effort,
!               1, 1, INT_MAX, NULL, NULL
!       },
!       {
!               {"geqo_generations", PGC_USERSET}, &Geqo_generations,
!               0, 0, INT_MAX, NULL, NULL
!       },
!       {
!               {"geqo_random_seed", PGC_USERSET}, &Geqo_random_seed,
!               -1, INT_MIN, INT_MAX, NULL, NULL
!       },
! 
!       {
!               {"deadlock_timeout", PGC_SIGHUP}, &DeadlockTimeout,
!               1000, 0, INT_MAX, NULL, NULL
        },
  
  #ifdef HAVE_SYSLOG
        {
!               {"syslog", PGC_SIGHUP}, &Use_syslog,
!               0, 0, 2, NULL, NULL
        },
  #endif
  
--- 272,780 ----
  
  /******** option records follow ********/
  
! struct config_bool
                        ConfigureNamesBool[] =
  {
        {
!               {"enable_seqscan", PGC_USERSET, QUERY_TUNING_METHOD,
!                translatable("Enable Query Planner's use of seq. scan plan types"),
!                NULL
!               },
!               &enable_seqscan, true, NULL, NULL
        },
        {
!               {"enable_indexscan", PGC_USERSET, QUERY_TUNING_METHOD,
!                translatable("Enable Query Planner's use of index-scan plan types"),
!                NULL
!               }, 
!               &enable_indexscan, true, NULL, NULL
        },
        {
!               {"enable_tidscan", PGC_USERSET, QUERY_TUNING_METHOD,
!                translatable("Enable Query Planner's use of TID scan plan types"),
!                NULL
!               }, 
!               &enable_tidscan, true, NULL, NULL
        },
        {
!               {"enable_sort", PGC_USERSET, QUERY_TUNING_METHOD,
!                translatable("Enable Query Planner's use of explicit sort steps"),
!                NULL
!               }, 
!               &enable_sort, true, NULL, NULL
        },
        {
!               {"enable_hashagg", PGC_USERSET, QUERY_TUNING_METHOD,
!                translatable("Enable Planner's use of hashed aggregation plan types"),
!                NULL
!               },
!               &enable_hashagg, true, NULL, NULL
        },
        {
!               {"enable_nestloop", PGC_USERSET, QUERY_TUNING_METHOD,
!                translatable("Enable Query Planner's use of nested-loop join plans"), 
!                NULL
!               },
!               &enable_nestloop, true, NULL, NULL
        },
        {
!               {"enable_mergejoin", PGC_USERSET, QUERY_TUNING_METHOD,
!                translatable("Enable Query Planner's use of merge-join plan types"), 
!                NULL
        },
!               &enable_mergejoin, true, NULL, NULL
        },
        {
!               {"enable_hashjoin", PGC_USERSET, QUERY_TUNING_METHOD,
!                translatable("Enable Query Planner's use of hash-join plan types"),
!                NULL
!               },
!               &enable_hashjoin, true, NULL, NULL
        },
        {
!               {"geqo", PGC_USERSET, QUERY_TUNING_GEQO,
!                translatable("Enable genetic query optimization"),
!                translatable("This algorithm attempts to do query planning without "
!                "exhaustive searching")
!               },
!               &enable_geqo, true, NULL, NULL
        },
+       /* Not for general use --- used by SET SESSION AUTHORIZATION */
        {
!               {"is_superuser", PGC_INTERNAL, DEVELOPER_OPTIONS,
!               translatable("Used by SET SESSION AUTHORIZATION"), 
!               NULL,
!               GUC_REPORT | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | NOT_IN_SAMPLE_CONF
!               },
!               &session_auth_is_superuser, false, NULL, NULL
!       },
!       {
!               {"tcpip_socket", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
!                translatable("Accept TCP/IP connections"), NULL
!               },
!               &NetServer, false, NULL, NULL
!       },
!       {
!               {"ssl", PGC_POSTMASTER, CONN_AUTH_SECURITY,
!                translatable("Enables SSL connections"), NULL
!               },
!               &EnableSSL, false, NULL, NULL
!       },
!       {
!               {"fsync", PGC_SIGHUP, WAL_SETTINGS,
!                translatable("If on, server physically writes updates to disk"),
!                translatable("It will use the fsync() system call in several places 
to make "
!                "sure that updates are physically written to disk. This insures "
!                "that a database cluster will recover to a consistent state after "
!                "an operating system or hardware crash")
!               },
!               &enableFsync, true, NULL, NULL
!       },
!       {
!               {"zero_damaged_pages", PGC_SUSET, DEVELOPER_OPTIONS,
!                translatable("Continues processing past damaged page headers"),
!                translatable("Detection of a damaged page header normally causes 
PostgreSQL to "
!                "report an error, aborting the current transaction. Setting "
!                "zero_damaged_pages to true causes the system to instead report a "
!                "warning, zero out the damaged page, and continue processing. This "
!                "behavior will destroy data, namely all the rows on the damaged 
page."),
!                NOT_IN_SAMPLE_CONF | DISALLOW_IN_CONF_FILE
!               },
!               &zero_damaged_pages, false, NULL, NULL
!       },
!       {
!               {"silent_mode", PGC_POSTMASTER, LOG_DEBUG_WHEN,
!                translatable("Runs the server silently"),
!                translatable("If this option is set, the server will automatically 
run in the"
!                "background and any controlling terminals are disassociated")
!               },
!               &SilentMode, false, NULL, NULL
!       },
! 
!       {
!               {"log_connections", PGC_BACKEND, LOG_DEBUG_WHAT,
!                translatable("Logs each successful connection"), NULL
!               },
!               &Log_connections, false, NULL, NULL
!       },
!       {
!               {"log_timestamp", PGC_SIGHUP, LOG_DEBUG_WHAT,
!                translatable("Prefixes server log messages with a time stamp"), NULL
!               },
!               &Log_timestamp, false, NULL, NULL
!               },
!       {
!               {"log_pid", PGC_SIGHUP, LOG_DEBUG_WHAT,
!                translatable("Prefixes server log messages with the server PID"), NULL
!               },
!               &Log_pid, false, NULL, NULL
        },
  
  #ifdef USE_ASSERT_CHECKING
        {
!               {"debug_assertions", PGC_USERSET, DEVELOPER_OPTIONS,
!                translatable("Turns on various assertion checks"),
!                translatable("This is a debugging aid. To use this option, the macro "
!                "USE_ASSERT_CHECKING  must be defined when PostgreSQL is built "
!                "(accomplished by the configure option --enable-cassert)"),
!                NOT_IN_SAMPLE_CONF
!               },
!               &assert_enabled, true, NULL, NULL
        },
  #endif
  
!         {
                /* currently undocumented, so don't show in SHOW ALL */
!               {"exit_on_error", PGC_USERSET, UNGROUPED,
!                translatable("No Description Available"), NULL, 
!                GUC_NO_SHOW_ALL | NOT_IN_SAMPLE_CONF
!               },
!               &ExitOnAnyError, false, NULL, NULL
!         },      
        {
!               {"log_statement", PGC_SUSET, LOG_DEBUG_WHAT,
!                translatable("Causes each SQL statement to be logged"), NULL
!               },
!               &log_statement, false, NULL, NULL
        },
        {
!               {"log_duration", PGC_SUSET, LOG_DEBUG_WHAT,
!                translatable("Duration of every completed statement is logged"), NULL
!               },
!               &log_duration, false, NULL, NULL
        },
        {
!               {"debug_print_parse", PGC_USERSET, LOG_DEBUG_WHAT,
!                translatable("Parse tree printed to server logs"),
!                translatable("Parsed for each executed query")
!               },
!               &Debug_print_parse, false, NULL, NULL
        },
        {
!               {"debug_print_rewritten", PGC_USERSET, LOG_DEBUG_WHAT,
!                translatable("Prints query rewriter output to server log"), NULL
!               },
!               &Debug_print_rewritten, false, NULL, NULL
        },
        {
!               {"debug_print_plan", PGC_USERSET, LOG_DEBUG_WHAT,
!                translatable("Prints execution plan to the server log"), NULL
!               },
!               &Debug_print_plan, false, NULL, NULL
        },
        {
!               {"debug_pretty_print", PGC_USERSET, LOG_DEBUG_WHAT,
!                translatable("Indents displays from parse, rewritten and plan"), NULL
!               },
!               &Debug_pretty_print, false, NULL, NULL
        },
  
        {
!               {"log_parser_stats", PGC_SUSET, STATS_MONITORING,
!                translatable("Write parser performance stats to server log"), NULL
!               },
!               &log_parser_stats, false, NULL, NULL
        },
        {
!               {"log_planner_stats", PGC_SUSET, STATS_MONITORING,
!                translatable("Write planner performance stats to server log"), NULL
!               },
!               &log_planner_stats, false, NULL, NULL
        },
        {
!               {"log_executor_stats", PGC_SUSET, STATS_MONITORING,
!                translatable("Write executor performance stats to server log"), NULL
!               },
!               &log_executor_stats,false, NULL, NULL
        },
        {
!               {"log_statement_stats", PGC_SUSET, STATS_MONITORING,
!                translatable("Write statement performance stats to server log"), NULL
!               },
!               &log_statement_stats, false, NULL, NULL
        },
  #ifdef BTREE_BUILD_STATS
        {
!               {"log_btree_build_stats", PGC_SUSET, UNGROUPED,
!                translatable("No Description Available"), NULL,
!                NOT_IN_SAMPLE_CONF
!               },
!               &log_btree_build_stats, false, NULL, NULL
        },
  #endif
  
        {
!               {"explain_pretty_print", PGC_USERSET, QUERY_TUNING_OTHER,
!                translatable("Use indented output format for EXPLAIN VERBOSE"), NULL
!               },
!               &Explain_pretty_print,  true, NULL, NULL
        },
  
        {
!               {"stats_start_collector", PGC_POSTMASTER, STATS_QUERY,
!                translatable("Start server statistics-collection subprocess"), NULL
!               },
!               &pgstat_collect_startcollector, true, NULL, NULL
        },
        {
!               {"stats_reset_on_server_start", PGC_POSTMASTER, STATS_QUERY,
!                translatable("Collected statistics zeroed out on server restart"), 
NULL
!               },
!               &pgstat_collect_resetonpmstart, true, NULL, NULL
        },
        {
!               {"stats_command_string", PGC_SUSET, STATS_QUERY,
!                translatable("Enable stat collection on executing commands"),
!                translatable("Enables the collection of statistics on the currently "
!                "executing command of each session, along with the time "
!                "at which that command began execution.")
!               },
!               &pgstat_collect_querystring, false, NULL, NULL
        },
        {
!               {"stats_row_level", PGC_SUSET, STATS_QUERY,
!                translatable("Enable collection of row-level stats on db activity"),
!                NULL
!               },
!               &pgstat_collect_tuplelevel, false, NULL, NULL
        },
        {
!               {"stats_block_level", PGC_SUSET, STATS_QUERY,
!                translatable("Enables collection of block-level stats on db 
activity"),
!                NULL
!               },
!               &pgstat_collect_blocklevel, false, NULL, NULL
        },
  
        {
!               {"trace_notify", PGC_USERSET, DEVELOPER_OPTIONS,
!                translatable("Generates debugging output for LISTEN and NOTIFY"), 
!                NULL,
!                NOT_IN_SAMPLE_CONF
!               },
!               &Trace_notify,  false, NULL, NULL
        },
  
  #ifdef LOCK_DEBUG
        {
!               {"trace_locks", PGC_SUSET, DEVELOPER_OPTIONS,
!                translatable("No Description Available"), NULL,
!                NOT_IN_SAMPLE_CONF
!               }, 
!               &Trace_locks, false, NULL, NULL
!       },
!       {
!               {"trace_userlocks", PGC_SUSET, DEVELOPER_OPTIONS,
!                translatable("No Description Available"), NULL,
!                NOT_IN_SAMPLE_CONF
!               }, 
!               &Trace_userlocks, false, NULL, NULL
!       },
!       {
!               {"trace_lwlocks", PGC_SUSET, UNGROUPED,
!                translatable("No Description Available"), NULL,
!                NOT_IN_SAMPLE_CONF
!               }, 
!               &Trace_lwlocks, false, NULL, NULL
!       },
!       {
!               {"debug_deadlocks", PGC_SUSET, DEVELOPER_OPTIONS,
!                translatable("No Description Available"), NULL,
!                NOT_IN_SAMPLE_CONF
!               }, 
!               &Debug_deadlocks, false, NULL, NULL
        },
  #endif
  
        {
!               {"log_hostname", PGC_SIGHUP, LOG_DEBUG_WHAT,
!                translatable("Log hostname to connection logs"),
!                translatable("By default, connection logs only show the IP address "
!                "of the connecting host. If you want them to show the host name you "
!                "can turn this on, but depending on your host name resolution "
!                "setup it might impose a non-negligible performance penalty")
!               }, 
!               &log_hostname,  false, NULL, NULL
!       },
!       {
!               {"log_source_port", PGC_SIGHUP, LOG_DEBUG_WHAT,
!                translatable("Log outgoing port number of the connecting host"), NULL
!               },
!               &LogSourcePort, false, NULL, NULL
        },
  
        {
!               {"sql_inheritance", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
!                translatable("This controls the inheritance semantics"),
!                translatable("In particular, whether subtables are included by "
!                "various commands by default")
!               }, 
!               &SQL_inheritance, true, NULL, NULL
!       },
!       {
!               {"australian_timezones", PGC_USERSET, CLIENT_CONN_LOCALE,
!                translatable("If true, ACST, CST, EST, and SAT are interpreted "
!                "as Australian time zones"),
!                translatable("Otherwise they are interpreted as North/South American "
!                "time zones and Saturday")
!       },
!               &Australian_timezones,  false, ClearDateCache, NULL
!       },
!       {
!               {"password_encryption", PGC_USERSET, CLIENT_CONN_OTHER,
!                translatable("If unspecified the password is encrypted"),
!                translatable("When a password is specified in CREATE USER or "
!                "ALTER USER without writing either ENCRYPTED or UNENCRYPTED, "
!                "this option determines whether the password is to be encrypted")
!               },
!               &Password_encryption, true, NULL, NULL
!       },
!       {
!               {"transform_null_equals", PGC_USERSET, COMPAT_OPTIONS_CLIENT,
!                translatable("expr=NULL treated as expr IS NULL"),
!                translatable("When turned on, expressions of the form expr = NULL "
!                "(or NULL = expr) are treated as expr IS NULL, that is, they "
!                "return true if expr evaluates to the null value, and false "
!                "otherwise. The correct behavior of expr = NULL is to always "
!                "return null (unknown)")
!               },
!               &Transform_null_equals, false, NULL, NULL
!       },
!       {
!               {"db_user_namespace", PGC_SIGHUP, CONN_AUTH_SECURITY, 
!                translatable("This allows per-database user names"), NULL
!               },
!               &Db_user_namespace, false, NULL, NULL
        },
        {
                /*
                 * This var doesn't do anything; it's just here so that we won't
                 * choke on SET AUTOCOMMIT TO ON from 7.3-vintage clients.
!               */
!               {"autocommit", PGC_USERSET, CLIENT_CONN_STATEMENT, 
!                translatable("This var doesn't do anything"),
!                translatable("It's just here so that we won't choke on SET AUTOCOMMIT 
"
!                "TO ON from 7.3-vintage clients."),
!                GUC_NO_SHOW_ALL
!                },
!               &phony_autocommit, true, assign_phony_autocommit, NULL
!       },
!       {
!               {"default_transaction_read_only", PGC_USERSET, CLIENT_CONN_STATEMENT, 
!                translatable("Controls default read-only status of new transactions"),
!                NULL
!               },
!               &DefaultXactReadOnly, false, NULL, NULL
!       },
!       {
!               {"transaction_read_only", PGC_USERSET, UNGROUPED, 
!                translatable("No Description Available"), NULL, 
!                GUC_NO_RESET_ALL | NOT_IN_SAMPLE_CONF | DISALLOW_IN_CONF_FILE
!               },
!               &XactReadOnly, false, NULL, NULL
!       },
!       {
!               {"add_missing_from", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
!                translatable("Add missing table references to from clauses"),
!                NULL
!               }, 
!               &add_missing_from, true, NULL, NULL
        },
  
        /* End-of-list marker */
        {
!               {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL
!       }
  };
  
  
! struct config_int
                        ConfigureNamesInt[] =
  {
        {
!               {"default_statistics_target", PGC_USERSET, STATS_MONITORING,
!                translatable("Sets the default statistics target"),
!                translatable("This applies to table columns that have not had a "
!                "column-specific target set via ALTER TABLE SET STATISTICS")
!               },
!               &default_statistics_target, 10, 1, 1000, NULL, NULL
!       },
!       {
!               {"from_collapse_limit", PGC_USERSET, QUERY_TUNING_OTHER,
!                translatable("From list size beyond which sub-queries are not "
!                "collapsed"),
!                translatable("The planner will merge sub-queries into upper "
!                "queries if the resulting FROM list would have no more than "
!                "this many items")
!               },
!               &from_collapse_limit, 8, 1, INT_MAX, NULL, NULL
!       },
!       {
!               {"join_collapse_limit", PGC_USERSET, QUERY_TUNING_OTHER,
!                translatable("From list size beyond which JOIN constructs not "
!                "flattened"),
!                translatable("The planner will flatten explicit inner JOIN "
!                "constructs into lists of FROM items whenever a list of no more "
!                "than this many items would result")
!               },
!               &join_collapse_limit, 8, 1, INT_MAX, NULL, NULL
!       },
!       {
!               {"geqo_threshold", PGC_USERSET, QUERY_TUNING_GEQO, 
!                translatable("Threshold of FROM items beyond which geqo is used"),
!                NULL
!               },
!               &geqo_threshold, 11, 2, INT_MAX, NULL, NULL
!       },
!       {
!               {"geqo_pool_size", PGC_USERSET, QUERY_TUNING_GEQO,
!                translatable("The number of individuals in one population"),
!                NULL
!               },
!               &Geqo_pool_size, DEFAULT_GEQO_POOL_SIZE, 0, MAX_GEQO_POOL_SIZE, NULL, 
NULL
!       },
!       {
!               {"geqo_effort", PGC_USERSET, QUERY_TUNING_GEQO,
!                translatable("Effort is used to calculate a default for generations"),
!                NULL
!               },
!               &Geqo_effort, 1, 1, INT_MAX, NULL, NULL
!       },
!       {
!               {"geqo_generations", PGC_USERSET, QUERY_TUNING_GEQO,
!                translatable("Specifies the number of iterations in the algorithm"),
!                translatable("The number must be a positive integer. If 0 is "
!                "specified then Effort * Log2(PoolSize) is used")
!               },
!               &Geqo_generations, 0, 0, INT_MAX, NULL, NULL
!       },
!       {
!               {"geqo_random_seed", PGC_USERSET, QUERY_TUNING_GEQO,
!                translatable("Can be set to get reproducible results from the 
algorithm"),
!                translatable("If it is set to -1 then the algorithm behaves "
!                "non-deterministically")
!               },
!               &Geqo_random_seed, -1, INT_MIN, INT_MAX, NULL, NULL
!       },
! 
!       {
!               {"deadlock_timeout", PGC_SIGHUP, LOCK_MANAGEMENT,
!                translatable("Time to wait on lock (ms) before checking for 
deadlock"),
!                NULL
!               },
!               &DeadlockTimeout, 1000, 0, INT_MAX, NULL, NULL
        },
  
  #ifdef HAVE_SYSLOG
        {
!               {"syslog", PGC_SIGHUP, LOG_DEBUG_SYSLOG,
!                translatable("Allows the use of syslog for logging"),
!                translatable("If this option is set to 1, messages go both to syslog "
!                "and the standard output. A setting of 2 sends output only to syslog. 
"
!                "(Some messages will still go to the standard output/error.) The "
!                "default is 0, which means syslog is off")
!               }, 
!               &Use_syslog, 0, 0, 2, NULL, NULL
        },
  #endif
  
*************** static struct config_int
*** 627,976 ****
         * backends number.
         */
        {
!               {"max_connections", PGC_POSTMASTER}, &MaxBackends,
!               DEF_MAXBACKENDS, 1, INT_MAX, NULL, NULL
        },
  
        {
!               {"superuser_reserved_connections", PGC_POSTMASTER}, &ReservedBackends,
!               2, 0, INT_MAX, NULL, NULL
        },
  
        {
!               {"shared_buffers", PGC_POSTMASTER}, &NBuffers,
!               DEF_NBUFFERS, 16, INT_MAX, NULL, NULL
        },
  
        {
!               {"port", PGC_POSTMASTER}, &PostPortNumber,
!               DEF_PGPORT, 1, 65535, NULL, NULL
        },
  
        {
!               {"unix_socket_permissions", PGC_POSTMASTER}, &Unix_socket_permissions,
!               0777, 0000, 0777, NULL, NULL
        },
  
        {
!               {"sort_mem", PGC_USERSET}, &SortMem,
!               1024, 8 * BLCKSZ / 1024, INT_MAX, NULL, NULL
        },
  
        {
!               {"vacuum_mem", PGC_USERSET}, &VacuumMem,
!               8192, 1024, INT_MAX, NULL, NULL
        },
  
        {
!               {"max_files_per_process", PGC_BACKEND}, &max_files_per_process,
!               1000, 25, INT_MAX, NULL, NULL
        },
  
  #ifdef LOCK_DEBUG
        {
!               {"trace_lock_oidmin", PGC_SUSET}, &Trace_lock_oidmin,
!               BootstrapObjectIdData, 1, INT_MAX, NULL, NULL
        },
        {
!               {"trace_lock_table", PGC_SUSET}, &Trace_lock_table,
!               0, 0, INT_MAX, NULL, NULL
        },
  #endif
        {
!               {"max_expr_depth", PGC_USERSET}, &max_expr_depth,
!               DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX, NULL, NULL
        },
  
        {
!               {"statement_timeout", PGC_USERSET}, &StatementTimeout,
!               0, 0, INT_MAX, NULL, NULL
        },
  
        {
!               {"max_fsm_relations", PGC_POSTMASTER}, &MaxFSMRelations,
!               1000, 100, INT_MAX, NULL, NULL
        },
        {
!               {"max_fsm_pages", PGC_POSTMASTER}, &MaxFSMPages,
!               20000, 1000, INT_MAX, NULL, NULL
        },
  
        {
!               {"max_locks_per_transaction", PGC_POSTMASTER}, &max_locks_per_xact,
!               64, 10, INT_MAX, NULL, NULL
        },
  
        {
!               {"authentication_timeout", PGC_SIGHUP}, &AuthenticationTimeout,
!               60, 1, 600, NULL, NULL
        },
  
        /* Not for general use */
        {
!               {"pre_auth_delay", PGC_SIGHUP}, &PreAuthDelay,
!               0, 0, 60, NULL, NULL
        },
  
        {
!               {"checkpoint_segments", PGC_SIGHUP}, &CheckPointSegments,
!               3, 1, INT_MAX, NULL, NULL
        },
  
        {
!               {"checkpoint_timeout", PGC_SIGHUP}, &CheckPointTimeout,
!               300, 30, 3600, NULL, NULL
        },
  
        {
!               {"checkpoint_warning", PGC_SIGHUP}, &CheckPointWarning,
!               30, 0, INT_MAX, NULL, NULL
        },
  
        {
!               {"wal_buffers", PGC_POSTMASTER}, &XLOGbuffers,
!               8, 4, INT_MAX, NULL, NULL
        },
  
        {
!               {"wal_debug", PGC_SUSET}, &XLOG_DEBUG,
!               0, 0, 16, NULL, NULL
        },
  
        {
!               {"commit_delay", PGC_USERSET}, &CommitDelay,
!               0, 0, 100000, NULL, NULL
        },
  
        {
!               {"commit_siblings", PGC_USERSET}, &CommitSiblings,
!               5, 1, 1000, NULL, NULL
        },
  
        {
!               {"extra_float_digits", PGC_USERSET}, &extra_float_digits,
!               0, -15, 2, NULL, NULL
        },
  
        {
!               {"log_min_duration_statement", PGC_SUSET}, &log_min_duration_statement,
!               0, 0, INT_MAX / 1000, NULL, NULL
        },
  
        /* End-of-list marker */
        {
!               {NULL, 0}, NULL, 0, 0, 0, NULL, NULL
        }
  };
  
  
! static struct config_real
                        ConfigureNamesReal[] =
  {
        {
!               {"effective_cache_size", PGC_USERSET}, &effective_cache_size,
                DEFAULT_EFFECTIVE_CACHE_SIZE, 0, DBL_MAX, NULL, NULL
        },
        {
!               {"random_page_cost", PGC_USERSET}, &random_page_cost,
!               DEFAULT_RANDOM_PAGE_COST, 0, DBL_MAX, NULL, NULL
!       },
!       {
!               {"cpu_tuple_cost", PGC_USERSET}, &cpu_tuple_cost,
!               DEFAULT_CPU_TUPLE_COST, 0, DBL_MAX, NULL, NULL
!       },
!       {
!               {"cpu_index_tuple_cost", PGC_USERSET}, &cpu_index_tuple_cost,
                DEFAULT_CPU_INDEX_TUPLE_COST, 0, DBL_MAX, NULL, NULL
        },
        {
!               {"cpu_operator_cost", PGC_USERSET}, &cpu_operator_cost,
!               DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX, NULL, NULL
        },
  
        {
!               {"geqo_selection_bias", PGC_USERSET}, &Geqo_selection_bias,
                DEFAULT_GEQO_SELECTION_BIAS, MIN_GEQO_SELECTION_BIAS,
                MAX_GEQO_SELECTION_BIAS, NULL, NULL
        },
  
        {
!               {"seed", PGC_USERSET, GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL},
                &phony_random_seed,
                0.5, 0.0, 1.0, assign_random_seed, show_random_seed
        },
  
        /* End-of-list marker */
        {
!               {NULL, 0}, NULL, 0.0, 0.0, 0.0, NULL, NULL
        }
  };
  
  
! static struct config_string
                        ConfigureNamesString[] =
  {
        {
!               {"client_encoding", PGC_USERSET, GUC_REPORT},
!               &client_encoding_string,
!               "SQL_ASCII", assign_client_encoding, NULL
        },
  
        {
!               {"client_min_messages", PGC_USERSET}, &client_min_messages_str,
!               "notice", assign_client_min_messages, NULL
        },
  
        {
!               {"log_min_error_statement", PGC_SUSET}, &log_min_error_statement_str,
!               "panic", assign_min_error_statement, NULL
        },
  
        {
!               {"DateStyle", PGC_USERSET, GUC_LIST_INPUT | GUC_REPORT},
!               &datestyle_string,
!               "ISO, US", assign_datestyle, show_datestyle
        },
  
        {
!               {"default_transaction_isolation", PGC_USERSET}, 
&default_iso_level_string,
                "read committed", assign_defaultxactisolevel, NULL
        },
  
        {
!               {"dynamic_library_path", PGC_SUSET}, &Dynamic_library_path,
!               "$libdir", NULL, NULL
        },
  
        {
!               {"krb_server_keyfile", PGC_POSTMASTER}, &pg_krb_server_keyfile,
!               PG_KRB_SRVTAB, NULL, NULL
        },
  
        /* See main.c about why defaults for LC_foo are not all alike */
  
        {
!               {"lc_collate", PGC_INTERNAL}, &locale_collate,
!               "C", NULL, NULL
        },
  
        {
!               {"lc_ctype", PGC_INTERNAL}, &locale_ctype,
!               "C", NULL, NULL
        },
  
        {
!               {"lc_messages", PGC_SUSET}, &locale_messages,
!               "", locale_messages_assign, NULL
        },
  
        {
!               {"lc_monetary", PGC_USERSET}, &locale_monetary,
!               "C", locale_monetary_assign, NULL
        },
  
        {
!               {"lc_numeric", PGC_USERSET}, &locale_numeric,
!               "C", locale_numeric_assign, NULL
        },
  
        {
!               {"lc_time", PGC_USERSET}, &locale_time,
!               "C", locale_time_assign, NULL
        },
  
        {
!               {"preload_libraries", PGC_POSTMASTER, GUC_LIST_INPUT | GUC_LIST_QUOTE},
!               &preload_libraries_string,
!               "", NULL, NULL
        },
  
        {
!               {"regex_flavor", PGC_USERSET}, &regex_flavor_string,
!               "advanced", assign_regex_flavor, NULL
        },
  
        {
!               {"search_path", PGC_USERSET, GUC_LIST_INPUT | GUC_LIST_QUOTE},
!               &namespace_search_path,
!               "$user,public", assign_search_path, NULL
        },
  
        /* Can't be set in postgresql.conf */
        {
!               {"server_encoding", PGC_INTERNAL, GUC_REPORT},
!               &server_encoding_string,
!               "SQL_ASCII", NULL, NULL
        },
  
-       /* Can't be set in postgresql.conf */
        {
!               {"server_version", PGC_INTERNAL, GUC_REPORT},
!               &server_version_string,
!               PG_VERSION, NULL, NULL
        },
  
        {
!               {"log_min_messages", PGC_SUSET}, &log_min_messages_str,
!               "notice", assign_log_min_messages, NULL
        },
  
        /* Not for general use --- used by SET SESSION AUTHORIZATION */
        {
!               {"session_authorization", PGC_USERSET, GUC_NO_SHOW_ALL | 
GUC_NO_RESET_ALL},
                &session_authorization_string,
                NULL, assign_session_authorization, show_session_authorization
        },
  
  #ifdef HAVE_SYSLOG
        {
!               {"syslog_facility", PGC_POSTMASTER}, &Syslog_facility,
!               "LOCAL0", assign_facility, NULL
        },
        {
!               {"syslog_ident", PGC_POSTMASTER}, &Syslog_ident,
!               "postgres", NULL, NULL
        },
  #endif
  
        {
!               {"TimeZone", PGC_USERSET}, &timezone_string,
                "UNKNOWN", assign_timezone, show_timezone
        },
  
        {
!               {"transaction_isolation", PGC_USERSET, GUC_NO_RESET_ALL},
!               &XactIsoLevel_string,
!               NULL, assign_XactIsoLevel, show_XactIsoLevel
        },
  
        {
!               {"unix_socket_group", PGC_POSTMASTER}, &Unix_socket_group,
!               "", NULL, NULL
        },
  
        {
!               {"unix_socket_directory", PGC_POSTMASTER}, &UnixSocketDir,
!               "", NULL, NULL
        },
  
        {
!               {"virtual_host", PGC_POSTMASTER}, &VirtualHost,
!               "", NULL, NULL
        },
  
        {
!               {"wal_sync_method", PGC_SIGHUP}, &XLOG_sync_method,
                XLOG_sync_method_default, assign_xlog_sync_method, NULL
        },
! 
        /* End-of-list marker */
        {
!               {NULL, 0}, NULL, NULL, NULL, NULL
        }
  };
  
  /******** end of options list ********/
- 
  
  /*
   * Actual lookup of variables is done through this single, sorted array.
--- 786,1348 ----
         * backends number.
         */
        {
!               {"max_connections", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
!                translatable("Maximum number of concurrent connections"), NULL
!               },
!               &MaxBackends, DEF_MAXBACKENDS, 1, INT_MAX, NULL, NULL
        },
  
        {
!               {"superuser_reserved_connections", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
!                translatable("Number of 'connection slots' reserved for superusers"),
!                NULL
!               },
!               &ReservedBackends, 2, 0, INT_MAX, NULL, NULL
        },
  
        {
!               {"shared_buffers", PGC_POSTMASTER, RESOURCES_MEM,
!                translatable("The number of shared memory buffers used by the 
server"),
!                NULL
!               },
!               &NBuffers, DEF_NBUFFERS, 16, INT_MAX, NULL, NULL
        },
  
        {
!               {"port", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
!                translatable("The TCP port the server listens on"), NULL
!               },
!               &PostPortNumber, DEF_PGPORT, 1, 65535, NULL, NULL
        },
  
        {
!               {"unix_socket_permissions", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
!                translatable("Sets the access permissions of the Unix domain socket"),
!                translatable("Unix domain sockets use the usual Unix file system "
!                "permission set. The option value is expected to be an numeric mode "
!                "specification in the form accepted by the chmod and umask  system "
!                "calls. (To use the customary octal format the number must start with 
"
!                "a 0 (zero).)")
!               },
!               &Unix_socket_permissions, 0777, 0000, 0777, NULL, NULL
        },
  
        {
!               {"sort_mem", PGC_USERSET, RESOURCES_MEM,
!                translatable("Max memory to be used for sorts and hash tables"),
!                translatable("Specifies the amount of memory to be used by internal "
!                "sort operations and hash tables before switching to temporary disk "
!                "files")
!               },
!               &SortMem, 1024, 8 * BLCKSZ / 1024, INT_MAX, NULL, NULL
        },
  
        {
!               {"vacuum_mem", PGC_USERSET, RESOURCES_MEM,
!                translatable("Max mem used to keep track of to-be-reclaimed tuples"),
!                NULL
!               },
!               &VacuumMem, 8192, 1024, INT_MAX, NULL, NULL
        },
  
        {
!               {"max_files_per_process", PGC_BACKEND, RESOURCES_DISK,
!                translatable("Max num of simultaneously open files for each 
subprocess"),
!                NULL
!               },
!               &max_files_per_process, 1000, 25, INT_MAX, NULL, NULL
        },
  
  #ifdef LOCK_DEBUG
        {
!               {"trace_lock_oidmin", PGC_SUSET, DEVELOPER_OPTIONS,
!                translatable("No Description Available"), NULL,
!                NOT_IN_SAMPLE_CONF
!               }, 
!               &Trace_lock_oidmin, BootstrapObjectIdData, 1, INT_MAX, NULL, NULL
        },
        {
!               {"trace_lock_table", PGC_SUSET, DEVELOPER_OPTIONS,
!                translatable("No Description Available"), NULL,
!                NOT_IN_SAMPLE_CONF
!               }, 
!               &Trace_lock_table, 0, 0, INT_MAX, NULL, NULL
        },
  #endif
        {
!               {"max_expr_depth", PGC_USERSET, QUERY_TUNING_OTHER,
!                translatable("Sets the maximum expression nesting depth of the 
parser"), 
!                NULL
!               },
!               &max_expr_depth, DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX, NULL, NULL
        },
  
        {
!               {"statement_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT,
!                translatable("Max allowed duration (ms) of any statement"),
!                translatable("A value of 0 turns off the timer")
!               },
!               &StatementTimeout, 0, 0, INT_MAX, NULL, NULL
        },
  
        {
!               {"max_fsm_relations", PGC_POSTMASTER, RESOURCES_SPACE_MAP,
!                translatable("Max. num. of tables, indexes for which free space is "
!                "tracked"), NULL
!               },
!               &MaxFSMRelations, 1000, 100, INT_MAX, NULL, NULL
        },
        {
!               {"max_fsm_pages", PGC_POSTMASTER, RESOURCES_SPACE_MAP,
!                translatable("Maximum num. of disk pages for which free space is "
!                "tracked"), NULL
!               },
!               &MaxFSMPages, 20000, 1000, INT_MAX, NULL, NULL
        },
  
        {
!               {"max_locks_per_transaction", PGC_POSTMASTER, LOCK_MANAGEMENT,
!                translatable("Maximum locks per transaction"),
!                translatable("The shared lock table is sized on the assumption that "
!                "at most max_locks_per_transaction * max_connections distinct "
!                "objects will need to be locked at any one time.")
!               },
!               &max_locks_per_xact, 64, 10, INT_MAX, NULL, NULL
        },
  
        {
!               {"authentication_timeout", PGC_SIGHUP, CONN_AUTH_SECURITY,
!                translatable("Max time (s) to complete client authentication"),
!                NULL
!               },
!               &AuthenticationTimeout, 60, 1, 600, NULL, NULL
        },
  
        /* Not for general use */
        {
!               {"pre_auth_delay", PGC_SIGHUP, UNGROUPED,
!                translatable("No Description Available"), NULL,
!                NOT_IN_SAMPLE_CONF | DISALLOW_IN_CONF_FILE 
!               },
!               &PreAuthDelay, 0, 0, 60, NULL, NULL
        },
  
        {
!               {"checkpoint_segments", PGC_SIGHUP, WAL_CHECKPOINTS,
!                translatable("Max distance between automatic WAL checkpoints"), NULL
!               }, 
!               &CheckPointSegments, 3, 1, INT_MAX, NULL, NULL
        },
  
        {
!               {"checkpoint_timeout", PGC_SIGHUP, WAL_CHECKPOINTS,
!                translatable("Max time (s) between automatic WAL checkpoints"), NULL
!               }, 
!               &CheckPointTimeout, 300, 30, 3600, NULL, NULL
        },
  
        {
!               {"checkpoint_warning", PGC_SIGHUP, WAL_CHECKPOINTS,
!                translatable("Log if filling of checkpoint segments happens more"
!                "frequently than this (s)"),
!                translatable("Send a message to the server logs if checkpoints "
!                "caused by the filling of checkpoint segment files happens more "
!                "frequently than this number of seconds. Zero turns off the warning.")
!               }, 
!               &CheckPointWarning, 30, 0, INT_MAX, NULL, NULL
        },
  
        {
!               {"wal_buffers", PGC_POSTMASTER, WAL_SETTINGS,
!                translatable("Disk-page buffers in shared memory for WAL logging"),
!                NULL
!               }, 
!               &XLOGbuffers, 8, 4, INT_MAX, NULL, NULL
        },
  
        {
!               {"wal_debug", PGC_SUSET, DEVELOPER_OPTIONS,
!                translatable("If nonzero, log WAL-related debugging output"), NULL,
!                NOT_IN_SAMPLE_CONF 
!               }, 
!               &XLOG_DEBUG, 0, 0, 16, NULL, NULL
        },
  
        {
!               {"commit_delay", PGC_USERSET, WAL_CHECKPOINTS,
!                translatable("Delay (us) betw. a commit to the WAL buffer and "
!                "flushing the buffer to disk"), NULL
!               }, 
!               &CommitDelay, 0, 0, 100000, NULL, NULL
        },
  
        {
!               {"commit_siblings", PGC_USERSET, WAL_CHECKPOINTS,
!                translatable("Min concurrent open trans. before performing "
!                "COMMIT_DELAY"), NULL
!               },
!               &CommitSiblings, 5, 1, 1000, NULL, NULL
        },
  
        {
!               {"extra_float_digits", PGC_USERSET, CLIENT_CONN_LOCALE,
!                translatable("Adjusts the num of digits displayed for "
!                "floating-point values"),
!                translatable("This includs float4, float8, and geometric data types. "
!                "The parameter value is added to the standard number of digits "
!                "(FLT_DIG or DBL_DIG  as appropriate)"),
!                NOT_IN_SAMPLE_CONF
!               },
!               &extra_float_digits, 0, -15, 2, NULL, NULL
        },
  
        {
!               {"log_min_duration_statement", PGC_SUSET, LOG_DEBUG_WHEN,
!                translatable("Min execution time (ms) above which statements will "
!                "be logged"),
!                translatable("The default is 0  (turning this feature off).")
!               }, 
!               &log_min_duration_statement, 0, 0, INT_MAX / 1000, NULL, NULL
        },
  
        /* End-of-list marker */
        {
!               {NULL, 0, 0, NULL, NULL}, NULL, 0, 0, 0, NULL, NULL
        }
  };
  
  
! struct config_real
                        ConfigureNamesReal[] =
  {
        {
!               {"effective_cache_size", PGC_USERSET, QUERY_TUNING_COST,
!                translatable("Planner's assumption about size of the disk cache"),
!                translatable("That is, the portion of the kernel's disk cache that "
!                "will be used for PostgreSQL data files. This is measured in disk "
!                "pages, which are normally 8 kB each.")
!               },
!               &effective_cache_size, 
                DEFAULT_EFFECTIVE_CACHE_SIZE, 0, DBL_MAX, NULL, NULL
        },
        {
!               {"random_page_cost", PGC_USERSET, QUERY_TUNING_COST,
!                translatable("Planner's estimate of the cost of a nonsequentially "
!                "fetched disk page"),
!                translatable("This is measured as a multiple of the cost of a "
!                "sequential page fetch. A higher value makes it more likely a "
!                "sequential scan will be used, a lower value makes it more likely an "
!                "index scan will be used.")
!               }, 
!               &random_page_cost, DEFAULT_RANDOM_PAGE_COST, 0, DBL_MAX, NULL, NULL
!       },
!       {
!               {"cpu_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
!                translatable("Planner's estimate of the cost of processing each 
tuple"),
!                translatable("This is measured as a fraction of the cost of a "
!                "sequential page fetch.")
!               },
!               &cpu_tuple_cost, DEFAULT_CPU_TUPLE_COST, 0, DBL_MAX, NULL, NULL
!       },
!       {
!               {"cpu_index_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
!                translatable("Planner's estimate of processing cost for each "
!                "index tuple during index scan"),
!                translatable("This is measured as a fraction of the cost of a "
!                "sequential page fetch.")
!               },
!               &cpu_index_tuple_cost,
                DEFAULT_CPU_INDEX_TUPLE_COST, 0, DBL_MAX, NULL, NULL
        },
        {
!               {"cpu_operator_cost", PGC_USERSET, QUERY_TUNING_COST,
!                translatable("Planner's estimate of processing cost of each op. in 
WHERE"),
!                translatable("This is measured as a fraction of the cost of a 
sequential "
!                "page fetch.")
!               },
!               &cpu_operator_cost, DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX, NULL, NULL
        },
  
        {
!               {"geqo_selection_bias", PGC_USERSET, QUERY_TUNING_GEQO,
!                translatable("The selective pressure within the population"), NULL
!               },
!               &Geqo_selection_bias, 
                DEFAULT_GEQO_SELECTION_BIAS, MIN_GEQO_SELECTION_BIAS,
                MAX_GEQO_SELECTION_BIAS, NULL, NULL
        },
  
        {
!               {"seed", PGC_USERSET, UNGROUPED, 
!                translatable("No Description Available"), NULL, 
!                GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | NOT_IN_SAMPLE_CONF | 
DISALLOW_IN_CONF_FILE
!               },
                &phony_random_seed,
                0.5, 0.0, 1.0, assign_random_seed, show_random_seed
        },
  
        /* End-of-list marker */
        {
!               {NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL
        }
  };
  
  
! struct config_string
                        ConfigureNamesString[] =
  {
        {
!               {"client_encoding", PGC_USERSET, CLIENT_CONN_LOCALE, 
!                translatable("The client-side encoding (character set)"), NULL,
!                GUC_REPORT
!               },
!               &client_encoding_string, "SQL_ASCII", assign_client_encoding, NULL
        },
  
        {
!               {"client_min_messages", PGC_USERSET, LOG_DEBUG_WHEN,
!                translatable("Controls which message levels are sent to the client"),
!                translatable("Valid values are DEBUG5, DEBUG4, DEBUG3, DEBUG2, "
!                "DEBUG1, LOG, NOTICE, WARNING, and ERROR. Each level includes all the 
"
!                "levels that follow it. The later the level, the fewer messages are "
!                "sent.")
!               },
!               &client_min_messages_str, "notice", assign_client_min_messages, NULL
        },
  
        {
!               {"log_min_error_statement", PGC_SUSET, LOG_DEBUG_WHEN,
!                translatable("Controls whether the erroneous statement is logged"),
!                translatable("All SQL statements that cause an error of the "
!                "specified level, or a higher level, are logged")
!               },
!               &log_min_error_statement_str, "panic", assign_min_error_statement, NULL
        },
  
        {
!               {"DateStyle", PGC_USERSET, CLIENT_CONN_LOCALE,
!                translatable("The display format for date and time values"),
!                translatable("As well as the rules for interpreting ambiguous date "
!                "input values"),
!                GUC_LIST_INPUT | GUC_REPORT
!               },
!               &datestyle_string, "ISO, US", assign_datestyle, show_datestyle
        },
  
        {
!               {"default_transaction_isolation", PGC_USERSET, CLIENT_CONN_STATEMENT,
!                translatable("The default isolation level of each new transaction"),
!                translatable("Each SQL transaction has an isolation level, which "
!                "can be either 'read committed' or 'serializable'.")
!               }, 
!               &default_iso_level_string,
                "read committed", assign_defaultxactisolevel, NULL
        },
  
        {
!               {"dynamic_library_path", PGC_SUSET, CLIENT_CONN_OTHER,
!                translatable("Path for dynamically loadable modules"),
!                translatable("If a dynamically loadable module needs to be opened and 
"
!                "the specified name does not have a directory component (i.e. the "
!                "name does not contain a slash), the system will search this path for 
"
!                "the specified file.")
!               },
!               &Dynamic_library_path, "$libdir", NULL, NULL
        },
  
        {
!               {"krb_server_keyfile", PGC_POSTMASTER, CONN_AUTH_SECURITY,
!                translatable("The location of the Kerberos server key file"), NULL
!               },
!               &pg_krb_server_keyfile, PG_KRB_SRVTAB, NULL, NULL
        },
  
        /* See main.c about why defaults for LC_foo are not all alike */
  
        {
!               {"lc_collate", PGC_INTERNAL, UNGROUPED, 
!                translatable("Locale Collation order"), NULL,
!                NOT_IN_SAMPLE_CONF
!               }, 
!               &locale_collate, "C", NULL, NULL
        },
  
        {
!               {"lc_ctype", PGC_INTERNAL, UNGROUPED,
!                translatable("Locale Character classification and case conversion"),
!                NULL,
!                NOT_IN_SAMPLE_CONF
!               }, 
!               &locale_ctype, "C", NULL, NULL
        },
  
        {
!               {"lc_messages", PGC_SUSET, CLIENT_CONN_LOCALE,
!                translatable("Language in which messages are displayed"), NULL
!               },
!               &locale_messages, "", locale_messages_assign, NULL
        },
  
        {
!               {"lc_monetary", PGC_USERSET, CLIENT_CONN_LOCALE,
!                translatable("The locale to use for formatting monetary amounts"),
!                translatable("For example with the to_char family of functions")
!               },
!               &locale_monetary, "C", locale_monetary_assign, NULL
        },
  
        {
!               {"lc_numeric", PGC_USERSET, CLIENT_CONN_LOCALE,
!                translatable("Locale to use for formatting numbers"),
!                translatable("For example with the to_char() family of functions")
!               },
!               &locale_numeric, "C", locale_numeric_assign, NULL
        },
  
        {
!               {"lc_time", PGC_USERSET, CLIENT_CONN_LOCALE,
!                translatable("Locale to use for formatting date and time values"),
!                NULL
!               },
!               &locale_time, "C", locale_time_assign, NULL
        },
  
        {
!               {"preload_libraries", PGC_POSTMASTER, RESOURCES_DISK, 
!                translatable("One or more shared libraries to preload start"), NULL,
!                GUC_LIST_INPUT | GUC_LIST_QUOTE
!               },
!               &preload_libraries_string, "", NULL, NULL
        },
  
        {
!               {"regex_flavor", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
!                translatable("The regular expression 'flavor'"),
!                translatable("This can be set to advanced, extended, or basic")
!               },
!               &regex_flavor_string, "advanced", assign_regex_flavor, NULL
        },
  
        {
!               {"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT, 
!                translatable("Schema search order when object not schema-qualified"),
!                NULL,
!                GUC_LIST_INPUT | GUC_LIST_QUOTE
!               },
!               &namespace_search_path, "$user,public", assign_search_path, NULL
        },
  
        /* Can't be set in postgresql.conf */
        {
!               {"server_encoding", PGC_INTERNAL, UNGROUPED, 
!                translatable("No Description Available"), NULL,
!                GUC_REPORT | NOT_IN_SAMPLE_CONF | DISALLOW_IN_CONF_FILE
!               },
!               &server_encoding_string, "SQL_ASCII", NULL, NULL
        },
  
        {
!       /* Can't be set in postgresql.conf */
!               {"server_version", PGC_INTERNAL, UNGROUPED, 
!                translatable("No Description Available"), NULL, 
!                GUC_REPORT | NOT_IN_SAMPLE_CONF | DISALLOW_IN_CONF_FILE
!               },
!               &server_version_string, PG_VERSION, NULL, NULL
        },
  
        {
!               {"log_min_messages", PGC_SUSET, LOG_DEBUG_WHEN,
!                translatable("Controls which message levels logged"),
!                translatable("Valid values are DEBUG5, DEBUG4, DEBUG3, DEBUG2, 
DEBUG1, "
!                "INFO, NOTICE, WARNING, ERROR, LOG, FATAL, and PANIC. Each level "
!                "includes all the levels that follow it")
!               },
!               &log_min_messages_str, "notice", assign_log_min_messages, NULL
        },
  
        /* Not for general use --- used by SET SESSION AUTHORIZATION */
        {
!               {"session_authorization", PGC_USERSET, UNGROUPED, 
!                translatable("No Description Available"), NULL,
!                GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL
!               },
                &session_authorization_string,
                NULL, assign_session_authorization, show_session_authorization
        },
  
  #ifdef HAVE_SYSLOG
        {
!               {"syslog_facility", PGC_POSTMASTER, LOG_DEBUG_SYSLOG,
!                translatable("Which syslog 'facility' to be used when syslog 
enabled"),
!                translatable("You may choose from LOCAL0, LOCAL1, LOCAL2, LOCAL3, "
!                "LOCAL4, LOCAL5, LOCAL6, LOCAL7")
!               }, 
!               &Syslog_facility, "LOCAL0", assign_facility, NULL
        },
        {
!               {"syslog_ident", PGC_POSTMASTER, LOG_DEBUG_SYSLOG,
!                translatable("Program name used to identify PostgreSQL messages "
!                "in syslog"), NULL
!               }, 
!               &Syslog_ident, "postgres", NULL, NULL
        },
  #endif
  
        {
!               {"TimeZone", PGC_USERSET, CLIENT_CONN_LOCALE,
!                translatable("Time zone for displaying and interpreting time stamps"),
!                NULL
!               },
!               &timezone_string,
                "UNKNOWN", assign_timezone, show_timezone
        },
  
        {
!               {"transaction_isolation", PGC_USERSET, UNGROUPED, 
!                translatable("No Description Available"), NULL, 
!                GUC_NO_RESET_ALL | NOT_IN_SAMPLE_CONF | DISALLOW_IN_CONF_FILE
!               },
!               &XactIsoLevel_string, NULL, assign_XactIsoLevel, show_XactIsoLevel
        },
  
        {
!               {"unix_socket_group", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
!                translatable("The group owner of the Unix domain socket"),
!                translatable("(The owning user of the socket is always the user "
!                "that starts the server.)")
!               },
!               &Unix_socket_group, "", NULL, NULL
        },
  
        {
!               {"unix_socket_directory", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
!                translatable("The Unix-domain socket directory to listen to"), NULL
!               },
!               &UnixSocketDir, "", NULL, NULL
        },
  
        {
!               {"virtual_host", PGC_POSTMASTER, CONN_AUTH_SECURITY,
!                translatable("The host name or IP address to listen to"), NULL
!               },
!               &VirtualHost, "", NULL, NULL
        },
  
        {
!               {"wal_sync_method", PGC_SIGHUP, WAL_SETTINGS,
!                translatable("Method used for forcing WAL updates out to disk"), NULL
!               },
!               &XLOG_sync_method,
                XLOG_sync_method_default, assign_xlog_sync_method, NULL
        },
!       
        /* End-of-list marker */
        {
!               {NULL, 0, 0, NULL, NULL}, NULL, NULL, NULL, NULL
        }
  };
  
  /******** end of options list ********/
  
  /*
   * Actual lookup of variables is done through this single, sorted array.
Index: src/include/utils/guc.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/utils/guc.h,v
retrieving revision 1.32
diff -c -p -r1.32 guc.h
*** src/include/utils/guc.h     11 Jun 2003 18:01:14 -0000      1.32
--- src/include/utils/guc.h     30 Jun 2003 19:18:44 -0000
***************
*** 50,55 ****
--- 50,60 ----
   *
   * USERSET options can be set by anyone any time.
   */
+ 
+ /*
+  * When updating the GucContexts, please make sure to update the corresponding
+  * GucContext_names [] entries in pg_guc.c. The two must correspond
+  */
  typedef enum
  {
        PGC_INTERNAL,
/*-------------------------------------------------------------------------
 * pg_guc
 *
 * Displays available options under grand unified configuration scheme 
 * Refer to header file, pg_guc.h for more details.
 *
 * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
 *
 * $Header: $ 
 *
 *-------------------------------------------------------------------------
 */

#include "postgres.h"
#include <fcntl.h>

#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif

#include <errno.h>
#include <float.h>
#include <limits.h>
#include <unistd.h>

#include "utils/guc.h"
#include "utils/guc_vars.h"
#include "utils/pg_guc.h"


/*
 * This array contains the display names for each of the GucContexts available
 */
char *GucContext_names [] = { translatable("INTERNAL"),
							  translatable("POSTMASTER"), 
							  translatable("SIGHUP"),
                              translatable("BACKEND"), 
							  translatable("SUSET"),
							  translatable("USERSET")
                            };

/*
 * Reads in the the command line options and sets the state of the program
 * accordingly. Initializes the result list and sorts it.
 */
int GucInfoMain ( int argc, char *argv[] )  {

	extern char *optarg;
	char c;

	while ((c = getopt(argc, argv, "g:mMhGl")) != -1)
	{
		switch (c)
		{
			case 'g':
				groupString = optarg;
				break;
			case 'r':
				nameString = optarg;
				nameRegexBool = true;
				break;
			case 'm':
				outFormat = MACHINE;
				break;
			case 'M':
				outFormat = MACHINE;
				suppressAllHeaders = true;
				break;
			case 'G':
				groupResults = false;
				break;
			case 'l':
				listAllGroups();
				exit(0);
			case 'h':
				helpMessage();
				exit(0);
				break;
			default:
				fprintf(stderr, gettext("%s \n Try -h for further details\n"), usageErrMsg());
				exit(1);
		}
	}


	if ( nameString == NULL ) {
		nameRegexBool = false;
		if ( argc > optind ) {
			nameString = argv[optind];
		}
	}


	/* get this list of variables that match the user's specs. */
	mixedStruct ** varList = varsToDisplay ();

	/* sort them if desired */
	if ( groupResults ) {
		qsort ( varList, resultListSize,
			sizeof(mixedStruct*), compareMixedStructs
		);
	}

	/* output the results */
	int i=0;
	if ( ! suppressAllHeaders ) {
		printf ( gettext(COLUMN_HEADER [outFormat]) );
	}
	while ( varList [i] != NULL ) {
		printf ( gettext(ROW_SEPARATOR [outFormat]) );
		printMixedStruct ( *(varList[i++]) );
	}
	return 0;
}


/*
 * This function is used to compare two mixedStruct types. It compares based
 * on the value of the 'group' field, and then the name of the variable.
 * Each void* is expected to be a pointer to a pointer to a struct.
 * (This is because it is used by qsort to sort an array of struct pointers)
 *
 * Returns an integer less than, equal to, or greater than zero if the first
 * argument (struct1) is considered to be respectively less than, equal to,
 * or greater than the second (struct2). The comparison is made frist on the
 * value of struct{1,2}.generic.group and then struct{1,2}.generic.name. The
 * groups will display in the order they are defined in enum config_group
 */
static int compareMixedStructs ( const void* struct1, const void* struct2 ) {

	mixedStruct *structVar1 = *(mixedStruct **)struct1;
	mixedStruct *structVar2 = *(mixedStruct **)struct2;
	int lessThan = -1;
	int greaterThan = 1;

	if ( structVar1->generic.group > structVar2->generic.group ) {
		return greaterThan;
	} else if ( structVar1->generic.group < structVar2->generic.group ) {
		return lessThan;
	} else {
		return strcmp(structVar1->generic.name, structVar2->generic.name);
	}
}


/*
 * This function returs a complete list of all the variables to display,
 * according to what the user wants to see.
 *
 * Returns pointer to a global variable to emphasise that this variable
 * cannot be used until after this function is properly called.
 *
 * It iterates through all the different variable structs, creates a
 * mixedstruct type for each one, and then decides if this variable matches
 * the user's specifications, and if so it adds it to the return list
 */
static mixedStruct **varsToDisplay ( void ) {

	int arrayIndex = 0;

	int i=0;
	while ( ConfigureNamesBool[i].gen.name != NULL ) {
		mixedStruct *boolVar = buildMixedStruct ( PGC_BOOL, &ConfigureNamesBool[i] );
		if ( varMatches ( *boolVar ) ) {
			resultList [arrayIndex++] = boolVar;
		}
		i++;
	}

	i=0;
	while ( ConfigureNamesInt[i].gen.name != NULL ) {
		mixedStruct *intVar = buildMixedStruct ( PGC_INT, &ConfigureNamesInt[i] );
		if ( varMatches ( *intVar ) ) {
			resultList [arrayIndex++] = intVar;
		}
		i++;
	}

	i=0;
	while ( ConfigureNamesReal[i].gen.name != NULL ) {
		mixedStruct *realVar = buildMixedStruct ( PGC_REAL, &ConfigureNamesReal[i] );
		if ( varMatches ( *realVar ) ) {
			resultList [arrayIndex++] = realVar;
		}
		i++;
	}

	i=0;
	while ( ConfigureNamesString[i].gen.name != NULL ) {
		mixedStruct *stringVar = buildMixedStruct ( PGC_STRING, &ConfigureNamesString[i] );
		if ( varMatches ( *stringVar ) ) {
			resultList [arrayIndex++] = stringVar;
		}
		i++;
	}

	/* set an end marker */
	resultList [ arrayIndex ] = NULL;
	resultListSize = arrayIndex;
	return resultList;
}


/*
 * This function is used to convert on of a number of different types of
 * variable structs ( int, real, string, bool ) into a generic mixedstruct
 * type. This way, multiple functions can operate on them conveniently
 * without needing to know exactly what type they are.
 */
static mixedStruct *buildMixedStruct ( enum config_type configType, void * mixed ) {

	mixedStruct *structToReturn = malloc ( sizeof( mixedStruct) );
	switch ( configType ) {
		case PGC_INT :
			structToReturn->type = PGC_INT;
			structToReturn->generic = ((struct config_int *) mixed)->gen;
			structToReturn->var.configInt = *((struct config_int *) mixed);
			break;
		case PGC_STRING :
			structToReturn->type = PGC_STRING;
			structToReturn->generic = ((struct config_string *) mixed)->gen;
			structToReturn->var.configString = *((struct config_string *) mixed);
			break;
		case PGC_REAL :
			structToReturn->type = PGC_REAL;
			structToReturn->generic = ((struct config_real *) mixed)->gen;
			structToReturn->var.configReal = *((struct config_real *) mixed);
			break;
		case PGC_BOOL :
			structToReturn->type = PGC_BOOL;
			structToReturn->generic = ((struct config_bool *) mixed)->gen;
			structToReturn->var.configBool = *((struct config_bool *) mixed);
			break;
		default :
			printf ( gettext("Unidentified variable type!\n") );
			/* do some error catching here? */
			break;
	}

	return structToReturn;
}


/*
 * This function will return false (0) if the struct passed to it (via the
 * pointer) should not be displayed to the user.
 * The criteria to determine if the struct should not be displayed is:
 *  + It's flag bits are set to GUC_NO_SHOW_ALL
 *  + It's flag bits are set to NOT_IN_SAMPLE_CONF 
 *  + It's flag bits are set to DISALLOW_IN_CONF_FILE 
 *
 * Otherwise it will return true (1)
 */
static int displayStruct ( mixedStruct* structToDisplay ) {
    if  ( structToDisplay->generic.flags & ( GUC_NO_SHOW_ALL |
											 NOT_IN_SAMPLE_CONF |
											 DISALLOW_IN_CONF_FILE
										   )
		)
	{
        return 0;
    } else {
        return 1;
    }
}



/*
 * Used to determine if a variable matches the user's specifications (stored in
 * global variables). Returns true if this particular variable information should
 * be returned to the user.
 */
static bool varMatches ( mixedStruct structToTest ) {

	bool matches = false;
	bool specificSearch = false; 	/* This is true if the user searched for
									 * a variable in particular. */

	if ( nameString != NULL && ! nameRegexBool ) {
		if ( strstr ( structToTest.generic.name, nameString ) != NULL ) {
			matches = true;
			specificSearch = true;
		}
	}

	if ( nameString != NULL && nameRegexBool ) {
		/* We do not support this option yet */	
	}

	if ( groupString != NULL && ! groupRegexBool ) {

		if ( strstr ( config_group_names [structToTest.generic.group], groupString ) != NULL ) {
			if ( nameString != NULL ) {
				matches = (matches && true);
			} else {
				matches = true;
			}
		} else {
			matches = false;
		}
	}

	if ( groupString != NULL && groupRegexBool ) {
		/* We do not support this option yet */	
	}

	/* return all variables */
	if ( nameString == NULL && groupString == NULL ) {
		matches = true;
	}

	if ( specificSearch ) {
		return matches;
	} else {
		return matches && displayStruct ( &structToTest );
	}
}



/*
 * This function prints out the generic struct passed to it. It will print out
 * a different format, depending on what the user wants to see.
 */
static int printMixedStruct ( mixedStruct structToPrint ) {

	structVal var = structToPrint.var;

	switch ( structToPrint.type ) {

		case PGC_BOOL:
				printGenericHead ( var.configBool.gen );
				printf ( 
					gettext(BOOL_FORMAT [outFormat]), 
					(var.configBool.reset_val = 0 ) ? gettext("FALSE") : 
													  gettext("TRUE")
				);
				printGenericFoot ( var.configBool.gen );
				break;

		case PGC_INT:
				printGenericHead ( var.configInt.gen );
				printf ( 
					gettext(INT_FORMAT [outFormat]), 
					var.configInt.reset_val,
					var.configInt.min,
					var.configInt.max
				);
				printGenericFoot ( var.configInt.gen );
				break;

		case PGC_REAL:
				printGenericHead ( var.configReal.gen );
				printf (
					gettext(REAL_FORMAT[outFormat]),
					var.configReal.reset_val,
					var.configReal.min,
					var.configReal.max
				);
				printGenericFoot ( var.configReal.gen );
				break;

		case PGC_STRING:
				printGenericHead ( var.configString.gen );
				printf (
					gettext(STRING_FORMAT [outFormat]),
					var.configString.boot_val
				);
				printGenericFoot ( var.configString.gen );
				break;

		default:
				printf(gettext("Unrecognized variable type!\n"));
				break;
	}
	
	return 0;
}


static int printGenericHead ( struct config_generic structToPrint ) {

	printf (
		gettext(GENERIC_FORMAT [outFormat]), structToPrint.name,
		gettext(GucContext_names [ structToPrint.context ]),
		gettext(config_group_names [ structToPrint.group ])
	);
	return 0;
}


static int printGenericFoot ( struct config_generic sPrint ) {

	printf (
		gettext(GENERIC_DESC [outFormat]), 
		(sPrint.short_desc == NULL) ? "" : gettext(sPrint.short_desc),
		(sPrint.long_desc == NULL ) ? "" : gettext(sPrint.long_desc)
	);
	return 0;
}


static void listAllGroups ( void ) {

	printf ( gettext("All currently defined groups\n") );
	printf ( gettext("----------------------------\n") );
	int i =0;
	while ( config_group_names[i] != NULL ) {
		printf (gettext("%s\n"), gettext(config_group_names[i++]));
	}
}

static char * usageErrMsg ( void ) {
	return gettext(
		"Usage for --long-help option: [-g <group>] [-h] [-H] [-G] [-l] [string]\n");
}

static void helpMessage ( void ) {

	printf ( gettext ("Description:\n"
			 "--long-help displays all the runtime options available to postgresql.\n"
			 "It groups them by category and sorts them by name. If available, it will\n"
			 "present a short description, default, max and min values as well as other\n"
			 "information about each option.\n\n"
			 "With no options specified, it will output all available runtime options\n"
			 "in human friendly format, grouped by category and sorted by name.\n\n"

			 "Usage:\n"
			 "  %s\n\n"

			 "General Options:\n"
			 "  [string]	All options with names that match this string\n"
			 "  -g GROUP	All options in categories that match GROUP\n"
			 "  -G      	Do not sort output, by group or name\n\n"
			 "Output Options:\n"
			 "  -m      	Machine friendly format. All fields are tab separated.\n"
			 "  -M      	Same as m, except header with column names is suppressed\n"
			 "  -l      	Prints list of all currently defined groups \\ subgroups\n"	
			 "  -h      	Prints this help message\n"	
			 "\n"),
			 usageErrMsg()
		  );
}
#ifndef GUC_VARS
#define GUC_VARS 1
/*-------------------------------------------------------------------------
 * guc_vars.h
 *
 * This contains enum an struct declarations used by GUC and common to
 * guc.c and pg_guc.c
 *
 * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
 *
 * $Id: $
 *-------------------------------------------------------------------------
 */


/*
 * Groupings to help organize all the run-time options for display.
 * Each group type needs to have a corresponding display name
 * in the char* array config_group_display, defined in guc.c.
 * If this enumeration is modified, the config_group_names needs to be
 * modified in parallel. The two must be in sync.
 */
enum config_group
{
	UNGROUPED,
	CONN_AUTH,
	CONN_AUTH_SETTINGS,
	CONN_AUTH_SECURITY,
	RESOURCES,
	RESOURCES_MEM,
	RESOURCES_SPACE_MAP,
	RESOURCES_DISK,
	WAL,
	WAL_SETTINGS,
	WAL_CHECKPOINTS,
	QUERY_TUNING,
	QUERY_TUNING_METHOD,
	QUERY_TUNING_COST,
	QUERY_TUNING_GEQO,
	QUERY_TUNING_OTHER,
	CLIENT_CONN,
	CLIENT_CONN_STATEMENT,
	CLIENT_CONN_LOCALE,
	CLIENT_CONN_OTHER,
	LOG_DEBUG,
	LOG_DEBUG_WHEN,
	LOG_DEBUG_WHAT,
	LOG_DEBUG_SYSLOG,
	STATS,
	STATS_MONITORING,
	STATS_QUERY,
	LOCK_MANAGEMENT,
	COMPAT_OPTIONS,
	COMPAT_OPTIONS_PREVIOUS,
	COMPAT_OPTIONS_CLIENT,
	DEVELOPER_OPTIONS
};


enum config_type
{
	PGC_BOOL,
	PGC_INT,
	PGC_REAL,
	PGC_STRING
};

/* 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 
 * them to the short description. (separated by a newline or '. ') 
 */
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 */
	/* 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 */
};

/* 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 NOT_IN_SAMPLE_CONF 		0x0020	/* not in postgresql.conf.sample */
#define DISALLOW_IN_CONF_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 */


/* 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) */
	bool	   *variable;
	bool		reset_val;
	bool		(*assign_hook) (bool newval, bool doit, bool interactive);
	const char *(*show_hook) (void);
	/* variable fields, initialized at runtime: */
	bool		session_val;
	bool		tentative_val;
};

struct config_int
{
	struct config_generic gen;
	/* these fields must be set correctly in initial value: */
	/* (all but reset_val are constants) */
	int		   *variable;
	int			reset_val;
	int			min;
	int			max;
	bool		(*assign_hook) (int newval, bool doit, bool interactive);
	const char *(*show_hook) (void);
	/* variable fields, initialized at runtime: */
	int			session_val;
	int			tentative_val;
};

struct config_real
{
	struct config_generic gen;
	/* these fields must be set correctly in initial value: */
	/* (all but reset_val are constants) */
	double	   *variable;
	double		reset_val;
	double		min;
	double		max;
	bool		(*assign_hook) (double newval, bool doit, bool interactive);
	const char *(*show_hook) (void);
	/* variable fields, initialized at runtime: */
	double		session_val;
	double		tentative_val;
};

struct config_string
{
	struct config_generic gen;
	/* these fields must be set correctly in initial value: */
	/* (all are constants) */
	char	  **variable;
	const char *boot_val;
	const char *(*assign_hook) (const char *newval, bool doit, bool interactive);
	const char *(*show_hook) (void);
	/* variable fields, initialized at runtime: */
	char	   *reset_val;
	char	   *session_val;
	char	   *tentative_val;
};

extern char *config_group_names [];
extern struct config_bool ConfigureNamesBool[];
extern struct config_int ConfigureNamesInt[];
extern struct config_real ConfigureNamesReal[];
extern struct config_string ConfigureNamesString[];

#endif
#ifndef PG_GUC_H
#define PG_GUC_H 1

/*-------------------------------------------------------------------------
 *
 * pg_guc.h
 * Interface to the --long-help option of main.c 
 *
 * The purpose of this option is to list, sort, and make searchable, all
 * runtime options available to Postgresql, by their description and grouping.
 *
 * Valid command-line options to this program:
 *
 *  none        : All available variables are sorted by group and name
 *                and formatted nicely. ( for human consumption )
 *  <string>    : list all the variables whose name matches this string
 *  -g <string> : list all the variables whose group matches this string
 *  -m          : output the list in Machine friendly format, with a header row
 *  -M          : same as m, except no header either
 *  -G          : do not sort results
 *  -l			: lists all currently defined groups and terminates
 *  -h			: help
 * 
 * Options whose flag bits are set to GUC_NO_SHOW_ALL, NOT_IN_SAMPLE_CONF,
 * or DISALLOW_IN_CONF_FILE are not displayed, unless the user specifically
 * requests that variable by name
 * 
 * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
 *
 * $Id: $ 
 *
 *-------------------------------------------------------------------------
 */

#define translatable(x) (x)
/* 
 * This is the maximum number of runtime variables
 * that this program can handle
 */
#define MAX_NUM_VARS 1024

/*
 * The following char constructs provide the different formats the variables
 * can be outputted in.
 */
enum outputFormat {
	HUMAN,
	MACHINE
};


static char * GENERIC_FORMAT [] = { translatable("Name       : %-20s \nContext    : %-20s \nGroup      : %-20s\n"),
									translatable("%s\t%s\t%s\t")
								  };
static char * GENERIC_DESC []   = { translatable("Description: %s\n%s\n"),
									translatable("%s	%s\n")
								  };
static char * BOOL_FORMAT []    = { translatable("Type       : BOOL\nReset Value: %-s \n"),
									translatable("BOOL\t%s\t\t\t")
								  };
static char * INT_FORMAT []     = { translatable("Type       : INT\nReset Value: %-20d \nMin Value  : %-20d \nMax Value  : %-20d \n"),
									translatable("INT\t%d\t%d\t%d\t")
								  };
static char * REAL_FORMAT []    = { translatable("Type       : REAL\nReset Value: %-20g \nMin Value  : %-20g \nMax Value  : %-20g \n"),
									translatable("REAL\t%g\t%g\t%g\t")
								  };
static char * STRING_FORMAT []  = { translatable("Type       : STRING\nReset Value: %-s \n"),
									translatable("STRING\t%s\t\t\t")
								  };
static char * COLUMN_HEADER []  = { "",
									translatable("NAME\tCONTEXT\tGROUP\tTYPE\tRESET_VALUE\tMIN\tMAX\tSHORT_DESCRIPTION\tLONG_DESCRIPTION\n")
								  };
static char * ROW_SEPARATOR []  = { "------------------------------------------------------------\n",
									""
								  };

/*
 * Variables loaded from the command line
 */
char *nameString = NULL;             /* The var name pattern to match */
bool  nameRegexBool = false;         /* Match the name pattern as a regex */
char *groupString = NULL;            /* The var group pattern to match */
bool  groupRegexBool = false;        /* Match the group pattern as a regex */
enum  outputFormat outFormat = HUMAN;
bool  suppressAllHeaders = false;    /* MACHINE output, no column headers */
bool  groupResults = true;           /* sort result list */


/*
 * This union allows us to mix the numerous different types of structs
 * that we are organizing. To be used as an element in the mixedStruct
 */
typedef union {
	struct config_bool configBool;
	struct config_real configReal;
	struct config_int configInt;
	struct config_string configString;
} structVal;


/*
 * This struct type allows us to access many of the field common to the
 * numerous different kinds of config_structs ( bool, int, string, real )
 * without knowing what kind it is, or writting special code in each case
 */
typedef struct {
	enum config_type type;
	struct config_generic generic;
	structVal var;
} mixedStruct;


/* function prototypes */
int GucInfoMain ( int argc, char * argv [] );
static mixedStruct * resultList [MAX_NUM_VARS];
static int resultListSize;
static bool varMatches ( mixedStruct );
static int compareMixedStructs ( const void*, const void* );
static mixedStruct **varsToDisplay ( void );
static mixedStruct *buildMixedStruct ( enum config_type, void* );
static char * usageErrMsg ( void );
static void helpMessage ( void );
static void listAllGroups ( void );
static int printGenericHead ( struct config_generic structToPrint );
static int printGenericFoot ( struct config_generic structToPrint );
static void descriptionParser ( const char *preParsed, char **shortDes, char **longDes );
static int printMixedStruct ( mixedStruct );
static int displayStruct ( mixedStruct* structToDisplay );

#endif
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to