<title>Preset Options</title>
<para>
- The following <quote>parameters</quote> are read-only, and are determined
- when <productname>PostgreSQL</productname> is compiled or when it is
- installed. As such, they have been excluded from the sample
+ The following <quote>parameters</quote> are read-only.
+ As such, they have been excluded from the sample
<filename>postgresql.conf</filename> file. These options report
various aspects of <productname>PostgreSQL</productname> behavior
that might be of interest to certain applications, particularly
administrative front-ends.
+ Most of them are determined when <productname>PostgreSQL</productname>
+ is compiled or when it is installed.
</para>
<variablelist>
</term>
<listitem>
<para>
- On Unix systems this parameter reports the permissions of the data
- directory defined by (<xref linkend="guc-data-directory"/>) at startup.
+ On Unix systems this parameter reports the permissions the data
+ directory (defined by <xref linkend="guc-data-directory"/>)
+ had at server startup.
(On Microsoft Windows this parameter will always display
- <literal>0700</literal>). See
+ <literal>0700</literal>.) See
<xref linkend="app-initdb-allow-group-access"/> for more information.
</para>
</listitem>
</listitem>
</varlistentry>
+ <varlistentry id="guc-in-hot-standby" xreflabel="in_hot_standby">
+ <term><varname>in_hot_standby</varname> (<type>boolean</type>)
+ <indexterm>
+ <primary><varname>in_hot_standby</varname> configuration parameter</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ Reports whether the server is currently in hot standby mode. When
+ this is <literal>on</literal>, all transactions are forced to be
+ read-only. Within a session, this can change only if the server is
+ promoted to be primary. See <xref linkend="hot-standby"/> for more
+ information.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry id="guc-lc-collate" xreflabel="lc_collate">
<term><varname>lc_collate</varname> (<type>string</type>)
<indexterm>
</para>
<para>
- Users will be able to tell whether their session is read-only by
- issuing <command>SHOW transaction_read_only</command>. In addition, a set of
+ Users can determine whether hot standby is currently active for their
+ session by issuing <command>SHOW in_hot_standby</command>.
+ (In server versions before 14, the <varname>in_hot_standby</varname>
+ parameter did not exist; a workable substitute method for older servers
+ is <command>SHOW transaction_read_only</command>.) In addition, a set of
functions (<xref linkend="functions-recovery-info-table"/>) allow users to
access information about the standby server. These allow you to write
programs that are aware of the current state of the database. These
<varname>server_encoding</varname>,
<varname>client_encoding</varname>,
<varname>application_name</varname>,
+ <varname>in_hot_standby</varname>,
<varname>is_superuser</varname>,
<varname>session_authorization</varname>,
<varname>DateStyle</varname>,
<varname>standard_conforming_strings</varname> was not reported by releases
before 8.1;
<varname>IntervalStyle</varname> was not reported by releases before 8.4;
- <varname>application_name</varname> was not reported by releases before 9.0.)
+ <varname>application_name</varname> was not reported by releases before
+ 9.0;
+ <varname>in_hot_standby</varname> was not reported by releases before
+ 14.)
Note that
<varname>server_version</varname>,
<varname>server_encoding</varname> and
<varname>server_encoding</varname>,
<varname>client_encoding</varname>,
<varname>application_name</varname>,
+ <varname>in_hot_standby</varname>,
<varname>is_superuser</varname>,
<varname>session_authorization</varname>,
<varname>DateStyle</varname>,
<varname>standard_conforming_strings</varname> was not reported by releases
before 8.1;
<varname>IntervalStyle</varname> was not reported by releases before 8.4;
- <varname>application_name</varname> was not reported by releases before 9.0.)
+ <varname>application_name</varname> was not reported by releases before
+ 9.0;
+ <varname>in_hot_standby</varname> was not reported by releases before
+ 14.)
Note that
<varname>server_version</varname>,
<varname>server_encoding</varname> and
## if an option is valid but shows up in only one file (guc.c but not
## postgresql.conf.sample), it should be listed here so that it
## can be ignored
-INTENTIONALLY_NOT_INCLUDED="debug_deadlocks \
+INTENTIONALLY_NOT_INCLUDED="debug_deadlocks in_hot_standby \
is_superuser lc_collate lc_ctype lc_messages lc_monetary lc_numeric lc_time \
pre_auth_delay role seed server_encoding server_version server_version_num \
session_authorization trace_lock_oidmin trace_lock_table trace_locks trace_lwlocks \
static const char *show_unix_socket_permissions(void);
static const char *show_log_file_mode(void);
static const char *show_data_directory_mode(void);
+static const char *show_in_hot_standby(void);
static bool check_backtrace_functions(char **newval, void **extra, GucSource source);
static void assign_backtrace_functions(const char *newval, void *extra);
static bool check_recovery_target_timeline(char **newval, void **extra, GucSource source);
static bool data_checksums;
static bool integer_datetimes;
static bool assert_enabled;
+static bool in_hot_standby;
static char *recovery_target_timeline_string;
static char *recovery_target_string;
static char *recovery_target_xid_string;
NULL, NULL, NULL
},
+ {
+ {"in_hot_standby", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows whether hot standby is currently active."),
+ NULL,
+ GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &in_hot_standby,
+ false,
+ NULL, NULL, show_in_hot_standby
+ },
+
{
{"allow_system_table_mods", PGC_SUSET, DEVELOPER_OPTIONS,
gettext_noop("Allows modifications of the structure of system tables."),
reporting_enabled = true;
+ /*
+ * Hack for in_hot_standby: initialize with the value we're about to send.
+ * (This could be out of date by the time we actually send it, in which
+ * case the next ReportChangedGUCOptions call will send a duplicate
+ * report.)
+ */
+ in_hot_standby = RecoveryInProgress();
+
/* Transmit initial values of interesting variables */
for (i = 0; i < num_guc_variables; i++)
{
if (!reporting_enabled)
return;
+ /*
+ * Since in_hot_standby isn't actually changed by normal GUC actions, we
+ * need a hack to check whether a new value needs to be reported to the
+ * client. For speed, we rely on the assumption that it can never
+ * transition from false to true.
+ */
+ if (in_hot_standby && !RecoveryInProgress())
+ {
+ struct config_generic *record;
+
+ record = find_option("in_hot_standby", false, ERROR);
+ Assert(record != NULL);
+ record->status |= GUC_NEEDS_REPORT;
+ report_needed = true;
+ in_hot_standby = false;
+ }
+
/* Quick exit if no values have been changed */
if (!report_needed)
return;
return buf;
}
+static const char *
+show_in_hot_standby(void)
+{
+ /*
+ * We display the actual state based on shared memory, so that this GUC
+ * reports up-to-date state if examined intra-query. The underlying
+ * variable in_hot_standby changes only when we transmit a new value to
+ * the client.
+ */
+ return RecoveryInProgress() ? "on" : "off";
+}
+
/*
* We split the input string, where commas separate function names
* and certain whitespace chars are ignored, into a \0-separated (and