Tom Lane wrote:

Andrew Dunstan <[EMAIL PROTECTED]> writes:
Works for me. There are some other things about the procdesc stuff I'm trying to sort out (especially if we should be storing per-call info inside it).

Hmm, probably not ... check to see if a recursive plperl function
behaves sanely.  (This might not have been much of an issue before
we had SPI support in plperl, since there was no way to recurse;
but it is an issue now.)

Behaviour is not good (see below for proof).

ISTM we'll need some sort of implicit of explicit stack of per-call data. The trick will be getting it to behave right under error recovery.

cheers

andrew


[andrew inst]$ bin/psql -e -f recurse.sql
create or replace function recurse(i int) returns setof text language plperl
as $$

 my $i = shift;
 elog(NOTICE,"i = $i");
 foreach my $x (1..$i)
 {
   return_next "hello $x";
 }
 if ($i > 2)
 {
   my $z = $i-1;
   my $cursor = spi_query("select * from recurse($z)");
   while (defined(my $row = spi_fetchrow($cursor)))
   {
     return_next "recurse $i: $row";
   }
 }
 return undef;

$$;
CREATE FUNCTION
select * from recurse(2);
psql:recurse.sql:24: NOTICE:  i = 2
recurse
---------
hello 1
hello 2
(2 rows)

select * from recurse(3);
psql:recurse.sql:25: NOTICE:  i = 3
psql:recurse.sql:25: NOTICE:  i = 2
psql:recurse.sql:25: server closed the connection unexpectedly
       This probably means the server terminated abnormally
       before or while processing the request.
psql:recurse.sql:25: connection to server was lost
[andrew inst]$

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

              http://www.postgresql.org/docs/faq

Reply via email to