summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/src/sgml/func.sgml2
-rw-r--r--doc/src/sgml/syntax.sgml21
-rw-r--r--doc/src/sgml/xfunc.sgml6
-rw-r--r--src/backend/commands/operatorcmds.c10
-rw-r--r--src/backend/parser/gram.y11
-rw-r--r--src/backend/parser/scan.l6
-rw-r--r--src/test/regress/expected/create_operator.out7
-rw-r--r--src/test/regress/expected/polymorphism.out67
-rw-r--r--src/test/regress/sql/create_operator.sql2
-rw-r--r--src/test/regress/sql/polymorphism.sql16
10 files changed, 124 insertions, 24 deletions
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index da2ed673a7e..c198beaf396 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -6785,7 +6785,7 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
Create interval from years, months, weeks, days, hours, minutes and
seconds fields
</entry>
- <entry><literal>make_interval(days := 10)</literal></entry>
+ <entry><literal>make_interval(days => 10)</literal></entry>
<entry><literal>10 days</literal></entry>
</row>
diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml
index 4b81b088823..8283e252582 100644
--- a/doc/src/sgml/syntax.sgml
+++ b/doc/src/sgml/syntax.sgml
@@ -2596,10 +2596,10 @@ SELECT concat_lower_or_upper('Hello', 'World');
<para>
In named notation, each argument's name is specified using
- <literal>:=</literal> to separate it from the argument expression.
+ <literal>=></literal> to separate it from the argument expression.
For example:
<screen>
-SELECT concat_lower_or_upper(a := 'Hello', b := 'World');
+SELECT concat_lower_or_upper(a => 'Hello', b => 'World');
concat_lower_or_upper
-----------------------
hello world
@@ -2610,13 +2610,24 @@ SELECT concat_lower_or_upper(a := 'Hello', b := 'World');
using named notation is that the arguments may be specified in any
order, for example:
<screen>
-SELECT concat_lower_or_upper(a := 'Hello', b := 'World', uppercase := true);
+SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
-SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
+SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World');
+ concat_lower_or_upper
+-----------------------
+ HELLO WORLD
+(1 row)
+</screen>
+ </para>
+
+ <para>
+ An older syntax based on ":=" is supported for backward compatibility:
+<screen>
+ SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
concat_lower_or_upper
-----------------------
HELLO WORLD
@@ -2638,7 +2649,7 @@ SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
already mentioned, named arguments cannot precede positional arguments.
For example:
<screen>
-SELECT concat_lower_or_upper('Hello', 'World', uppercase := true);
+SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
concat_lower_or_upper
-----------------------
HELLO WORLD
diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml
index b85f2adc453..9de7ccc2582 100644
--- a/doc/src/sgml/xfunc.sgml
+++ b/doc/src/sgml/xfunc.sgml
@@ -776,14 +776,14 @@ SELECT mleast(VARIADIC ARRAY[]::numeric[]);
<literal>VARIADIC</>. For example, this will work:
<screen>
-SELECT mleast(VARIADIC arr := ARRAY[10, -1, 5, 4.4]);
+SELECT mleast(VARIADIC arr => ARRAY[10, -1, 5, 4.4]);
</screen>
but not these:
<screen>
-SELECT mleast(arr := 10);
-SELECT mleast(arr := ARRAY[10, -1, 5, 4.4]);
+SELECT mleast(arr => 10);
+SELECT mleast(arr => ARRAY[10, -1, 5, 4.4]);
</screen>
</para>
</sect2>
diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c
index 1efaacfd5e2..b4a1aac3a14 100644
--- a/src/backend/commands/operatorcmds.c
+++ b/src/backend/commands/operatorcmds.c
@@ -87,16 +87,6 @@ DefineOperator(List *names, List *parameters)
/* Convert list of names to a name and namespace */
oprNamespace = QualifiedNameGetCreationNamespace(names, &oprName);
- /*
- * The SQL standard committee has decided that => should be used for named
- * parameters; therefore, a future release of PostgreSQL may disallow it
- * as the name of a user-defined operator.
- */
- if (strcmp(oprName, "=>") == 0)
- ereport(WARNING,
- (errmsg("=> is deprecated as an operator name"),
- errdetail("This name may be disallowed altogether in future versions of PostgreSQL.")));
-
/* Check we have creation rights in target namespace */
aclresult = pg_namespace_aclcheck(oprNamespace, GetUserId(), ACL_CREATE);
if (aclresult != ACLCHECK_OK)
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 435c0451cae..21b8897038f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -533,7 +533,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
*/
%token <str> IDENT FCONST SCONST BCONST XCONST Op
%token <ival> ICONST PARAM
-%token TYPECAST DOT_DOT COLON_EQUALS
+%token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
/*
* If you want to make any keyword changes, update the keyword table in
@@ -12567,6 +12567,15 @@ func_arg_expr: a_expr
na->location = @1;
$$ = (Node *) na;
}
+ | param_name EQUALS_GREATER a_expr
+ {
+ NamedArgExpr *na = makeNode(NamedArgExpr);
+ na->name = $1;
+ na->arg = (Expr *) $3;
+ na->argnumber = -1; /* until determined */
+ na->location = @1;
+ $$ = (Node *) na;
+ }
;
type_list: Typename { $$ = list_make1($1); }
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index a78ce03fbd5..a0e20434ef3 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -334,6 +334,7 @@ identifier {ident_start}{ident_cont}*
typecast "::"
dot_dot \.\.
colon_equals ":="
+equals_greater "=>"
/*
* "self" is the set of chars that should be returned as single-character
@@ -808,6 +809,11 @@ other .
return COLON_EQUALS;
}
+{equals_greater} {
+ SET_YYLLOC();
+ return EQUALS_GREATER;
+ }
+
{self} {
SET_YYLLOC();
return yytext[0];
diff --git a/src/test/regress/expected/create_operator.out b/src/test/regress/expected/create_operator.out
index 2e6c764ee18..3a216c2ca8f 100644
--- a/src/test/regress/expected/create_operator.out
+++ b/src/test/regress/expected/create_operator.out
@@ -29,13 +29,14 @@ CREATE OPERATOR #%# (
-- Test comments
COMMENT ON OPERATOR ###### (int4, NONE) IS 'bad right unary';
ERROR: operator does not exist: integer ######
--- Show deprecated message. => is deprecated now
+-- => is disallowed now
CREATE OPERATOR => (
leftarg = int8, -- right unary
procedure = numeric_fac
);
-WARNING: => is deprecated as an operator name
-DETAIL: This name may be disallowed altogether in future versions of PostgreSQL.
+ERROR: syntax error at or near "=>"
+LINE 1: CREATE OPERATOR => (
+ ^
-- Should fail. CREATE OPERATOR requires USAGE on SCHEMA
BEGIN TRANSACTION;
CREATE ROLE regress_rol_op1;
diff --git a/src/test/regress/expected/polymorphism.out b/src/test/regress/expected/polymorphism.out
index 27b28790e0f..987b3eed7d3 100644
--- a/src/test/regress/expected/polymorphism.out
+++ b/src/test/regress/expected/polymorphism.out
@@ -1356,6 +1356,73 @@ select dfunc('a'::text, 'b', flag := true); -- mixed notation
a
(1 row)
+-- ansi/sql syntax
+select dfunc(a => 1, b => 2);
+ dfunc
+-------
+ 1
+(1 row)
+
+select dfunc(a => 'a'::text, b => 'b');
+ dfunc
+-------
+ a
+(1 row)
+
+select dfunc(a => 'a'::text, b => 'b', flag => false); -- named notation
+ dfunc
+-------
+ b
+(1 row)
+
+select dfunc(b => 'b'::text, a => 'a'); -- named notation with default
+ dfunc
+-------
+ a
+(1 row)
+
+select dfunc(a => 'a'::text, flag => true); -- named notation with default
+ dfunc
+-------
+ a
+(1 row)
+
+select dfunc(a => 'a'::text, flag => false); -- named notation with default
+ dfunc
+-------
+
+(1 row)
+
+select dfunc(b => 'b'::text, a => 'a', flag => true); -- named notation
+ dfunc
+-------
+ a
+(1 row)
+
+select dfunc('a'::text, 'b', false); -- full positional notation
+ dfunc
+-------
+ b
+(1 row)
+
+select dfunc('a'::text, 'b', flag => false); -- mixed notation
+ dfunc
+-------
+ b
+(1 row)
+
+select dfunc('a'::text, 'b', true); -- full positional notation
+ dfunc
+-------
+ a
+(1 row)
+
+select dfunc('a'::text, 'b', flag => true); -- mixed notation
+ dfunc
+-------
+ a
+(1 row)
+
-- check reverse-listing of named-arg calls
CREATE VIEW dfview AS
SELECT q1, q2,
diff --git a/src/test/regress/sql/create_operator.sql b/src/test/regress/sql/create_operator.sql
index f7a372ab897..0e5d6356bc3 100644
--- a/src/test/regress/sql/create_operator.sql
+++ b/src/test/regress/sql/create_operator.sql
@@ -35,7 +35,7 @@ CREATE OPERATOR #%# (
-- Test comments
COMMENT ON OPERATOR ###### (int4, NONE) IS 'bad right unary';
--- Show deprecated message. => is deprecated now
+-- => is disallowed now
CREATE OPERATOR => (
leftarg = int8, -- right unary
procedure = numeric_fac
diff --git a/src/test/regress/sql/polymorphism.sql b/src/test/regress/sql/polymorphism.sql
index 3d8dd1e5548..72f6cb5e7cb 100644
--- a/src/test/regress/sql/polymorphism.sql
+++ b/src/test/regress/sql/polymorphism.sql
@@ -748,6 +748,22 @@ select dfunc('a'::text, 'b', flag := false); -- mixed notation
select dfunc('a'::text, 'b', true); -- full positional notation
select dfunc('a'::text, 'b', flag := true); -- mixed notation
+-- ansi/sql syntax
+select dfunc(a => 1, b => 2);
+select dfunc(a => 'a'::text, b => 'b');
+select dfunc(a => 'a'::text, b => 'b', flag => false); -- named notation
+
+select dfunc(b => 'b'::text, a => 'a'); -- named notation with default
+select dfunc(a => 'a'::text, flag => true); -- named notation with default
+select dfunc(a => 'a'::text, flag => false); -- named notation with default
+select dfunc(b => 'b'::text, a => 'a', flag => true); -- named notation
+
+select dfunc('a'::text, 'b', false); -- full positional notation
+select dfunc('a'::text, 'b', flag => false); -- mixed notation
+select dfunc('a'::text, 'b', true); -- full positional notation
+select dfunc('a'::text, 'b', flag => true); -- mixed notation
+
+
-- check reverse-listing of named-arg calls
CREATE VIEW dfview AS
SELECT q1, q2,