Function call with offset and limit

From: REYNAUD Jean-Samuel <reynaud(at)elma(dot)fr>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Function call with offset and limit
Date: 2005-12-21 17:44:33
Message-ID: 1135187074.1316.63.camel@jsr.elma.loc
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi all,

We need to find a solution for a strange problem.
We have a plpgsql FUNCTION which performs an heavy job (named
test_func).

CREATE or replace function test_func(z int) returns integer as $$
declare
tst integer;
begin
--
-- Large jobs with z
--
tst := nextval('test_truc');
return tst;
end;
$$ LANGUAGE plpgsql;

So I made this test:

test=# select setval('test_truc',1);
setval
--------
1
(1 row)

test=# select currval('test_truc') ;
currval
---------
1
(1 row)

test=# select *,test_func(idkeyword) from tag offset 5000 limit 1;
idkeyword | test_func
-----------+-------------
5001 | 5002
(1 row)

test=# select currval('test_truc') ;
currval
---------
5002
(1 row)

This demonstrates that the function is called 5001 times though only one
row is returned. Problem is that this heavy job is performed much, much
more than needed.

But, If I do:
test=# select *,(select test_func(1)) from tag offset 5000 limit 1;
My function is called only once.

Is there any work around ?

Thanks
--
REYNAUD Jean-Samuel <reynaud(at)elma(dot)fr>
Elma

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Dave Cramer 2005-12-21 17:45:09 replicating tsearch2 across versions of postgres
Previous Message Andrew Dunstan 2005-12-21 16:34:12 Re: localization problem (and solution)