Re: Segfault from PL/Perl Returning vstring

From: Andrew Dunstan <andrew(at)dunslane(dot)net>
To: "David E(dot) Wheeler" <david(at)kineticode(dot)com>
Cc: pgsql-hackers Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Segfault from PL/Perl Returning vstring
Date: 2009-12-21 19:46:17
Message-ID: 4B2FD089.6060101@dunslane.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

David E. Wheeler wrote:
> At least I think it's a segfault. This function returns a vstring:
>
> CREATE OR REPLACE FUNCTION wtf(
> ) RETURNS text LANGUAGE plperl IMMUTABLE STRICT AS $X$
> return $^V;
> $X$;
>
> Here's what happens when I call it:
>
> try=# select wtf();
> server closed the connection unexpectedly
> This probably means the server terminated abnormally
> before or while processing the request.
> The connection to the server was lost. Attempting reset: Failed.
> !>
>
> So I think that it doesn't know what to do with vstrings. They should probably never be returned (they're mostly deprecated), but if they are, they should be cast to text, I think.
>
>
>

It's not doing that for me.

The plperl code has no way at all of knowing that the bytes you are
returning come from $^V. If you really want the version back, do what
the perl docs tell you and sprintf the value:

andrew=# CREATE OR REPLACE FUNCTION wtf(
) RETURNS text LANGUAGE plperl IMMUTABLE STRICT AS $X$
return sprintf("%vd",$^V);
$X$;
CREATE FUNCTION
andrew=# select wtf();
wtf
-------
5.8.8

BTW, this should arguably not be an immutable function. You could
replace the perl library, so it's not solely dependent on the input for
the result.

cheers

andrew

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message David E. Wheeler 2009-12-21 19:48:20 Re: Segfault from PL/Perl Returning vstring
Previous Message David E. Wheeler 2009-12-21 19:26:38 Segfault from PL/Perl Returning vstring