From 3bea93b3b0828b6eddf890f85fd423dff062b4df Mon Sep 17 00:00:00 2001
From: Magnus Hagander <magnus@hagander.net>
Date: Mon, 6 Oct 2008 13:05:40 +0000
Subject: [PATCH] Add columns boot_val and reset_val to the pg_settings view,
 to expose the value a parameter has at server start and will have after
 RESET, respectively.

Greg Smith, with some modifications by me.
---
 doc/src/sgml/catalogs.sgml          | 14 +++++-
 src/backend/utils/misc/guc.c        | 72 +++++++++++++++++++++++++----
 src/include/catalog/catversion.h    |  4 +-
 src/include/catalog/pg_proc.h       |  4 +-
 src/test/regress/expected/rules.out |  2 +-
 5 files changed, 82 insertions(+), 14 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index bf1ac314f73..77ccf8e3fcd 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.176 2008/09/23 09:20:33 heikki Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.177 2008/10/06 13:05:36 mha Exp $ -->
 <!--
  Documentation of the system catalogs, directed toward PostgreSQL developers
  -->
@@ -6435,6 +6435,18 @@
       <entry>Allowed values in enum parameters (NULL for non-enum
       values)</entry>
      </row>
+     <row>
+      <entry><structfield>boot_val</structfield></entry>
+      <entry><type>text</type></entry>
+      <entry>Parameter value assumed at server startup if the parameter is
+      not otherwise set</entry>
+     </row>
+     <row>
+      <entry><structfield>reset_val</structfield></entry>
+      <entry><type>text</type></entry>
+      <entry>Default run-time session value for the parameter that it will
+      revert to if <command>RESET</command></entry>
+     </row>
      <row>
       <entry><structfield>sourcefile</structfield></entry>
       <entry><type>text</type></entry>
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 93f20eef350..9fec5753a81 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.474 2008/09/30 10:52:13 heikki Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.475 2008/10/06 13:05:36 mha Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -6067,6 +6067,8 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
 	{
 		case PGC_BOOL:
 			{
+				struct config_bool *lconf = (struct config_bool *) conf;
+
 				/* min_val */
 				values[9] = NULL;
 
@@ -6075,6 +6077,12 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
 
 				/* enumvals */
 				values[11] = NULL;
+
+				/* boot_val */
+				values[12] = pstrdup(lconf->boot_val ? "on" : "off");
+
+				/* reset_val */
+				values[13] = pstrdup(lconf->reset_val ? "on" : "off");
 			}
 			break;
 
@@ -6092,6 +6100,14 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
 
 				/* enumvals */
 				values[11] = NULL;
+
+ 				/* boot_val */
+ 				snprintf(buffer, sizeof(buffer), "%d", lconf->boot_val);
+ 				values[12] = pstrdup(buffer);
+
+ 				/* reset_val */
+ 				snprintf(buffer, sizeof(buffer), "%d", lconf->reset_val);
+ 				values[13] = pstrdup(buffer);
 			}
 			break;
 
@@ -6109,11 +6125,21 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
 
 				/* enumvals */
 				values[11] = NULL;
+
+ 				/* boot_val */
+ 				snprintf(buffer, sizeof(buffer), "%g", lconf->boot_val);
+ 				values[12] = pstrdup(buffer);
+
+ 				/* reset_val */
+ 				snprintf(buffer, sizeof(buffer), "%g", lconf->reset_val);
+ 				values[13] = pstrdup(buffer);
 			}
 			break;
 
 		case PGC_STRING:
 			{
+ 				struct config_string *lconf = (struct config_string *) conf;
+
 				/* min_val */
 				values[9] = NULL;
 
@@ -6122,11 +6148,25 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
 
 				/* enumvals */
 				values[11] = NULL;
+
+ 				/* boot_val */
+ 				if (lconf->boot_val == NULL)
+ 					values[12] = NULL;
+				else
+					values[12] = pstrdup(lconf->boot_val);
+
+ 				/* reset_val */
+ 				if (lconf->reset_val == NULL)
+ 					values[13] = NULL;
+				else
+					values[13] = pstrdup(lconf->reset_val);
 			}
 			break;
 
 		case PGC_ENUM:
 			{
+ 				struct config_enum *lconf = (struct config_enum *) conf;
+
 				/* min_val */
 				values[9] = NULL;
 
@@ -6135,6 +6175,12 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
 
 				/* 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));
+
+ 				/* reset_val */
+				values[13] = pstrdup(config_enum_lookup_by_value(lconf, lconf->reset_val));
 			}
 			break;
 
