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 |
Message-ID: | 87ttmultc8.fsf@wibble.ilmari.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
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
1731e3741cbbf8e0b4481665d7d523bc55117f63.
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
TRANSFORM FOR TYPE bytea
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;
string
--------
stuff
(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 |
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 |