]> granicus.if.org Git - postgresql/commitdiff
Add --help-config facility to dump information about GUC parameters
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 4 Jul 2003 16:41:22 +0000 (16:41 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 4 Jul 2003 16:41:22 +0000 (16:41 +0000)
without needing a running backend.  Reorder postgresql.conf.sample
to match new layout of runtime.sgml.  This commit re-adds work lost
in Wednesday's crash.

doc/src/sgml/runtime.sgml
src/backend/main/main.c
src/backend/tcop/postgres.c
src/backend/utils/misc/Makefile
src/backend/utils/misc/guc.c
src/backend/utils/misc/help_config.c [new file with mode: 0644]
src/backend/utils/misc/postgresql.conf.sample
src/bin/initdb/initdb.sh
src/include/utils/guc_tables.h [new file with mode: 0644]
src/include/utils/help_config.h [new file with mode: 0644]

index 3f6a2b350db9df0735dd822ebf7e12b71fbd6688..dd950c78dc90ff4a9083a62b22b9e9be559607e0 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.189 2003/06/30 16:47:01 tgl Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.190 2003/07/04 16:41:21 tgl Exp $
 -->
 
 <Chapter Id="runtime">
@@ -710,6 +710,18 @@ SET ENABLE_SEQSCAN TO OFF;
        </para>
       </listitem>
      </varlistentry>
+
+     <varlistentry>
+      <term><varname>VIRTUAL_HOST</varname> (<type>string</type>)</term>
+      <listitem>
+       <para>
+        Specifies the host name or IP address on which the server is
+        to listen for connections from client applications. The
+        default is to listen on all configured addresses (including
+        <systemitem class="systemname">localhost</>).
+       </para>
+      </listitem>
+     </varlistentry>
      
      </variablelist>
      </sect3>
@@ -748,23 +760,23 @@ SET ENABLE_SEQSCAN TO OFF;
      </varlistentry>
 
      <varlistentry>
-      <term><varname>KRB_SERVER_KEYFILE</varname> (<type>string</type>)</term>
+      <term><varname>PASSWORD_ENCRYPTION</varname> (<type>boolean</type>)</term>
       <listitem>
        <para>
-        Sets the location of the Kerberos server key file. See
-        <xref linkend="kerberos-auth"> for details.
+        When a password is specified in <command>CREATE USER</> or
+        <command>ALTER USER</> without writing either <literal>ENCRYPTED</> or
+        <literal>UNENCRYPTED</>, this option determines whether the password is to be
+        encrypted. The default is on (encrypt the password).
        </para>
       </listitem>
      </varlistentry>
 
      <varlistentry>
-      <term><varname>VIRTUAL_HOST</varname> (<type>string</type>)</term>
+      <term><varname>KRB_SERVER_KEYFILE</varname> (<type>string</type>)</term>
       <listitem>
        <para>
-        Specifies the host name or IP address on which the server is
-        to listen for connections from client applications. The
-        default is to listening on all configured addresses (including
-        <systemitem class="systemname">localhost</>).
+        Sets the location of the Kerberos server key file. See
+        <xref linkend="kerberos-auth"> for details.
        </para>
       </listitem>
      </varlistentry>
@@ -905,8 +917,8 @@ SET ENABLE_SEQSCAN TO OFF;
      
      </variablelist>
      </sect3>
-     <sect3 id="runtime-config-resource-disk">
-     <title>Disk Resource Usage</title>
+     <sect3 id="runtime-config-resource-kernel">
+     <title>Kernel Resource Usage</title>
      <variablelist>
 
      <varlistentry>
@@ -957,7 +969,9 @@ SET ENABLE_SEQSCAN TO OFF;
        <para>
         By preloading a shared library (and initializing it if
         applicable), the library startup time is avoided when the
-        library is first used.
+        library is first used.  However, the time to start each new
+       server process may increase, even if that process never
+       uses the library.
        </para>
       </listitem>
      </varlistentry>
@@ -967,7 +981,7 @@ SET ENABLE_SEQSCAN TO OFF;
    </sect2>
 
    <sect2 id="runtime-config-wal">
-    <title>Write Ahead Logging</title>
+    <title>Write Ahead Log</title>
 
    <para>
     See also <xref linkend="wal-configuration"> for details on WAL
@@ -1019,14 +1033,6 @@ SET ENABLE_SEQSCAN TO OFF;
         <varname>fsync</varname>.
        </para>
 
-       <para>
-        It should be noted that the performance penalty of having
-        <varname>fsync</> on is considerably less in
-        <productname>PostgreSQL</> version 7.1 and later. If you
-        previously suppressed <function>fsync</> for performance
-        reasons, you may wish to reconsider your choice.
-       </para>
-
        <para>
         This option can only be set at server start or in the
         <filename>postgresql.conf</filename> file.
@@ -1056,7 +1062,7 @@ SET ENABLE_SEQSCAN TO OFF;
       <listitem>
        <para>
         Number of disk-page buffers in shared memory for WAL
-        logging. The default is 4. This option can only be set at
+        logging. The default is 8. This option can only be set at
         server start.
        </para>
       </listitem>
@@ -1288,9 +1294,18 @@ SET ENABLE_SEQSCAN TO OFF;
        </para>
       </listitem>
      </varlistentry>
-    </variablelist>
 
-    <variablelist>
+     <varlistentry>
+      <term><varname>CPU_TUPLE_COST</varname> (<type>floating point</type>)</term>
+      <listitem>
+       <para>
+        Sets the query planner's estimate of the cost of processing
+        each tuple during a query. This is measured as a fraction of
+        the cost of a sequential page fetch.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><varname>CPU_INDEX_TUPLE_COST</varname> (<type>floating point</type>)</term>
       <listitem>
@@ -1313,21 +1328,11 @@ SET ENABLE_SEQSCAN TO OFF;
       </listitem>
      </varlistentry>
 
-     <varlistentry>
-      <term><varname>CPU_TUPLE_COST</varname> (<type>floating point</type>)</term>
-      <listitem>
-       <para>
-        Sets the query planner's estimate of the cost of processing
-        each tuple during a query. This is measured as a fraction of
-        the cost of a sequential page fetch.
-       </para>
-      </listitem>
-     </varlistentry>
-
      </variablelist>
+
     </sect3>
      <sect3 id="runtime-config-query-geqo">
-     <title>Genetic Estimate Query Optimizer</title>
+     <title>Genetic Query Optimizer</title>
 
      <variablelist>
 
@@ -1395,20 +1400,23 @@ SET ENABLE_SEQSCAN TO OFF;
      </variablelist>
     </sect3>
      <sect3 id="runtime-config-query-other">
-     <title>Other Query Modifiers</title>
+     <title>Other Planner Options</title>
 
      <variablelist>
 
      <varlistentry>
-      <term><varname>EXPLAIN_PRETTY_PRINT</varname> (<type>boolean</type>)</term>
+      <term><varname>DEFAULT_STATISTICS_TARGET</varname> (<type>integer</type>)</term>
       <listitem>
        <para>
-        Determines whether <command>EXPLAIN VERBOSE</> uses the indented
-        or non-indented format for displaying detailed query-tree dumps.
+        Sets the default statistics target for table columns that have not
+        had a column-specific target set via <command>ALTER TABLE SET
+        STATISTICS</>.  Larger values increase the time needed to do
+        <command>ANALYZE</>, but may improve the quality of the planner's
+        estimates. The default value is 10.
        </para>
       </listitem>
      </varlistentry>
-     
+
      <varlistentry>
       <term><varname>FROM_COLLAPSE_LIMIT</varname> (<type>integer</type>)</term>
       <listitem>
@@ -1437,25 +1445,13 @@ SET ENABLE_SEQSCAN TO OFF;
        </para>
       </listitem>
      </varlistentry>
-
-     <varlistentry>
-      <term><varname>MAX_EXPR_DEPTH</varname> (<type>integer</type>)</term>
-      <listitem>
-       <para>
-        Sets the maximum expression nesting depth of the parser. The
-        default value is high enough for any normal query, but you can
-        raise it if needed. (But if you raise it too high, you run
-        the risk of server crashes due to stack overflow.)
-       </para>
-      </listitem>
-     </varlistentry>
      
      </variablelist>
     </sect3>
    </sect2>
 
    <sect2 id="runtime-config-logging">
-    <title>Logging and Debugging</title>
+    <title>Error Reporting and Logging</title>
 
     <sect3 id="runtime-config-logging-syslog">
      <title>Syslog</title>
@@ -1512,88 +1508,6 @@ SET ENABLE_SEQSCAN TO OFF;
      <sect3 id="runtime-config-logging-when">
      <title>When To Log</title>
 
-       <para>
-        Here is a list of the various message severity levels:
-        <variablelist>
-         <varlistentry>
-          <term><literal>DEBUG[1-5]</literal></term>
-          <listitem>
-           <para>
-            Provides information for use by developers.
-           </para>
-          </listitem>
-         </varlistentry>
-
-         <varlistentry>
-          <term><literal>INFO</literal></term>
-          <listitem>
-           <para>
-            Provides information implicitly requested by the user,
-            e.g., during <command>VACUUM VERBOSE</>.
-           </para>
-          </listitem>
-         </varlistentry>
-
-         <varlistentry>
-          <term><literal>NOTICE</literal></term>
-          <listitem>
-           <para>
-            Provides information that may be helpful to users, e.g.,
-            truncation of long identifiers and the creation of indexes as part
-            of primary keys.
-           </para>
-          </listitem>
-         </varlistentry>
-
-         <varlistentry>
-          <term><literal>WARNING</literal></term>
-          <listitem>
-           <para>
-            Provides warnings to the user, e.g., <command>COMMIT</>
-            outside a transaction block.
-           </para>
-          </listitem>
-         </varlistentry>
-
-         <varlistentry>
-          <term><literal>ERROR</literal></term>
-          <listitem>
-           <para>
-            Reports an error that caused the current transaction to abort.
-           </para>
-          </listitem>
-         </varlistentry>
-
-         <varlistentry>
-          <term><literal>LOG</literal></term>
-          <listitem>
-           <para>
-            Reports information of interest to administrators, e.g.,
-            checkpoint activity.
-           </para>
-          </listitem>
-         </varlistentry>
-
-         <varlistentry>
-          <term><literal>FATAL</literal></term>
-          <listitem>
-           <para>
-            Reports an error that caused the current session to abort.
-           </para>
-          </listitem>
-         </varlistentry>
-
-         <varlistentry>
-          <term><literal>PANIC</literal></term>
-          <listitem>
-           <para>
-            Reports an error that caused all sessions to abort.
-           </para>
-          </listitem>
-         </varlistentry>
-        </variablelist>
-       </para>
-
      <variablelist>
 
      <varlistentry>
@@ -1699,6 +1613,90 @@ SET ENABLE_SEQSCAN TO OFF;
      </varlistentry>
 
      </variablelist>
+
+       <para>
+        Here is a list of the various message severity levels used in
+       these settings:
+        <variablelist>
+         <varlistentry>
+          <term><literal>DEBUG[1-5]</literal></term>
+          <listitem>
+           <para>
+            Provides information for use by developers.
+           </para>
+          </listitem>
+         </varlistentry>
+
+         <varlistentry>
+          <term><literal>INFO</literal></term>
+          <listitem>
+           <para>
+            Provides information implicitly requested by the user,
+            e.g., during <command>VACUUM VERBOSE</>.
+           </para>
+          </listitem>
+         </varlistentry>
+
+         <varlistentry>
+          <term><literal>NOTICE</literal></term>
+          <listitem>
+           <para>
+            Provides information that may be helpful to users, e.g.,
+            truncation of long identifiers and the creation of indexes as part
+            of primary keys.
+           </para>
+          </listitem>
+         </varlistentry>
+
+         <varlistentry>
+          <term><literal>WARNING</literal></term>
+          <listitem>
+           <para>
+            Provides warnings to the user, e.g., <command>COMMIT</>
+            outside a transaction block.
+           </para>
+          </listitem>
+         </varlistentry>
+
+         <varlistentry>
+          <term><literal>ERROR</literal></term>
+          <listitem>
+           <para>
+            Reports an error that caused the current transaction to abort.
+           </para>
+          </listitem>
+         </varlistentry>
+
+         <varlistentry>
+          <term><literal>LOG</literal></term>
+          <listitem>
+           <para>
+            Reports information of interest to administrators, e.g.,
+            checkpoint activity.
+           </para>
+          </listitem>
+         </varlistentry>
+
+         <varlistentry>
+          <term><literal>FATAL</literal></term>
+          <listitem>
+           <para>
+            Reports an error that caused the current session to abort.
+           </para>
+          </listitem>
+         </varlistentry>
+
+         <varlistentry>
+          <term><literal>PANIC</literal></term>
+          <listitem>
+           <para>
+            Reports an error that caused all sessions to abort.
+           </para>
+          </listitem>
+         </varlistentry>
+        </variablelist>
+       </para>
+
     </sect3>
      <sect3 id="runtime-config-logging-what">
      <title>What To Log</title>
@@ -1811,6 +1809,95 @@ SET ENABLE_SEQSCAN TO OFF;
     </sect3>
    </sect2>
 
+   <sect2 id="runtime-config-statistics">
+    <title>Runtime Statistics</title>
+
+    <sect3 id="runtime-config-statistics-monitor">
+     <title>Statistics Monitoring</title>
+     <variablelist>
+
+     <varlistentry>
+      <term><varname>LOG_STATEMENT_STATS</varname> (<type>boolean</type>)</term>
+      <term><varname>LOG_PARSER_STATS</varname> (<type>boolean</type>)</term>
+      <term><varname>LOG_PLANNER_STATS</varname> (<type>boolean</type>)</term>
+      <term><varname>LOG_EXECUTOR_STATS</varname> (<type>boolean</type>)</term>
+      <listitem>
+       <para>
+        For each query, write performance statistics of the respective
+        module to the server log. This is a crude profiling
+        instrument.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     </variablelist>
+
+    </sect3>
+    <sect3 id="runtime-config-statistics-collector">
+     <title>Query and Index Statistics Collector</title>
+     <variablelist>
+
+     <varlistentry>
+      <term><varname>STATS_START_COLLECTOR</varname> (<type>boolean</type>)</term>
+      <listitem>
+       <para>
+        Controls whether the server should start the
+        statistics-collection subprocess.  This is on by default, but
+        may be turned off if you know you have no interest in
+        collecting statistics.  This option can only be set at server
+        start.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
+      <term><varname>STATS_COMMAND_STRING</varname> (<type>boolean</type>)</term>
+      <listitem>
+       <para>
+        Enables the collection of statistics on the currently
+        executing command of each session, along with the time at
+        which that command began execution. This option is off by
+        default. Note that even when enabled, this information is not
+        visible to all users, only to superusers and the user owning
+        the session being reported on; so it should not represent a
+        security risk. This data can be accessed via the
+        <structname>pg_stat_activity</structname> system view; refer
+        to <xref linkend="monitoring"> for more information.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
+      <term><varname>STATS_BLOCK_LEVEL</varname> (<type>boolean</type>)</term>
+      <term><varname>STATS_ROW_LEVEL</varname> (<type>boolean</type>)</term>
+      <listitem>
+       <para>
+        These enable the collection of block-level and row-level statistics
+        on database activity, respectively. These options are off by
+        default. This data can be accessed via the
+        <structname>pg_stat</structname> and
+        <structname>pg_statio</structname> family of system views;
+        refer to <xref linkend="monitoring"> for more information.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
+      <term><varname>STATS_RESET_ON_SERVER_START</varname> (<type>boolean</type>)</term>
+      <listitem>
+       <para>
+        If on, collected statistics are zeroed out whenever the server
+        is restarted. If off, statistics are accumulated across server
+        restarts. The default is on. This option can only be set at
+        server start.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     </variablelist>
+    </sect3>
+   </sect2>
+
    <sect2 id="runtime-config-client">
     <title>Client Connection Defaults</title>
 
@@ -2007,6 +2094,16 @@ SET ENABLE_SEQSCAN TO OFF;
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><varname>CLIENT_ENCODING</varname> (<type>string</type>)</term>
+      <indexterm><primary>character set encoding</></>
+      <listitem>
+       <para>
+        Sets the client-side encoding (character set).
+        The default is to use the database encoding.
+       </para>
+      </listitem>
+     </varlistentry>
 
      <varlistentry>
       <term><varname>LC_MESSAGES</varname> (<type>string</type>)</term>
@@ -2074,18 +2171,8 @@ SET ENABLE_SEQSCAN TO OFF;
       </listitem>
      </varlistentry>
 
-     <varlistentry>
-      <term><varname>CLIENT_ENCODING</varname> (<type>string</type>)</term>
-      <indexterm><primary>character set encoding</></>
-      <listitem>
-       <para>
-        Sets the client-side encoding (character set).
-        The default is to use the database encoding.
-       </para>
-      </listitem>
-     </varlistentry>
-
      </variablelist>
+
     </sect3>
      <sect3 id="runtime-config-client-other">
      <title>Other Defaults</title>
@@ -2093,18 +2180,15 @@ SET ENABLE_SEQSCAN TO OFF;
      <variablelist>
 
      <varlistentry>
-      <term><varname>PASSWORD_ENCRYPTION</varname> (<type>boolean</type>)</term>
+      <term><varname>EXPLAIN_PRETTY_PRINT</varname> (<type>boolean</type>)</term>
       <listitem>
        <para>
-        When a password is specified in <command>CREATE USER</> or
-        <command>ALTER USER</> without writing either <literal>ENCRYPTED</> or
-        <literal>UNENCRYPTED</>, this option determines whether the password is to be
-        encrypted. The default is on (encrypt the password).
+        Determines whether <command>EXPLAIN VERBOSE</> uses the indented
+        or non-indented format for displaying detailed query-tree dumps.
        </para>
       </listitem>
      </varlistentry>
 
-
      <varlistentry>
       <term><varname>DYNAMIC_LIBRARY_PATH</varname> (<type>string</type>)</term>
       <indexterm><primary>dynamic_library_path</></>
@@ -2151,105 +2235,14 @@ dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
       </listitem>
      </varlistentry>
 
-
-     </variablelist>
-    </sect3>
-   </sect2>
-
-   <sect2 id="runtime-config-statistics">
-    <title>Statistics</title>
-
-    <sect3 id="runtime-config-statistics-monitor">
-     <title>Statistics Monitoring</title>
-     <variablelist>
-
-     <varlistentry>
-      <term><varname>LOG_STATEMENT_STATS</varname> (<type>boolean</type>)</term>
-      <term><varname>LOG_PARSER_STATS</varname> (<type>boolean</type>)</term>
-      <term><varname>LOG_PLANNER_STATS</varname> (<type>boolean</type>)</term>
-      <term><varname>LOG_EXECUTOR_STATS</varname> (<type>boolean</type>)</term>
-      <listitem>
-       <para>
-        For each query, write performance statistics of the respective
-        module to the server log. This is a crude profiling
-        instrument.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><varname>DEFAULT_STATISTICS_TARGET</varname> (<type>integer</type>)</term>
-      <listitem>
-       <para>
-        Sets the default statistics target for table columns that have not
-        had a column-specific target set via <command>ALTER TABLE SET
-        STATISTICS</>.  Larger values increase the time needed to do
-        <command>ANALYZE</>, but may improve the quality of the planner's
-        estimates. The default value is 10.
-       </para>
-      </listitem>
-     </varlistentry>
-     
-     
-     </variablelist>
-    </sect3>
-    <sect3 id="runtime-config-statistics-collector">
-     <title>Query and Index Statistics Collector</title>
-     <variablelist>
-
-     <varlistentry>
-      <term><varname>STATS_START_COLLECTOR</varname> (<type>boolean</type>)</term>
-      <listitem>
-       <para>
-        Controls whether the server should start the
-        statistics-collection subprocess.  This is on by default, but
-        may be turned off if you know you have no interest in
-        collecting statistics.  This option can only be set at server
-        start.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><varname>STATS_COMMAND_STRING</varname> (<type>boolean</type>)</term>
-      <listitem>
-       <para>
-        Enables the collection of statistics on the currently
-        executing command of each session, along with the time at
-        which that command began execution. This option is off by
-        default. Note that even when enabled, this information is not
-        visible to all users, only to superusers and the user owning
-        the session being reported on; so it should not represent a
-        security risk. This data can be accessed via the
-        <structname>pg_stat_activity</structname> system view; refer
-        to <xref linkend="monitoring"> for more information.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry>
-      <term><varname>STATS_BLOCK_LEVEL</varname> (<type>boolean</type>)</term>
-      <term><varname>STATS_ROW_LEVEL</varname> (<type>boolean</type>)</term>
-      <listitem>
-       <para>
-        These enable the collection of block-level and row-level statistics
-        on database activity, respectively. These options are off by
-        default. This data can be accessed via the
-        <structname>pg_stat</structname> and
-        <structname>pg_statio</structname> family of system views;
-        refer to <xref linkend="monitoring"> for more information.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><varname>STATS_RESET_ON_SERVER_START</varname> (<type>boolean</type>)</term>
+      <term><varname>MAX_EXPR_DEPTH</varname> (<type>integer</type>)</term>
       <listitem>
        <para>
-        If on, collected statistics are zeroed out whenever the server
-        is restarted. If off, statistics are accumulated across server
-        restarts. The default is on. This option can only be set at
-        server start.
+        Sets the maximum expression nesting depth of the parser. The
+        default value is high enough for any normal query, but you can
+        raise it if needed. (But if you raise it too high, you run
+        the risk of server crashes due to stack overflow.)
        </para>
       </listitem>
      </varlistentry>
@@ -2364,15 +2357,6 @@ dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
      <title>Platform and Client Compatibility</title>
      <variablelist>
 
-     <varlistentry>
-      <term><varname>HAS_RENDEZVOUS</varname> (<type>boolean</type>)</term>
-      <indexterm><primary>rendezvous</></>
-      <listitem>
-       <para>
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry>
       <term><varname>TRANSFORM_NULL_EQUALS</varname> (<type>boolean</type>)</term>
       <indexterm><primary>IS NULL</></>
@@ -2421,14 +2405,16 @@ dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
    </sect2>
 
    <sect2 id="runtime-config-developer">
-    <title>Source Developer Options</title>
+    <title>Developer Options</title>
 
     <para>
-    The following options are for work on the PostgreSQL source and for severly
-    crashed databases only.  There should be no reason to use them in a production
-    database setup.  As such, they have been excluded from the postgresql.conf file.
-    Additionally, many of these options require special source compilation flags
-    to work.
+     The following options are intended for work on the PostgreSQL source,
+     and in some cases to assist with recovery of
+     severely damaged databases.  There should be no reason to use them in
+     a production database setup.  As such, they have been excluded from the
+     sample <filename>postgresql.conf</> file.
+     Note that many of these options require special
+     source compilation flags to work at all.
     </para>
 
     <variablelist>
@@ -2450,6 +2436,19 @@ dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><varname>PRE_AUTH_DELAY</varname> (<type>integer</type>)</term>
+      <listitem>
+       <para>
+        If nonzero, a delay of this many seconds occurs just after a new
+       server process is forked, before it conducts the authentication
+       process.  This is intended to give an opportunity to attach to the
+       server process with a debugger to trace down misbehavior in
+       authentication.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><varname>TRACE_NOTIFY</varname> (<type>boolean</type>)</term>
       <listitem>
@@ -2458,19 +2457,20 @@ dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
         <command>LISTEN</command> and <command>NOTIFY</command>
         commands.
         <option>CLIENT_MIN_MESSAGES</option> or <option>LOG_MIN_MESSAGES</option>
-        must be <literal>DEBUG1</literal> or lower to send output to the client
-        or server logs.
+        must be <literal>DEBUG1</literal> or lower to send this output to the
+        client or server log, respectively.
        </para>
       </listitem>
      </varlistentry>
 
      <varlistentry>
       <term><varname>TRACE_LOCKS</varname> (<type>boolean</type>)</term>
+      <term><varname>TRACE_LWLOCKS</varname> (<type>boolean</type>)</term>
       <term><varname>TRACE_USERLOCKS</varname> (<type>boolean</type>)</term>
       <term><varname>TRACE_LOCK_OIDMIN</varname> (<type>boolean</type>)</term>
       <term><varname>TRACE_LOCK_TABLE</varname> (<type>boolean</type>)</term>
       <term><varname>DEBUG_DEADLOCKS</varname> (<type>boolean</type>)</term>
-      <term><varname>SHOW_BTREE_BUILD_STATS</varname> (<type>boolean</type>)</term>
+      <term><varname>LOG_BTREE_BUILD_STATS</varname> (<type>boolean</type>)</term>
       <listitem>
        <para>
         Various other code tracing and debugging options.
@@ -2482,7 +2482,7 @@ dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
       <term><varname>WAL_DEBUG</varname> (<type>integer</type>)</term>
       <listitem>
        <para>
-        If nonzero, turn on WAL-related debugging output to the server log.
+        If nonzero, turn on WAL-related debugging output.
        </para>
       </listitem>
      </varlistentry>
index c86b45b132f75b46ca23973f639f7820bb860a71..e03633a3261762499f9c62c89f7d75dbb2bf4117 100644 (file)
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.57 2003/05/15 16:35:28 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.58 2003/07/04 16:41:21 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -37,6 +37,7 @@
 #include "miscadmin.h"
 #include "bootstrap/bootstrap.h"
 #include "tcop/tcopprot.h"
+#include "utils/help_config.h"
 #include "utils/ps_status.h"
 
 
@@ -198,7 +199,7 @@ main(int argc, char *argv[])
        }
 
        /*
-        * Now dispatch to one of PostmasterMain, PostgresMain, or
+        * Now dispatch to one of PostmasterMain, PostgresMain, GucInfoMain, or
         * BootstrapMain depending on the program name (and possibly first
         * argument) we were called with.  The lack of consistency here is
         * historical.
@@ -218,6 +219,14 @@ main(int argc, char *argv[])
        if (argc > 1 && strcmp(new_argv[1], "-boot") == 0)
                exit(BootstrapMain(argc - 1, new_argv + 1));
 
+       /*
+        * If the first argument is "--help-config", then invoke runtime
+        * configuration option display mode.
+        * We remove "--help-config" from the arguments passed on to GucInfoMain.
+        */
+       if (argc > 1 && strcmp(new_argv[1], "--help-config") == 0)
+               exit(GucInfoMain(argc - 1, new_argv + 1));
+
        /*
         * Otherwise we're a standalone backend.  Invoke PostgresMain,
         * specifying current userid as the "authenticated" Postgres user
index 3ac145860b4d7d31c42d3521cf3bcaaf23fff505..c3480d803cf7d8a0f837d68f2923d566fbfc8474 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.348 2003/06/20 21:58:02 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.349 2003/07/04 16:41:21 tgl Exp $
  *
  * NOTES
  *       this is the "main" module of the postgres backend and
@@ -1910,6 +1910,7 @@ usage(char *progname)
        printf("  -P              disable system indexes\n");
        printf("  -s              show statistics after each query\n");
        printf("  -S SORT-MEM     set amount of memory for sorts (in kbytes)\n");
+       printf("  --help-config   show configuration options, then exit. Details: --help-config -h\n");
        printf("  --help          show this help, then exit\n");
        printf("  --version       output version information, then exit\n");
        printf("\nDeveloper options:\n");
@@ -2547,7 +2548,7 @@ PostgresMain(int argc, char *argv[], const char *username)
        if (!IsUnderPostmaster)
        {
                puts("\nPOSTGRES backend interactive interface ");
-               puts("$Revision: 1.348 $ $Date: 2003/06/20 21:58:02 $\n");
+               puts("$Revision: 1.349 $ $Date: 2003/07/04 16:41:21 $\n");
        }
 
        /*
index 1f440a19e16f89a46710f66043bc1852f3a05f33..5078e1c850e3ba48f70d9c607dad7a6967425b13 100644 (file)
@@ -1,4 +1,4 @@
-# $Header: /cvsroot/pgsql/src/backend/utils/misc/Makefile,v 1.20 2002/11/01 22:52:33 tgl Exp $
+# $Header: /cvsroot/pgsql/src/backend/utils/misc/Makefile,v 1.21 2003/07/04 16:41:21 tgl Exp $
 
 subdir = src/backend/utils/misc
 top_builddir = ../../../..
@@ -6,7 +6,7 @@ include $(top_builddir)/src/Makefile.global
 
 override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
 
-OBJS = database.o superuser.o guc.o ps_status.o
+OBJS = database.o superuser.o guc.o help_config.o ps_status.o
 
 # This location might depend on the installation directories. Therefore
 # we can't subsitute it into config.h.
index 6e0da5bbaabecf62bf975dfcea676d0b9bdc6d12..fc626169ec0e513f4675ab15686baee3de051b29 100644 (file)
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.133 2003/06/30 16:47:01 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.134 2003/07/04 16:41:21 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
-
 #include "postgres.h"
 
 #include <errno.h>
@@ -23,6 +22,7 @@
 #include <unistd.h>
 
 #include "utils/guc.h"
+#include "utils/guc_tables.h"
 
 #include "access/xlog.h"
 #include "catalog/namespace.h"
@@ -56,8 +56,6 @@
 #include "utils/pg_locale.h"
 #include "pgstat.h"
 
-int                    log_min_duration_statement = 0;
-
 
 #ifndef PG_KRB_SRVTAB
 #define PG_KRB_SRVTAB ""
@@ -87,7 +85,7 @@ static const char *assign_facility(const char *facility,
 static const char *assign_defaultxactisolevel(const char *newval,
                                                   bool doit, bool interactive);
 static const char *assign_log_min_messages(const char *newval,
-                                                  bool doit, bool interactive);
+                                               bool doit, bool interactive);
 static const char *assign_client_min_messages(const char *newval,
                                                   bool doit, bool interactive);
 static const char *assign_min_error_statement(const char *newval, bool doit,
@@ -95,7 +93,7 @@ static const char *assign_min_error_statement(const char *newval, bool doit,
 static const char *assign_msglvl(int *var, const char *newval,
                          bool doit, bool interactive);
 static const char *assign_log_error_verbosity(const char *newval, bool doit,
-                                                                                         bool interactive);
+                                                  bool interactive);
 static bool assign_phony_autocommit(bool newval, bool doit, bool interactive);
 
 
@@ -130,6 +128,8 @@ int                 log_min_error_statement = PANIC;
 int                    log_min_messages = NOTICE;
 int                    client_min_messages = NOTICE;
 
+int                    log_min_duration_statement = 0;
+
 
 /*
  * These variables are all dummies that don't do anything, except in some
@@ -156,110 +156,6 @@ static char *timezone_string;
 static char *XactIsoLevel_string;
 
 
-/*
- * 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 ... */
 #define SET_STRING_VARIABLE(rec, newval) \
@@ -300,8 +196,53 @@ struct config_string
        } while (0)
 
 
+/*
+ * 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.
+ */
+const char *const config_group_names[] = {
+       gettext_noop("Ungrouped"),
+       gettext_noop("Connections & Authentication"),
+       gettext_noop("Connections & Authentication / Connection Settings"),
+       gettext_noop("Connections & Authentication / Security & Authentication"),
+       gettext_noop("Resource Usage"),
+       gettext_noop("Resource Usage / Memory"),
+       gettext_noop("Resource Usage / Free Space Map"),
+       gettext_noop("Resource Usage / Kernel Resources"),
+       gettext_noop("Write Ahead Log"),
+       gettext_noop("Write Ahead Log / Settings"),
+       gettext_noop("Write Ahead Log / Checkpoints"),
+       gettext_noop("Query Tuning"),
+       gettext_noop("Query Tuning / Planner Method Enabling"),
+       gettext_noop("Query Tuning / Planner Cost Constants"),
+       gettext_noop("Query Tuning / Genetic Query Optimizer"),
+       gettext_noop("Query Tuning / Other Planner Options"),
+       gettext_noop("Reporting & Logging"),
+       gettext_noop("Reporting & Logging / Syslog"),
+       gettext_noop("Reporting & Logging / When To Log"),
+       gettext_noop("Reporting & Logging / What To Log"),
+       gettext_noop("Statistics"),
+       gettext_noop("Statistics / Monitoring"),
+       gettext_noop("Statistics / Query & Index Statistics Collector"),
+       gettext_noop("Client Connection Defaults"),
+       gettext_noop("Client Connection Defaults / Statement Behavior"),
+       gettext_noop("Client Connection Defaults / Locale and Formatting"),
+       gettext_noop("Client Connection Defaults / Other Defaults"),
+       gettext_noop("Lock Management"),
+       gettext_noop("Version & Platform Compatibility"),
+       gettext_noop("Version & Platform Compatibility / Previous Postgres Versions"),
+       gettext_noop("Version & Platform Compatibility / Other Platforms & Clients"),
+       gettext_noop("Developer Options"),
+       NULL
+};
+
 
 /*
+ * Contents of GUC tables
+ *
+ * See src/backend/utils/misc/README for design notes.
+ *
  * TO ADD AN OPTION:
  *
  * 1. Declare a global variable of type bool, int, double, or char*
@@ -325,299 +266,588 @@ struct config_string
 
 /******** option records follow ********/
 
