From 7cbfa7565e11b3668a388fac94d787e3590b1a97 Mon Sep 17 00:00:00 2001
From: Magnus Hagander <magnus@hagander.net>
Date: Mon, 17 Mar 2008 17:45:09 +0000
Subject: [PATCH] Fix postgres --describe-config for guc enums, breakage noted
 by Alvaro.

While at it, rename option lookup functions to make names clearer, per
discussion with Tom.
---
 src/backend/utils/misc/guc.c         | 29 +++++++++++++---------------
 src/backend/utils/misc/help_config.c |  9 ++++++++-
 src/include/utils/guc_tables.h       |  8 +++++++-
 3 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 2f855b13aae..6839a165dd6 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.438 2008/03/16 16:42:44 mha Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.439 2008/03/17 17:45:09 mha Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -168,9 +168,6 @@ static const char *show_tcp_keepalives_count(void);
 static bool assign_autovacuum_max_workers(int newval, bool doit, GucSource source);
 static bool assign_maxconnections(int newval, bool doit, GucSource source);
 
-static const char *config_enum_lookup_value(struct config_enum *record, int val);
-static bool config_enum_lookup_name(struct config_enum *record, 
-									const char *value, int *retval);
 static char *config_enum_get_options(struct config_enum *record, 
 									 const char *prefix, const char *suffix);
 
@@ -3144,7 +3141,7 @@ InitializeGUCOptions(void)
 												   PGC_S_DEFAULT))
 							elog(FATAL, "failed to initialize %s to %s",
 								 conf->gen.name, 
-								 config_enum_lookup_value(conf, conf->boot_val));
+								 config_enum_lookup_by_value(conf, conf->boot_val));
 					*conf->variable = conf->reset_val = conf->boot_val;
 					break;
 				}
@@ -4219,8 +4216,8 @@ parse_real(const char *value, double *result)
  * The returned string is a pointer to static data and not
  * allocated for modification.
  */
-static const char *
-config_enum_lookup_value(struct config_enum *record, int val)
+const char *
+config_enum_lookup_by_value(struct config_enum *record, int val)
 {
 	const struct config_enum_entry *entry = record->options;
 	while (entry && entry->name)
@@ -4242,8 +4239,8 @@ config_enum_lookup_value(struct config_enum *record, int val)
  * true. If it's not found, return FALSE and retval is set to 0.
  *
  */
-static bool
-config_enum_lookup_name(struct config_enum *record, const char *value, int *retval)
+bool
+config_enum_lookup_by_name(struct config_enum *record, const char *value, int *retval)
 {
 	const struct config_enum_entry *entry = record->options;
 	
@@ -4876,7 +4873,7 @@ set_config_option(const char *name, const char *value,
 
 				if (value)
 				{
-					if (!config_enum_lookup_name(conf, value, &newval))
+					if (!config_enum_lookup_by_name(conf, value, &newval))
 					{
 						char *hintmsg = config_enum_get_options(conf, "Available values: ", ".");
 
@@ -4906,7 +4903,7 @@ set_config_option(const char *name, const char *value,
 								(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 								 errmsg("invalid value for parameter \"%s\": \"%s\"",
 										name, 
-										config_enum_lookup_value(conf, newval))));
+										config_enum_lookup_by_value(conf, newval))));
 						return false;
 					}
 
@@ -5007,7 +5004,7 @@ GetConfigOption(const char *name)
 			return *((struct config_string *) record)->variable;
 
 		case PGC_ENUM:
-			return config_enum_lookup_value((struct config_enum *) record,
+			return config_enum_lookup_by_value((struct config_enum *) record,
 											*((struct config_enum *) record)->variable);
 	}
 	return NULL;
@@ -5055,7 +5052,7 @@ GetConfigOptionResetString(const char *name)
 			return ((struct config_string *) record)->reset_val;
 
 		case PGC_ENUM:
-			return config_enum_lookup_value((struct config_enum *) record,
+			return config_enum_lookup_by_value((struct config_enum *) record,
 										    ((struct config_enum *) record)->reset_val);
 	}
 	return NULL;
@@ -6265,7 +6262,7 @@ _ShowOption(struct config_generic * record, bool use_units)
 				if(conf->show_hook)
 					val = (*conf->show_hook) ();
 				else
-					val = config_enum_lookup_value(conf, *conf->variable);
+					val = config_enum_lookup_by_value(conf, *conf->variable);
 			}
 			break;
 
@@ -6331,7 +6328,7 @@ is_newvalue_equal(struct config_generic * record, const char *newvalue)
 				struct config_enum *conf = (struct config_enum *) record;
 				int			newval;
 
-				return config_enum_lookup_name(conf, newvalue, &newval)
+				return config_enum_lookup_by_name(conf, newvalue, &newval)
 					&& *conf->variable == newval;
 			}
 	}
@@ -6425,7 +6422,7 @@ write_nondefault_variables(GucContext context)
 					{
 						struct config_enum *conf = (struct config_enum *) gconf;
 						
-						fprintf(fp, "%s", config_enum_lookup_value(conf, *conf->variable));
+						fprintf(fp, "%s", config_enum_lookup_by_value(conf, *conf->variable));
 					}
 					break;
 			}
diff --git a/src/backend/utils/misc/help_config.c b/src/backend/utils/misc/help_config.c
index 1fdd134b729..543aeb7ed34 100644
--- a/src/backend/utils/misc/help_config.c
+++ b/src/backend/utils/misc/help_config.c
@@ -10,7 +10,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/misc/help_config.c,v 1.20 2008/02/23 19:23:33 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/help_config.c,v 1.21 2008/03/17 17:45:09 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -35,6 +35,7 @@ typedef union
 	struct config_real real;
 	struct config_int integer;
 	struct config_string string;
+	struct config_enum _enum;
 } mixedStruct;
 
 
@@ -120,6 +121,12 @@ printMixedStruct(mixedStruct *structToPrint)
 				   structToPrint->string.boot_val ? structToPrint->string.boot_val : "");
 			break;
 
+		case PGC_ENUM:
+			printf("ENUM\t%s\t\t\t",
+				   config_enum_lookup_by_value(&structToPrint->_enum,
+											   structToPrint->_enum.boot_val));
+			break;
+
 		default:
 			write_stderr("internal error: unrecognized run-time parameter type\n");
 			break;
diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h
index f81826fe4cf..9e52adfcc8b 100644
--- a/src/include/utils/guc_tables.h
+++ b/src/include/utils/guc_tables.h
@@ -7,7 +7,7 @@
  *
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  *
- *	  $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.40 2008/03/16 16:42:44 mha Exp $
+ *	  $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.41 2008/03/17 17:45:09 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -236,4 +236,10 @@ extern struct config_generic **get_guc_variables(void);
 
 extern void build_guc_variables(void);
 
+/* search in enum options */
+extern const char *config_enum_lookup_by_value(struct config_enum *record, int val);
+extern bool config_enum_lookup_by_name(struct config_enum *record,
+									  const char *value, int *retval);
+
+
 #endif   /* GUC_TABLES_H */
-- 
GitLab