Alvaro Herrera wrote:
Zdenek Kotala 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 as an attachment, or disallow your mail client from
munging whitespace ... I see wrapped words here, and apparently tab
expansion as well.

OK. Here is patch like attachment.

Zdenek
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
  
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

Reply via email to