@@ -6152,6 +6198,12 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
 
 				/* enumvals */
 				values[11] = NULL;
+
+ 				/* boot_val */
+ 				values[12] = NULL;
+
+ 				/* reset_val */
+ 				values[13] = NULL;
 			}
 			break;
 	}
@@ -6163,14 +6215,14 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
 	 */
 	if (conf->source == PGC_S_FILE && superuser())
 	{
-		values[12] = conf->sourcefile;
+		values[14] = conf->sourcefile;
 		snprintf(buffer, sizeof(buffer), "%d", conf->sourceline);
-		values[13] = pstrdup(buffer);
+		values[15] = pstrdup(buffer);
 	}
 	else
 	{
-		values[12] = NULL;
-		values[13] = NULL;
+		values[14] = NULL;
+		values[15] = NULL;
 	}
 }
 
@@ -6207,7 +6259,7 @@ show_config_by_name(PG_FUNCTION_ARGS)
  * show_all_settings - equiv to SHOW ALL command but implemented as
  * a Table Function.
  */
-#define NUM_PG_SETTINGS_ATTS	14
+#define NUM_PG_SETTINGS_ATTS	16
 
 Datum
 show_all_settings(PG_FUNCTION_ARGS)
@@ -6259,9 +6311,13 @@ show_all_settings(PG_FUNCTION_ARGS)
 						   TEXTOID, -1, 0);
 		TupleDescInitEntry(tupdesc, (AttrNumber) 12, "enumvals",
 						   TEXTOID, -1, 0);
-		TupleDescInitEntry(tupdesc, (AttrNumber) 13, "sourcefile",
+ 		TupleDescInitEntry(tupdesc, (AttrNumber) 13, "boot_val",
+ 						   TEXTOID, -1, 0);
+ 		TupleDescInitEntry(tupdesc, (AttrNumber) 14, "reset_val",
+ 						   TEXTOID, -1, 0);
+		TupleDescInitEntry(tupdesc, (AttrNumber) 15, "sourcefile",
 						   TEXTOID, -1, 0);
-		TupleDescInitEntry(tupdesc, (AttrNumber) 14, "sourceline",
+		TupleDescInitEntry(tupdesc, (AttrNumber) 16, "sourceline",
 						   INT4OID, -1, 0);
 
 		/*
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 43dc65a9d76..fd6895263bb 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.493 2008/10/05 17:33:16 petere Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.494 2008/10/06 13:05:37 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*							yyyymmddN */
-#define CATALOG_VERSION_NO	200810051
+#define CATALOG_VERSION_NO	200810061
 
 #endif
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 229d1af2b3d..31449b60e0f 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.517 2008/10/05 17:33:16 petere Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.518 2008/10/06 13:05:37 mha Exp $
  *
  * NOTES
  *	  The script catalog/genbki.sh reads this file and generates .bki
@@ -3145,7 +3145,7 @@ 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,23}" "{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,sourcefile,sourceline}" show_all_settings _null_ _null_ _null_ ));
+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");
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 05235428de7..50abeb5b0e0 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -1287,7 +1287,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
  pg_prepared_xacts        | SELECT p.transaction, p.gid, p.prepared, u.rolname AS owner, d.datname AS database FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
  pg_roles                 | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolinherit, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, pg_authid.rolconfig, pg_authid.oid FROM pg_authid;
  pg_rules                 | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name);
- pg_settings              | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals, a.sourcefile, a.sourceline FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, sourcefile, sourceline);
+ pg_settings              | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals, a.boot_val, a.reset_val, a.sourcefile, a.sourceline FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, sourcefile, sourceline);
  pg_shadow                | SELECT pg_authid.rolname AS usename, pg_authid.oid AS usesysid, pg_authid.rolcreatedb AS usecreatedb, pg_authid.rolsuper AS usesuper, pg_authid.rolcatupdate AS usecatupd, pg_authid.rolpassword AS passwd, (pg_authid.rolvaliduntil)::abstime AS valuntil, pg_authid.rolconfig AS useconfig FROM pg_authid WHERE pg_authid.rolcanlogin;
  pg_stat_activity         | SELECT s.datid, d.datname, s.procpid, s.usesysid, u.rolname AS usename, s.current_query, s.waiting, s.xact_start, s.query_start, s.backend_start, s.client_addr, s.client_port FROM pg_database d, pg_stat_get_activity(NULL::integer) s(datid, procpid, usesysid, current_query, waiting, xact_start, query_start, backend_start, client_addr, client_port), pg_authid u WHERE ((s.datid = d.oid) AND (s.usesysid = u.oid));
  pg_stat_all_indexes      | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
-- 
GitLab