Commit 4b82c6d9 authored by Tom Lane's avatar Tom Lane

Allow CREATE FUNCTION xyz AS '' LANGUAGE 'internal' to

work the way it used to (ie, assume xyz is the name of the builtin
function to call).  Complain if an unknown builtin function name is
referenced.
parent 00a41961
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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 @@ ...@@ -26,6 +26,7 @@
#include "parser/parse_node.h" #include "parser/parse_node.h"
#include "tcop/tcopprot.h" #include "tcop/tcopprot.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/fmgrtab.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/sets.h" #include "utils/sets.h"
#include "utils/syscache.h" #include "utils/syscache.h"
...@@ -37,7 +38,7 @@ ...@@ -37,7 +38,7 @@
#endif #endif
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
* ProcedureDefine * ProcedureCreate
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
Oid Oid
...@@ -94,7 +95,7 @@ ProcedureCreate(char *procedureName, ...@@ -94,7 +95,7 @@ ProcedureCreate(char *procedureName,
if (strcmp(strVal(t), "opaque") == 0) if (strcmp(strVal(t), "opaque") == 0)
{ {
if (strcmp(languageName, "sql") == 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; toid = 0;
} }
else else
...@@ -220,6 +221,32 @@ ProcedureCreate(char *procedureName, ...@@ -220,6 +221,32 @@ ProcedureCreate(char *procedureName,
pg_checkretval(typeObjectId, querytree_list); 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) for (i = 0; i < Natts_pg_proc; ++i)
{ {
nulls[i] = ' '; nulls[i] = ' ';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment