Andrew Dunstan wrote:
> Zdenek Kotala wrote:
>> There is path implements following item from todo list: "Allow
>> commenting of variables in postgresql.conf to restore them to defaults".
>> Main idea is:
>>
>> General config structure is extend with default_val attribute to keep
>> really default value. (There is small conflict - for string boot_val
>> has same meaning).
>> During reconfiguration all values which has reset source equal with
>> PGC_S_FILE are revert back to really default values. New values from
>> configuration files are set after this step and commented variables
>> stay with default value.
>>
>
> Please resubmit your patch as a context diff, as documented here:
> http://www.postgresql.org/docs/faqs.FAQ_DEV.html#item1.5
>
> cheers
>
> andrew
I am sorry. Here it is:
Index: src/backend/utils/misc/guc-file.l
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v
retrieving revision 1.37
diff -c -r1.37 guc-file.l
*** src/backend/utils/misc/guc-file.l 7 Mar 2006 01:03:12 -0000 1.37
--- src/backend/utils/misc/guc-file.l 24 May 2006 14:10:12 -0000
***************
*** 112,119 ****
void
ProcessConfigFile(GucContext context)
{
! int elevel;
struct name_value_pair *item, *head, *tail;
Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
--- 112,120 ----
void
ProcessConfigFile(GucContext context)
{
! int elevel, i;
struct name_value_pair *item, *head, *tail;
+ char *env;
Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
***************
*** 143,148 ****
--- 144,185 ----
goto cleanup_list;
}
+ /* Revert all options with reset source PGC_S_FILE to default value.
+ * This implementation is easier then iplementing some change flag
and verify
+ * what realy was commented out.
+ * XXX When log_line_prefix is set in configuration file then log
output
+ * is not correct during this phase - prefix is revert to empty value.
+ */
+ for (i = 0; i < num_guc_variables; i++)
+ {
+ struct config_generic *gconf = guc_variables[i];
+ if ( gconf->reset_source == PGC_S_FILE )
+ {
+ set_config_option(gconf->name, NULL, context,
+ PGC_S_FILE, false, true);
+ }
+ }
+
+ /* Revert to environment variable. PGPORT is ignored, because it
cannot be
+ * set in running state. PGC_S_FILE is used instead PGC_S_ENV so as
+ * set_config_option can override previous defined option in
config file.
+ * If these options are still in config file They will be
overriden in
+ * the following step.
+ */
+ env = getenv("PGDATESTYLE");
+ if (env != NULL)
+ {
+ set_config_option("datestyle", env, context,
+ PGC_S_FILE, false, true);
+ }
+
+ env = getenv("PGCLIENTENCODING");
+ if (env != NULL)
+ {
+ set_config_option("client_encoding", env, context,
+ PGC_S_FILE, false, true);
+ }
+
/* If we got here all the options checked out okay, so apply them. */
for (item = head; item; item = item->next)
{
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.319
diff -c -r1.319 guc.c
*** src/backend/utils/misc/guc.c 11 May 2006 19:15:35 -0000 1.319
--- src/backend/utils/misc/guc.c 24 May 2006 14:10:12 -0000
***************
*** 2648,2658 ****
struct config_bool *conf = (struct config_bool *)
gconf;
if (conf->assign_hook)
! if (!(*conf->assign_hook) (conf->reset_val, true,
PGC_S_DEFAULT))
elog(FATAL, "failed to initialize %s to %d",
! conf->gen.name, (int) conf->reset_val);
! *conf->variable = conf->reset_val;
break;
}
case PGC_INT:
--- 2648,2658 ----
struct config_bool *conf = (struct config_bool *)
gconf;
if (conf->assign_hook)
! if (!(*conf->assign_hook) (conf->default_val,
true,
PGC_S_DEFAULT))
elog(FATAL, "failed to initialize %s to %d",
! conf->gen.name, (int) conf->default_val);
! *conf->variable = conf->reset_val = conf->default_val;
break;
}
case PGC_INT:
***************
*** 2662,2672 ****
Assert(conf->reset_val >= conf->min);
Assert(conf->reset_val <= conf->max);
if (conf->assign_hook)
! if (!(*conf->assign_hook) (conf->reset_val, true,
PGC_S_DEFAULT))
elog(FATAL, "failed to initialize %s to %d",
! conf->gen.name, conf->reset_val);
! *conf->variable = conf->reset_val;
break;
}
case PGC_REAL:
--- 2662,2672 ----
Assert(conf->reset_val >= conf->min);
Assert(conf->reset_val <= conf->max);
if (conf->assign_hook)
! if (!(*conf->assign_hook) (conf->default_val,
true,
PGC_S_DEFAULT))
elog(FATAL, "failed to initialize %s to %d",
! conf->gen.name, conf->default_val);
! *conf->variable = conf->reset_val =
conf->default_val;
break;
}
case PGC_REAL:
***************
*** 2676,2686 ****
Assert(conf->reset_val >= conf->min);
Assert(conf->reset_val <= conf->max);
if (conf->assign_hook)
! if (!(*conf->assign_hook) (conf->reset_val, true,
PGC_S_DEFAULT))
elog(FATAL, "failed to initialize %s to %g",
! conf->gen.name, conf->reset_val);
! *conf->variable = conf->reset_val;
break;
}
case PGC_STRING:
--- 2676,2686 ----
Assert(conf->reset_val >= conf->min);
Assert(conf->reset_val <= conf->max);
if (conf->assign_hook)
! if (!(*conf->assign_hook) (conf->default_val,
true,
PGC_S_DEFAULT))
elog(FATAL, "failed to initialize %s to %g",
! conf->gen.name, conf->default_val);
! *conf->variable = conf->reset_val =
conf->default_val;
break;
}
case PGC_STRING:
***************
*** 3647,3653 ****
case PGC_POSTMASTER:
if (context == PGC_SIGHUP)
{
! if (changeVal && !is_newvalue_equal(record, value))
ereport(elevel,
(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
errmsg("parameter \"%s\" cannot be
changed after server start; configuration file change ignored",
--- 3647,3653 ----
case PGC_POSTMASTER:
if (context == PGC_SIGHUP)
{
! if (changeVal && value != NULL &&
!is_newvalue_equal(record, value))
ereport(elevel,
(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
errmsg("parameter \"%s\" cannot be
changed after server start; configuration file change ignored",
***************
*** 3723,3729 ****
* Should we set reset/stacked values? (If so, the behavior is not
* transactional.)
*/
! makeDefault = changeVal && (source <= PGC_S_OVERRIDE) && (value !=
NULL);
/*
* Ignore attempted set if overridden by previously processed setting.
--- 3723,3729 ----
* Should we set reset/stacked values? (If so, the behavior is not
* transactional.)
*/
! makeDefault = changeVal && (source <= PGC_S_OVERRIDE) && (value !=
NULL || source == PGC_S_FILE);
/*
* Ignore attempted set if overridden by previously processed setting.
***************
*** 3766,3773 ****
}
else
{
! newval = conf->reset_val;
! source = conf->gen.reset_source;
}
if (conf->assign_hook)
--- 3766,3784 ----
}
else
{
! /* Revert value to default if source is
configuration file. It is used when
! * configuration parameter is removed/commented
out in the config file. Else
! * RESET or SET TO DEFAULT command is called and
reset_val is used.
! */
! if( source == PGC_S_FILE )
! {
! newval = conf->default_val;
! }
! else
! {
! newval = conf->reset_val;
! source = conf->gen.reset_source;
! }
}
if (conf->assign_hook)
***************
*** 3850,3857 ****
}
else
{
! newval = conf->reset_val;
! source = conf->gen.reset_source;
}
if (conf->assign_hook)
--- 3861,3879 ----
}
else
{
! /* Revert value to default if source is
configuration file. It is used when
! * configuration parameter is removed/commented
out in the config file. Else
! * RESET or SET TO DEFAULT command is called and
reset_val is used.
! */
! if( source == PGC_S_FILE )
! {
! newval = conf->default_val;
! }
! else
! {
! newval = conf->reset_val;
! source = conf->gen.reset_source;
! }
}
if (conf->assign_hook)
***************
*** 3934,3941 ****
}
else
{
! newval = conf->reset_val;
! source = conf->gen.reset_source;
}
if (conf->assign_hook)
--- 3956,3974 ----
}
else
{
! /* Revert value to default if source is
configuration file. It is used when
! * configuration parameter is removed/commented
out in the config file. Else
! * RESET or SET TO DEFAULT command is called and
reset_val is used.
! */
! if( source == PGC_S_FILE )
! {
! newval = conf->default_val;
! }
! else
! {
! newval = conf->reset_val;
! source = conf->gen.reset_source;
! }
}
if (conf->assign_hook)
***************
*** 4009,4014 ****
--- 4042,4061 ----
if (conf->gen.flags & GUC_IS_NAME)
truncate_identifier(newval, strlen(newval), true);
}
+ else if (source == PGC_S_FILE)
+ {
+ /* Revert value to default when item is removed
from config file. */
+ if ( conf->boot_val != NULL )
+ {
+ newval = guc_strdup(elevel, conf->boot_val);
+ if (newval == NULL)
+ return false;
+ }
+ else
+ {
+ return false;
+ }
+ }
else if (conf->reset_val)
{
/*
***************
*** 5111,5116 ****
--- 5158,5168 ----
static bool
is_newvalue_equal(struct config_generic *record, const char *newvalue)
{
+ if( !newvalue )
+ {
+ return false;
+ }
+
switch (record->vartype)
{
case PGC_BOOL:
Index: src/include/utils/guc_tables.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/guc_tables.h,v
retrieving revision 1.22
diff -c -r1.22 guc_tables.h
*** src/include/utils/guc_tables.h 5 Mar 2006 15:59:07 -0000 1.22
--- src/include/utils/guc_tables.h 24 May 2006 14:10:13 -0000
***************
*** 142,152 ****
/* these fields must be set correctly in initial value: */
/* (all but reset_val are constants) */
bool *variable;
! bool reset_val;
GucBoolAssignHook assign_hook;
GucShowHook show_hook;
/* variable fields, initialized at runtime: */
bool tentative_val;
};
struct config_int
--- 142,153 ----
/* these fields must be set correctly in initial value: */
/* (all but reset_val are constants) */
bool *variable;
! bool default_val;
GucBoolAssignHook assign_hook;
GucShowHook show_hook;
/* variable fields, initialized at runtime: */
bool tentative_val;
+ bool reset_val;
};
struct config_int
***************
*** 155,167 ****
/* these fields must be set correctly in initial value: */
/* (all but reset_val are constants) */
int *variable;
! int reset_val;
int min;
int max;
GucIntAssignHook assign_hook;
GucShowHook show_hook;
/* variable fields, initialized at runtime: */
int tentative_val;
};
struct config_real
--- 156,169 ----
/* these fields must be set correctly in initial value: */
/* (all but reset_val are constants) */
int *variable;
! int default_val;
int min;
int max;
GucIntAssignHook assign_hook;
GucShowHook show_hook;
/* variable fields, initialized at runtime: */
int tentative_val;
+ int reset_val;
};
struct config_real
***************
*** 170,182 ****
/* these fields must be set correctly in initial value: */
/* (all but reset_val are constants) */
double *variable;
! double reset_val;
double min;
double max;
GucRealAssignHook assign_hook;
GucShowHook show_hook;
/* variable fields, initialized at runtime: */
double tentative_val;
};
struct config_string
--- 172,186 ----
/* these fields must be set correctly in initial value: */
/* (all but reset_val are constants) */
double *variable;
! double default_val;
double min;
double max;
GucRealAssignHook assign_hook;
GucShowHook show_hook;
/* variable fields, initialized at runtime: */
double tentative_val;
+ double reset_val;
+
};
struct config_string