Thread: Functions as first-class values

Functions as first-class values

From
Jon Smark
Date:
Hi,

Is there support in PL/pgSQL for treating functions as first-class values?
Consider the pseudo-code simple example below, which illustrates how this
feature can be useful.  I reckon that this behaviour can be emulated using
EXECUTE, but I suspect there are serious performance penalties.
Your thoughts?

Thanks in advance!
Jon


CREATE FUNCTION f1 (int) RETURNS boolean ...
CREATE FUNCTION f2 (int) RETURNS boolean ...
CREATE FUNCTION f3 (int) RETURNS boolean ...

CREATE FUNCTION do_stuff ...
BEGIN
        CASE cond
                WHEN 'a' THEN func := f1;
                WHEN 'b' THEN func := f2;
                WHEN 'c' THEN func := f3;
        END CASE

        SELECT * FROM foobar WHERE func (foobar.age);
END;


Re: Functions as first-class values

From
Pavel Stehule
Date:
Hello

2011/4/6 Jon Smark <jon.smark@yahoo.com>:
> Hi,
>
> Is there support in PL/pgSQL for treating functions as first-class values?
> Consider the pseudo-code simple example below, which illustrates how this
> feature can be useful.  I reckon that this behaviour can be emulated using
> EXECUTE, but I suspect there are serious performance penalties.
> Your thoughts?
>
> Thanks in advance!
> Jon
>
>
> CREATE FUNCTION f1 (int) RETURNS boolean ...
> CREATE FUNCTION f2 (int) RETURNS boolean ...
> CREATE FUNCTION f3 (int) RETURNS boolean ...
>
> CREATE FUNCTION do_stuff ...
> BEGIN
>        CASE cond
>                WHEN 'a' THEN func := f1;
>                WHEN 'b' THEN func := f2;
>                WHEN 'c' THEN func := f3;
>        END CASE
>
>        SELECT * FROM foobar WHERE func (foobar.age);
> END;
>

no it isn't possible.

Regards

Pavel Stehule



>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>

Re: Functions as first-class values

From
Merlin Moncure
Date:
On Wed, Apr 6, 2011 at 9:10 AM, Pavel Stehule <pavel.stehule@gmail.com> wrote:
> Hello
>
> 2011/4/6 Jon Smark <jon.smark@yahoo.com>:
>> Hi,
>>
>> Is there support in PL/pgSQL for treating functions as first-class values?
>> Consider the pseudo-code simple example below, which illustrates how this
>> feature can be useful.  I reckon that this behaviour can be emulated using
>> EXECUTE, but I suspect there are serious performance penalties.
>> Your thoughts?
>>
>> Thanks in advance!
>> Jon
>>
>>
>> CREATE FUNCTION f1 (int) RETURNS boolean ...
>> CREATE FUNCTION f2 (int) RETURNS boolean ...
>> CREATE FUNCTION f3 (int) RETURNS boolean ...
>>
>> CREATE FUNCTION do_stuff ...
>> BEGIN
>>        CASE cond
>>                WHEN 'a' THEN func := f1;
>>                WHEN 'b' THEN func := f2;
>>                WHEN 'c' THEN func := f3;
>>        END CASE
>>
>>        SELECT * FROM foobar WHERE func (foobar.age);
>> END;
>>
>
> no it isn't possible.

it can be done with a small C wrapper though.  see archives.

merlin