proposal: PLpgSQL parallel assignemnt
Hi
Some modern or old languages (GO, Lua, CLU) has similarly designed function
OUT parameters like PLpgSQL.
In these languages is usually supported parallel assignment. It is not
supported by PLpgSQL - there is workaround - using SELECT FROM, but it is
workaround. The implementation of PA is trivial.
Current state:
==========
CREATE OR REPLACE FUNCTION fx(OUT a int, OUT b int)
AS $$ ...
possibilities of CALL and assignment
recvar := fx();
rowvar := fx();
SELECT * FROM fx() INTO a, b;
Lua, Golang like proposal:
a, b := fx();
Comments, notes, ideas?
Regards
Pavel
On 2 June 2017 at 15:51, Pavel Stehule <pavel.stehule@gmail.com> wrote:
a, b := fx();
Comments, notes, ideas?
I'd be pretty happy to have
(a, b) = (x, y);
(a, b) = f(x);
which is SQL-esque.
But what, if anything, does Ada do?
--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
2017-06-02 10:06 GMT+02:00 Craig Ringer <craig@2ndquadrant.com>:
On 2 June 2017 at 15:51, Pavel Stehule <pavel.stehule@gmail.com> wrote:
a, b := fx();
Comments, notes, ideas?
I'd be pretty happy to have
(a, b) = (x, y);
(a, b) = f(x);which is SQL-esque.
This is not too far to my proposal - and it is fully adequate alternative.
But what, if anything, does Ada do?
What I know, no, Ada has not this statement - but the design of OUT
parameters in Ada absolutely different than PostgreSQL - so in this case we
cannot to use Ada language as our base :(
Regards
Pavel
Show quoted text
--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
2017-06-02 10:15 GMT+02:00 Pavel Stehule <pavel.stehule@gmail.com>:
2017-06-02 10:06 GMT+02:00 Craig Ringer <craig@2ndquadrant.com>:
On 2 June 2017 at 15:51, Pavel Stehule <pavel.stehule@gmail.com> wrote:
a, b := fx();
Comments, notes, ideas?
I'd be pretty happy to have
(a, b) = (x, y);
(a, b) = f(x);which is SQL-esque.
This is not too far to my proposal - and it is fully adequate alternative.
The ANSI form is related to SET or UPDATE commands - so in this case I see
classic languages style
https://en.wikipedia.org/wiki/Assignment_(computer_science) better. The
assign statement in PLpgSQL is not related to embedded SQL. If we introduce
SQL syntax and SET commands for schema variables then ( ) syntax is
perfect, but for := PLpgSQL I am not sure
It is maybe strange, but
SET (a,b) = (SELECT a,b FROM foo)
a, b := fx()
are sentences from two independent worlds and different syntax can be
correct (depends how much we would to integrate procedural and SQL worlds
.. 100% T-SQL, 80% SQL/PSM, ..20% PLpgSQL or 5%PL/SQL)
Regards
Pavel
Show quoted text
But what, if anything, does Ada do?
What I know, no, Ada has not this statement - but the design of OUT
parameters in Ada absolutely different than PostgreSQL - so in this case we
cannot to use Ada language as our base :(Regards
Pavel
--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
2017-06-02 19:05 GMT+02:00 Pavel Stehule <pavel.stehule@gmail.com>:
2017-06-02 10:15 GMT+02:00 Pavel Stehule <pavel.stehule@gmail.com>:
2017-06-02 10:06 GMT+02:00 Craig Ringer <craig@2ndquadrant.com>:
On 2 June 2017 at 15:51, Pavel Stehule <pavel.stehule@gmail.com> wrote:
a, b := fx();
Comments, notes, ideas?
I'd be pretty happy to have
(a, b) = (x, y);
(a, b) = f(x);which is SQL-esque.
This is not too far to my proposal - and it is fully adequate
alternative.The ANSI form is related to SET or UPDATE commands - so in this case I see
classic languages style https://en.wikipedia.org/wiki/
Assignment_(computer_science) better. The assign statement in PLpgSQL is
not related to embedded SQL. If we introduce SQL syntax and SET commands
for schema variables then ( ) syntax is perfect, but for := PLpgSQL I am
not sureIt is maybe strange, but
SET (a,b) = (SELECT a,b FROM foo)
a, b := fx()
are sentences from two independent worlds and different syntax can be
correct (depends how much we would to integrate procedural and SQL worlds
.. 100% T-SQL, 80% SQL/PSM, ..20% PLpgSQL or 5%PL/SQL)
More thoughts:
1. syntax (a,b) := f() ... can mean - assign record to temporary composite
(a,b)
2. syntax a,b := f() ... can mean - unpack result composite and assign to
a, b fields
so both syntaxes has sense although we don't introduce relation to SQL - on
this way
a,b := 10, 20 -- ok .. attach a=c1, b=c2
a,b := (10,20) -- ok .. attach a = r.c1, b = r.c2
(a,b) := (10,20) -- ok attach ct = rt
(a,b) := 10,20 -- ok attach ct = row(c1, c2)
@1 syntax says "create composite target", @2 syntax says "unpack result".
Both should to work. Personally I prefer @1 .. due less parenthesis
Regards
Pavel
Show quoted text
Regards
Pavel
But what, if anything, does Ada do?
What I know, no, Ada has not this statement - but the design of OUT
parameters in Ada absolutely different than PostgreSQL - so in this case we
cannot to use Ada language as our base :(Regards
Pavel
--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services