OSDN Git Service

Allow CREATE FUNCTION xyz AS '' LANGUAGE 'internal' to
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 18 Apr 1999 02:57:22 +0000 (02:57 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 18 Apr 1999 02:57:22 +0000 (02:57 +0000)
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.

src/backend/catalog/pg_proc.c

index 71cb218..90c41f5 100644 (file)
@@ -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] = ' ';