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