Hi út 25. 2. 2025 v 6:32 odesílatel Pavel Stehule <pavel.steh...@gmail.com> napsal:
> Hi > > po 24. 2. 2025 v 21:05 odesílatel Gilles Darold <gil...@darold.net> > napsal: > >> Review: >> >> This patch claims to add SQL/PSM named arguments syntax to cursors and >> this what it does exactly. >> >> It compiles without error with master current code and all tests >> passed successfully. >> >> I think it could be ready to be committed. >> >> >> Note for the committer: does it make sense to mention in the >> documentation that this standard SQL/PSM syntax is preferred than the PG >> syntax? >> > I modified doc in same manner like function's named arguments are described Regards Pavel > >> >> Best regards, >> > > Thank you for review > > Pavel > > >> >> -- >> Gilles Darold >> http://www.darold.net/ >> >>
From aa39b0ad4fe87c33ae889bbcfa9a81e973605fd8 Mon Sep 17 00:00:00 2001 From: "ok...@github.com" <pavel.steh...@gmail.com> Date: Thu, 27 Feb 2025 16:35:52 +0100 Subject: [PATCH 2/2] Separate old (proprietary) syntax to own para with note so it is supported just for compatibility reasons. --- doc/src/sgml/plpgsql.sgml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index 60af57712b7..2acdf43b4a1 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -3317,7 +3317,7 @@ OPEN curs1 FOR EXECUTE format('SELECT * FROM %I WHERE col1 = $1',tabname) USING <title>Opening a Bound Cursor</title> <synopsis> -OPEN <replaceable>bound_cursorvar</replaceable> <optional> ( <optional> <replaceable>argument_name</replaceable> { := | => } </optional> <replaceable>argument_value</replaceable> <optional>, ...</optional> ) </optional>; +OPEN <replaceable>bound_cursorvar</replaceable> <optional> ( <optional> <replaceable>argument_name</replaceable> { => | := } </optional> <replaceable>argument_value</replaceable> <optional>, ...</optional> ) </optional>; </synopsis> <para> @@ -3340,7 +3340,7 @@ OPEN <replaceable>bound_cursorvar</replaceable> <optional> ( <optional> <replace Argument values can be passed using either <firstterm>positional</firstterm> or <firstterm>named</firstterm> notation. In positional notation, all arguments are specified in order. In named notation, - each argument's name is specified using <literal>:=</literal> to + each argument's name is specified using <literal>=></literal> to separate it from the argument expression. Similar to calling functions, described in <xref linkend="sql-syntax-calling-funcs"/>, it is also allowed to mix positional and named notation. @@ -3351,11 +3351,18 @@ OPEN <replaceable>bound_cursorvar</replaceable> <optional> ( <optional> <replace <programlisting> OPEN curs2; OPEN curs3(42); -OPEN curs3(key := 42); OPEN curs3(Key => 42); </programlisting> </para> + <para> + An older syntax based on <literal>:=</literal> is supported for backward + compatibility: +<programlisting> +OPEN curs3(key := 42); +</programlisting> + </para> + <para> Because variable substitution is done on a bound cursor's query, there are really two ways to pass values into the cursor: either -- 2.48.1
From 0ac81502c81c9359b7f9ecbd77e5edd34f410a15 Mon Sep 17 00:00:00 2001 From: "ok...@github.com" <pavel.steh...@gmail.com> Date: Sat, 8 Feb 2025 07:45:58 +0100 Subject: [PATCH 1/2] allow to use standard syntax for named arguments for plpgsql cursor arguments --- doc/src/sgml/plpgsql.sgml | 3 ++- src/pl/plpgsql/src/pl_gram.y | 13 ++++++++----- src/test/regress/expected/plpgsql.out | 3 ++- src/test/regress/sql/plpgsql.sql | 3 ++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index 78e4983139b..60af57712b7 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -3317,7 +3317,7 @@ OPEN curs1 FOR EXECUTE format('SELECT * FROM %I WHERE col1 = $1',tabname) USING <title>Opening a Bound Cursor</title> <synopsis> -OPEN <replaceable>bound_cursorvar</replaceable> <optional> ( <optional> <replaceable>argument_name</replaceable> := </optional> <replaceable>argument_value</replaceable> <optional>, ...</optional> ) </optional>; +OPEN <replaceable>bound_cursorvar</replaceable> <optional> ( <optional> <replaceable>argument_name</replaceable> { := | => } </optional> <replaceable>argument_value</replaceable> <optional>, ...</optional> ) </optional>; </synopsis> <para> @@ -3352,6 +3352,7 @@ OPEN <replaceable>bound_cursorvar</replaceable> <optional> ( <optional> <replace OPEN curs2; OPEN curs3(42); OPEN curs3(key := 42); +OPEN curs3(Key => 42); </programlisting> </para> diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y index 8048e040f81..dc0ae113184 100644 --- a/src/pl/plpgsql/src/pl_gram.y +++ b/src/pl/plpgsql/src/pl_gram.y @@ -3955,9 +3955,12 @@ read_cursor_args(PLpgSQL_var *cursor, int until, YYSTYPE *yylvalp, YYLTYPE *yyll 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; @@ -3983,11 +3986,11 @@ read_cursor_args(PLpgSQL_var *cursor, int until, YYSTYPE *yylvalp, YYLTYPE *yyll parser_errposition(*yyllocp))); /* - * Eat the ":=". We already peeked, so the error should never - * happen. + * Eat the ":=" and the "=>". 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; diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index 0a6945581bd..31aa806e491 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -2419,7 +2419,8 @@ declare 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; diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql index 18c91572ae1..aaae1e44c6f 100644 --- a/src/test/regress/sql/plpgsql.sql +++ b/src/test/regress/sql/plpgsql.sql @@ -2072,7 +2072,8 @@ declare 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; -- 2.48.1