Commit 9ba78fb0 authored by Fujii Masao's avatar Fujii Masao

Don't allow data_directory to be set in postgresql.auto.conf by ALTER SYSTEM.

data_directory could be set both in postgresql.conf and postgresql.auto.conf so far.
This could cause some problematic situations like circular definition. To avoid such
situations, this commit forbids a user to set data_directory in postgresql.auto.conf.

Backpatch this to 9.4 where ALTER SYSTEM command was introduced.

Amit Kapila, reviewed by Abhijit Menon-Sen, with minor adjustments by me.
parent df8b7bc9
...@@ -76,6 +76,16 @@ ALTER SYSTEM SET <replaceable class="PARAMETER">configuration_parameter</replace ...@@ -76,6 +76,16 @@ ALTER SYSTEM SET <replaceable class="PARAMETER">configuration_parameter</replace
</variablelist> </variablelist>
</refsect1> </refsect1>
<refsect1>
<title>Notes</title>
<para>
This command can't be used to set <xref linkend="guc-data-directory">
and any parameters (e.g., <link linkend="runtime-config-preset">preset options</>)
that are not allowed in <filename>postgresql.conf</>.
</para>
</refsect1>
<refsect1> <refsect1>
<title>Examples</title> <title>Examples</title>
......
...@@ -3095,10 +3095,14 @@ static struct config_string ConfigureNamesString[] = ...@@ -3095,10 +3095,14 @@ static struct config_string ConfigureNamesString[] =
}, },
{ {
/*
* Can't be set by ALTER SYSTEM as it can lead to recursive definition
* of data_directory.
*/
{"data_directory", PGC_POSTMASTER, FILE_LOCATIONS, {"data_directory", PGC_POSTMASTER, FILE_LOCATIONS,
gettext_noop("Sets the server's data directory."), gettext_noop("Sets the server's data directory."),
NULL, NULL,
GUC_SUPERUSER_ONLY GUC_SUPERUSER_ONLY | GUC_DISALLOW_IN_AUTO_FILE
}, },
&data_directory, &data_directory,
NULL, NULL,
...@@ -6735,12 +6739,17 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) ...@@ -6735,12 +6739,17 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
(errcode(ERRCODE_UNDEFINED_OBJECT), (errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("unrecognized configuration parameter \"%s\"", name))); errmsg("unrecognized configuration parameter \"%s\"", name)));
/*
* Don't allow the parameters which can't be set in configuration
* files to be set in PG_AUTOCONF_FILENAME file.
*/
if ((record->context == PGC_INTERNAL) || if ((record->context == PGC_INTERNAL) ||
(record->flags & GUC_DISALLOW_IN_FILE)) (record->flags & GUC_DISALLOW_IN_FILE) ||
ereport(ERROR, (record->flags & GUC_DISALLOW_IN_AUTO_FILE))
(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), ereport(ERROR,
errmsg("parameter \"%s\" cannot be changed", (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
name))); errmsg("parameter \"%s\" cannot be changed",
name)));
if (!validate_conf_option(record, name, value, PGC_S_FILE, if (!validate_conf_option(record, name, value, PGC_S_FILE,
ERROR, true, NULL, ERROR, true, NULL,
......
...@@ -195,6 +195,7 @@ typedef enum ...@@ -195,6 +195,7 @@ typedef enum
#define GUC_UNIT_TIME 0x7000 /* mask for MS, S, MIN */ #define GUC_UNIT_TIME 0x7000 /* mask for MS, S, MIN */
#define GUC_NOT_WHILE_SEC_REST 0x8000 /* can't set if security restricted */ #define GUC_NOT_WHILE_SEC_REST 0x8000 /* can't set if security restricted */
#define GUC_DISALLOW_IN_AUTO_FILE 0x00010000 /* can't set in PG_AUTOCONF_FILENAME */
/* GUC vars that are actually declared in guc.c, rather than elsewhere */ /* GUC vars that are actually declared in guc.c, rather than elsewhere */
extern bool log_duration; extern bool log_duration;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment