The attached patch changes pg_settings.enumval to be an array of text
instead of just a string, per previous discussion and the open items list.

Comments?

//Magnus
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
***************
*** 168,174 **** static bool assign_maxconnections(int newval, bool doit, GucSource source);
  static const char *assign_pgstat_temp_directory(const char *newval, bool doit, GucSource source);
  
  static char *config_enum_get_options(struct config_enum *record, 
! 									 const char *prefix, const char *suffix);
  
  
  /*
--- 168,175 ----
  static const char *assign_pgstat_temp_directory(const char *newval, bool doit, GucSource source);
  
  static char *config_enum_get_options(struct config_enum *record, 
! 									 const char *prefix, const char *suffix,
! 									 const char *separator);
  
  
  /*
***************
*** 4427,4433 **** config_enum_lookup_by_name(struct config_enum *record, const char *value, int *r
   * If suffix is non-NULL, it is added to the end of the string.
   */
  static char *
! config_enum_get_options(struct config_enum *record, const char *prefix, const char *suffix)
  {
  	const struct config_enum_entry *entry = record->options;
  	int		len = 0;
--- 4428,4435 ----
   * If suffix is non-NULL, it is added to the end of the string.
   */
  static char *
! config_enum_get_options(struct config_enum *record, const char *prefix,
! 						const char *suffix, const char *separator)
  {
  	const struct config_enum_entry *entry = record->options;
  	int		len = 0;
***************
*** 4439,4445 **** config_enum_get_options(struct config_enum *record, const char *prefix, const ch
  	while (entry && entry->name)
  	{
  		if (!entry->hidden)
! 			len += strlen(entry->name) + 2; /* string and ", " */
  
  		entry++;
  	}
--- 4441,4447 ----
  	while (entry && entry->name)
  	{
  		if (!entry->hidden)
! 			len += strlen(entry->name) + strlen(separator);
  
  		entry++;
  	}
***************
*** 4454,4460 **** config_enum_get_options(struct config_enum *record, const char *prefix, const ch
  		if (!entry->hidden)
  		{
  			strcat(hintmsg, entry->name);
! 			strcat(hintmsg, ", ");
  		}
  
  		entry++;
--- 4456,4462 ----
  		if (!entry->hidden)
  		{
  			strcat(hintmsg, entry->name);
! 			strcat(hintmsg, separator);
  		}
  
  		entry++;
***************
*** 4469,4484 **** config_enum_get_options(struct config_enum *record, const char *prefix, const ch
  	 * to make sure we don't write to invalid memory instead of actually
  	 * trying to do something smart with it.
  	 */
! 	if (len > 1)
! 		/* Replace final comma/space */
! 		hintmsg[len-2] = '\0';
  
  	strcat(hintmsg, suffix);
  
  	return hintmsg;
  }
  
- 
  /*
   * Call a GucStringAssignHook function, being careful to free the
   * "newval" string if the hook ereports.
--- 4471,4485 ----
  	 * to make sure we don't write to invalid memory instead of actually
  	 * trying to do something smart with it.
  	 */
! 	if (len > strlen(separator)-1)
! 		/* Replace final separator */
! 		hintmsg[len-strlen(separator)] = '\0';
  
  	strcat(hintmsg, suffix);
  
  	return hintmsg;
  }
  
  /*
   * Call a GucStringAssignHook function, being careful to free the
   * "newval" string if the hook ereports.
***************
*** 5044,5050 **** set_config_option(const char *name, const char *value,
  				{
  					if (!config_enum_lookup_by_name(conf, value, &newval))
  					{
! 						char *hintmsg = config_enum_get_options(conf, "Available values: ", ".");
  
  						ereport(elevel,
  								(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
--- 5045,5051 ----
  				{
  					if (!config_enum_lookup_by_name(conf, value, &newval))
  					{
! 						char *hintmsg = config_enum_get_options(conf, "Available values: ", ".", ", ");
  
  						ereport(elevel,
  								(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
***************
*** 6249,6255 **** GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
  				values[10] = NULL;
  
  				/* enumvals */
! 				values[11] = config_enum_get_options((struct config_enum *) conf, "", "");
  
   				/* boot_val */
  				values[12] = pstrdup(config_enum_lookup_by_value(lconf, lconf->boot_val));
--- 6250,6256 ----
  				values[10] = NULL;
  
  				/* enumvals */
! 				values[11] = config_enum_get_options((struct config_enum *) conf, "{\"", "\"}", "\",\"");
  
   				/* boot_val */
  				values[12] = pstrdup(config_enum_lookup_by_value(lconf, lconf->boot_val));
***************
*** 6385,6391 **** show_all_settings(PG_FUNCTION_ARGS)
  		TupleDescInitEntry(tupdesc, (AttrNumber) 11, "max_val",
  						   TEXTOID, -1, 0);
  		TupleDescInitEntry(tupdesc, (AttrNumber) 12, "enumvals",
! 						   TEXTOID, -1, 0);
   		TupleDescInitEntry(tupdesc, (AttrNumber) 13, "boot_val",
   						   TEXTOID, -1, 0);
   		TupleDescInitEntry(tupdesc, (AttrNumber) 14, "reset_val",
--- 6386,6392 ----
  		TupleDescInitEntry(tupdesc, (AttrNumber) 11, "max_val",
  						   TEXTOID, -1, 0);
  		TupleDescInitEntry(tupdesc, (AttrNumber) 12, "enumvals",
! 						   CSTRINGARRAYOID, -1, 0);
   		TupleDescInitEntry(tupdesc, (AttrNumber) 13, "boot_val",
   						   TEXTOID, -1, 0);
   		TupleDescInitEntry(tupdesc, (AttrNumber) 14, "reset_val",
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
***************
*** 3166,3172 **** DATA(insert OID = 2077 (  current_setting	PGNSP PGUID 12 1 0 0 f f t f s 1 25 "2
  DESCR("SHOW X as a function");
  DATA(insert OID = 2078 (  set_config		PGNSP PGUID 12 1 0 0 f f f f v 3 25 "25 25 16" _null_ _null_ _null_ set_config_by_name _null_ _null_ _null_ ));
  DESCR("SET X as a function");
! DATA(insert OID = 2084 (  pg_show_all_settings	PGNSP PGUID 12 1 1000 0 f f t t s 0 2249 "" "{25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,23}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals,boot_val,reset_val,sourcefile,sourceline}" show_all_settings _null_ _null_ _null_ ));
  DESCR("SHOW ALL as a function");
  DATA(insert OID = 1371 (  pg_lock_status   PGNSP PGUID 12 1 1000 0 f f t t v 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted}" pg_lock_status _null_ _null_ _null_ ));
  DESCR("view system lock information");
--- 3166,3172 ----
  DESCR("SHOW X as a function");
  DATA(insert OID = 2078 (  set_config		PGNSP PGUID 12 1 0 0 f f f f v 3 25 "25 25 16" _null_ _null_ _null_ set_config_by_name _null_ _null_ _null_ ));
  DESCR("SET X as a function");
! DATA(insert OID = 2084 (  pg_show_all_settings	PGNSP PGUID 12 1 1000 0 f f t t s 0 2249 "" "{25,25,25,25,25,25,25,25,25,25,25,1263,25,25,25,23}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals,boot_val,reset_val,sourcefile,sourceline}" show_all_settings _null_ _null_ _null_ ));
  DESCR("SHOW ALL as a function");
  DATA(insert OID = 1371 (  pg_lock_status   PGNSP PGUID 12 1 1000 0 f f t t v 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted}" pg_lock_status _null_ _null_ _null_ ));
  DESCR("view system lock information");
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to