diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 2a822d229860fbbecc718a96bf7338b51d80b77a..81ff16dd633915792e7e28efc8c9dee1c7507b17 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.131 2004/01/06 22:22:37 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.132 2004/01/19 19:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3523,7 +3523,7 @@ xlog_outrec(char *buf, XLogRecord *record)
  * GUC support
  */
 const char *
-assign_xlog_sync_method(const char *method, bool doit, bool interactive)
+assign_xlog_sync_method(const char *method, bool doit, GucSource source)
 {
 	int			new_sync_method;
 	int			new_sync_bit;
diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c
index 1d7e21e31951ac612cbf3777ebaca1cab9d250f5..6c243877011e6b1d4ff52cbf227b1c9de505670a 100644
--- a/src/backend/catalog/namespace.c
+++ b/src/backend/catalog/namespace.c
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.61 2003/12/29 21:33:09 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.62 2004/01/19 19:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -39,6 +39,7 @@
 #include "utils/acl.h"
 #include "utils/builtins.h"
 #include "utils/catcache.h"
+#include "utils/guc.h"
 #include "utils/inval.h"
 #include "utils/lsyscache.h"
 #include "utils/memutils.h"
@@ -1773,7 +1774,7 @@ RemoveTempRelationsCallback(int code, Datum arg)
 
 /* assign_hook: validate new search_path, do extra actions as needed */
 const char *
-assign_search_path(const char *newval, bool doit, bool interactive)
+assign_search_path(const char *newval, bool doit, GucSource source)
 {
 	char	   *rawname;
 	List	   *namelist;
@@ -1795,13 +1796,19 @@ assign_search_path(const char *newval, bool doit, bool interactive)
 	 * If we aren't inside a transaction, we cannot do database access so
 	 * cannot verify the individual names.	Must accept the list on faith.
 	 */
-	if (interactive && IsTransactionState())
+	if (source >= PGC_S_INTERACTIVE && IsTransactionState())
 	{
 		/*
 		 * Verify that all the names are either valid namespace names or
 		 * "$user".  We do not require $user to correspond to a valid
 		 * namespace.  We do not check for USAGE rights, either; should
 		 * we?
+		 *
+		 * When source == PGC_S_TEST, we are checking the argument of an
+		 * ALTER DATABASE SET or ALTER USER SET command.  It could be that
+		 * the intended use of the search path is for some other database,
+		 * so we should not error out if it mentions schemas not present
+		 * in the current database.  We reduce the message to NOTICE instead.
 		 */
 		foreach(l, namelist)
 		{
@@ -1812,7 +1819,7 @@ assign_search_path(const char *newval, bool doit, bool interactive)
 			if (!SearchSysCacheExists(NAMESPACENAME,
 									  CStringGetDatum(curname),
 									  0, 0, 0))
-				ereport(ERROR,
+				ereport((source == PGC_S_TEST) ? NOTICE : ERROR,
 						(errcode(ERRCODE_UNDEFINED_SCHEMA),
 					   errmsg("schema \"%s\" does not exist", curname)));
 		}
diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c
index 901188b2a36740c548b48333ae434df3641e6f3a..14c408e0010f7d396dc6eaa2f339fd36b3718949 100644
--- a/src/backend/commands/variable.c
+++ b/src/backend/commands/variable.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.92 2003/12/21 04:34:35 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.93 2004/01/19 19:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -48,7 +48,7 @@ extern char *tzname[];
  * assign_datestyle: GUC assign_hook for datestyle
  */
 const char *
-assign_datestyle(const char *value, bool doit, bool interactive)
+assign_datestyle(const char *value, bool doit, GucSource source)
 {
 	int			newDateStyle = DateStyle;
 	int			newDateOrder = DateOrder;
@@ -69,7 +69,7 @@ assign_datestyle(const char *value, bool doit, bool interactive)
 		/* syntax error in list */
 		pfree(rawstring);
 		freeList(elemlist);
-		if (interactive)
+		if (source >= PGC_S_INTERACTIVE)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 					 errmsg("invalid list syntax for parameter \"datestyle\"")));
@@ -137,7 +137,7 @@ assign_datestyle(const char *value, bool doit, bool interactive)
 			const char *subval;
 
 			subval = assign_datestyle(GetConfigOptionResetString("datestyle"),
-									  true, interactive);
+									  true, source);
 			if (scnt == 0)
 				newDateStyle = DateStyle;
 			if (ocnt == 0)
@@ -155,7 +155,7 @@ assign_datestyle(const char *value, bool doit, bool interactive)
 		}
 		else
 		{
-			if (interactive)
+			if (source >= PGC_S_INTERACTIVE)
 				ereport(ERROR,
 						(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 						 errmsg("unrecognized \"datestyle\" key word: \"%s\"",
@@ -173,7 +173,7 @@ assign_datestyle(const char *value, bool doit, bool interactive)
 
 	if (!ok)
 	{
-		if (interactive)
+		if (source >= PGC_S_INTERACTIVE)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 					 errmsg("conflicting \"datestyle\" specifications")));
@@ -386,7 +386,7 @@ tz_acceptable(void)
  * assign_timezone: GUC assign_hook for timezone
  */
 const char *
-assign_timezone(const char *value, bool doit, bool interactive)
+assign_timezone(const char *value, bool doit, GucSource source)
 {
 	char	   *result;
 	char	   *endptr;
@@ -444,7 +444,7 @@ assign_timezone(const char *value, bool doit, bool interactive)
 		pfree(val);
 		if (interval->month != 0)
 		{
-			if (interactive)
+			if (source >= PGC_S_INTERACTIVE)
 				ereport(ERROR,
 						(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 						 errmsg("invalid interval value for time zone: month not allowed")));
@@ -552,7 +552,7 @@ assign_timezone(const char *value, bool doit, bool interactive)
 				/* Complain if it was bad */
 				if (!known)
 				{
-					ereport(interactive ? ERROR : LOG,
+					ereport((source >= PGC_S_INTERACTIVE) ? ERROR : LOG,
 							(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 							 errmsg("unrecognized time zone name: \"%s\"",
 									value)));
@@ -560,7 +560,7 @@ assign_timezone(const char *value, bool doit, bool interactive)
 				}
 				if (!acceptable)
 				{
-					ereport(interactive ? ERROR : LOG,
+					ereport((source >= PGC_S_INTERACTIVE) ? ERROR : LOG,
 							(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 					errmsg("time zone \"%s\" appears to use leap seconds",
 						   value),
@@ -628,9 +628,9 @@ show_timezone(void)
  */
 
 const char *
-assign_XactIsoLevel(const char *value, bool doit, bool interactive)
+assign_XactIsoLevel(const char *value, bool doit, GucSource source)
 {
-	if (doit && interactive && SerializableSnapshot != NULL)
+	if (doit && source >= PGC_S_INTERACTIVE && SerializableSnapshot != NULL)
 		ereport(ERROR,
 				(errcode(ERRCODE_ACTIVE_SQL_TRANSACTION),
 				 errmsg("SET TRANSACTION ISOLATION LEVEL must be called before any query")));
@@ -690,10 +690,10 @@ show_XactIsoLevel(void)
  */
 
 bool
-assign_random_seed(double value, bool doit, bool interactive)
+assign_random_seed(double value, bool doit, GucSource source)
 {
 	/* Can't really roll back on error, so ignore non-interactive setting */
-	if (doit && interactive)
+	if (doit && source >= PGC_S_INTERACTIVE)
 		DirectFunctionCall1(setseed, Float8GetDatum(value));
 	return true;
 }
@@ -710,7 +710,7 @@ show_random_seed(void)
  */
 
 const char *
-assign_client_encoding(const char *value, bool doit, bool interactive)
+assign_client_encoding(const char *value, bool doit, GucSource source)
 {
 	int			encoding;
 
@@ -726,7 +726,7 @@ assign_client_encoding(const char *value, bool doit, bool interactive)
 	 */
 	if (SetClientEncoding(encoding, doit) < 0)
 	{
-		if (interactive)
+		if (source >= PGC_S_INTERACTIVE)
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 				  errmsg("conversion between %s and %s is not supported",
@@ -748,7 +748,7 @@ assign_client_encoding(const char *value, bool doit, bool interactive)
  * because of the NAMEDATALEN limit on names.
  */
 const char *
-assign_session_authorization(const char *value, bool doit, bool interactive)
+assign_session_authorization(const char *value, bool doit, GucSource source)
 {
 	AclId		usesysid = 0;
 	bool		is_superuser = false;
@@ -791,7 +791,7 @@ assign_session_authorization(const char *value, bool doit, bool interactive)
 								 0, 0, 0);
 		if (!HeapTupleIsValid(userTup))
 		{
-			if (interactive)
+			if (source >= PGC_S_INTERACTIVE)
 				ereport(ERROR,
 						(errcode(ERRCODE_UNDEFINED_OBJECT),
 						 errmsg("user \"%s\" does not exist", value)));
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index 35ef845c5d08356e47dfc9ee7c0c53e32d7516e9..5fa4be73c433b3d1d7fec2f33fc8295fc6befd3b 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.123 2003/12/21 04:34:35 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.124 2004/01/19 19:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3919,7 +3919,7 @@ EncodeInterval(struct tm * tm, fsec_t fsec, int style, char *str)
 
 /* GUC assign_hook for australian_timezones */
 bool
-ClearDateCache(bool newval, bool doit, bool interactive)
+ClearDateCache(bool newval, bool doit, GucSource source)
 {
 	int			i;
 
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index 15ae8ce953c229bc77e0b2a46b98b6af9820d099..5c2e951be10d7846fc8b05fcaa438c90da6a50ba 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -4,7 +4,7 @@
  *
  * Portions Copyright (c) 2002-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/backend/utils/adt/pg_locale.c,v 1.24 2003/11/29 19:51:59 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/pg_locale.c,v 1.25 2004/01/19 19:04:40 tgl Exp $
  *
  *-----------------------------------------------------------------------
  */
@@ -73,7 +73,7 @@ char	   *locale_time;
  * valid.  (See explanation at the top of this file.)
  */
 static const char *
-locale_xxx_assign(int category, const char *value, bool doit, bool interactive)
+locale_xxx_assign(int category, const char *value, bool doit, GucSource source)
 {
 	char	   *save;
 
@@ -99,21 +99,21 @@ locale_xxx_assign(int category, const char *value, bool doit, bool interactive)
 
 
 const char *
-locale_monetary_assign(const char *value, bool doit, bool interactive)
+locale_monetary_assign(const char *value, bool doit, GucSource source)
 {
-	return locale_xxx_assign(LC_MONETARY, value, doit, interactive);
+	return locale_xxx_assign(LC_MONETARY, value, doit, source);
 }
 
 const char *
-locale_numeric_assign(const char *value, bool doit, bool interactive)
+locale_numeric_assign(const char *value, bool doit, GucSource source)
 {
-	return locale_xxx_assign(LC_NUMERIC, value, doit, interactive);
+	return locale_xxx_assign(LC_NUMERIC, value, doit, source);
 }
 
 const char *
-locale_time_assign(const char *value, bool doit, bool interactive)
+locale_time_assign(const char *value, bool doit, GucSource source)
 {
-	return locale_xxx_assign(LC_TIME, value, doit, interactive);
+	return locale_xxx_assign(LC_TIME, value, doit, source);
 }
 
 
@@ -121,7 +121,7 @@ locale_time_assign(const char *value, bool doit, bool interactive)
  * We allow LC_MESSAGES to actually be set globally.
  */
 const char *
-locale_messages_assign(const char *value, bool doit, bool interactive)
+locale_messages_assign(const char *value, bool doit, GucSource source)
 {
 	/*
 	 * LC_MESSAGES category does not exist everywhere, but accept it
@@ -134,7 +134,7 @@ locale_messages_assign(const char *value, bool doit, bool interactive)
 			return NULL;
 	}
 	else
-		value = locale_xxx_assign(LC_MESSAGES, value, false, interactive);
+		value = locale_xxx_assign(LC_MESSAGES, value, false, source);
 #endif
 	return value;
 }
diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c
index 63b14266af1160c961e1f25a1c55a52e49911bab..78944a57951d2275ee2914ed148d4c8a8d6b2be1 100644
--- a/src/backend/utils/adt/regexp.c
+++ b/src/backend/utils/adt/regexp.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/regexp.c,v 1.50 2003/11/29 19:51:59 pgsql Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/regexp.c,v 1.51 2004/01/19 19:04:40 tgl Exp $
  *
  *		Alistair Crooks added the code for the regex caching
  *		agc - cached the regular expressions used - there's a good chance
@@ -32,6 +32,7 @@
 #include "regex/regex.h"
 #include "mb/pg_wchar.h"
 #include "utils/builtins.h"
+#include "utils/guc.h"
 
 
 /* GUC-settable flavor parameter */
@@ -229,7 +230,7 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
  */
 const char *
 assign_regex_flavor(const char *value,
-					bool doit, bool interactive)
+					bool doit, GucSource source)
 {
 	if (strcasecmp(value, "advanced") == 0)
 	{
diff --git a/src/backend/utils/misc/README b/src/backend/utils/misc/README
index bf6c8c7cc59a415d39f2bc59ae7a14524a22913a..12a2cdef03654fb2ff1c411d2ed6d358a29fc756 100644
--- a/src/backend/utils/misc/README
+++ b/src/backend/utils/misc/README
@@ -1,4 +1,4 @@
-$PostgreSQL: pgsql/src/backend/utils/misc/README,v 1.3 2003/11/29 19:52:03 pgsql Exp $
+$PostgreSQL: pgsql/src/backend/utils/misc/README,v 1.4 2004/01/19 19:04:40 tgl Exp $
 
 
 GUC IMPLEMENTATION NOTES
@@ -19,29 +19,30 @@ to change when a GUC variable is set.  Show hooks are used to modify
 the default SHOW display for a variable.
 
 If an assign_hook is provided, it points to a function of the signature
-	bool assign_hook(newvalue, bool doit, bool interactive)
-where the type of 'newvalue' matches the kind of variable.  This function
+	bool assign_hook(newvalue, bool doit, GucSource source)
+where the type of "newvalue" matches the kind of variable.  This function
 is called immediately before actually setting the variable's value (so it
 can look at the actual variable to determine the old value).  If the
 function returns "true" then the assignment is completed; if it returns
 "false" then newvalue is considered invalid and the assignment is not
 performed.  If "doit" is false then the function should simply check
-validity of newvalue and not change any derived state.  "interactive" is
-true when we are performing a SET command; in this case it is okay for the
-assign_hook to raise an error via elog().  If the function returns false
-for an interactive assignment then guc.c will report a generic "invalid
-value" error message.  (An internal elog() in an assign_hook is only
-needed if you want to generate a specialized error message.)  But when
-"interactive" is false we are reading a non-interactive option source,
-such as postgresql.conf.  In this case the assign_hook should *not* elog
-but should just return false if it doesn't like the newvalue.  (An
-elog(LOG) call would be acceptable if you feel a need for a custom
-complaint in this situation.)
+validity of newvalue and not change any derived state.  The "source" parameter
+indicates where the new value came from.  If it is >= PGC_S_INTERACTIVE,
+then we are performing an interactive assignment (e.g., a SET command).
+In such cases it is okay for the assign_hook to raise an error via ereport().
+If the function returns false for an interactive assignment then guc.c will
+report a generic "invalid value" error message.  (An internal ereport() in
+an assign_hook is only needed if you want to generate a specialized error
+message.)  But when source < PGC_S_INTERACTIVE, we are reading a
+non-interactive option source, such as postgresql.conf.  In this case the
+assign_hook should *not* ereport but should just return false if it doesn't
+like the newvalue.  (An ereport(LOG) call would be acceptable if you feel a
+need for a custom complaint in this situation.)
 
 For string variables, the signature for assign hooks is a bit different:
 	const char *assign_hook(const char *newvalue,
 				bool doit,
-				bool interactive)
+				GucSource source)
 The meanings of the parameters are the same as for the other types of GUC
 variables, but the return value is handled differently:
 	NULL --- assignment fails (like returning false for other datatypes)
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index f0a0a88dd60c3062da2dbcc28c25598054254240..45bbfc96ea0b0e5b2d67210f5e97b1a0295c893b 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.176 2004/01/06 17:26:23 neilc Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.177 2004/01/19 19:04:40 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -24,7 +24,6 @@
 #include "utils/guc.h"
 #include "utils/guc_tables.h"
 
-#include "access/xlog.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_type.h"
 #include "commands/async.h"
@@ -52,7 +51,6 @@
 #include "tcop/tcopprot.h"
 #include "utils/array.h"
 #include "utils/builtins.h"
-#include "utils/datetime.h"
 #include "utils/pg_locale.h"
 #include "pgstat.h"
 
@@ -81,22 +79,22 @@ extern char *Syslog_facility;
 extern char *Syslog_ident;
 
 static const char *assign_facility(const char *facility,
-				bool doit, bool interactive);
+				bool doit, GucSource source);
 #endif
 
 static const char *assign_defaultxactisolevel(const char *newval,
-						   bool doit, bool interactive);
+						   bool doit, GucSource source);
 static const char *assign_log_min_messages(const char *newval,
-						bool doit, bool interactive);
+						bool doit, GucSource source);
 static const char *assign_client_min_messages(const char *newval,
-						   bool doit, bool interactive);
+						   bool doit, GucSource source);
 static const char *assign_min_error_statement(const char *newval, bool doit,
-						   bool interactive);
+						   GucSource source);
 static const char *assign_msglvl(int *var, const char *newval,
-			  bool doit, bool interactive);
+			  bool doit, GucSource source);
 static const char *assign_log_error_verbosity(const char *newval, bool doit,
-						   bool interactive);
-static bool assign_phony_autocommit(bool newval, bool doit, bool interactive);
+						   GucSource source);
+static bool assign_phony_autocommit(bool newval, bool doit, GucSource source);
 
 
 /*
@@ -227,16 +225,18 @@ const char *const GucContext_Names[] =
  */
 const char *const GucSource_Names[] =
 {
-	 /* PGC_S_DEFAULT */ "default",
-	 /* PGC_S_ENV_VAR */ "environment variable",
-	 /* PGC_S_FILE */ "configuration file",
-	 /* PGC_S_ARGV */ "command line",
-	 /* PGC_S_UNPRIVILEGED */ "unprivileged",
-	 /* PGC_S_DATABASE */ "database",
-	 /* PGC_S_USER */ "user",
-	 /* PGC_S_CLIENT */ "client",
-	 /* PGC_S_OVERRIDE */ "override",
-	 /* PGC_S_SESSION */ "session"
+	/* PGC_S_DEFAULT */ "default",
+	/* PGC_S_ENV_VAR */ "environment variable",
+	/* PGC_S_FILE */ "configuration file",
+	/* PGC_S_ARGV */ "command line",
+	/* PGC_S_UNPRIVILEGED */ "unprivileged",
+	/* PGC_S_DATABASE */ "database",
+	/* PGC_S_USER */ "user",
+	/* PGC_S_CLIENT */ "client",
+	/* PGC_S_OVERRIDE */ "override",
+	/* PGC_S_INTERACTIVE */ "interactive",
+	/* PGC_S_TEST */ "test",
+	/* PGC_S_SESSION */ "session"
 };
 
 /*
@@ -1893,7 +1893,8 @@ InitializeGUCOptions(void)
 					struct config_bool *conf = (struct config_bool *) gconf;
 
 					if (conf->assign_hook)
-						if (!(*conf->assign_hook) (conf->reset_val, true, false))
+						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;
@@ -1914,7 +1915,8 @@ InitializeGUCOptions(void)
 					Assert(conf->gen.context != PGC_USERLIMIT ||
 						   strcmp(conf->gen.name, "log_min_duration_statement") == 0);
 					if (conf->assign_hook)
-						if (!(*conf->assign_hook) (conf->reset_val, true, false))
+						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;
@@ -1929,7 +1931,8 @@ InitializeGUCOptions(void)
 					Assert(conf->reset_val <= conf->max);
 					Assert(conf->gen.context != PGC_USERLIMIT);
 					if (conf->assign_hook)
-						if (!(*conf->assign_hook) (conf->reset_val, true, false))
+						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;
@@ -1971,7 +1974,8 @@ InitializeGUCOptions(void)
 					{
 						const char *newstr;
 
-						newstr = (*conf->assign_hook) (str, true, false);
+						newstr = (*conf->assign_hook) (str, true,
+													   PGC_S_DEFAULT);
 						if (newstr == NULL)
 						{
 							elog(FATAL, "failed to initialize %s to \"%s\"",
@@ -2065,7 +2069,8 @@ ResetAllOptions(void)
 					struct config_bool *conf = (struct config_bool *) gconf;
 
 					if (conf->assign_hook)
-						if (!(*conf->assign_hook) (conf->reset_val, true, true))
+						if (!(*conf->assign_hook) (conf->reset_val, true,
+												   PGC_S_SESSION))
 							elog(ERROR, "failed to reset %s", conf->gen.name);
 					*conf->variable = conf->reset_val;
 					conf->tentative_val = conf->reset_val;
@@ -2080,7 +2085,8 @@ ResetAllOptions(void)
 					struct config_int *conf = (struct config_int *) gconf;
 
 					if (conf->assign_hook)
-						if (!(*conf->assign_hook) (conf->reset_val, true, true))
+						if (!(*conf->assign_hook) (conf->reset_val, true,
+												   PGC_S_SESSION))
 							elog(ERROR, "failed to reset %s", conf->gen.name);
 					*conf->variable = conf->reset_val;
 					conf->tentative_val = conf->reset_val;
@@ -2095,7 +2101,8 @@ ResetAllOptions(void)
 					struct config_real *conf = (struct config_real *) gconf;
 
 					if (conf->assign_hook)
-						if (!(*conf->assign_hook) (conf->reset_val, true, true))
+						if (!(*conf->assign_hook) (conf->reset_val, true,
+												   PGC_S_SESSION))
 							elog(ERROR, "failed to reset %s", conf->gen.name);
 					*conf->variable = conf->reset_val;
 					conf->tentative_val = conf->reset_val;
@@ -2123,7 +2130,8 @@ ResetAllOptions(void)
 					{
 						const char *newstr;
 
-						newstr = (*conf->assign_hook) (str, true, true);
+						newstr = (*conf->assign_hook) (str, true,
+													   PGC_S_SESSION);
 						if (newstr == NULL)
 							elog(ERROR, "failed to reset %s", conf->gen.name);
 						else if (newstr != str)
@@ -2198,7 +2206,7 @@ AtEOXact_GUC(bool isCommit)
 					{
 						if (conf->assign_hook)
 							if (!(*conf->assign_hook) (conf->session_val,
-													   true, false))
+													   true, PGC_S_OVERRIDE))
 								elog(LOG, "failed to commit %s",
 									 conf->gen.name);
 						*conf->variable = conf->session_val;
@@ -2222,7 +2230,7 @@ AtEOXact_GUC(bool isCommit)
 					{
 						if (conf->assign_hook)
 							if (!(*conf->assign_hook) (conf->session_val,
-													   true, false))
+													   true, PGC_S_OVERRIDE))
 								elog(LOG, "failed to commit %s",
 									 conf->gen.name);
 						*conf->variable = conf->session_val;
@@ -2246,7 +2254,7 @@ AtEOXact_GUC(bool isCommit)
 					{
 						if (conf->assign_hook)
 							if (!(*conf->assign_hook) (conf->session_val,
-													   true, false))
+													   true, PGC_S_OVERRIDE))
 								elog(LOG, "failed to commit %s",
 									 conf->gen.name);
 						*conf->variable = conf->session_val;
@@ -2277,7 +2285,8 @@ AtEOXact_GUC(bool isCommit)
 						{
 							const char *newstr;
 
-							newstr = (*conf->assign_hook) (str, true, false);
+							newstr = (*conf->assign_hook) (str, true,
+														   PGC_S_OVERRIDE);
 							if (newstr == NULL)
 								elog(LOG, "failed to commit %s",
 									 conf->gen.name);
@@ -2500,7 +2509,6 @@ set_config_option(const char *name, const char *value,
 {
 	struct config_generic *record;
 	int			elevel;
-	bool		interactive;
 	bool		makeDefault;
 	bool		changeVal_orig;
 
@@ -2610,9 +2618,6 @@ set_config_option(const char *name, const char *value,
 			break;
 	}
 
-	/* Should we report errors interactively? */
-	interactive = (source >= PGC_S_SESSION);
-
 	/*
 	 * Should we set reset/session values?	(If so, the behavior is not
 	 * transactional.)
@@ -2687,7 +2692,7 @@ set_config_option(const char *name, const char *value,
 				}
 
 				if (conf->assign_hook)
-					if (!(*conf->assign_hook) (newval, changeVal, interactive))
+					if (!(*conf->assign_hook) (newval, changeVal, source))
 					{
 						ereport(elevel,
 								(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -2784,7 +2789,7 @@ set_config_option(const char *name, const char *value,
 				}
 
 				if (conf->assign_hook)
-					if (!(*conf->assign_hook) (newval, changeVal, interactive))
+					if (!(*conf->assign_hook) (newval, changeVal, source))
 					{
 						ereport(elevel,
 								(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -2880,7 +2885,7 @@ set_config_option(const char *name, const char *value,
 				}
 
 				if (conf->assign_hook)
-					if (!(*conf->assign_hook) (newval, changeVal, interactive))
+					if (!(*conf->assign_hook) (newval, changeVal, source))
 					{
 						ereport(elevel,
 								(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -2949,9 +2954,9 @@ set_config_option(const char *name, const char *value,
 
 						/* all USERLIMIT strings are message levels */
 						assign_msglvl(&old_int_value, conf->reset_val,
-									  true, interactive);
+									  true, source);
 						assign_msglvl(&new_int_value, newval,
-									  true, interactive);
+									  true, source);
 						/* Limit non-superuser changes */
 						if (source > PGC_S_UNPRIVILEGED &&
 							new_int_value > old_int_value &&
@@ -3008,7 +3013,7 @@ set_config_option(const char *name, const char *value,
 					const char *hookresult;
 
 					hookresult = (*conf->assign_hook) (newval,
-													   changeVal, interactive);
+													   changeVal, source);
 					guc_string_workspace = NULL;
 					if (hookresult == NULL)
 					{
@@ -4189,7 +4194,7 @@ GUCArrayAdd(ArrayType *array, const char *name, const char *value)
 	/* test if the option is valid */
 	set_config_option(name, value,
 					  superuser() ? PGC_SUSET : PGC_USERSET,
-					  PGC_S_SESSION, false, false);
+					  PGC_S_TEST, false, false);
 
 	/* convert name to canonical spelling, so we can use plain strcmp */
 	(void) GetConfigOptionByName(name, &varname);
@@ -4268,7 +4273,7 @@ GUCArrayDelete(ArrayType *array, const char *name)
 	/* test if the option is valid */
 	set_config_option(name, NULL,
 					  superuser() ? PGC_SUSET : PGC_USERSET,
-					  PGC_S_SESSION, false, false);
+					  PGC_S_TEST, false, false);
 
 	/* convert name to canonical spelling, so we can use plain strcmp */
 	(void) GetConfigOptionByName(name, &varname);
@@ -4333,7 +4338,7 @@ GUCArrayDelete(ArrayType *array, const char *name)
 #ifdef HAVE_SYSLOG
 
 static const char *
-assign_facility(const char *facility, bool doit, bool interactive)
+assign_facility(const char *facility, bool doit, GucSource source)
 {
 	if (strcasecmp(facility, "LOCAL0") == 0)
 		return facility;
@@ -4357,7 +4362,7 @@ assign_facility(const char *facility, bool doit, bool interactive)
 
 
 static const char *
-assign_defaultxactisolevel(const char *newval, bool doit, bool interactive)
+assign_defaultxactisolevel(const char *newval, bool doit, GucSource source)
 {
 	if (strcasecmp(newval, "serializable") == 0)
 	{
@@ -4386,26 +4391,26 @@ assign_defaultxactisolevel(const char *newval, bool doit, bool interactive)
 
 static const char *
 assign_log_min_messages(const char *newval,
-						bool doit, bool interactive)
+						bool doit, GucSource source)
 {
-	return (assign_msglvl(&log_min_messages, newval, doit, interactive));
+	return (assign_msglvl(&log_min_messages, newval, doit, source));
 }
 
 static const char *
 assign_client_min_messages(const char *newval,
-						   bool doit, bool interactive)
+						   bool doit, GucSource source)
 {
-	return (assign_msglvl(&client_min_messages, newval, doit, interactive));
+	return (assign_msglvl(&client_min_messages, newval, doit, source));
 }
 
 static const char *
-assign_min_error_statement(const char *newval, bool doit, bool interactive)
+assign_min_error_statement(const char *newval, bool doit, GucSource source)
 {
-	return (assign_msglvl(&log_min_error_statement, newval, doit, interactive));
+	return (assign_msglvl(&log_min_error_statement, newval, doit, source));
 }
 
 static const char *
-assign_msglvl(int *var, const char *newval, bool doit, bool interactive)
+assign_msglvl(int *var, const char *newval, bool doit, GucSource source)
 {
 	if (strcasecmp(newval, "debug") == 0)
 	{
@@ -4479,7 +4484,7 @@ assign_msglvl(int *var, const char *newval, bool doit, bool interactive)
 }
 
 static const char *
-assign_log_error_verbosity(const char *newval, bool doit, bool interactive)
+assign_log_error_verbosity(const char *newval, bool doit, GucSource source)
 {
 	if (strcasecmp(newval, "terse") == 0)
 	{
@@ -4502,11 +4507,11 @@ assign_log_error_verbosity(const char *newval, bool doit, bool interactive)
 }
 
 static bool
-assign_phony_autocommit(bool newval, bool doit, bool interactive)
+assign_phony_autocommit(bool newval, bool doit, GucSource source)
 {
 	if (!newval)
 	{
-		if (doit && interactive)
+		if (doit && source >= PGC_S_INTERACTIVE)
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 				errmsg("SET AUTOCOMMIT TO OFF is no longer supported")));
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index e4f5b7182c24b30444713d164ab3c3ef89c46b01..d0ff1d99f5052219f4be9aa664f2f1acd0d450df 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.47 2004/01/06 17:26:23 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.48 2004/01/19 19:04:40 tgl Exp $
  */
 #ifndef XLOG_H
 #define XLOG_H
@@ -222,7 +222,4 @@ extern XLogRecPtr GetRedoRecPtr(void);
  */
 extern XLogRecPtr GetUndoRecPtr(void);
 
-extern const char *assign_xlog_sync_method(const char *method,
-						bool doit, bool interactive);
-
 #endif   /* XLOG_H */
diff --git a/src/include/catalog/namespace.h b/src/include/catalog/namespace.h
index 2f613ff2c254ed3020fa5a4065c25b3917dabe95..7a0cfd70994ecade27356d1bc1732aebabb1507b 100644
--- a/src/include/catalog/namespace.h
+++ b/src/include/catalog/namespace.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/namespace.h,v 1.29 2003/11/29 22:40:58 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/namespace.h,v 1.30 2004/01/19 19:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -95,9 +95,6 @@ extern void AtEOXact_Namespace(bool isCommit);
 /* stuff for search_path GUC variable */
 extern char *namespace_search_path;
 
-extern const char *assign_search_path(const char *newval,
-				   bool doit, bool interactive);
-
 extern List *fetch_search_path(bool includeImplicit);
 
 #endif   /* NAMESPACE_H */
diff --git a/src/include/commands/variable.h b/src/include/commands/variable.h
index 0c3c8388e45fc5cb522faf68c67af5fd7d9ae981..7acce7d195ae2f5ee2190520ebdeb6a98f5d70d7 100644
--- a/src/include/commands/variable.h
+++ b/src/include/commands/variable.h
@@ -2,27 +2,32 @@
  * variable.h
  *		Routines for handling specialized SET variables.
  *
- * $PostgreSQL: pgsql/src/include/commands/variable.h,v 1.22 2003/11/29 22:40:59 pgsql Exp $
+ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
  *
+ * $PostgreSQL: pgsql/src/include/commands/variable.h,v 1.23 2004/01/19 19:04:40 tgl Exp $
  */
 #ifndef VARIABLE_H
 #define VARIABLE_H
 
+#include "utils/guc.h"
+
+
 extern const char *assign_datestyle(const char *value,
-				 bool doit, bool interactive);
+				 bool doit, GucSource source);
 extern const char *assign_timezone(const char *value,
-				bool doit, bool interactive);
+				bool doit, GucSource source);
 extern const char *show_timezone(void);
 extern const char *assign_XactIsoLevel(const char *value,
-					bool doit, bool interactive);
+					bool doit, GucSource source);
 extern const char *show_XactIsoLevel(void);
 extern bool assign_random_seed(double value,
-				   bool doit, bool interactive);
+				   bool doit, GucSource source);
 extern const char *show_random_seed(void);
 extern const char *assign_client_encoding(const char *value,
-					   bool doit, bool interactive);
+					   bool doit, GucSource source);
 extern const char *assign_session_authorization(const char *value,
-							 bool doit, bool interactive);
+							 bool doit, GucSource source);
 extern const char *show_session_authorization(void);
 
 #endif   /* VARIABLE_H */
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index fa1e8b6c08b73813b74564eddd23fcb75375eab2..dc5e2f267cc7dfd94d0c6f57317d90ed2a7b0222 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.232 2003/12/01 23:12:16 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.233 2004/01/19 19:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -16,7 +16,6 @@
 
 #include "fmgr.h"
 #include "nodes/parsenodes.h"
-#include "storage/itemptr.h"	/* for setLastTid() */
 
 /*
  *		Defined in adt/
@@ -415,8 +414,6 @@ extern Datum texticregexeq(PG_FUNCTION_ARGS);
 extern Datum texticregexne(PG_FUNCTION_ARGS);
 extern Datum textregexsubstr(PG_FUNCTION_ARGS);
 extern Datum similar_escape(PG_FUNCTION_ARGS);
-extern const char *assign_regex_flavor(const char *value,
-					bool doit, bool interactive);
 
 /* regproc.c */
 extern Datum regprocin(PG_FUNCTION_ARGS);
@@ -483,7 +480,6 @@ extern Datum tidsend(PG_FUNCTION_ARGS);
 extern Datum tideq(PG_FUNCTION_ARGS);
 extern Datum currtid_byreloid(PG_FUNCTION_ARGS);
 extern Datum currtid_byrelname(PG_FUNCTION_ARGS);
-extern void setLastTid(const ItemPointer tid);
 
 /* varchar.c */
 extern Datum bpcharin(PG_FUNCTION_ARGS);
diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h
index cbb0d39e093b42d3e32771cf2fc76fae95895bec..34a98454acce5dd9a9bf7a099b77b34c34f307bf 100644
--- a/src/include/utils/datetime.h
+++ b/src/include/utils/datetime.h
@@ -9,7 +9,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/datetime.h,v 1.46 2003/11/29 22:41:15 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/utils/datetime.h,v 1.47 2004/01/19 19:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -318,7 +318,6 @@ extern int	EncodeInterval(struct tm * tm, fsec_t fsec, int style, char *str);
 
 extern int	DecodeSpecial(int field, char *lowtoken, int *val);
 extern int	DecodeUnits(int field, char *lowtoken, int *val);
-extern bool ClearDateCache(bool newval, bool doit, bool interactive);
 
 extern int	j2day(int jd);
 
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 29d731146d3ffe147687dfd4eebd44d27c3de847..597f10069fdbf062729c1d6a3850a6a329a6a0ec 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -7,7 +7,7 @@
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
- * $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.43 2003/12/01 22:08:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.44 2004/01/19 19:04:40 tgl Exp $
  *--------------------------------------------------------------------
  */
 #ifndef GUC_H
@@ -76,6 +76,15 @@ typedef enum
  *
  * PGC_S_UNPRIVILEGED isn't actually a source value, but the dividing line
  * between privileged and unprivileged sources for USERLIMIT purposes.
+ * Similarly, PGC_S_INTERACTIVE isn't a real source value, but is the
+ * dividing line between "interactive" and "non-interactive" sources for
+ * error reporting purposes.
+ *
+ * PGC_S_TEST is used when testing values to be stored as per-database or
+ * per-user defaults ("doit" will always be false, so this never gets stored
+ * as the actual source of any value).  This is an interactive case, but
+ * it needs its own source value because some assign hooks need to make
+ * different validity checks in this case.
  */
 typedef enum
 {
@@ -88,6 +97,8 @@ typedef enum
 	PGC_S_USER,					/* per-user setting */
 	PGC_S_CLIENT,				/* from client connection request */
 	PGC_S_OVERRIDE,				/* special case to forcibly set default */
+	PGC_S_INTERACTIVE,			/* dividing line for error reporting */
+	PGC_S_TEST,					/* test per-database or per-user setting */
 	PGC_S_SESSION				/* SET command */
 } GucSource;
 
@@ -152,4 +163,22 @@ void		write_nondefault_variables(GucContext context);
 void		read_nondefault_variables(void);
 #endif
 
+/*
+ * The following functions are not in guc.c, but are declared here to avoid
+ * having to include guc.h in some widely used headers that it really doesn't
+ * belong in.
+ */
+
+/* in utils/adt/datetime.c */
+extern bool ClearDateCache(bool newval, bool doit, GucSource source);
+/* in utils/adt/regexp.c */
+extern const char *assign_regex_flavor(const char *value,
+					bool doit, GucSource source);
+/* in catalog/namespace.c */
+extern const char *assign_search_path(const char *newval,
+				   bool doit, GucSource source);
+/* in access/transam/xlog.c */
+extern const char *assign_xlog_sync_method(const char *method,
+						bool doit, GucSource source);
+
 #endif   /* GUC_H */
diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h
index c596e964eba403c2f1369aad458b1964fb4fe6d4..47e0339dafae0dad28372ac852cf7847c168594b 100644
--- a/src/include/utils/guc_tables.h
+++ b/src/include/utils/guc_tables.h
@@ -7,7 +7,7 @@
  *
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  *
- *	  $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.8 2003/12/03 18:52:00 joe Exp $
+ *	  $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.9 2004/01/19 19:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -113,7 +113,7 @@ struct config_bool
 	/* (all but reset_val are constants) */
 	bool	   *variable;
 	bool		reset_val;
-	bool		(*assign_hook) (bool newval, bool doit, bool interactive);
+	bool		(*assign_hook) (bool newval, bool doit, GucSource source);
 	const char *(*show_hook) (void);
 	/* variable fields, initialized at runtime: */
 	bool		session_val;
@@ -129,7 +129,7 @@ struct config_int
 	int			reset_val;
 	int			min;
 	int			max;
-	bool		(*assign_hook) (int newval, bool doit, bool interactive);
+	bool		(*assign_hook) (int newval, bool doit, GucSource source);
 	const char *(*show_hook) (void);
 	/* variable fields, initialized at runtime: */
 	int			session_val;
@@ -145,7 +145,7 @@ struct config_real
 	double		reset_val;
 	double		min;
 	double		max;
-	bool		(*assign_hook) (double newval, bool doit, bool interactive);
+	bool		(*assign_hook) (double newval, bool doit, GucSource source);
 	const char *(*show_hook) (void);
 	/* variable fields, initialized at runtime: */
 	double		session_val;
@@ -159,7 +159,7 @@ struct config_string
 	/* (all are constants) */
 	char	  **variable;
 	const char *boot_val;
-	const char *(*assign_hook) (const char *newval, bool doit, bool interactive);
+	const char *(*assign_hook) (const char *newval, bool doit, GucSource source);
 	const char *(*show_hook) (void);
 	/* variable fields, initialized at runtime: */
 	char	   *reset_val;
diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h
index ae2d13752199271d6731440c50732ea698fc4357..970724ad24f35895682330bfb5452bb86005cd7a 100644
--- a/src/include/utils/pg_locale.h
+++ b/src/include/utils/pg_locale.h
@@ -2,7 +2,7 @@
  *
  * PostgreSQL locale utilities
  *
- * $PostgreSQL: pgsql/src/include/utils/pg_locale.h,v 1.16 2003/11/29 22:41:16 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/utils/pg_locale.h,v 1.17 2004/01/19 19:04:40 tgl Exp $
  *
  * Copyright (c) 2002-2003, PostgreSQL Global Development Group
  *
@@ -14,19 +14,22 @@
 
 #include <locale.h>
 
+#include "utils/guc.h"
+
+
 extern char *locale_messages;
 extern char *locale_monetary;
 extern char *locale_numeric;
 extern char *locale_time;
 
 extern const char *locale_messages_assign(const char *value,
-					   bool doit, bool interactive);
+					   bool doit, GucSource source);
 extern const char *locale_monetary_assign(const char *value,
-					   bool doit, bool interactive);
+					   bool doit, GucSource source);
 extern const char *locale_numeric_assign(const char *value,
-					  bool doit, bool interactive);
+					  bool doit, GucSource source);
 extern const char *locale_time_assign(const char *value,
-				   bool doit, bool interactive);
+				   bool doit, GucSource source);
 
 extern bool lc_collate_is_c(void);
 
diff --git a/src/interfaces/ecpg/pgtypeslib/dt.h b/src/interfaces/ecpg/pgtypeslib/dt.h
index 2cbc58984bdf4918378d9bae0a1bbda1b5260b3d..fa74a23f4ba180738f0c7ce401e4f3387a8a9c5f 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt.h
+++ b/src/interfaces/ecpg/pgtypeslib/dt.h
@@ -298,7 +298,6 @@ int			EncodeInterval(struct tm * tm, fsec_t fsec, int style, char *str);
 int			tm2timestamp(struct tm *, fsec_t, int *, timestamp *);
 
 int			DecodeUnits(int field, char *lowtoken, int *val);
-bool		ClearDateCache(bool, bool, bool);
 
 bool		CheckDateTokenTables(void);