Commit b700a672 authored by Tom Lane's avatar Tom Lane

Add --help-config facility to dump information about GUC parameters

without needing a running backend.  Reorder postgresql.conf.sample
to match new layout of runtime.sgml.  This commit re-adds work lost
in Wednesday's crash.
parent efbbd107
<!--
$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>
......
......@@ -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
......
......@@ -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");
}
/*
......
# $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.
......
......@@ -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"
/*-------------------------------------------------------------------------
* 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()
);
}
......@@ -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
......@@ -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 \
......
/*-------------------------------------------------------------------------
*
* 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
/*-------------------------------------------------------------------------
*
* 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment