aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/parser/gram.y47
-rw-r--r--src/backend/utils/misc/guc.c98
2 files changed, 91 insertions, 54 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 6f4d6455df6..b46dd7b008c 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -411,7 +411,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <istmt> insert_rest
-%type <vsetstmt> generic_set set_rest set_rest_more SetResetClause FunctionSetResetClause
+%type <vsetstmt> generic_set set_rest set_rest_more generic_reset reset_rest
+ SetResetClause FunctionSetResetClause
%type <node> TableElement TypedTableElement ConstraintElem TableFuncElement
%type <node> columnDef columnOptions
@@ -1579,39 +1580,47 @@ NonReservedWord_or_Sconst:
;
VariableResetStmt:
- RESET var_name
+ RESET reset_rest { $$ = (Node *) $2; }
+ ;
+
+reset_rest:
+ generic_reset { $$ = $1; }
+ | TIME ZONE
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->kind = VAR_RESET;
- n->name = $2;
- $$ = (Node *) n;
+ n->name = "timezone";
+ $$ = n;
}
- | RESET TIME ZONE
+ | TRANSACTION ISOLATION LEVEL
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->kind = VAR_RESET;
- n->name = "timezone";
- $$ = (Node *) n;
+ n->name = "transaction_isolation";
+ $$ = n;
}
- | RESET TRANSACTION ISOLATION LEVEL
+ | SESSION AUTHORIZATION
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->kind = VAR_RESET;
- n->name = "transaction_isolation";
- $$ = (Node *) n;
+ n->name = "session_authorization";
+ $$ = n;
}
- | RESET SESSION AUTHORIZATION
+ ;
+
+generic_reset:
+ var_name
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->kind = VAR_RESET;
- n->name = "session_authorization";
- $$ = (Node *) n;
+ n->name = $1;
+ $$ = n;
}
- | RESET ALL
+ | ALL
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->kind = VAR_RESET_ALL;
- $$ = (Node *) n;
+ $$ = n;
}
;
@@ -8494,7 +8503,7 @@ DropdbStmt: DROP DATABASE database_name
/*****************************************************************************
*
- * ALTER SYSTEM SET
+ * ALTER SYSTEM
*
* This is used to change configuration parameters persistently.
*****************************************************************************/
@@ -8506,6 +8515,12 @@ AlterSystemStmt:
n->setstmt = $4;
$$ = (Node *)n;
}
+ | ALTER SYSTEM_P RESET generic_reset
+ {
+ AlterSystemStmt *n = makeNode(AlterSystemStmt);
+ n->setstmt = $4;
+ $$ = (Node *)n;
+ }
;
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 8c57803afe2..af667f54ada 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -6696,6 +6696,8 @@ replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,
* This function takes all previous configuration parameters
* set by ALTER SYSTEM command and the currently set ones
* and write them all to the automatic configuration file.
+ * It just writes an empty file incase user wants to reset
+ * all the parameters.
*
* The configuration parameters are written to a temporary
* file then renamed to the final name.
@@ -6710,6 +6712,7 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
{
char *name;
char *value;
+ bool resetall = false;
int Tmpfd = -1;
FILE *infile;
struct config_generic *record;
@@ -6737,37 +6740,48 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
break;
case VAR_SET_DEFAULT:
+ case VAR_RESET:
+ value = NULL;
+ break;
+
+ case VAR_RESET_ALL:
value = NULL;
+ resetall = true;
break;
+
default:
elog(ERROR, "unrecognized alter system stmt type: %d",
altersysstmt->setstmt->kind);
break;
}
- record = find_option(name, false, LOG);
- if (record == NULL)
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("unrecognized configuration parameter \"%s\"", name)));
+ /* If we're resetting everything, there's no need to validate anything */
+ if (!resetall)
+ {
+ record = find_option(name, false, LOG);
+ if (record == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ 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) ||
- (record->flags & GUC_DISALLOW_IN_FILE) ||
- (record->flags & GUC_DISALLOW_IN_AUTO_FILE))
- ereport(ERROR,
- (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
- errmsg("parameter \"%s\" cannot be changed",
- name)));
-
- if (!validate_conf_option(record, name, value, PGC_S_FILE,
- ERROR, true, NULL,
- &newextra))
- ereport(ERROR,
- (errmsg("invalid value for parameter \"%s\": \"%s\"", name, value)));
+ /*
+ * 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) ||
+ (record->flags & GUC_DISALLOW_IN_FILE) ||
+ (record->flags & GUC_DISALLOW_IN_AUTO_FILE))
+ ereport(ERROR,
+ (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+ errmsg("parameter \"%s\" cannot be changed",
+ name)));
+
+ if (!validate_conf_option(record, name, value, PGC_S_FILE,
+ ERROR, true, NULL,
+ &newextra))
+ ereport(ERROR,
+ (errmsg("invalid value for parameter \"%s\": \"%s\"", name, value)));
+ }
/*
@@ -6799,26 +6813,34 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
PG_TRY();
{
- if (stat(AutoConfFileName, &st) == 0)
+ /*
+ * If we're going to reset everything, then don't open the file, don't
+ * parse it, and don't do anything with the configuration list. Just
+ * write out an empty file.
+ */
+ if (!resetall)
{
- /* open file PG_AUTOCONF_FILENAME */
- infile = AllocateFile(AutoConfFileName, "r");
- if (infile == NULL)
- ereport(ERROR,
- (errmsg("failed to open auto conf file \"%s\": %m ",
- AutoConfFileName)));
+ if (stat(AutoConfFileName, &st) == 0)
+ {
+ /* open file PG_AUTOCONF_FILENAME */
+ infile = AllocateFile(AutoConfFileName, "r");
+ if (infile == NULL)
+ ereport(ERROR,
+ (errmsg("failed to open auto conf file \"%s\": %m ",
+ AutoConfFileName)));
- /* parse it */
- ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail);
+ /* parse it */
+ ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail);
- FreeFile(infile);
- }
+ FreeFile(infile);
+ }
- /*
- * replace with new value if the configuration parameter already
- * exists OR add it as a new cofiguration parameter in the file.
- */
- replace_auto_config_value(&head, &tail, AutoConfFileName, name, value);
+ /*
+ * replace with new value if the configuration parameter already
+ * exists OR add it as a new cofiguration parameter in the file.
+ */
+ replace_auto_config_value(&head, &tail, AutoConfFileName, name, value);
+ }
/* Write and sync the new contents to the temporary file */
write_auto_conf_file(Tmpfd, AutoConfTmpFileName, &head);