diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index 3f6a2b350db9df0735dd822ebf7e12b71fbd6688..dd950c78dc90ff4a9083a62b22b9e9be559607e0 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -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>
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index c86b45b132f75b46ca23973f639f7820bb860a71..e03633a3261762499f9c62c89f7d75dbb2bf4117 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -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
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 3ac145860b4d7d31c42d3521cf3bcaaf23fff505..c3480d803cf7d8a0f837d68f2923d566fbfc8474 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -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");
 	}
 
 	/*
diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
index 1f440a19e16f89a46710f66043bc1852f3a05f33..5078e1c850e3ba48f70d9c607dad7a6967425b13 100644
--- a/src/backend/utils/misc/Makefile
+++ b/src/backend/utils/misc/Makefile
@@ -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.
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 6e0da5bbaabecf62bf975dfcea676d0b9bdc6d12..fc626169ec0e513f4675ab15686baee3de051b29 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,11 +10,10 @@
  * 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
index 0000000000000000000000000000000000000000..0ea1fbd99d698546a32f6034575da3eb55d8baf9
--- /dev/null
+++ b/src/backend/utils/misc/help_config.c
@@ -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()
+	);
+}
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 57c6e55cb22d35f1bf9ef09101c6ba933d2073a5..7333210692700548f3b80092bccef9944de93d74 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -27,70 +27,83 @@
 #
 #	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
@@ -98,117 +111,127 @@
 #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
diff --git a/src/bin/initdb/initdb.sh b/src/bin/initdb/initdb.sh
index 0202a7c72b26152b49e85fe743601bb5ed10f3f6..08fe399bfc578791d2eed42a011300353c90cdde 100644
--- a/src/bin/initdb/initdb.sh
+++ b/src/bin/initdb/initdb.sh
@@ -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
index 0000000000000000000000000000000000000000..e8ccfeefd00fd7d59ae76cb6dd0ddd7868a984d6
--- /dev/null
+++ b/src/include/utils/guc_tables.h
@@ -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
index 0000000000000000000000000000000000000000..45645f0216b3db1b04b1996aec593517f6f815e0
--- /dev/null
+++ b/src/include/utils/help_config.h
@@ -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