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] = ' ';