Re: Transform for pl/perl

Anthony Bykov <a.bykov@postgrespro.ru>

From: Anthony Bykov <a.bykov@postgrespro.ru>
To: Arthur Zakirov <a.zakirov@postgrespro.ru>
Cc: Thomas Munro <thomas.munro@enterprisedb.com>, pgsql-hackers@lists.postgresql.org
Date: 2018-02-15T09:53:13Z
Lists: pgsql-hackers

Attachments

On Wed, 31 Jan 2018 13:36:22 +0300
Arthur Zakirov <a.zakirov@postgrespro.ru> wrote:

> I've noticed a possible bug:
> 
> > +					/* json key in v */
> > +					key =
> > pstrdup(v.val.string.val);
> > +					keyLength =
> > v.val.string.len;
> > +					JsonbIteratorNext(&it, &v,
> > true);  
> 
> I think it is worth to use pnstrdup() here, because v.val.string.val
> is not necessarily null-terminated as the comment says:
> 
> > struct JsonbValue
> > ...
> > 		struct
> > 		{
> > 			int			len;
> > 			char	   *val;	/* Not
> > necessarily null-terminated */ }
> > string;		/* String primitive type */  
> 
> Consider an example:
> 
> =# CREATE FUNCTION testSVToJsonb3(val jsonb) RETURNS jsonb
> LANGUAGE plperl
> TRANSFORM FOR TYPE jsonb
> AS $$
> return $_->{"1"};
> $$;
> 
> =# SELECT testSVToJsonb3('{"1":{"2":[3,4,5]},"2":3}');
>  testsvtojsonb3 
> ----------------
>  (null)
> 
> But my perl isn't good, so the example maybe isn't good too.
> 

Hello.
Glad you've noticed this. Thank you.

I've fixed this possible bug in the new patch, but your example
can't check that.

The problem is that $_ - is a pointer to an array of incoming
parameters. So, if you return $_[0]->{"1"} instead of $_->{"1"}, the
test will return exactly the expected output: {"2":[3,4,5]} 

I've tried to test "chop" and even "=~ s/\0$//", but that didn't check
the problem.

--
Anthony Bykov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Commits

  1. Fix jsonb_plperl to convert Perl UV values correctly.

  2. Fix contrib/hstore_plperl to look through scalar refs.

  3. Allow plperl_sv_to_datum to look through scalar refs.

  4. Fix excessive enreferencing in jsonb-to-plperl transform.