Proposal: TABLE functions
Hello,
Currently PostgreSQL support set returning functions.
ANSI SQL 2003 goes with new type of functions - table functions. With this
syntax
CREATE FUNCTION foo() RETURNS TABLE (c1 t1, ... )
PostgreSQL equal statements are:
CREATE TYPE tmptype AS (c1 t1, ...)
CREATE FUNCTION ... RETURNS SETOF tmptype AS ...
All necessary infrastructure is done. Implementation needs propably only
small changes in parser.
This feature doesn't need any changes in SQL functions. I expect so they
will be more readable and consistent.
CREATE OR REPLACE FUNCTION foo(f integer)
RETURNS TABLE(a int, b int) AS
$$
SELECT a, b FROM
FROM footab
WHERE a < f;
$$ LANGUAGE sql;
plpgpsql RETURN have to be enhanced for table expressions.
CREATE OR REPLACE FUNCTION foo(f integer)
RETURNS TABLE(a int, b int) AS -- they are not variables!
$$
BEGIN
RETURN TABLE(SELECT a, b -- it's secure, a,b are not variables
FROM footab
WHERE a < f);
END;
$$ LANGUAGE plpgsql;
RETURN NEXT can be used without changes. This feature doesn't allow
combination of RETURN TABLE and RETURN NEXT statement.
Table functions can have only IN arguments.
Advances:
* conformance with ansi sql 2003
* less propability of colision varnames and colnames
Regards
Pavel Stehule
_________________________________________________________________
Emotikony a pozadi programu MSN Messenger ozivi vasi konverzaci.
http://messenger.msn.cz/
On Tue, 6 Feb 2007, Pavel Stehule wrote:
Hello,
Currently PostgreSQL support set returning functions.
ANSI SQL 2003 goes with new type of functions - table functions. With this
syntaxCREATE FUNCTION foo() RETURNS TABLE (c1 t1, ... )
PostgreSQL equal statements are:
CREATE TYPE tmptype AS (c1 t1, ...)
CREATE FUNCTION ... RETURNS SETOF tmptype AS ...
or you can do
CREATE FUNCTION foo(OUT c1 t1, OUT ...) RETURNS SETOF record AS ...
But I think this would be nice, I think the OUT parameters make less sense
than saying RETURNS TABLE(...). But what about functions not returning
SETOF?
--
The Schwine-Kitzenger Institute study of 47 men over the age of 100
showed that all had these things in common:
(1) They all had moderate appetites.
(2) They all came from middle class homes
(3) All but two of them were dead.
Pavel Stehule wrote:
Hello,
Currently PostgreSQL support set returning functions.
ANSI SQL 2003 goes with new type of functions - table functions. With
this syntaxCREATE FUNCTION foo() RETURNS TABLE (c1 t1, ... )
Yeah this should be pretty easy because a table is just a composite
type. You can already do this:
CREATE TABLE foo (id bigint, first_name text);
CREATE FUNCTION foo() RETURNS SET OF foo...
PostgreSQL equal statements are:
CREATE TYPE tmptype AS (c1 t1, ...)
CREATE FUNCTION ... RETURNS SETOF tmptype AS ...All necessary infrastructure is done. Implementation needs propably only
small changes in parser.This feature doesn't need any changes in SQL functions. I expect so they
will be more readable and consistent.CREATE OR REPLACE FUNCTION foo(f integer)
RETURNS TABLE(a int, b int) AS
$$
SELECT a, b FROM
FROM footab
WHERE a < f;
$$ LANGUAGE sql;plpgpsql RETURN have to be enhanced for table expressions.
CREATE OR REPLACE FUNCTION foo(f integer)
RETURNS TABLE(a int, b int) AS -- they are not variables!
$$
BEGIN
RETURN TABLE(SELECT a, b -- it's secure, a,b are not variables
FROM footab
WHERE a < f);
END;
$$ LANGUAGE plpgsql;RETURN NEXT can be used without changes. This feature doesn't allow
combination of RETURN TABLE and RETURN NEXT statement.Table functions can have only IN arguments.
Advances:
* conformance with ansi sql 2003
* less propability of colision varnames and colnamesRegards
Pavel Stehule_________________________________________________________________
Emotikony a pozadi programu MSN Messenger ozivi vasi konverzaci.
http://messenger.msn.cz/---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?
--
=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/
Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/
Hello,
Currently PostgreSQL support set returning functions.
ANSI SQL 2003 goes with new type of functions - table functions. With
this
syntax
CREATE FUNCTION foo() RETURNS TABLE (c1 t1, ... )
PostgreSQL equal statements are:
CREATE TYPE tmptype AS (c1 t1, ...)
CREATE FUNCTION ... RETURNS SETOF tmptype AS ...or you can do
CREATE FUNCTION foo(OUT c1 t1, OUT ...) RETURNS SETOF record AS ...But I think this would be nice, I think the OUT parameters make less sense
than saying RETURNS TABLE(...). But what about functions not returning
SETOF?
This feature doesn't change current behaviour. And using TABLE function
means using SETOF.
Regards
Pavel Stehule
_________________________________________________________________
Najdete si svou lasku a nove pratele na Match.com. http://www.msn.cz/
On Tue, 2007-02-06 at 23:43 +0100, Pavel Stehule wrote:
ANSI SQL 2003 goes with new type of functions - table functions. With this
syntax
...
All necessary infrastructure is done. Implementation needs propably only
small changes in parser.
...
* conformance with ansi sql 2003
Sounds good to me.
--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com
Hello,
it can by more simple than I though. I need only one flag, and if its true
then I don't create language variables for OUT params. But I need one next
column in pg_proc.
Currently a lot of columns in pg_proc is bool. What about one binary columns
for other options? I hope so next versions can support autonomous
transaction, which need flag too.
Regards
Pavel Stehule
Pavel Stehule wrote:
Hello,
Currently PostgreSQL support set returning functions.
ANSI SQL 2003 goes with new type of functions - table functions. With
this syntaxCREATE FUNCTION foo() RETURNS TABLE (c1 t1, ... )
Yeah this should be pretty easy because a table is just a composite
type. You can already do this:CREATE TABLE foo (id bigint, first_name text);
CREATE FUNCTION foo() RETURNS SET OF foo...
PostgreSQL equal statements are:
CREATE TYPE tmptype AS (c1 t1, ...)
CREATE FUNCTION ... RETURNS SETOF tmptype AS ...All necessary infrastructure is done. Implementation needs propably only
small changes in parser.This feature doesn't need any changes in SQL functions. I expect so they
will be more readable and consistent.CREATE OR REPLACE FUNCTION foo(f integer)
RETURNS TABLE(a int, b int) AS
$$
SELECT a, b FROM
FROM footab
WHERE a < f;
$$ LANGUAGE sql;plpgpsql RETURN have to be enhanced for table expressions.
CREATE OR REPLACE FUNCTION foo(f integer)
RETURNS TABLE(a int, b int) AS -- they are not variables!
$$
BEGIN
RETURN TABLE(SELECT a, b -- it's secure, a,b are notvariables
FROM footab
WHERE a < f);
END;
$$ LANGUAGE plpgsql;RETURN NEXT can be used without changes. This feature doesn't allow
combination of RETURN TABLE and RETURN NEXT statement.Table functions can have only IN arguments.
Advances:
* conformance with ansi sql 2003
* less propability of colision varnames and colnamesRegards
Pavel Stehule_________________________________________________________________
Emotikony a pozadi programu MSN Messenger ozivi vasi konverzaci.
http://messenger.msn.cz/---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?--
=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/
_________________________________________________________________
Emotikony a pozadi programu MSN Messenger ozivi vasi konverzaci.
http://messenger.msn.cz/
"Pavel Stehule" <pavel.stehule@hotmail.com> writes:
it can by more simple than I though. I need only one flag, and if its true
then I don't create language variables for OUT params. But I need one next
column in pg_proc.
I thought you said this was just syntactic sugar for capabilities we
already had?
Currently a lot of columns in pg_proc is bool. What about one binary columns
for other options? I hope so next versions can support autonomous
transaction, which need flag too.
I think stored procedures of that sort aren't functions at all, and
probably don't belong in pg_proc.
regards, tom lane
"Pavel Stehule" <pavel.stehule@hotmail.com> writes:
it can by more simple than I though. I need only one flag, and if its
true
then I don't create language variables for OUT params. But I need one
next
column in pg_proc.
I thought you said this was just syntactic sugar for capabilities we
already had?
My mistake. I am sorry. I have to store somewhere flag. One bit, which
signalise "don't use OUT arguments as function's parameters". Other is only
game in parser.
Currently a lot of columns in pg_proc is bool. What about one binary
columns
for other options? I hope so next versions can support autonomous
transaction, which need flag too.I think stored procedures of that sort aren't functions at all, and
probably don't belong in pg_proc.
Why not? Some people use "ugly" implementation of it in plperlu and DBI.
pg_proc and related infrastructure works well. It miss only little bit
bigger adaptability. I thing so can be interesting one general option byte,
and one byte reservated for language handlers.
Regards
Pavel Stehule
_________________________________________________________________
Najdete si svou lasku a nove pratele na Match.com. http://www.msn.cz/
Import Notes
Resolved by subject fallback
"Pavel Stehule" <pavel.stehule@hotmail.com> writes:
I thought you said this was just syntactic sugar for capabilities we
already had?
My mistake. I am sorry. I have to store somewhere flag. One bit, which
signalise "don't use OUT arguments as function's parameters".
Huh? What exactly is the meaning of the arguments then?
It sounds to me like this might be better thought of as a new
proargmode value, but I'm quite unsure what you're talking about ...
regards, tom lane
I thought you said this was just syntactic sugar for capabilities we
already had?My mistake. I am sorry. I have to store somewhere flag. One bit, which
signalise "don't use OUT arguments as function's parameters".Huh? What exactly is the meaning of the arguments then?
It sounds to me like this might be better thought of as a new
proargmode value, but I'm quite unsure what you're talking about ...
My basic idea was:
CREATE FUNCTION aaa(IN a1, OUT a, OUT b)
RETURNS SETOF RECORD AS $$
..
is similar
CREATE FUNCTION aaa(IN a1)
RETURNS SETOF RECORD AS $$
from executor perspective there isn't any difference. But PL languages have
to create only IN variables. It's protection before identifier's name
colision. With special flag I don't need any changes in executor. And small
change in PL compile rutines. Special proargmode can be solution too. I
don't need new column in pg_proc, but have to modify executor and need more
changes in output rutines in PL.
I'll go on the way to spec. proargmode. It's good idea.
Thank You
Pavel Stehule
_________________________________________________________________
Emotikony a pozadi programu MSN Messenger ozivi vasi konverzaci.
http://messenger.msn.cz/