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 = ##
 );