From 3fa9c416ed14f1d46567fdcf99c8d639034dbeec Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Sat, 4 Feb 2006 12:50:47 +0000
Subject: [PATCH] Issue a warning if a change-on-restart-only postgresql.conf
 value is modified  and the server config files are reloaded

---
 doc/TODO                     |  2 +-
 doc/src/FAQ/TODO.html        |  6 ++---
 src/backend/utils/misc/guc.c | 49 +++++++++++++++++++++++++++++++++++-
 3 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/doc/TODO b/doc/TODO
index d7e210651fc..b38a717f1e2 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -83,7 +83,7 @@ Administration
 	o %Allow postgresql.conf file values to be changed via an SQL
 	  API, perhaps using SET GLOBAL
 	o Allow the server to be stopped/restarted via an SQL API
-	o Issue a warning if a change-on-restart-only postgresql.conf value
+	o -Issue a warning if a change-on-restart-only postgresql.conf value
 	  is modified  and the server config files are reloaded
 	o Mark change-on-restart-only values in postgresql.conf
 
diff --git a/doc/src/FAQ/TODO.html b/doc/src/FAQ/TODO.html
index 9aafe3e9c30..d9d21ac4c74 100644
--- a/doc/src/FAQ/TODO.html
+++ b/doc/src/FAQ/TODO.html
@@ -26,7 +26,7 @@ first.
 
 <ul>
   <li>%Remove behavior of postmaster -o
-  </li><li>-*%Allow pooled connections to list all prepared statements*
+  </li><li>-<em>%Allow pooled connections to list all prepared statements</em>
 <p>  This would allow an application inheriting a pooled connection to know
   the statements prepared in the current session.
 </p>
@@ -79,8 +79,8 @@ first.
     </li><li>%Allow postgresql.conf file values to be changed via an SQL
           API, perhaps using SET GLOBAL
     </li><li>Allow the server to be stopped/restarted via an SQL API
-    </li><li>Issue a warning if a change-on-restart-only postgresql.conf value
-          is modified  and the server config files are reloaded
+    </li><li>-<em>Issue a warning if a change-on-restart-only postgresql.conf value
+          is modified  and the server config files are reloaded</em>
     </li><li>Mark change-on-restart-only values in postgresql.conf
   </li></ul>
   </li><li>Tablespaces
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index e16bbd057b3..6ff6382a482 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.309 2006/01/09 10:05:31 petere Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.310 2006/02/04 12:50:47 petere Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -2201,6 +2201,7 @@ static void ReportGUCOption(struct config_generic * record);
 static void ShowGUCConfigOption(const char *name, DestReceiver *dest);
 static void ShowAllGUCConfig(DestReceiver *dest);
 static char *_ShowOption(struct config_generic * record);
+static bool is_newvalue_equal(struct config_generic *record, const char *newvalue);
 
 
 /*
@@ -3631,7 +3632,15 @@ set_config_option(const char *name, const char *value,
 			break;
 		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",
+									name)));
+
 				return true;
+			}
 			if (context != PGC_POSTMASTER)
 			{
 				ereport(elevel,
@@ -5079,6 +5088,44 @@ _ShowOption(struct config_generic * record)
 }
 
 
+static bool
+is_newvalue_equal(struct config_generic *record, const char *newvalue)
+{
+	switch (record->vartype)
+	{
+		case PGC_BOOL:
+		{
+			struct config_bool *conf = (struct config_bool *) record;
+			bool newval;
+
+			return parse_bool(newvalue, &newval) && *conf->variable == newval;
+		}
+		case PGC_INT:
+		{
+			struct config_int *conf = (struct config_int *) record;
+			int newval;
+
+			return parse_int(newvalue, &newval) && *conf->variable == newval;
+		}
+		case PGC_REAL:
+		{
+			struct config_real *conf = (struct config_real *) record;
+			double newval;
+
+			return parse_real(newvalue, &newval) && *conf->variable == newval;
+		}
+		case PGC_STRING:
+		{
+			struct config_string *conf = (struct config_string *) record;
+
+			return strcmp(*conf->variable, newvalue) == 0;
+		}
+	}
+
+	return false;
+}
+
+
 #ifdef EXEC_BACKEND
 
 /*
-- 
GitLab