diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c
index 71cb21822e95dec6ebaec12c1206b361362ae0ae..90c41f57ee8a73ec206e60e6ca79fdd2d8b0531f 100644
--- a/src/backend/catalog/pg_proc.c
+++ b/src/backend/catalog/pg_proc.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.26 1999/02/21 03:48:32 scrappy Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.27 1999/04/18 02:57:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -26,6 +26,7 @@
 #include "parser/parse_node.h"
 #include "tcop/tcopprot.h"
 #include "utils/builtins.h"
+#include "utils/fmgrtab.h"
 #include "utils/lsyscache.h"
 #include "utils/sets.h"
 #include "utils/syscache.h"
@@ -37,7 +38,7 @@
 #endif
 
 /* ----------------------------------------------------------------
- *		ProcedureDefine
+ *		ProcedureCreate
  * ----------------------------------------------------------------
  */
 Oid
@@ -94,7 +95,7 @@ ProcedureCreate(char *procedureName,
 		if (strcmp(strVal(t), "opaque") == 0)
 		{
 			if (strcmp(languageName, "sql") == 0)
-				elog(ERROR, "ProcedureDefine: sql functions cannot take type \"opaque\"");
+				elog(ERROR, "ProcedureCreate: sql functions cannot take type \"opaque\"");
 			toid = 0;
 		}
 		else
@@ -220,6 +221,32 @@ ProcedureCreate(char *procedureName,
 		pg_checkretval(typeObjectId, querytree_list);
 	}
 
+	/*
+	 * If this is an internal procedure, check that the given internal
+	 * function name (the 'prosrc' value) is a known builtin function.
+	 *
+	 * NOTE: in Postgres versions before 6.5, the SQL name of the created
+	 * function could not be different from the internal name, and 'prosrc'
+	 * wasn't used.  So there is code out there that does CREATE FUNCTION
+	 * xyz AS '' LANGUAGE 'internal'.  To preserve some modicum of
+	 * backwards compatibility, accept an empty 'prosrc' value as meaning
+	 * the supplied SQL function name.
+	 */
+
+	if (strcmp(languageName, "internal") == 0)
+	{
+		if (strlen(prosrc) == 0)
+			prosrc = procedureName;
+		if (fmgr_lookupByName(prosrc) == (func_ptr) NULL)
+			elog(ERROR,
+				 "ProcedureCreate: there is no builtin function named \"%s\"",
+				 prosrc);
+	}
+
+	/*
+	 * All seems OK; prepare the tuple to be inserted into pg_proc.
+	 */
+
 	for (i = 0; i < Natts_pg_proc; ++i)
 	{
 		nulls[i] = ' ';