Re: Set-returning functions only allowed if written in language 'sql'

From: raf <raf(at)raf(dot)org>
To: pgsql-bugs(at)postgresql(dot)org
Subject: Re: Set-returning functions only allowed if written in language 'sql'
Date: 2009-02-10 23:48:16
Message-ID: 20090210234815.GA11860@raf.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Pavel Stehule wrote:

> Hello
>
> this limit will be removed at 8.4
>
> in older version you have to use table notation like
>
> select * from srf()
>
> regards
> Pavel Stehule

hi,

that's funny. the 8.3 documentation i read said that in the
future you'd probably have to use "select * from srf()"
and *not* "select srf()" since that method is deprecated:

http://www.postgresql.org/docs/8.3/interactive/xfunc-sql.html#AEN40353

"Currently, functions returning sets can also be called in
the select list of a query. For each row that the query
generates by itself, the function returning set is invoked,
and an output row is generated for each element of the
function's result set. Note, however, that this capability
is deprecated and might be removed in future releases."

so i use "select * from srf()" all the time
(it works better for multi-column sets anyway).

does this mean that "select srf()" is no longer deprecated?

cheers,
raf

> 2009/2/10 Daniel Migowski <dmigowski(at)ikoffice(dot)de>:
> > Hello dear PostgreSQL developers,
> >
> > I noticed the following strange behaviour with set-returning functions. If
> > sets are allowed seems to depend on the language the function is written in,
> > what makes conpletely no sense to me. See the following functions x() and
> > y(). x() is written in 'sql' and works, y() is written is plpgsql and fails.
> > Any reasons for this I do not realize?
> >
> > With best regards,
> > Daniel Migowski
> >
> > ----------------------------
> >
> > CREATE FUNCTION x() RETURNS SETOF int4 AS
> > $$
> > SELECT 1
> > UNION
> > SELECT 2
> > $$
> > LANGUAGE 'sql';
> > SELECT x(); -- fine with two result rows.
> >
> > CREATE FUNCTION y() RETURNS SETOF int4 AS
> > $$
> > BEGIN
> > RETURN NEXT 1;
> > RETURN NEXT 2;
> > END
> > $$
> > LANGUAGE 'plpgsql';
> > SELECT y(); -- fails with:
> > FEHLER: Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der
> > keine Mengenergebnisse verarbeiten kann
> > SQL Status:0A000
> > Kontext:PL/pgSQL function "y" line 2 at RETURN NEXT

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2009-02-11 00:49:37 Re: Set-returning functions only allowed if written in language 'sql'
Previous Message Marshall, Steve 2009-02-10 14:42:54 Re: pg_listener entries deleted under heavy NOTIFY load only on Windows