-static struct config_bool
-                       ConfigureNamesBool[] =
+static struct config_bool ConfigureNamesBool[] =
 {
        {
-               {"enable_seqscan", PGC_USERSET}, &enable_seqscan,
+               {"enable_seqscan", PGC_USERSET, QUERY_TUNING_METHOD,
+                       gettext_noop("Enable planner's use of sequential-scan plans"),
+                       NULL
+               },
+               &enable_seqscan,
                true, NULL, NULL
        },
        {
-               {"enable_indexscan", PGC_USERSET}, &enable_indexscan,
+               {"enable_indexscan", PGC_USERSET, QUERY_TUNING_METHOD,
+                       gettext_noop("Enable planner's use of index-scan plans"),
+                       NULL
+               },
+               &enable_indexscan,
                true, NULL, NULL
        },
        {
-               {"enable_tidscan", PGC_USERSET}, &enable_tidscan,
+               {"enable_tidscan", PGC_USERSET, QUERY_TUNING_METHOD,
+                       gettext_noop("Enable planner's use of TID scan plans"),
+                       NULL
+               },
+               &enable_tidscan,
                true, NULL, NULL
        },
        {
-               {"enable_sort", PGC_USERSET}, &enable_sort,
+               {"enable_sort", PGC_USERSET, QUERY_TUNING_METHOD,
+                       gettext_noop("Enable planner's use of explicit sort steps"),
+                       NULL
+               },
+               &enable_sort,
                true, NULL, NULL
        },
        {
-               {"enable_hashagg", PGC_USERSET}, &enable_hashagg,
+               {"enable_hashagg", PGC_USERSET, QUERY_TUNING_METHOD,
+                       gettext_noop("Enable planner's use of hashed aggregation plans"),
+                       NULL
+               },
+               &enable_hashagg,
                true, NULL, NULL
        },
        {
-               {"enable_nestloop", PGC_USERSET}, &enable_nestloop,
+               {"enable_nestloop", PGC_USERSET, QUERY_TUNING_METHOD,
+                       gettext_noop("Enable planner's use of nested-loop join plans"),
+                       NULL
+               },
+               &enable_nestloop,
                true, NULL, NULL
        },
        {
-               {"enable_mergejoin", PGC_USERSET}, &enable_mergejoin,
+               {"enable_mergejoin", PGC_USERSET, QUERY_TUNING_METHOD,
+                       gettext_noop("Enable planner's use of merge join plans"),
+                       NULL
+               },
+               &enable_mergejoin,
                true, NULL, NULL
        },
        {
-               {"enable_hashjoin", PGC_USERSET}, &enable_hashjoin,
+               {"enable_hashjoin", PGC_USERSET, QUERY_TUNING_METHOD,
+                       gettext_noop("Enable planner's use of hash join plans"),
+                       NULL
+               },
+               &enable_hashjoin,
                true, NULL, NULL
        },
        {
-               {"geqo", PGC_USERSET}, &enable_geqo,
+               {"geqo", PGC_USERSET, QUERY_TUNING_GEQO,
+                       gettext_noop("Enable genetic query optimization"),
+                       gettext_noop("This algorithm attempts to do planning without "
+                                                "exhaustive searching")
+               },
+               &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},
+               /* Not for general use --- used by SET SESSION AUTHORIZATION */
+               {"is_superuser", PGC_INTERNAL, UNGROUPED,
+                       gettext_noop("Set to indicate current user's privilege status"),
+                       NULL,
+                       GUC_REPORT | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
                &session_auth_is_superuser,
                false, NULL, NULL
        },
-
        {
-               {"tcpip_socket", PGC_POSTMASTER}, &NetServer,
+               {"tcpip_socket", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+                       gettext_noop("Accept TCP/IP connections"),
+                       NULL
+               },
+               &NetServer,
                false, NULL, NULL
        },
        {
-               {"ssl", PGC_POSTMASTER}, &EnableSSL,
+               {"ssl", PGC_POSTMASTER, CONN_AUTH_SECURITY,
+                       gettext_noop("Enables SSL connections"),
+                       NULL
+               },
+               &EnableSSL,
                false, NULL, NULL
        },
        {
-               {"fsync", PGC_SIGHUP}, &enableFsync,
+               {"fsync", PGC_SIGHUP, WAL_SETTINGS,
+                       gettext_noop("If on, server physically writes updates to disk"),
+                       gettext_noop("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}, &zero_damaged_pages,
+               {"zero_damaged_pages", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("Continues processing past damaged page headers"),
+                       gettext_noop("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"),
+                       GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
+               &zero_damaged_pages,
                false, NULL, NULL
        },
        {
-               {"silent_mode", PGC_POSTMASTER}, &SilentMode,
+               {"silent_mode", PGC_POSTMASTER, LOGGING_WHEN,
+                       gettext_noop("Runs the server silently"),
+                       gettext_noop("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_connections,
+               {"log_connections", PGC_BACKEND, LOGGING_WHAT,
+                       gettext_noop("Logs each successful connection"),
+                       NULL
+               },
+               &Log_connections,
                false, NULL, NULL
        },
        {
-               {"log_timestamp", PGC_SIGHUP}, &Log_timestamp,
+               {"log_timestamp", PGC_SIGHUP, LOGGING_WHAT,
+                       gettext_noop("Prefixes server log messages with a time stamp"),
+                       NULL
+               },
+               &Log_timestamp,
                false, NULL, NULL
        },
        {
-               {"log_pid", PGC_SIGHUP}, &Log_pid,
+               {"log_pid", PGC_SIGHUP, LOGGING_WHAT,
+                       gettext_noop("Prefixes server log messages with the server PID"),
+                       NULL
+               },
+               &Log_pid,
                false, NULL, NULL
        },
 
 #ifdef USE_ASSERT_CHECKING
        {
-               {"debug_assertions", PGC_USERSET}, &assert_enabled,
+               {"debug_assertions", PGC_USERSET, DEVELOPER_OPTIONS,
+                       gettext_noop("Turns on various assertion checks"),
+                       gettext_noop("This is a debugging aid. To use this option, "
+                                                "PostgreSQL must be built with the configure option --enable-cassert"),
+                       GUC_NOT_IN_SAMPLE
+               },
+               &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,
+               {"exit_on_error", PGC_USERSET, UNGROUPED,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE
+               },
+               &ExitOnAnyError,
                false, NULL, NULL
        },
-
        {
-               {"log_statement", PGC_SUSET}, &log_statement,
+               {"log_statement", PGC_SUSET, LOGGING_WHAT,
+                       gettext_noop("Causes each SQL statement to be logged"),
+                       NULL
+               },
+               &log_statement,
                false, NULL, NULL
        },
        {
-               {"log_duration", PGC_SUSET}, &log_duration,
+               {"log_duration", PGC_SUSET, LOGGING_WHAT,
+                       gettext_noop("Duration of every completed statement is logged"),
+                       NULL
+               },
+               &log_duration,
                false, NULL, NULL
        },
        {
-               {"debug_print_parse", PGC_USERSET}, &Debug_print_parse,
+               {"debug_print_parse", PGC_USERSET, LOGGING_WHAT,
+                       gettext_noop("Parse tree printed to server logs"),
+                       gettext_noop("Parsed for each executed query")
+               },
+               &Debug_print_parse,
                false, NULL, NULL
        },
        {
-               {"debug_print_rewritten", PGC_USERSET}, &Debug_print_rewritten,
+               {"debug_print_rewritten", PGC_USERSET, LOGGING_WHAT,
+                       gettext_noop("Prints query rewriter output to server log"),
+                       NULL
+               },
+               &Debug_print_rewritten,
                false, NULL, NULL
        },
        {
-               {"debug_print_plan", PGC_USERSET}, &Debug_print_plan,
+               {"debug_print_plan", PGC_USERSET, LOGGING_WHAT,
+                       gettext_noop("Prints execution plan to the server log"),
+                       NULL
+               },
+               &Debug_print_plan,
                false, NULL, NULL
        },
        {
-               {"debug_pretty_print", PGC_USERSET}, &Debug_pretty_print,
+               {"debug_pretty_print", PGC_USERSET, LOGGING_WHAT,
+                       gettext_noop("Indents displays from parse, rewritten and plan"),
+                       NULL
+               },
+               &Debug_pretty_print,
                false, NULL, NULL
        },
-
        {
-               {"log_parser_stats", PGC_SUSET}, &log_parser_stats,
+               {"log_parser_stats", PGC_SUSET, STATS_MONITORING,
+                       gettext_noop("Write parser performance stats to server log"),
+                       NULL
+               },
+               &log_parser_stats,
                false, NULL, NULL
        },
        {
-               {"log_planner_stats", PGC_SUSET}, &log_planner_stats,
+               {"log_planner_stats", PGC_SUSET, STATS_MONITORING,
+                       gettext_noop("Write planner performance stats to server log"),
+                       NULL
+               },
+               &log_planner_stats,
                false, NULL, NULL
        },
        {
-               {"log_executor_stats", PGC_SUSET}, &log_executor_stats,
+               {"log_executor_stats", PGC_SUSET, STATS_MONITORING,
+                       gettext_noop("Write executor performance stats to server log"),
+                       NULL
+               },
+               &log_executor_stats,
                false, NULL, NULL
        },
        {
-               {"log_statement_stats", PGC_SUSET}, &log_statement_stats,
+               {"log_statement_stats", PGC_SUSET, STATS_MONITORING,
+                       gettext_noop("Write statement performance stats to server log"),
+                       NULL
+               },
+               &log_statement_stats,
                false, NULL, NULL
        },
 #ifdef BTREE_BUILD_STATS
        {
-               {"log_btree_build_stats", PGC_SUSET}, &log_btree_build_stats,
+               {"log_btree_build_stats", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &log_btree_build_stats,
                false, NULL, NULL
        },
 #endif
 
        {
-               {"explain_pretty_print", PGC_USERSET}, &Explain_pretty_print,
+               {"explain_pretty_print", PGC_USERSET, CLIENT_CONN_OTHER,
+                       gettext_noop("Use indented output format for EXPLAIN VERBOSE"),
+                       NULL
+               },
+               &Explain_pretty_print,
                true, NULL, NULL
        },
-
        {
-               {"stats_start_collector", PGC_POSTMASTER}, &pgstat_collect_startcollector,
+               {"stats_start_collector", PGC_POSTMASTER, STATS_COLLECTOR,
+                       gettext_noop("Start server statistics-collection subprocess"),
+                       NULL
+               },
+               &pgstat_collect_startcollector,
                true, NULL, NULL
        },
        {
-               {"stats_reset_on_server_start", PGC_POSTMASTER}, &pgstat_collect_resetonpmstart,
+               {"stats_reset_on_server_start", PGC_POSTMASTER, STATS_COLLECTOR,
+                       gettext_noop("Collected statistics zeroed out on server restart"),
+                       NULL
+               },
+               &pgstat_collect_resetonpmstart,
                true, NULL, NULL
        },
        {
-               {"stats_command_string", PGC_SUSET}, &pgstat_collect_querystring,
+               {"stats_command_string", PGC_SUSET, STATS_COLLECTOR,
+                       gettext_noop("Enable stat collection of executing commands"),
+                       gettext_noop("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}, &pgstat_collect_tuplelevel,
+               {"stats_row_level", PGC_SUSET, STATS_COLLECTOR,
+                       gettext_noop("Enable collection of row-level stats on db activity"),
+                       NULL
+               },
+               &pgstat_collect_tuplelevel,
                false, NULL, NULL
        },
        {
-               {"stats_block_level", PGC_SUSET}, &pgstat_collect_blocklevel,
+               {"stats_block_level", PGC_SUSET, STATS_COLLECTOR,
+                       gettext_noop("Enables collection of block-level stats on db activity"),
+                       NULL
+               },
+               &pgstat_collect_blocklevel,
                false, NULL, NULL
        },
 
        {
-               {"trace_notify", PGC_USERSET}, &Trace_notify,
+               {"trace_notify", PGC_USERSET, DEVELOPER_OPTIONS,
+                       gettext_noop("Generates debugging output for LISTEN and NOTIFY"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &Trace_notify,
                false, NULL, NULL
        },
 
 #ifdef LOCK_DEBUG
        {
-               {"trace_locks", PGC_SUSET}, &Trace_locks,
+               {"trace_locks", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &Trace_locks,
                false, NULL, NULL
        },
        {
-               {"trace_userlocks", PGC_SUSET}, &Trace_userlocks,
+               {"trace_userlocks", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &Trace_userlocks,
                false, NULL, NULL
        },
        {
-               {"trace_lwlocks", PGC_SUSET}, &Trace_lwlocks,
+               {"trace_lwlocks", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &Trace_lwlocks,
                false, NULL, NULL
        },
        {
-               {"debug_deadlocks", PGC_SUSET}, &Debug_deadlocks,
+               {"debug_deadlocks", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &Debug_deadlocks,
                false, NULL, NULL
        },
 #endif
 
        {
-               {"log_hostname", PGC_SIGHUP}, &log_hostname,
+               {"log_hostname", PGC_SIGHUP, LOGGING_WHAT,
+                       gettext_noop("Log hostname to connection logs"),
+                       gettext_noop("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}, &LogSourcePort,
+               {"log_source_port", PGC_SIGHUP, LOGGING_WHAT,
+                       gettext_noop("Log outgoing port number of the connecting host"),
+                       NULL
+               },
+               &LogSourcePort,
                false, NULL, NULL
        },
 
        {
-               {"sql_inheritance", PGC_USERSET}, &SQL_inheritance,
+               {"sql_inheritance", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+                       gettext_noop("This controls the inheritance semantics"),
+                       gettext_noop("In particular, whether subtables are included by "
+                                                "various commands by default")
+               },
+               &SQL_inheritance,
                true, NULL, NULL
        },
        {
-               {"australian_timezones", PGC_USERSET}, &Australian_timezones,
+               {"australian_timezones", PGC_USERSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("If true, ACST, CST, EST, and SAT are interpreted "
+                                                "as Australian time zones"),
+                       gettext_noop("Otherwise they are interpreted as North/South American "
+                                                "time zones and Saturday")
+               },
+               &Australian_timezones,
                false, ClearDateCache, NULL
        },
        {
-               {"password_encryption", PGC_USERSET}, &Password_encryption,
+               {"password_encryption", PGC_USERSET, CONN_AUTH_SECURITY,
+                       gettext_noop("If unspecified the password is encrypted"),
+                       gettext_noop("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}, &Transform_null_equals,
+               {"transform_null_equals", PGC_USERSET, COMPAT_OPTIONS_CLIENT,
+                       gettext_noop("expr=NULL treated as expr IS NULL"),
+                       gettext_noop("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}, &Db_user_namespace,
+               {"db_user_namespace", PGC_SIGHUP, CONN_AUTH_SECURITY,
+                       gettext_noop("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, GUC_NO_SHOW_ALL}, &phony_autocommit,
+               /* only here for backwards compatibility */
+               {"autocommit", PGC_USERSET, CLIENT_CONN_STATEMENT,
+                       gettext_noop("This var doesn't do anything"),
+                       gettext_noop("It's just here so that we won't choke on SET AUTOCOMMIT "
+                                                "TO ON from 7.3-vintage clients."),
+                       GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE
+               },
+               &phony_autocommit,
                true, assign_phony_autocommit, NULL
        },
        {
-               {"default_transaction_read_only", PGC_USERSET}, &DefaultXactReadOnly,
+               {"default_transaction_read_only", PGC_USERSET, CLIENT_CONN_STATEMENT,
+                       gettext_noop("Controls default read-only status of new transactions"),
+                       NULL
+               },
+               &DefaultXactReadOnly,
                false, NULL, NULL
        },
        {
-               {"transaction_read_only", PGC_USERSET, GUC_NO_RESET_ALL}, &XactReadOnly,
+               {"transaction_read_only", PGC_USERSET, CLIENT_CONN_STATEMENT,
+                       gettext_noop("Current transaction's read-only status"),
+                       NULL,
+                       GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
+               &XactReadOnly,
                false, NULL, NULL
        },
        {
-               {"add_missing_from", PGC_USERSET}, &add_missing_from,
+               {"add_missing_from", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+                       gettext_noop("Add missing table references to from clauses"),
+                       NULL
+               },
+               &add_missing_from,
                true, NULL, NULL
        },
 
        /* End-of-list marker */
        {
-               {NULL, 0}, NULL, false, NULL, NULL
-       },
+               {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL
+       }
 };
 
 
-static struct config_int
-                       ConfigureNamesInt[] =
+static struct config_int ConfigureNamesInt[] =
 {
        {
-               {"default_statistics_target", PGC_USERSET}, &default_statistics_target,
+               {"default_statistics_target", PGC_USERSET, QUERY_TUNING_OTHER,
+                       gettext_noop("Sets the default statistics target"),
+                       gettext_noop("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}, &from_collapse_limit,
+               {"from_collapse_limit", PGC_USERSET, QUERY_TUNING_OTHER,
+                       gettext_noop("From list size beyond which sub-queries are not "
+                                                "collapsed"),
+                       gettext_noop("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}, &join_collapse_limit,
+               {"join_collapse_limit", PGC_USERSET, QUERY_TUNING_OTHER,
+                       gettext_noop("From list size beyond which JOIN constructs not "
+                                                "flattened"),
+                       gettext_noop("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}, &geqo_threshold,
+               {"geqo_threshold", PGC_USERSET, QUERY_TUNING_GEQO,
+                       gettext_noop("Threshold of FROM items beyond which geqo is used"),
+                       NULL
+               },
+               &geqo_threshold,
                11, 2, INT_MAX, NULL, NULL
        },
        {
-               {"geqo_pool_size", PGC_USERSET}, &Geqo_pool_size,
+               {"geqo_pool_size", PGC_USERSET, QUERY_TUNING_GEQO,
+                       gettext_noop("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}, &Geqo_effort,
+               {"geqo_effort", PGC_USERSET, QUERY_TUNING_GEQO,
+                       gettext_noop("Effort is used to calculate a default for generations"),
+                       NULL
+               },
+               &Geqo_effort,
                1, 1, INT_MAX, NULL, NULL
        },
        {
-               {"geqo_generations", PGC_USERSET}, &Geqo_generations,
+               {"geqo_generations", PGC_USERSET, QUERY_TUNING_GEQO,
+                       gettext_noop("Specifies the number of iterations in the algorithm"),
+                       gettext_noop("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}, &Geqo_random_seed,
+               {"geqo_random_seed", PGC_USERSET, QUERY_TUNING_GEQO,
+                       gettext_noop("Can be set to get reproducible results from the algorithm"),
+                       gettext_noop("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}, &DeadlockTimeout,
+               {"deadlock_timeout", PGC_SIGHUP, LOCK_MANAGEMENT,
+                       gettext_noop("Time to wait on lock (msec) before checking for deadlock"),
+                       NULL
+               },
+               &DeadlockTimeout,
                1000, 0, INT_MAX, NULL, NULL
        },
 
 #ifdef HAVE_SYSLOG
        {
-               {"syslog", PGC_SIGHUP}, &Use_syslog,
+               {"syslog", PGC_SIGHUP, LOGGING_SYSLOG,
+                       gettext_noop("Allows the use of syslog for logging"),
+                       gettext_noop("If this option is 1, messages go both to syslog "
+                                                "and the standard output. A value 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
@@ -630,350 +860,645 @@ static struct config_int
         * backends number.
         */
        {
-               {"max_connections", PGC_POSTMASTER}, &MaxBackends,
+               {"max_connections", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+                       gettext_noop("Max number of concurrent connections"),
+                       NULL
+               },
+               &MaxBackends,
                DEF_MAXBACKENDS, 1, INT_MAX, NULL, NULL
        },
 
        {
-               {"superuser_reserved_connections", PGC_POSTMASTER}, &ReservedBackends,
+               {"superuser_reserved_connections", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+                       gettext_noop("Number of 'connection slots' reserved for superusers"),
+                       NULL
+               },
+               &ReservedBackends,
                2, 0, INT_MAX, NULL, NULL
        },
 
        {
-               {"shared_buffers", PGC_POSTMASTER}, &NBuffers,
+               {"shared_buffers", PGC_POSTMASTER, RESOURCES_MEM,
+                       gettext_noop("The number of shared memory buffers used by the server"),
+                       NULL
+               },
+               &NBuffers,
                DEF_NBUFFERS, 16, INT_MAX, NULL, NULL
        },
 
        {
-               {"port", PGC_POSTMASTER}, &PostPortNumber,
+               {"port", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+                       gettext_noop("The TCP port the server listens on"),
+                       NULL
+               },
+               &PostPortNumber,
                DEF_PGPORT, 1, 65535, NULL, NULL
        },
 
        {
-               {"unix_socket_permissions", PGC_POSTMASTER}, &Unix_socket_permissions,
+               {"unix_socket_permissions", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+                       gettext_noop("Sets the access permissions of the Unix domain socket"),
+                       gettext_noop("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}, &SortMem,
+               {"sort_mem", PGC_USERSET, RESOURCES_MEM,
+                       gettext_noop("Max memory to be used for sorts and hash tables"),
+                       gettext_noop("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}, &VacuumMem,
+               {"vacuum_mem", PGC_USERSET, RESOURCES_MEM,
+                       gettext_noop("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}, &max_files_per_process,
+               {"max_files_per_process", PGC_BACKEND, RESOURCES_KERNEL,
+                       gettext_noop("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}, &Trace_lock_oidmin,
+               {"trace_lock_oidmin", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &Trace_lock_oidmin,
                BootstrapObjectIdData, 1, INT_MAX, NULL, NULL
        },
        {
-               {"trace_lock_table", PGC_SUSET}, &Trace_lock_table,
+               {"trace_lock_table", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &Trace_lock_table,
                0, 0, INT_MAX, NULL, NULL
        },
 #endif
        {
-               {"max_expr_depth", PGC_USERSET}, &max_expr_depth,
+               {"max_expr_depth", PGC_USERSET, CLIENT_CONN_OTHER,
+                       gettext_noop("Max expression nesting depth"),
+                       NULL
+               },
+               &max_expr_depth,
                DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX, NULL, NULL
        },
 
        {
-               {"statement_timeout", PGC_USERSET}, &StatementTimeout,
+               {"statement_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT,
+                       gettext_noop("Max allowed duration (msec) of any statement"),
+                       gettext_noop("A value of 0 turns off the timeout")
+               },
+               &StatementTimeout,
                0, 0, INT_MAX, NULL, NULL
        },
 
        {
-               {"max_fsm_relations", PGC_POSTMASTER}, &MaxFSMRelations,
+               {"max_fsm_relations", PGC_POSTMASTER, RESOURCES_FSM,
+                       gettext_noop("Max num. of tables+indexes for which free space is "
+                                                "tracked"),
+                       NULL
+               },
+               &MaxFSMRelations,
                1000, 100, INT_MAX, NULL, NULL
        },
        {
-               {"max_fsm_pages", PGC_POSTMASTER}, &MaxFSMPages,
+               {"max_fsm_pages", PGC_POSTMASTER, RESOURCES_FSM,
+                       gettext_noop("Max num. of disk pages for which free space is "
+                                                "tracked"),
+                       NULL
+               },
+               &MaxFSMPages,
                20000, 1000, INT_MAX, NULL, NULL
        },
 
        {
-               {"max_locks_per_transaction", PGC_POSTMASTER}, &max_locks_per_xact,
+               {"max_locks_per_transaction", PGC_POSTMASTER, LOCK_MANAGEMENT,
+                       gettext_noop("Max locks per transaction"),
+                       gettext_noop("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}, &AuthenticationTimeout,
+               {"authentication_timeout", PGC_SIGHUP, CONN_AUTH_SECURITY,
+                       gettext_noop("Max time (sec) to complete client authentication"),
+                       NULL
+               },
+               &AuthenticationTimeout,
                60, 1, 600, NULL, NULL
        },
 
-       /* Not for general use */
        {
-               {"pre_auth_delay", PGC_SIGHUP}, &PreAuthDelay,
+               /* Not for general use */
+               {"pre_auth_delay", PGC_SIGHUP, DEVELOPER_OPTIONS,
+                       gettext_noop("No Description Available"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &PreAuthDelay,
                0, 0, 60, NULL, NULL
        },
 
        {
-               {"checkpoint_segments", PGC_SIGHUP}, &CheckPointSegments,
+               {"checkpoint_segments", PGC_SIGHUP, WAL_CHECKPOINTS,
+                       gettext_noop("Max distance between automatic WAL checkpoints"),
+                       NULL
+               },
+               &CheckPointSegments,
                3, 1, INT_MAX, NULL, NULL
        },
 
        {
-               {"checkpoint_timeout", PGC_SIGHUP}, &CheckPointTimeout,
+               {"checkpoint_timeout", PGC_SIGHUP, WAL_CHECKPOINTS,
+                       gettext_noop("Max time (sec) between automatic WAL checkpoints"),
+                       NULL
+               },
+               &CheckPointTimeout,
                300, 30, 3600, NULL, NULL
        },
 
        {
-               {"checkpoint_warning", PGC_SIGHUP}, &CheckPointWarning,
+               {"checkpoint_warning", PGC_SIGHUP, WAL_CHECKPOINTS,
+                       gettext_noop("Log if filling of checkpoint segments happens more"
+                                                "frequently than this (sec)"),
+                       gettext_noop("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}, &XLOGbuffers,
+               {"wal_buffers", PGC_POSTMASTER, WAL_SETTINGS,
+                       gettext_noop("Disk-page buffers in shared memory for WAL logging"),
+                       NULL
+               },
+               &XLOGbuffers,
                8, 4, INT_MAX, NULL, NULL
        },
 
        {
-               {"wal_debug", PGC_SUSET}, &XLOG_DEBUG,
+               {"wal_debug", PGC_SUSET, DEVELOPER_OPTIONS,
+                       gettext_noop("If nonzero, log WAL-related debugging output"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE
+               },
+               &XLOG_DEBUG,
                0, 0, 16, NULL, NULL
        },
 
        {
-               {"commit_delay", PGC_USERSET}, &CommitDelay,
+               {"commit_delay", PGC_USERSET, WAL_CHECKPOINTS,
+                       gettext_noop("Delay (usec) between transaction commit and "
+                                                "flushing WAL to disk"),
+                       NULL
+               },
+               &CommitDelay,
                0, 0, 100000, NULL, NULL
        },
 
        {
-               {"commit_siblings", PGC_USERSET}, &CommitSiblings,
+               {"commit_siblings", PGC_USERSET, WAL_CHECKPOINTS,
+                       gettext_noop("Min concurrent open trans. before performing "
+                                                "COMMIT_DELAY"),
+                       NULL
+               },
+               &CommitSiblings,
                5, 1, 1000, NULL, NULL
        },
 
        {
-               {"extra_float_digits", PGC_USERSET}, &extra_float_digits,
+               {"extra_float_digits", PGC_USERSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("Adjusts number of digits displayed for "
+                                                "floating-point values"),
+                       gettext_noop("This affects float4, float8, and geometric data types. "
+                                                "The parameter value is added to the standard number of digits "
+                                                "(FLT_DIG or DBL_DIG as appropriate)")
+               },
+               &extra_float_digits,
                0, -15, 2, NULL, NULL
        },
 
        {
-               {"log_min_duration_statement", PGC_SUSET}, &log_min_duration_statement,
+               {"log_min_duration_statement", PGC_SUSET, LOGGING_WHEN,
+                       gettext_noop("Min execution time (msec) above which statements will "
+                                                "be logged"),
+                       gettext_noop("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}, NULL, 0, 0, 0, NULL, NULL
+               {NULL, 0, 0, NULL, NULL}, NULL, 0, 0, 0, NULL, NULL
        }
 };
 
 
-static struct config_real
-                       ConfigureNamesReal[] =
+static struct config_real ConfigureNamesReal[] =
 {
        {
-               {"effective_cache_size", PGC_USERSET}, &effective_cache_size,
+               {"effective_cache_size", PGC_USERSET, QUERY_TUNING_COST,
+                       gettext_noop("Planner's assumption about size of the disk cache"),
+                       gettext_noop("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}, &random_page_cost,
+               {"random_page_cost", PGC_USERSET, QUERY_TUNING_COST,
+                       gettext_noop("Planner's estimate of the cost of a nonsequentially "
+                                                "fetched disk page"),
+                       gettext_noop("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}, &cpu_tuple_cost,
+               {"cpu_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
+                       gettext_noop("Planner's estimate of the cost of processing each tuple"),
+                       gettext_noop("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}, &cpu_index_tuple_cost,
+               {"cpu_index_tuple_cost", PGC_USERSET, QUERY_TUNING_COST,
+                       gettext_noop("Planner's estimate of processing cost for each "
+                                                "index tuple during index scan"),
+                       gettext_noop("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}, &cpu_operator_cost,
+               {"cpu_operator_cost", PGC_USERSET, QUERY_TUNING_COST,
+                       gettext_noop("Planner's estimate of processing cost of each op. in WHERE"),
+                       gettext_noop("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}, &Geqo_selection_bias,
+               {"geqo_selection_bias", PGC_USERSET, QUERY_TUNING_GEQO,
+                       gettext_noop("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, GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL},
+               {"seed", PGC_USERSET, UNGROUPED,
+                       gettext_noop("Seed for random-number generation"),
+                       NULL,
+                       GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
                &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
+               {NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL
        }
 };
 
 
-static struct config_string
-                       ConfigureNamesString[] =
+static struct config_string ConfigureNamesString[] =
 {
        {
-               {"client_encoding", PGC_USERSET, GUC_REPORT},
+               {"client_encoding", PGC_USERSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("Client's character set encoding"),
+                       NULL,
+                       GUC_REPORT
+               },
                &client_encoding_string,
                "SQL_ASCII", assign_client_encoding, NULL
        },
 
        {
-               {"client_min_messages", PGC_USERSET}, &client_min_messages_str,
+               {"client_min_messages", PGC_USERSET, LOGGING_WHEN,
+                       gettext_noop("Controls which message levels are sent to the client"),
+                       gettext_noop("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_messages", PGC_SUSET}, &log_min_messages_str,
+               {"log_min_messages", PGC_SUSET, LOGGING_WHEN,
+                       gettext_noop("Controls which message levels logged"),
+                       gettext_noop("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
        },
 
        {
-               {"log_error_verbosity", PGC_SUSET}, &log_error_verbosity_str,
+               {"log_error_verbosity", PGC_SUSET, LOGGING_WHEN,
+                       gettext_noop("Controls verbosity of logged messages"),
+                       gettext_noop("Valid values are TERSE, DEFAULT, and VERBOSE")
+               },
+               &log_error_verbosity_str,
                "default", assign_log_error_verbosity, NULL
        },
 
        {
-               {"log_min_error_statement", PGC_SUSET}, &log_min_error_statement_str,
+               {"log_min_error_statement", PGC_SUSET, LOGGING_WHEN,
+                       gettext_noop("Controls whether the erroneous statement is logged"),
+                       gettext_noop("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, GUC_LIST_INPUT | GUC_REPORT},
+               {"DateStyle", PGC_USERSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("The display format for date and time values"),
+                       gettext_noop("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}, &default_iso_level_string,
+               {"default_transaction_isolation", PGC_USERSET, CLIENT_CONN_STATEMENT,
+                       gettext_noop("The default isolation level of each new transaction"),
+                       gettext_noop("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}, &Dynamic_library_path,
+               {"dynamic_library_path", PGC_SUSET, CLIENT_CONN_OTHER,
+                       gettext_noop("Path for dynamically loadable modules"),
+                       gettext_noop("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}, &pg_krb_server_keyfile,
+               {"krb_server_keyfile", PGC_POSTMASTER, CONN_AUTH_SECURITY,
+                       gettext_noop("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}, &locale_collate,
+               {"lc_collate", PGC_INTERNAL, CLIENT_CONN_LOCALE,
+                       gettext_noop("Locale collation order"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
+               &locale_collate,
                "C", NULL, NULL
        },
 
        {
-               {"lc_ctype", PGC_INTERNAL}, &locale_ctype,
+               {"lc_ctype", PGC_INTERNAL, CLIENT_CONN_LOCALE,
+                       gettext_noop("Locale character classification and case conversion"),
+                       NULL,
+                       GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
+               &locale_ctype,
                "C", NULL, NULL
        },
 
        {
-               {"lc_messages", PGC_SUSET}, &locale_messages,
+               {"lc_messages", PGC_SUSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("Language in which messages are displayed"),
+                       NULL
+               },
+               &locale_messages,
                "", locale_messages_assign, NULL
        },
 
        {
-               {"lc_monetary", PGC_USERSET}, &locale_monetary,
+               {"lc_monetary", PGC_USERSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("Locale for formatting monetary amounts"),
+                       NULL
+               },
+               &locale_monetary,
                "C", locale_monetary_assign, NULL
        },
 
        {
-               {"lc_numeric", PGC_USERSET}, &locale_numeric,
+               {"lc_numeric", PGC_USERSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("Locale for formatting numbers"),
+                       NULL
+               },
+               &locale_numeric,
                "C", locale_numeric_assign, NULL
        },
 
        {
-               {"lc_time", PGC_USERSET}, &locale_time,
+               {"lc_time", PGC_USERSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("Locale for formatting date and time values"),
+                       NULL
+               },
+               &locale_time,
                "C", locale_time_assign, NULL
        },
 
        {
-               {"preload_libraries", PGC_POSTMASTER, GUC_LIST_INPUT | GUC_LIST_QUOTE},
+               {"preload_libraries", PGC_POSTMASTER, RESOURCES_KERNEL,
+                       gettext_noop("Shared libraries to preload into postmaster"),
+                       NULL,
+                       GUC_LIST_INPUT | GUC_LIST_QUOTE
+               },
                &preload_libraries_string,
                "", NULL, NULL
        },
 
        {
-               {"regex_flavor", PGC_USERSET}, &regex_flavor_string,
+               {"regex_flavor", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+                       gettext_noop("Regular expression 'flavor'"),
+                       gettext_noop("This can be set to advanced, extended, or basic")
+               },
+               &regex_flavor_string,
                "advanced", assign_regex_flavor, NULL
        },
 
        {
-               {"search_path", PGC_USERSET, GUC_LIST_INPUT | GUC_LIST_QUOTE},
+               {"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,
+                       gettext_noop("Schema search order for names 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, GUC_REPORT},
+               /* Can't be set in postgresql.conf */
+               {"server_encoding", PGC_INTERNAL, CLIENT_CONN_LOCALE,
+                       gettext_noop("Server (database) character set encoding"),
+                       NULL,
+                       GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
                &server_encoding_string,
                "SQL_ASCII", NULL, NULL
        },
 
-       /* Can't be set in postgresql.conf */
        {
-               {"server_version", PGC_INTERNAL, GUC_REPORT},
+               /* Can't be set in postgresql.conf */
+               {"server_version", PGC_INTERNAL, UNGROUPED,
+                       gettext_noop("Server version"),
+                       NULL,
+                       GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
                &server_version_string,
                PG_VERSION, NULL, NULL
        },
 
-       /* Not for general use --- used by SET SESSION AUTHORIZATION */
        {
-               {"session_authorization", PGC_USERSET, GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL},
+               /* Not for general use --- used by SET SESSION AUTHORIZATION */
+               {"session_authorization", PGC_USERSET, UNGROUPED,
+                       gettext_noop("Current session userid"),
+                       NULL,
+                       GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
                &session_authorization_string,
                NULL, assign_session_authorization, show_session_authorization
        },
 
 #ifdef HAVE_SYSLOG
        {
-               {"syslog_facility", PGC_POSTMASTER}, &Syslog_facility,
+               {"syslog_facility", PGC_POSTMASTER, LOGGING_SYSLOG,
+                       gettext_noop("Which syslog 'facility' to be used when syslog enabled"),
+                       gettext_noop("You may choose from LOCAL0, LOCAL1, LOCAL2, LOCAL3, "
+                                                "LOCAL4, LOCAL5, LOCAL6, LOCAL7")
+               },
+               &Syslog_facility,
                "LOCAL0", assign_facility, NULL
        },
        {
-               {"syslog_ident", PGC_POSTMASTER}, &Syslog_ident,
+               {"syslog_ident", PGC_POSTMASTER, LOGGING_SYSLOG,
+                       gettext_noop("Program name used to identify PostgreSQL messages "
+                                                "in syslog"),
+                       NULL
+               },
+               &Syslog_ident,
                "postgres", NULL, NULL
        },
 #endif
 
        {
-               {"TimeZone", PGC_USERSET}, &timezone_string,
+               {"TimeZone", PGC_USERSET, CLIENT_CONN_LOCALE,
+                       gettext_noop("Time zone for displaying and interpreting time stamps"),
+                       NULL
+               },
+               &timezone_string,
                "UNKNOWN", assign_timezone, show_timezone
        },
 
        {
-               {"transaction_isolation", PGC_USERSET, GUC_NO_RESET_ALL},
+               {"transaction_isolation", PGC_USERSET, CLIENT_CONN_STATEMENT,
+                       gettext_noop("Current transaction's isolation level"),
+                       NULL,
+                       GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+               },
                &XactIsoLevel_string,
                NULL, assign_XactIsoLevel, show_XactIsoLevel
        },
 
        {
-               {"unix_socket_group", PGC_POSTMASTER}, &Unix_socket_group,
+               {"unix_socket_group", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+                       gettext_noop("The group owner of the Unix domain socket"),
+                       gettext_noop("(The owning user of the socket is always the user "
+                                                "that starts the server.)")
+               },
+               &Unix_socket_group,
                "", NULL, NULL
        },
 
        {
-               {"unix_socket_directory", PGC_POSTMASTER}, &UnixSocketDir,
+               {"unix_socket_directory", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+                       gettext_noop("The Unix-domain socket directory to listen to"),
+                       NULL
+               },
+               &UnixSocketDir,
                "", NULL, NULL
        },
 
        {
-               {"virtual_host", PGC_POSTMASTER}, &VirtualHost,
+               {"virtual_host", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+                       gettext_noop("The host name or IP address to listen to"),
+                       NULL
+               },
+               &VirtualHost,
                "", NULL, NULL
        },
 
        {
-               {"wal_sync_method", PGC_SIGHUP}, &XLOG_sync_method,
+               {"wal_sync_method", PGC_SIGHUP, WAL_SETTINGS,
+                       gettext_noop("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}, NULL, NULL, NULL, NULL
+               {NULL, 0, 0, NULL, NULL}, NULL, NULL, NULL, NULL
        }
 };
 
@@ -983,8 +1508,8 @@ static struct config_string
 /*
  * Actual lookup of variables is done through this single, sorted array.
  */
-static struct config_generic **guc_variables;
-static int     num_guc_variables;
+struct config_generic **guc_variables;
+int                    num_guc_variables;
 
 static bool guc_dirty;                 /* TRUE if need to do commit/abort work */
 
@@ -994,7 +1519,7 @@ static char *guc_string_workspace;         /* for avoiding memory leaks */
 
 
 static int     guc_var_compare(const void *a, const void *b);
-static void ReportGUCOption(struct config_generic *record);
+static void ReportGUCOption(struct config_generic * record);
 static char *_ShowOption(struct config_generic * record);
 
 
@@ -1003,7 +1528,7 @@ static char *_ShowOption(struct config_generic * record);
  * re-executed after startup (eg, we could allow loadable modules to
  * add vars, and then we'd need to re-sort).
  */
-static void
+void
 build_guc_variables(void)
 {
        int                     num_vars = 0;
@@ -1437,7 +1962,7 @@ AtEOXact_GUC(bool isCommit)
        for (i = 0; i < num_guc_variables; i++)
        {
                struct config_generic *gconf = guc_variables[i];
-               bool    changed;
+               bool            changed;
 
                /* Skip if nothing's happened to this var in this transaction */
                if (gconf->status == 0)
@@ -1601,11 +2126,11 @@ BeginReportingGUCOptions(void)
  * ReportGUCOption: if appropriate, transmit option value to frontend
  */
 static void
-ReportGUCOption(struct config_generic *record)
+ReportGUCOption(struct config_generic * record)
 {
        if (reporting_enabled && (record->flags & GUC_REPORT))
        {
-               char    *val = _ShowOption(record);
+               char       *val = _ShowOption(record);
                StringInfoData msgbuf;
 
                pq_beginmessage(&msgbuf, 'S');
@@ -2211,7 +2736,7 @@ set_config_option(const char *name, const char *value,
        }
 
        if (DoIt && (record->flags & GUC_REPORT))
-                       ReportGUCOption(record);
+               ReportGUCOption(record);
 
        return true;
 }
@@ -2890,10 +3415,11 @@ _ShowOption(struct config_generic * record)
 void
 write_nondefault_variables(GucContext context)
 {
-       int i;
-       char *new_filename, *filename;
-       int elevel;
-       FILE *fp;
+       int                     i;
+       char       *new_filename,
+                          *filename;
+       int                     elevel;
+       FILE       *fp;
 
        Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
        Assert(DataDir);
@@ -2903,7 +3429,7 @@ write_nondefault_variables(GucContext context)
         * Open file
         */
        new_filename = malloc(strlen(DataDir) + strlen(CONFIG_EXEC_PARAMS) +
-                                                       strlen(".new") + 2);
+                                                 strlen(".new") + 2);
        filename = malloc(strlen(DataDir) + strlen(CONFIG_EXEC_PARAMS) + 2);
        if (new_filename == NULL || filename == NULL)
        {
@@ -2913,13 +3439,13 @@ write_nondefault_variables(GucContext context)
        sprintf(new_filename, "%s/" CONFIG_EXEC_PARAMS ".new", DataDir);
        sprintf(filename, "%s/" CONFIG_EXEC_PARAMS, DataDir);
 
-    fp = AllocateFile(new_filename, "w");
-    if (!fp)
-    {
-               free(new_filename);
+       fp = AllocateFile(new_filename, "w");
+       if (!fp)
+       {
+               free(new_filename);
                free(filename);
                elog(elevel, "could not write exec config params file `"
-                                       CONFIG_EXEC_PARAMS "': %s", strerror(errno));
+                        CONFIG_EXEC_PARAMS "': %s", strerror(errno));
                return;
        }
 
@@ -2994,8 +3520,10 @@ write_nondefault_variables(GucContext context)
 static char *
 read_string_with_null(FILE *fp)
 {
-       int i = 0, ch, maxlen = 256;
-       char *str = NULL;
+       int                     i = 0,
+                               ch,
+                               maxlen = 256;
+       char       *str = NULL;
 
        do
        {
@@ -3024,10 +3552,11 @@ read_string_with_null(FILE *fp)
 void
 read_nondefault_variables(void)
 {
-       char *filename;
-       FILE *fp;
-       char *varname, *varvalue;
-       int varsource;
+       char       *filename;
+       FILE       *fp;
+       char       *varname,
+                          *varvalue;
+       int                     varsource;
 
        Assert(DataDir);
 
@@ -3042,29 +3571,29 @@ read_nondefault_variables(void)
        }
        sprintf(filename, "%s/" CONFIG_EXEC_PARAMS, DataDir);
 
-    fp = AllocateFile(filename, "r");
-    if (!fp)
-    {
+       fp = AllocateFile(filename, "r");
+       if (!fp)
+       {
                free(filename);
-        /* File not found is fine */
-        if (errno != ENOENT)
-            elog(FATAL, "could not read exec config params file `"
-                                       CONFIG_EXEC_PARAMS "': %s", strerror(errno));
+               /* File not found is fine */
+               if (errno != ENOENT)
+                       elog(FATAL, "could not read exec config params file `"
+                                CONFIG_EXEC_PARAMS "': %s", strerror(errno));
                return;
-    }
+       }
 
-    while (1)
+       while (1)
        {
                if ((varname = read_string_with_null(fp)) == NULL)
                        break;
 
                if ((varvalue = read_string_with_null(fp)) == NULL)
                        elog(FATAL, "Invalid format of exec config params file");
-               if (fread(&varsource, sizeof(varsource), 1, fp) == 0)
+               if (fread(&varsource, sizeof(varsource), 1, fp) == 0)
                        elog(FATAL, "Invalid format of exec config params file");
 
                (void) set_config_option(varname, varvalue, PGC_POSTMASTER,
-                               varsource, false, true);
+                                                                varsource, false, true);
                free(varname);
                free(varvalue);
        }
@@ -3384,7 +3913,7 @@ assign_defaultxactisolevel(const char *newval, bool doit, bool interactive)
 
 static const char *
 assign_log_min_messages(const char *newval,
-                                                  bool doit, bool interactive)
+                                               bool doit, bool interactive)
 {
        return (assign_msglvl(&log_min_messages, newval, doit, interactive));
 }
@@ -3513,4 +4042,3 @@ assign_phony_autocommit(bool newval, bool doit, bool interactive)
 
 
 #include "guc-file.c"
-
diff --git a/src/backend/utils/misc/help_config.c b/src/backend/utils/misc/help_config.c
new file mode 100644 (file)
index 0000000..0ea1fbd
--- /dev/null
@@ -0,0 +1,461 @@
+/*-------------------------------------------------------------------------
+ * help_config.c
+ *
+ * Displays available options under grand unified configuration scheme
+ *
+ * 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
+ *     -l                      : lists all currently defined groups and terminates
+ *     -G                      : no sort by groups (you get strict name order, instead)
+ *     -m                      : output the list in Machine friendly format, with a header row
+ *     -M                      : same as m, except no header
+ *     -h                      : help
+ *
+ * Options whose flag bits are set to GUC_NO_SHOW_ALL, GUC_NOT_IN_SAMPLE,
+ * or GUC_DISALLOW_IN_FILE are not displayed, unless the user specifically
+ * requests that variable by name
+ *
+ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ *       $Header: /cvsroot/pgsql/src/backend/utils/misc/help_config.c,v 1.1 2003/07/04 16:41:21 tgl Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#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_tables.h"
+#include "utils/help_config.h"
+
+extern int     optind;
+extern char *optarg;
+
+
+/*
+ * The following char constructs provide the different formats the variables
+ * can be outputted in.
+ */
+enum outputFormat
+{
+       HUMAN_OUTPUT,
+       MACHINE_OUTPUT
+};
+
+static const char * const GENERIC_FORMAT[] = {
+       gettext_noop("Name       : %-20s \nContext    : %-20s \nGroup      : %-20s\n"),
+       gettext_noop("%s\t%s\t%s\t")
+};
+static const char * const GENERIC_DESC[] = {
+       gettext_noop("Description: %s\n%s\n"),
+       gettext_noop("%s        %s\n")
+};
+static const char * const BOOL_FORMAT[] = {
+       gettext_noop("Type       : BOOL\nReset Value: %-s \n"),
+       gettext_noop("BOOL\t%s\t\t\t")
+};
+static const char * const INT_FORMAT[] = {
+       gettext_noop("Type       : INT\nReset Value: %-20d \nMin Value  : %-20d \nMax Value  : %-20d \n"),
+       gettext_noop("INT\t%d\t%d\t%d\t")
+};
+static const char * const REAL_FORMAT[] = {
+       gettext_noop("Type       : REAL\nReset Value: %-20g \nMin Value  : %-20g \nMax Value  : %-20g \n"),
+       gettext_noop("REAL\t%g\t%g\t%g\t")
+};
+static const char * const STRING_FORMAT[] = {
+       gettext_noop("Type       : STRING\nReset Value: %-s \n"),
+       gettext_noop("STRING\t%s\t\t\t")
+};
+static const char * const COLUMN_HEADER[] = {
+       "",
+       gettext_noop("NAME\tCONTEXT\tGROUP\tTYPE\tRESET_VALUE\tMIN\tMAX\tSHORT_DESCRIPTION\tLONG_DESCRIPTION\n")
+};
+static const char * const ROW_SEPARATOR[] = {
+       "------------------------------------------------------------\n",
+       ""
+};
+
+/*
+ * Variables loaded from the command line
+ */
+static char *nameString = NULL; /* The var name pattern to match */
+static bool nameRegexBool = false;             /* Match the name pattern as a
+                                                                                * regex */
+static char *groupString = NULL;       /* The var group pattern to match */
+static bool groupRegexBool = false;            /* Match the group pattern as a
+                                                                                * regex */
+static enum outputFormat outFormat = HUMAN_OUTPUT;
+static bool suppressAllHeaders = false; /* MACHINE_OUTPUT output, no column
+                                                                                * headers */
+static bool groupResults = true;       /* sort result list by groups */
+
+
+/*
+ * This union allows us to mix the numerous different types of structs
+ * that we are organizing.
+ */
+typedef union
+{
+       struct config_generic generic;
+       struct config_bool bool;
+       struct config_real real;
+       struct config_int integer;
+       struct config_string string;
+}      mixedStruct;
+
+
+/* function prototypes */
+static bool varMatches(mixedStruct * structToTest);
+static int     compareMixedStructs(const void *, const void *);
+static mixedStruct **varsToDisplay(int *resultListSize);
+static const char *usageErrMsg(void);
+static void helpMessage(void);
+static void listAllGroups(void);
+static void printGenericHead(struct config_generic structToPrint);
+static void printGenericFoot(struct config_generic structToPrint);
+static void printMixedStruct(mixedStruct * structToPrint);
+static bool displayStruct(mixedStruct * structToDisplay);
+
+/*
+ * This array contains the display names for each of the GucContexts available
+ *
+ * Note: these strings are deliberately not localized.
+ */
+static const char *const GucContext_names[] = {
+       "INTERNAL",
+       "POSTMASTER",
+       "SIGHUP",
+       "BACKEND",
+       "SUSET",
+       "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[])
+{
+       mixedStruct **varList;
+       int                     resultListSize;
+       int                     c;
+       int                     i;
+
+       while ((c = getopt(argc, argv, "g:rGmMlh")) != -1)
+       {
+               switch (c)
+               {
+                       case 'g':
+                               groupString = optarg;
+                               break;
+                       case 'r':                       /* not actually implemented yet */
+                               nameRegexBool = true;
+                               break;
+                       case 'G':
+                               groupResults = false;
+                               break;
+                       case 'm':
+                               outFormat = MACHINE_OUTPUT;
+                               break;
+                       case 'M':
+                               outFormat = MACHINE_OUTPUT;
+                               suppressAllHeaders = true;
+                               break;
+                       case 'l':
+                               listAllGroups();
+                               exit(0);
+                       case 'h':
+                               helpMessage();
+                               exit(0);
+
+                       default:
+                               fprintf(stderr, gettext("%s \n Try -h for further details\n"), usageErrMsg());
+                               exit(1);
+               }
+       }
+
+       if (optind < argc)
+               nameString = argv[optind];
+
+       /* get the list of variables that match the user's specs. */
+       varList = varsToDisplay(&resultListSize);
+
+       /* sort them by group if desired */
+       /* (without this, we get the original sort by name from guc.c) */
+       if (groupResults)
+               qsort(varList, resultListSize,
+                         sizeof(mixedStruct *), compareMixedStructs);
+
+       /* output the results */
+       if (!suppressAllHeaders)
+               printf(gettext(COLUMN_HEADER[outFormat]));
+
+       for (i = 0; varList[i] != NULL; i++)
+       {
+               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;
+
+       if (structVar1->generic.group > structVar2->generic.group)
+               return 1;
+       else if (structVar1->generic.group < structVar2->generic.group)
+               return -1;
+       else
+               return strcmp(structVar1->generic.name, structVar2->generic.name);
+}
+
+
+/*
+ * This function returns a complete list of all the variables to display,
+ * according to what the user wants to see.
+ */
+static mixedStruct **
+varsToDisplay(int *resultListSize)
+{
+       mixedStruct **resultList;
+       int                     arrayIndex;
+       int                     i;
+
+       /* Initialize the guc_variables[] array */
+       build_guc_variables();
+
+       /* Extract just the ones we want to display */
+       resultList = malloc((num_guc_variables + 1) * sizeof(mixedStruct *));
+       arrayIndex = 0;
+
+       for (i = 0; i < num_guc_variables; i++)
+       {
+               mixedStruct *var = (mixedStruct *) guc_variables[i];
+
+               if (varMatches(var))
+                       resultList[arrayIndex++] = var;
+       }
+
+       /* add an end marker */
+       resultList[arrayIndex] = NULL;
+
+       *resultListSize = arrayIndex;
+       return resultList;
+}
+
+
+/*
+ * This function will return true if the struct passed to it
+ * should 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 GUC_NOT_IN_SAMPLE
+ *     + It's flag bits are set to GUC_DISALLOW_IN_FILE
+ */
+static bool
+displayStruct(mixedStruct * structToDisplay)
+{
+       if (structToDisplay->generic.flags & (GUC_NO_SHOW_ALL |
+                                                                                 GUC_NOT_IN_SAMPLE |
+                                                                                 GUC_DISALLOW_IN_FILE))
+               return false;
+       else
+               return true;
+}
+
+
+/*
+ * 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 void
+printMixedStruct(mixedStruct * structToPrint)
+{
+       printGenericHead(structToPrint->generic);
+
+       switch (structToPrint->generic.vartype)
+       {
+
+               case PGC_BOOL:
+                       printf(gettext(BOOL_FORMAT[outFormat]),
+                                  (structToPrint->bool.reset_val == 0) ?
+                                  gettext("FALSE") : gettext("TRUE"));
+                       break;
+
+               case PGC_INT:
+                       printf(gettext(INT_FORMAT[outFormat]),
+                                  structToPrint->integer.reset_val,
+                                  structToPrint->integer.min,
+                                  structToPrint->integer.max);
+                       break;
+
+               case PGC_REAL:
+                       printf(gettext(REAL_FORMAT[outFormat]),
+                                  structToPrint->real.reset_val,
+                                  structToPrint->real.min,
+                                  structToPrint->real.max);
+                       break;
+
+               case PGC_STRING:
+                       printf(gettext(STRING_FORMAT[outFormat]),
+                                  structToPrint->string.boot_val);
+                       break;
+
+               default:
+                       printf(gettext("Unrecognized variable type!\n"));
+                       break;
+       }
+
+       printGenericFoot(structToPrint->generic);
+}
+
+static void
+printGenericHead(struct config_generic structToPrint)
+{
+       printf(gettext(GENERIC_FORMAT[outFormat]),
+                  structToPrint.name,
+                  GucContext_names[structToPrint.context],
+                  gettext(config_group_names[structToPrint.group]));
+}
+
+static void
+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));
+}
+
+static void
+listAllGroups(void)
+{
+       int                     i;
+
+       printf(gettext("All currently defined groups\n"));
+       printf(gettext("----------------------------\n"));
+       for (i = 0; config_group_names[i] != NULL; i++)
+               printf(gettext("%s\n"), gettext(config_group_names[i]));
+}
+
+static const char *
+usageErrMsg(void)
+{
+       return gettext("Usage for --help-config option: [-h] [-g <group>] [-l] [-G] [-m] [-M] [string]\n");
+}
+
+static void
+helpMessage(void)
+{
+       printf(gettext("Description:\n"
+                                  "--help-config displays all the runtime options available in 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"
+
+                                  "%s\n"
+
+                                  "General Options:\n"
+                       "  [string]     All options with names that match this string\n"
+                          "  -g GROUP  All options in categories that match GROUP\n"
+                                  "  -l        Prints list of all groups / subgroups\n"
+                                  "  -h        Prints this help message\n"
+                                  "\nOutput Options:\n"
+                                  "  -G        Do not group by category\n"
+                       "  -m           Machine friendly format: tab separated fields\n"
+                                  "  -M        Same as m, except header with column names is suppressed\n"),
+                  usageErrMsg()
+       );
+}
index 57c6e55cb22d35f1bf9ef09101c6ba933d2073a5..7333210692700548f3b80092bccef9944de93d74 100644 (file)
 #
 #      Connection Parameters
 #
-#tcpip_socket = false
-#ssl = false
 
+# CONNECTIONS AND AUTHENTICATION
+# ----------------------------------
+# Connection Settings
+
+#tcpip_socket = false
 #max_connections = 32
+       # note: increasing max_connections costs about 500 bytes of shared
+       # memory per connection slot, in addition to costs from shared_buffers
+        # and max_locks_per_transaction.
 #superuser_reserved_connections = 2
-
-#port = 5432 
-
+#port = 5432
 #unix_socket_directory = ''
 #unix_socket_group = ''
 #unix_socket_permissions = 0777        # octal
-
 #virtual_host = ''
 
+# Security & Authentication
+
+#authentication_timeout = 60   # 1-600, in seconds
+#ssl = false
+#password_encryption = true
 #krb_server_keyfile = ''
+#db_user_namespace = false
 
 
-#
-#      Shared Memory Size
-#
+# RESOURCE USAGE (except WAL)
+# ---------------------------------
+# Memory
+
 #shared_buffers = 64           # min 16, at least max_connections*2, 8KB each
-#max_locks_per_transaction = 64        # min 10, ~260*max_connections bytes each
-#wal_buffers = 8               # min 4, 8KB each
-# fsm = free space map
-#max_fsm_relations = 1000      # min 100, ~50 bytes each
+#sort_mem = 1024               # min 64, size in KB
+#vacuum_mem = 8192             # min 1024, size in KB
+
+# Free Space Map
+
 #max_fsm_pages = 20000         # min max_fsm_relations*16, 6 bytes each
-# note: increasing max_connections also costs about 500 bytes each,
-# in addition to costs from shared_buffers and max_locks_per_transaction.
+#max_fsm_relations = 1000      # min 100, ~50 bytes each
 
+# Kernel Resource Usage
 
-#
-#      Non-shared Memory Sizes
-#
-#sort_mem = 1024               # min 64, size in KB
-#vacuum_mem = 8192             # min 1024, size in KB
+#max_files_per_process = 1000  # min 25
+#preload_libraries = ''
 
 
-#
-#      Write-ahead log (WAL)
-#
+# WRITE AHEAD LOG
+# ---------------------------------
+# Settings
+
+#fsync = true                  # turns forced synchronization on or off
+#wal_sync_method = fsync       # the default varies across platforms:
+                               # fsync, fdatasync, open_sync, or open_datasync
+#wal_buffers = 8               # min 4, 8KB each
+
+# Checkpoints
+
 #checkpoint_segments = 3       # in logfile segments, min 1, 16MB each
 #checkpoint_timeout = 300      # range 30-3600, in seconds
 #checkpoint_warning = 30       # 0 is off, in seconds
-#
 #commit_delay = 0              # range 0-100000, in microseconds
 #commit_siblings = 5           # range 1-1000
-#
-#fsync = true
-#wal_sync_method = fsync       # the default varies across platforms:
-#                              # fsync, fdatasync, open_sync, or open_datasync
-#wal_debug = 0                 # range 0-16
 
 
-#
-#      Optimizer Parameters
-#
-#enable_seqscan = true
-#enable_indexscan = true
-#enable_tidscan = true
-#enable_sort = true
+# QUERY TUNING
+# --------------------------------
+# Planner Method Enabling
+
 #enable_hashagg = true
-#enable_nestloop = true
-#enable_mergejoin = true
 #enable_hashjoin = true
+#enable_indexscan = true
+#enable_mergejoin = true
+#enable_nestloop = true
+#enable_seqscan = true
+#enable_sort = true
+#enable_tidscan = true
+
+# Planner Cost Constants
 
 #effective_cache_size = 1000   # typically 8KB each
 #random_page_cost = 4          # units are one sequential page fetch cost
 #cpu_index_tuple_cost = 0.001  # (same)
 #cpu_operator_cost = 0.0025    # (same)
 
-#from_collapse_limit = 8
-#join_collapse_limit = 8       # 1 disables collapsing of explicit JOINs
-
-#default_statistics_target = 10        # range 1-1000
+# Genetic Query Optimizer
 
-#
-#      GEQO Optimizer Parameters
-#
 #geqo = true
-#geqo_selection_bias = 2.0     # range 1.5-2.0
 #geqo_threshold = 11
-#geqo_pool_size = 0            # default based on tables in statement, 
-                               # range 128-1024
 #geqo_effort = 1
 #geqo_generations = 0
-#geqo_random_seed = -1         # auto-compute seed
+#geqo_pool_size = 0            # default based on tables in statement,
+                               # range 128-1024
+#geqo_random_seed = -1         # -1 = use variable seed
+#geqo_selection_bias = 2.0     # range 1.5-2.0
 
+# Other Planner Options
+
+#default_statistics_target = 10        # range 1-1000
+#from_collapse_limit = 8
+#join_collapse_limit = 8       # 1 disables collapsing of explicit JOINs
+
+
+# ERROR REPORTING AND LOGGING
+# ------------------------------------
+# Syslog
+
+#syslog = 0                    # range 0-2
+#syslog_facility = 'LOCAL0'
+#syslog_ident = 'postgres'
+
+# When to Log
 
-#
-#      Message display
-#
 #client_min_messages = notice  # Values, in order of decreasing detail:
                                #   debug5, debug4, debug3, debug2, debug1,
                                #   log, info, notice, warning, error
+
 #log_min_messages = notice     # Values, in order of decreasing detail:
                                #   debug5, debug4, debug3, debug2, debug1,
                                #   info, notice, warning, error, log, fatal,
                                #   panic
 
-#log_error_verbosity = default # terse, default, or verbose messages
-
-#silent_mode = false
-
-#log_connections = false
-#log_hostname = false
-#log_source_port = false
-#log_pid = false
-#log_statement = false
-#log_duration = false
-#log_timestamp = false
+#log_error_verbosity = default   # terse, default, or verbose messages
 
 #log_min_error_statement = panic # Values in order of increasing severity:
                                 #   debug5, debug4, debug3, debug2, debug1,
                                 #   info, notice, warning, error, panic(off)
-
+                                
 #log_min_duration_statement = 0  # Log all statements whose
                                 # execution time exceeds the value, in
                                 # milliseconds.  Zero disables.
 
+#silent_mode = false            # DO NOT USE without Syslog!
+
+# What to Log
+
 #debug_print_parse = false
 #debug_print_rewritten = false
 #debug_print_plan = false
 #debug_pretty_print = false
+#log_connections = false
+#log_duration = false
+#log_pid = false
+#log_statement = false
+#log_timestamp = false
+#log_hostname = false
+#log_source_port = false
 
-#explain_pretty_print = true
-
-# requires USE_ASSERT_CHECKING
-#debug_assertions = true
-
-
-#
-#      Syslog
-#
-#syslog = 0                    # range 0-2
-#syslog_facility = 'LOCAL0'
-#syslog_ident = 'postgres'
-
+# RUNTIME STATISTICS
+# -------------------------------------
+# Statistics Monitoring
 
-#
-#      Statistics
-#
 #log_parser_stats = false
 #log_planner_stats = false
 #log_executor_stats = false
 #log_statement_stats = false
 
-# requires BTREE_BUILD_STATS
-#log_btree_build_stats = false
-
+# Query/Index Statistics Collector
 
-#
-#      Access statistics collection
-#
 #stats_start_collector = true
-#stats_reset_on_server_start = true
 #stats_command_string = false
-#stats_row_level = false
 #stats_block_level = false
+#stats_row_level = false
+#stats_reset_on_server_start = true
 
 
-#
-#      Misc
-#
-#dynamic_library_path = '$libdir'
+# CLIENT CONNECTION DEFAULTS
+# -------------------------------------
+# Statement Behavior
+
 #search_path = '$user,public'  # schema names
+#default_transaction_isolation = 'read committed'
+#default_transaction_read_only = false
+#statement_timeout = 0         # 0 is disabled, in milliseconds
+
+# Locale and Formatting
+
 #datestyle = 'iso, us'
 #timezone = unknown            # actually, defaults to TZ environment setting
 #australian_timezones = false
-#client_encoding = sql_ascii   # actually, defaults to database encoding
-#authentication_timeout = 60   # 1-600, in seconds
-#deadlock_timeout = 1000       # in milliseconds
-#default_transaction_isolation = 'read committed'
-#default_transaction_read_only = false
 #extra_float_digits = 0                # min -15, max 2
+#client_encoding = sql_ascii   # actually, defaults to database encoding
+
+# These settings are initialized by initdb -- they may be changed
+
+# Other Defaults
+
+#explain_pretty_print = true
+#dynamic_library_path = '$libdir'
 #max_expr_depth = 10000                # min 10
-#max_files_per_process = 1000  # min 25
-#password_encryption = true
+
+# LOCK MANAGEMENT
+# -----------------------------------------
+
+#deadlock_timeout = 1000       # in milliseconds
+#max_locks_per_transaction = 64        # min 10, ~260*max_connections bytes each
+
+
+# VERSION/PLATFORM COMPATIBILITY
+# -----------------------------------------
+# Previous Postgres Versions
+
+#add_missing_from = true
 #regex_flavor = advanced       # advanced, extended, or basic
 #sql_inheritance = true
+
+# Other Platforms & Clients
+
 #transform_null_equals = false
-#statement_timeout = 0         # 0 is disabled, in milliseconds
-#db_user_namespace = false
-#preload_libraries = ''
-#add_missing_from = true
index 0202a7c72b26152b49e85fe743601bb5ed10f3f6..08fe399bfc578791d2eed42a011300353c90cdde 100644 (file)
@@ -27,7 +27,7 @@
 # Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
 # Portions Copyright (c) 1994, Regents of the University of California
 #
-# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.192 2003/06/02 19:00:29 tgl Exp $
+# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.193 2003/07/04 16:41:21 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -586,16 +586,12 @@ $ECHO_N "creating configuration files... "$ECHO_C
 cp "$PG_HBA_SAMPLE" "$PGDATA"/pg_hba.conf              || exit_nicely
 cp "$PG_IDENT_SAMPLE" "$PGDATA"/pg_ident.conf          || exit_nicely
 (
-  cat "$POSTGRESQL_CONF_SAMPLE"
-  echo
-  echo
-  echo "#"
-  echo "#      Locale settings"
-  echo "#"
-  echo "# (initialized by initdb -- may be changed)"
+  trigger="# These settings are initialized by initdb -- they may be changed"
+  sed -n "1,/$trigger/p" "$POSTGRESQL_CONF_SAMPLE"
   for cat in MESSAGES MONETARY NUMERIC TIME; do
     echo "LC_$cat = '`pg_getlocale $cat`'"
   done
+  sed -n "1,/$trigger/!p" "$POSTGRESQL_CONF_SAMPLE"
 ) > "$PGDATA"/postgresql.conf || exit_nicely
 
 chmod 0600 "$PGDATA"/pg_hba.conf "$PGDATA"/pg_ident.conf \
diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h
new file mode 100644 (file)
index 0000000..e8ccfee
--- /dev/null
@@ -0,0 +1,178 @@
+/*-------------------------------------------------------------------------
+ *
+ * guc_tables.h
+ *             Declarations of tables used by GUC.
+ *
+ * See src/backend/utils/misc/README for design notes.
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ *
+ *       $Id: guc_tables.h,v 1.1 2003/07/04 16:41:22 tgl Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef GUC_TABLES
+#define GUC_TABLES 1
+
+/*
+ * Groupings to help organize all the run-time options for display.
+ *
+ * Keep this in sync with config_group_names[] in guc.c.
+ */
+enum config_group
+{
+       UNGROUPED,
+       CONN_AUTH,
+       CONN_AUTH_SETTINGS,
+       CONN_AUTH_SECURITY,
+       RESOURCES,
+       RESOURCES_MEM,
+       RESOURCES_FSM,
+       RESOURCES_KERNEL,
+       WAL,
+       WAL_SETTINGS,
+       WAL_CHECKPOINTS,
+       QUERY_TUNING,
+       QUERY_TUNING_METHOD,
+       QUERY_TUNING_COST,
+       QUERY_TUNING_GEQO,
+       QUERY_TUNING_OTHER,
+       LOGGING,
+       LOGGING_SYSLOG,
+       LOGGING_WHEN,
+       LOGGING_WHAT,
+       STATS,
+       STATS_MONITORING,
+       STATS_COLLECTOR,
+       CLIENT_CONN,
+       CLIENT_CONN_STATEMENT,
+       CLIENT_CONN_LOCALE,
+       CLIENT_CONN_OTHER,
+       LOCK_MANAGEMENT,
+       COMPAT_OPTIONS,
+       COMPAT_OPTIONS_PREVIOUS,
+       COMPAT_OPTIONS_CLIENT,
+       DEVELOPER_OPTIONS
+};
+
+
+/*
+ * GUC supports these types of variables:
+ */
+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 
+ * it 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 GUC_NOT_IN_SAMPLE              0x0020  /* not in postgresql.conf.sample */
+#define GUC_DISALLOW_IN_FILE   0x0040  /* can't set in postgresql.conf */ 
+
+/* bit values in status field */
+#define GUC_HAVE_TENTATIVE     0x0001          /* tentative value is defined */
+#define GUC_HAVE_LOCAL         0x0002          /* a SET LOCAL has been executed */
+
+
+/* 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 const char * const config_group_names[];
+extern struct config_generic **guc_variables;
+extern int     num_guc_variables;
+
+extern void build_guc_variables(void);
+
+#endif
diff --git a/src/include/utils/help_config.h b/src/include/utils/help_config.h
new file mode 100644 (file)
index 0000000..45645f0
--- /dev/null
@@ -0,0 +1,17 @@
+/*-------------------------------------------------------------------------
+ *
+ * help_config.h
+ *             Interface to the --help-config option of main.c 
+ * 
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ *
+ *       $Id: help_config.h,v 1.1 2003/07/04 16:41:22 tgl Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef HELP_CONFIG_H
+#define HELP_CONFIG_H 1
+
+extern int     GucInfoMain(int argc, char *argv[]);
+
+#endif