Change PROCEDURE to FUNCTION in CREATE OPERATOR syntax
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 15 Aug 2018 16:05:46 +0000 (18:05 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 22 Aug 2018 12:44:49 +0000 (14:44 +0200)
Since procedures are now a different thing from functions, change the
CREATE OPERATOR syntax to use FUNCTION in the clause that specifies the
function.  PROCEDURE is still accepted for compatibility.

Reported-by: Peter Geoghegan <pg@bowt.ie>
Reviewed-by: Jonathan S. Katz <jonathan.katz@excoventures.com>
doc/src/sgml/extend.sgml
doc/src/sgml/ref/create_operator.sgml
doc/src/sgml/xoper.sgml
src/backend/commands/operatorcmds.c
src/bin/pg_dump/pg_dump.c
src/test/regress/expected/create_operator.out
src/test/regress/sql/create_operator.sql

index a3cb064131b9e48adc3e9b26f24b487a032b46ef..d5731621e7b258cef7e289698aa15789d0f20b9c 100644 (file)
@@ -1015,7 +1015,7 @@ CREATE TYPE pair AS ( k text, v text );
 CREATE OR REPLACE FUNCTION pair(text, text)
 RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::@extschema@.pair;';
 
-CREATE OPERATOR ~> (LEFTARG = text, RIGHTARG = text, PROCEDURE = pair);
+CREATE OPERATOR ~> (LEFTARG = text, RIGHTARG = text, FUNCTION = pair);
 
 -- "SET search_path" is easy to get right, but qualified names perform better.
 CREATE OR REPLACE FUNCTION lower(pair)
index c8263437abdd5c081d8907fca2b59a22226ad3b8..d5c385c087f5c936410030711c203243ceddca2b 100644 (file)
@@ -22,7 +22,7 @@ PostgreSQL documentation
  <refsynopsisdiv>
 <synopsis>
 CREATE OPERATOR <replaceable>name</replaceable> (
-    PROCEDURE = <replaceable class="parameter">function_name</replaceable>
+    {FUNCTION|PROCEDURE} = <replaceable class="parameter">function_name</replaceable>
     [, LEFTARG = <replaceable class="parameter">left_type</replaceable> ] [, RIGHTARG = <replaceable class="parameter">right_type</replaceable> ]
     [, COMMUTATOR = <replaceable class="parameter">com_op</replaceable> ] [, NEGATOR = <replaceable class="parameter">neg_op</replaceable> ]
     [, RESTRICT = <replaceable class="parameter">res_proc</replaceable> ] [, JOIN = <replaceable class="parameter">join_proc</replaceable> ]
@@ -99,6 +99,14 @@ CREATE OPERATOR <replaceable>name</replaceable> (
    of arguments (either one or two) of the indicated types.
   </para>
 
+  <para>
+   In the syntax of <literal>CREATE OPERATOR</literal>, the keywords
+   <literal>FUNCTION</literal> and <literal>PROCEDURE</literal> are
+   equivalent, but the referenced function must in any case be a function, not
+   a procedure.  The use of the keyword <literal>PROCEDURE</literal> here is
+   historical and deprecated.
+  </para>
+
   <para>
    The other clauses specify optional operator optimization clauses.
    Their meaning is detailed in <xref linkend="xoper-optimization"/>.
@@ -264,7 +272,7 @@ COMMUTATOR = OPERATOR(myschema.===) ,
 CREATE OPERATOR === (
     LEFTARG = box,
     RIGHTARG = box,
-    PROCEDURE = area_equal_function,
+    FUNCTION = area_equal_function,
     COMMUTATOR = ===,
     NEGATOR = !==,
     RESTRICT = area_restriction_function,
index 2aa7cf9b6421a33954d63e438c16d80401dca91c..2f5560ac5059099e8b93063f573baa8c4fbbccb5 100644 (file)
@@ -44,7 +44,7 @@ CREATE FUNCTION complex_add(complex, complex)
 CREATE OPERATOR + (
     leftarg = complex,
     rightarg = complex,
-    procedure = complex_add,
+    function = complex_add,
     commutator = +
 );
 </programlisting>
@@ -66,7 +66,7 @@ SELECT (a + b) AS c FROM test_complex;
   <para>
    We've shown how to create a binary operator here.  To create unary
    operators, just omit one of <literal>leftarg</literal> (for left unary) or
-   <literal>rightarg</literal> (for right unary).  The <literal>procedure</literal>
+   <literal>rightarg</literal> (for right unary).  The <literal>function</literal>
    clause and the argument clauses are the only required items in
    <command>CREATE OPERATOR</command>.  The <literal>commutator</literal>
    clause shown in the example is an optional hint to the query
index f0da4c5279231a557f3fb6126bd757e7728ce01c..8fd8f7e8cffc6065ef17ff978f584836d6d81f04 100644 (file)
@@ -21,7 +21,7 @@
  * NOTES
  *       These things must be defined and committed in the following order:
  *             "create function":
- *                             input/output, recv/send procedures
+ *                             input/output, recv/send functions
  *             "create type":
  *                             type
  *             "create operator":
@@ -79,8 +79,8 @@ DefineOperator(List *names, List *parameters)
        Oid                     rettype;
        List       *commutatorName = NIL;       /* optional commutator operator name */
        List       *negatorName = NIL;  /* optional negator operator name */
-       List       *restrictionName = NIL;      /* optional restrict. sel. procedure */
-       List       *joinName = NIL; /* optional join sel. procedure */
+       List       *restrictionName = NIL;      /* optional restrict. sel. function */
+       List       *joinName = NIL; /* optional join sel. function */
        Oid                     functionOid;    /* functions converted to OID */
        Oid                     restrictionOid;
        Oid                     joinOid;
@@ -120,6 +120,9 @@ DefineOperator(List *names, List *parameters)
                                                (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
                                                 errmsg("SETOF type not allowed for operator argument")));
                }
+               /* "function" and "procedure" are equivalent here */
+               else if (strcmp(defel->defname, "function") == 0)
+                       functionName = defGetQualifiedName(defel);
                else if (strcmp(defel->defname, "procedure") == 0)
                        functionName = defGetQualifiedName(defel);
                else if (strcmp(defel->defname, "commutator") == 0)
@@ -159,7 +162,7 @@ DefineOperator(List *names, List *parameters)
        if (functionName == NIL)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
-                                errmsg("operator procedure must be specified")));
+                                errmsg("operator function must be specified")));
 
        /* Transform type names to type OIDs */
        if (typeName1)
