Hi all, with this patch, you can now restore default value with SIGHUP when commenting an variable in postgresql.conf
Emmanuel BERTHOULE
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 27 Mar 2006 20:30:55 -0000 *************** *** 18,23 **** --- 18,24 ---- #include "storage/fd.h" #include "utils/guc.h" + extern void ResetOptionsSIGHUP(void); /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */ #undef fprintf *************** *** 124,129 **** --- 125,132 ---- * about problems with the config file. */ elevel = IsUnderPostmaster ? DEBUG2 : LOG; + /* SIGHUP initialize default value at first */ + ResetOptionsSIGHUP(); } else elevel = ERROR; *************** *** 154,160 **** free_name_value_list(head); } ! /* * Read and parse a single configuration file. This function recurses * to handle "include" directives. --- 157,163 ---- free_name_value_list(head); } ! /* * Read and parse a single configuration file. This function recurses * to handle "include" directives. Index: src/backend/utils/misc/guc.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v retrieving revision 1.314 diff -c -r1.314 guc.c *** src/backend/utils/misc/guc.c 7 Mar 2006 02:54:23 -0000 1.314 --- src/backend/utils/misc/guc.c 27 Mar 2006 20:30:56 -0000 *************** *** 3021,3026 **** --- 3021,3127 ---- /* + * Reset all options ( with context = SIGHUP ) to their saved default values + */ + void + ResetOptionsSIGHUP(void) + { + int i; + bool retour; + + for (i = 0; i < num_guc_variables; i++) + { + struct config_generic *gconf = guc_variables[i]; + + if ( gconf->context == PGC_SIGHUP ) + { + elog(LOG,"option = %s",gconf->name); + switch (gconf->vartype) + { + case PGC_BOOL: + { + struct config_bool *conf = (struct config_bool *) gconf; + + + if (conf->assign_hook) + if (!(*conf->assign_hook) (conf->reset_val, true, + PGC_S_SESSION)) + elog(ERROR, "failed to reset %s", conf->gen.name); + if ( !strcmp(GetConfigOptionResetString((const char*)conf->gen.name),"on") ) *conf->variable=true; + else *conf->variable=false; + conf->gen.reset_source=PGC_S_SIGHUP; + break; + } + case PGC_INT: + { + struct config_int *conf = (struct config_int *) gconf; + + if (conf->assign_hook) + if (!(*conf->assign_hook) (conf->reset_val, true, + PGC_S_SESSION)) + elog(ERROR, "failed to reset %s", conf->gen.name); + *conf->variable = atoi(GetConfigOptionResetString(conf->gen.name)); + conf->gen.reset_source=PGC_S_SIGHUP; + break; + } + case PGC_REAL: + { + struct config_real *conf = (struct config_real *) gconf; + + if (conf->assign_hook) + if (!(*conf->assign_hook) (conf->reset_val, true, + PGC_S_SESSION)) + elog(ERROR, "failed to reset %s", conf->gen.name); + *conf->variable = atol(GetConfigOptionResetString(conf->gen.name)); + conf->gen.reset_source=PGC_S_SIGHUP; + break; + } + case PGC_STRING: + { + struct config_string *conf = (struct config_string *) gconf; + char *str; + + if (conf->reset_val == NULL) + { + /* Nothing to reset to, as yet; so do nothing */ + break; + } + + /* We need not strdup here */ + str = guc_strdup(LOG, conf->reset_val); + + if (conf->assign_hook) + { + const char *newstr; + + newstr = (*conf->assign_hook) (str, true, + PGC_S_SESSION); + if (newstr == NULL) + elog(ERROR, "failed to reset %s", conf->gen.name); + else if (newstr != str) + { + /* + * See notes in set_config_option about casting + */ + str = (char *) newstr; + } + } + + set_string_field(conf, conf->variable, str); + conf->gen.reset_source=PGC_S_SIGHUP; + break; + } + + } + } + } + } + + + + + + /* * push_old_value * Push previous state during first assignment to a GUC variable * within a particular transaction. *************** *** 3124,3130 **** GucStack *stack = gconf->stack; bool useTentative; bool changed; ! /* * Skip if nothing's happened to this var in this transaction */ --- 3225,3231 ---- GucStack *stack = gconf->stack; bool useTentative; bool changed; ! /* * Skip if nothing's happened to this var in this transaction */ *************** *** 3711,3717 **** * transactional.) */ makeDefault = changeVal && (source <= PGC_S_OVERRIDE) && (value != NULL); ! /* * Ignore attempted set if overridden by previously processed setting. * However, if changeVal is false then plow ahead anyway since we are --- 3812,3818 ---- * transactional.) */ makeDefault = changeVal && (source <= PGC_S_OVERRIDE) && (value != NULL); ! /* * Ignore attempted set if overridden by previously processed setting. * However, if changeVal is false then plow ahead anyway since we are *************** *** 4049,4055 **** newval = (char *) hookresult; } } ! if (changeVal || makeDefault) { /* Save old value to support transaction abort */ --- 4150,4156 ---- newval = (char *) hookresult; } } ! if (changeVal || makeDefault) { /* Save old value to support transaction abort */ *************** *** 4077,4082 **** --- 4178,4184 ---- newval); stack->source = source; } + } /* Perhaps we didn't install newval anywhere */ if (!string_field_used(conf, newval)) *************** *** 4097,4102 **** --- 4199,4206 ---- } else free(newval); + + break; } } Index: src/include/utils/guc.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/utils/guc.h,v retrieving revision 1.67 diff -c -r1.67 guc.h *** src/include/utils/guc.h 7 Mar 2006 03:01:22 -0000 1.67 --- src/include/utils/guc.h 27 Mar 2006 20:30:56 -0000 *************** *** 88,93 **** --- 88,94 ---- PGC_S_USER, /* per-user setting */ PGC_S_CLIENT, /* from client connection request */ PGC_S_OVERRIDE, /* special case to forcibly set default */ + PGC_S_SIGHUP, /* Default value from SIGHUP signal */ PGC_S_INTERACTIVE, /* dividing line for error reporting */ PGC_S_TEST, /* test per-database or per-user setting */ PGC_S_SESSION /* SET command */
---------------------------(end of broadcast)--------------------------- TIP 5: don't forget to increase your free space map settings