Re: suspicious pointer/integer coersion - Mailing list pgsql-hackers

From Andrew Dunstan
Subject Re: suspicious pointer/integer coersion
Date
Msg-id 42D1B8F0.8020100@dunslane.net
Whole thread Raw
In response to Re: suspicious pointer/integer coersion  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: suspicious pointer/integer coersion
List pgsql-hackers

Tom Lane wrote:

>Andrew Dunstan <andrew@dunslane.net> 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 = 2recurse
---------hello 1hello 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]$


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: plperl warning
Next
From: Andrew Dunstan
Date:
Subject: Re: suspicious pointer/integer coersion