Re: Bytea PL/Perl transform

From: Dagfinn Ilmari Mannsåker <ilmari(at)ilmari(dot)org>
To: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Cc: vignesh C <vignesh21(at)gmail(dot)com>, Ivan Panchenko <wao(at)mail(dot)ru>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Peter Eisentraut <peter(at)eisentraut(dot)org>, pgsql-hackers(at)lists(dot)postgresql(dot)org, Greg Sabino Mullane <htamfids(at)gmail(dot)com>
Subject: Re: Bytea PL/Perl transform
Date: 2024-01-30 15:43:51
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-hackers

Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> writes:

> I inserted perl reference support - hstore_plperl and json_plperl does it.
> +<->/* Dereference references recursively. */
> +<->while (SvROK(in))
> +<-><-->in = SvRV(in);

That code in hstore_plperl and json_plperl is only relevant because they
deal with non-scalar values (hashes for hstore, and also arrays for
json) which must be passed as references. The recursive nature of the
dereferencing is questionable, and masked the bug fixed by commit

bytea_plperl only deals with scalars (specifically strings), so should
not concern itself with references. In fact, this code breaks returning
objects with overloaded stringification, for example:

CREATE FUNCTION plperlu_overload() RETURNS bytea LANGUAGE plperlu
AS $$
package StringOverload { use overload '""' => sub { "stuff" }; }
return bless {}, "StringOverload";

This makes the server crash with an assertion failure from Perl because
SvPVbyte() was passed a non-scalar value:

postgres: ilmari regression_bytea_plperl [local] SELECT: sv.c:2865: Perl_sv_2pv_flags:
Assertion `SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVHV && SvTYPE(sv) != SVt_PVFM' failed.

If I remove the dereferincing loop it succeeds:

SELECT encode(plperlu_overload(), 'escape') AS string;
(1 row)

Attached is a v2 patch which removes the dereferencing and includes the
above example as a test.

- ilmari

Attachment Content-Type Size
v2-0001-Add-bytea-transformation-for-plperl.patch text/x-diff 15.6 KB

In response to


Browse pgsql-hackers by date

  From Date Subject
Next Message Bertrand Drouvot 2024-01-30 15:45:00 Re: Synchronizing slots from primary to standby
Previous Message Bertrand Drouvot 2024-01-30 15:41:32 Documentation: warn about two_phase when altering a subscription