diff options
-rw-r--r-- | doc/src/sgml/extend.sgml | 2 | ||||
-rw-r--r-- | doc/src/sgml/ref/create_operator.sgml | 12 | ||||
-rw-r--r-- | doc/src/sgml/xoper.sgml | 4 | ||||
-rw-r--r-- | src/backend/commands/operatorcmds.c | 20 | ||||
-rw-r--r-- | src/bin/pg_dump/pg_dump.c | 2 | ||||
-rw-r--r-- | src/test/regress/expected/create_operator.out | 6 | ||||
-rw-r--r-- | src/test/regress/sql/create_operator.sql | 2 |
7 files changed, 30 insertions, 18 deletions
diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml index a3cb064131b..d5731621e7b 100644 --- a/doc/src/sgml/extend.sgml +++ b/doc/src/sgml/extend.sgml @@ -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) diff --git a/doc/src/sgml/ref/create_operator.sgml b/doc/src/sgml/ref/create_operator.sgml index c8263437abd..d5c385c087f 100644 --- a/doc/src/sgml/ref/create_operator.sgml +++ b/doc/src/sgml/ref/create_operator.sgml @@ -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> ] @@ -100,6 +100,14 @@ CREATE OPERATOR <replaceable>name</replaceable> ( </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"/>. </para> @@ -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, diff --git a/doc/src/sgml/xoper.sgml b/doc/src/sgml/xoper.sgml index 2aa7cf9b642..2f5560ac505 100644 --- a/doc/src/sgml/xoper.sgml +++ b/doc/src/sgml/xoper.sgml @@ -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 diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c index f0da4c52792..8fd8f7e8cff 100644 --- a/src/backend/commands/operatorcmds.c +++ b/src/backend/commands/operatorcmds.c @@ -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 || diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 1efa1aad73f..3774867b2e1 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -12406,7 +12406,7 @@ dumpOpr(Archive *fout, OprInfo *oprinfo) oprregproc = convertRegProcReference(fout, oprcode); if (oprregproc) { - appendPQExpBuffer(details, " PROCEDURE = %s", oprregproc); + appendPQExpBuffer(details, " FUNCTION = %s", oprregproc); free(oprregproc); } diff --git a/src/test/regress/expected/create_operator.out b/src/test/regress/expected/create_operator.out index fd8b37fff56..77237f48500 100644 --- a/src/test/regress/expected/create_operator.out +++ b/src/test/regress/expected/create_operator.out @@ -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 diff --git a/src/test/regress/sql/create_operator.sql b/src/test/regress/sql/create_operator.sql index 9edf32b3f80..625e9b97485 100644 --- a/src/test/regress/sql/create_operator.sql +++ b/src/test/regress/sql/create_operator.sql @@ -5,7 +5,7 @@ CREATE OPERATOR ## ( leftarg = path, rightarg = path, - procedure = path_inter, + function = path_inter, commutator = ## ); |