Change PROCEDURE to FUNCTION in CREATE OPERATOR syntax
authorPeter Eisentraut
Wed, 15 Aug 2018 16:05:46 +0000 (18:05 +0200)
committerPeter Eisentraut
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
Reviewed-by: Jonathan S. Katz
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)::@[email protected];';
 
-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
  
 
 CREATE OPERATOR name (
-    PROCEDURE = function_name
+    {FUNCTION|PROCEDURE} = function_name
     [, LEFTARG = left_type ] [, RIGHTARG = right_type ]
     [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
     [, RESTRICT = res_proc ] [, JOIN = join_proc ]
@@ -99,6 +99,14 @@ CREATE OPERATOR name (
    of arguments (either one or two) of the indicated types.
   
 
+  
+   In the syntax of CREATE OPERATOR, the keywords
+   FUNCTION and PROCEDURE are
+   equivalent, but the referenced function must in any case be a function, not
+   a procedure.  The use of the keyword PROCEDURE here is
+   historical and deprecated.
+  
+
   
    The other clauses specify optional operator optimization clauses.
    Their meaning is detailed in .
@@ -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 = +
 );
 
@@ -66,7 +66,7 @@ SELECT (a + b) AS c FROM test_complex;
   
    We've shown how to create a binary operator here.  To create unary
    operators, just omit one of leftarg (for left unary) or
-   rightarg (for right unary).  The procedure
+   rightarg (for right unary).  The function
    clause and the argument clauses are the only required items in
    CREATE OPERATOR.  The commutator
    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 = ##
 );