Re: Transform for pl/perl
От | Anthony Bykov |
---|---|
Тема | Re: Transform for pl/perl |
Дата | |
Msg-id | 20180215125313.290468ae@anthony-24-g082ur обсуждение исходный текст |
Ответ на | Re: Transform for pl/perl (Arthur Zakirov <a.zakirov@postgrespro.ru>) |
Ответы |
Re: Transform for pl/perl
|
Список | pgsql-hackers |
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
Вложения
В списке pgsql-hackers по дате отправления: