*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
#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"
#endif
/* ----------------------------------------------------------------
- * ProcedureDefine
+ * ProcedureCreate
* ----------------------------------------------------------------
*/
Oid
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
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] = ' ';