We've traditionally accepted "name := value" syntax for
cursor arguments in plpgsql. But it turns out that the
equivalent statements in Oracle use "name => value".
Since we accept both forms of punctuation for function
arguments, it makes sense to do the same here.
Author: Pavel Stehule
Reviewed-by: Gilles Darold
Discussion: https://postgr.es/m/CAFj8pRA3d0ARQEMbABa1n6q25AUdNmyO8aGs56XNf9pD4sRMjQ@mail.gmail.com
Opening a Bound Cursor
-OPEN bound_cursorvar ( argument_name := argument_value , ... ) ;
+OPEN bound_cursorvar ( argument_name { := | => } argument_value , ... ) ;
Argument values can be passed using either positional
or named notation. In positional
notation, all arguments are specified in order. In named notation,
- each argument's name is specified using := to
+ each argument's name is specified using :=
+ or => to
separate it from the argument expression. Similar to calling
functions, described in , it
is also allowed to mix positional and named notation.
OPEN curs2;
OPEN curs3(42);
OPEN curs3(key := 42);
+OPEN curs3(key => 42);
<<label>>
-FOR recordvar IN bound_cursorvar ( argument_name := argument_value , ... ) LOOP
+FOR recordvar IN bound_cursorvar ( argument_name { := | => } argument_value , ... ) LOOP
statements
END LOOP label ;
tok2;
int arglocation;
- /* Check if it's a named parameter: "param := value" */
+ /*
+ * Check if it's a named parameter: "param := value"
+ * or "param => value"
+ */
plpgsql_peek2(&tok1, &tok2, &arglocation, NULL, yyscanner);
- if (tok1 == IDENT && tok2 == COLON_EQUALS)
+ if (tok1 == IDENT && (tok2 == COLON_EQUALS || tok2 == EQUALS_GREATER))
{
char *argname;
IdentifierLookup save_IdentifierLookup;
parser_errposition(*yyllocp)));
/*
- * Eat the ":=". We already peeked, so the error should never
- * happen.
+ * Eat the ":=" or "=>". We already peeked, so the error should
+ * never happen.
*/
tok2 = yylex(yylvalp, yyllocp, yyscanner);
- if (tok2 != COLON_EQUALS)
+ if (tok2 != COLON_EQUALS && tok2 != EQUALS_GREATER)
yyerror(yyllocp, NULL, yyscanner, "syntax error");
any_named = true;
p2 int4 := 1006;
n int4;
begin
- open c1 (p1 := p1, p2 := p2, debug := 2);
+ -- use both supported syntaxes for named arguments
+ open c1 (p1 := p1, p2 => p2, debug => 2);
fetch c1 into n;
return n;
end $$ language plpgsql;
raise notice '% from %', r.i, c;
end loop;
-- again, to test if cursor was closed properly
- for r in c(9,10) loop
+ -- (and while we're at it, test named-parameter notation)
+ for r in c(r2 := 10, r1 => 9) loop
raise notice '% from %', r.i, c;
end loop;
-- and test a parameterless cursor
p2 int4 := 1006;
n int4;
begin
- open c1 (p1 := p1, p2 := p2, debug := 2);
+ -- use both supported syntaxes for named arguments
+ open c1 (p1 := p1, p2 => p2, debug => 2);
fetch c1 into n;
return n;
end $$ language plpgsql;
raise notice '% from %', r.i, c;
end loop;
-- again, to test if cursor was closed properly
- for r in c(9,10) loop
+ -- (and while we're at it, test named-parameter notation)
+ for r in c(r2 := 10, r1 => 9) loop
raise notice '% from %', r.i, c;
end loop;
-- and test a parameterless cursor