diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index 21089df67947a2c055d5d5e75878d8ac6ae4e7c5..443cd40387fb5c80ae1824eae6b9b4c160764e16 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.209 2003/09/20 20:12:05 tgl Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.210 2003/10/03 19:26:49 tgl Exp $
 -->
 
 <Chapter Id="runtime">
@@ -2085,6 +2085,17 @@ SET ENABLE_SEQSCAN TO OFF;
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><varname>check_function_bodies</varname> (<type>boolean</type>)</term>
+      <listitem>
+       <para>
+        This parameter is normally true.  When set false, it disables
+	validation of the function body string in <command>CREATE FUNCTION</>.
+	Disabling validation is occasionally useful to avoid problems such as
+	forward references when restoring function definitions from a dump.
+       </para>
+      </listitem>
+     </varlistentry>
 
      <varlistentry>
       <indexterm>
diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c
index 99f07549bd275bcd215084493c7206e819ed8f9e..fde65fd109ecb6a55f6bc3d1bc14d7bb05d571cf 100644
--- a/src/backend/catalog/pg_proc.c
+++ b/src/backend/catalog/pg_proc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.108 2003/09/29 00:05:24 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.109 2003/10/03 19:26:49 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -34,6 +34,10 @@
 #include "utils/syscache.h"
 
 
+/* GUC parameter */
+bool		check_function_bodies = true;
+
+
 Datum		fmgr_internal_validator(PG_FUNCTION_ARGS);
 Datum		fmgr_c_validator(PG_FUNCTION_ARGS);
 Datum		fmgr_sql_validator(PG_FUNCTION_ARGS);
@@ -560,6 +564,11 @@ fmgr_internal_validator(PG_FUNCTION_ARGS)
 	Datum		tmp;
 	char	   *prosrc;
 
+	/*
+	 * We do not honor check_function_bodies since it's unlikely the
+	 * function name will be found later if it isn't there now.
+	 */
+
 	tuple = SearchSysCache(PROCOID,
 						   ObjectIdGetDatum(funcoid),
 						   0, 0, 0);
@@ -604,6 +613,12 @@ fmgr_c_validator(PG_FUNCTION_ARGS)
 	char	   *prosrc;
 	char	   *probin;
 
+	/*
+	 * It'd be most consistent to skip the check if !check_function_bodies,
+	 * but the purpose of that switch is to be helpful for pg_dump loading,
+	 * and for pg_dump loading it's much better if we *do* check.
+	 */
+
 	tuple = SearchSysCache(PROCOID,
 						   ObjectIdGetDatum(funcoid),
 						   0, 0, 0);
@@ -633,8 +648,7 @@ fmgr_c_validator(PG_FUNCTION_ARGS)
 /*
  * Validator for SQL language functions
  *
- * Parse it here in order to be sure that it contains no syntax
- * errors.
+ * Parse it here in order to be sure that it contains no syntax errors.
  */
 Datum
 fmgr_sql_validator(PG_FUNCTION_ARGS)
@@ -689,30 +703,34 @@ fmgr_sql_validator(PG_FUNCTION_ARGS)
 		}
 	}
 
-	tmp = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_prosrc, &isnull);
-	if (isnull)
-		elog(ERROR, "null prosrc");
+	/* Postpone body checks if !check_function_bodies */
+	if (check_function_bodies)
+	{
+		tmp = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_prosrc, &isnull);
+		if (isnull)
+			elog(ERROR, "null prosrc");
 
-	prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp));
+		prosrc = DatumGetCString(DirectFunctionCall1(textout, tmp));
 
-	/*
-	 * We can't do full prechecking of the function definition if there
-	 * are any polymorphic input types, because actual datatypes of
-	 * expression results will be unresolvable.  The check will be done at
-	 * runtime instead.
-	 *
-	 * We can run the text through the raw parser though; this will at least
-	 * catch silly syntactic errors.
-	 */
-	if (!haspolyarg)
-	{
-		querytree_list = pg_parse_and_rewrite(prosrc,
-											  proc->proargtypes,
-											  proc->pronargs);
-		check_sql_fn_retval(proc->prorettype, functyptype, querytree_list);
+		/*
+		 * We can't do full prechecking of the function definition if there
+		 * are any polymorphic input types, because actual datatypes of
+		 * expression results will be unresolvable.  The check will be done
+		 * at runtime instead.
+		 *
+		 * We can run the text through the raw parser though; this will at
+		 * least catch silly syntactic errors.
+		 */
+		if (!haspolyarg)
+		{
+			querytree_list = pg_parse_and_rewrite(prosrc,
+												  proc->proargtypes,
+												  proc->pronargs);
+			check_sql_fn_retval(proc->prorettype, functyptype, querytree_list);
+		}
+		else
+			querytree_list = pg_parse_query(prosrc);
 	}
-	else
-		querytree_list = pg_parse_query(prosrc);
 
 	ReleaseSysCache(tuple);
 
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 1b085104927552c249a902aa25666e72cac10b15..377993a37421558967335141b7f0ca8f82589789 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
- *	  $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.161 2003/09/29 00:05:25 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.162 2003/10/03 19:26:49 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -66,6 +66,7 @@
 
 /* XXX these should appear in other modules' header files */
 extern bool Log_connections;
+extern bool check_function_bodies;
 extern int	PreAuthDelay;
 extern int	AuthenticationTimeout;
 extern int	CheckPointTimeout;
@@ -821,6 +822,14 @@ static struct config_bool ConfigureNamesBool[] =
 		&add_missing_from,
 		true, NULL, NULL
 	},
+	{
+		{"check_function_bodies", PGC_USERSET, CLIENT_CONN_STATEMENT,
+			gettext_noop("check function bodies during CREATE FUNCTION"),
+			NULL
+		},
+		&check_function_bodies,
+		true, NULL, NULL
+	},
 
 	/* End-of-list marker */
 	{
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index c04aaab39bb7c7dc7fbe20c5513f94cbf47284a3..c880dc4031818843619f93c12eef6bc22ce38cd9 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -205,6 +205,7 @@
 # - Statement Behavior -
 
 #search_path = '$user,public'	# schema names
+#check_function_bodies = true
 #default_transaction_isolation = 'read committed'
 #default_transaction_read_only = false
 #statement_timeout = 0		# 0 is disabled, in milliseconds