@@ -245,8 +248,8 @@ DefineOperator(List *names, List *parameters)
                                           functionOid, /* function for operator */
                                           commutatorName,      /* optional commutator operator name */
                                           negatorName, /* optional negator operator name */
-                                          restrictionOid,      /* optional restrict. sel. procedure */
-                                          joinOid, /* optional join sel. procedure name */
+                                          restrictionOid,      /* optional restrict. sel. function */
+                                          joinOid, /* optional join sel. function name */
                                           canMerge,    /* operator merges */
                                           canHash);    /* operator hashes */
 }
@@ -393,10 +396,10 @@ AlterOperator(AlterOperatorStmt *stmt)
        Datum           values[Natts_pg_operator];
        bool            nulls[Natts_pg_operator];
        bool            replaces[Natts_pg_operator];
-       List       *restrictionName = NIL;      /* optional restrict. sel. procedure */
+       List       *restrictionName = NIL;      /* optional restrict. sel. function */
        bool            updateRestriction = false;
        Oid                     restrictionOid;
-       List       *joinName = NIL; /* optional join sel. procedure */
+       List       *joinName = NIL; /* optional join sel. function */
        bool            updateJoin = false;
        Oid                     joinOid;
 
@@ -436,6 +439,7 @@ AlterOperator(AlterOperatorStmt *stmt)
                 */
                else if (strcmp(defel->defname, "leftarg") == 0 ||
                                 strcmp(defel->defname, "rightarg") == 0 ||
+                                strcmp(defel->defname, "function") == 0 ||
                                 strcmp(defel->defname, "procedure") == 0 ||
                                 strcmp(defel->defname, "commutator") == 0 ||
                                 strcmp(defel->defname, "negator") == 0 ||
index 89056207b9722c6ff2ed8ac7c73a86dfa849c962..cd325c0484e2e95f96ce7f558cfa45ee6d80f403 100644 (file)
@@ -12415,7 +12415,7 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
        oprregproc = convertRegProcReference(fout, oprcode);
        if (oprregproc)
        {
-               appendPQExpBuffer(details, "    PROCEDURE = %s", oprregproc);
+               appendPQExpBuffer(details, "    FUNCTION = %s", oprregproc);
                free(oprregproc);
        }
 
index fd8b37fff56948b5f1d9390450096a0ba5b08b90..77237f485006e58fe39a6208a79badec61832fec 100644 (file)
@@ -4,7 +4,7 @@
 CREATE OPERATOR ## (
    leftarg = path,
    rightarg = path,
-   procedure = path_inter,
+   function = path_inter,
    commutator = ##
 );
 CREATE OPERATOR <% (
@@ -107,7 +107,7 @@ ERROR:  at least one of leftarg or rightarg must be specified
 CREATE OPERATOR #@%# (
    leftarg = int8
 );
-ERROR:  operator procedure must be specified
+ERROR:  operator function must be specified
 -- Should fail. CREATE OPERATOR requires USAGE on TYPE
 BEGIN TRANSACTION;
 CREATE ROLE regress_rol_op3;
@@ -202,4 +202,4 @@ WARNING:  operator attribute "Restrict" not recognized
 WARNING:  operator attribute "Join" not recognized
 WARNING:  operator attribute "Hashes" not recognized
 WARNING:  operator attribute "Merges" not recognized
-ERROR:  operator procedure must be specified
+ERROR:  operator function must be specified
index 9edf32b3f803df407aefb1654974ef443c70db77..625e9b97485160c83ad9e8f8fe9ce670474aa025 100644 (file)
@@ -5,7 +5,7 @@
 CREATE OPERATOR ## (
    leftarg = path,
    rightarg = path,
-   procedure = path_inter,
+   function = path_inter,
    commutator = ##
 );