2017-11-15 10:24 GMT+01:00 Oleg Bartunov <obartu...@gmail.com>: > > > On 14 Nov 2017 11:35, "Anthony Bykov" <a.by...@postgrespro.ru> wrote: > > On Fri, 10 Nov 2017 14:40:21 +0100 > Pavel Stehule <pavel.steh...@gmail.com> wrote: > > > Hi > > > > 2017-10-24 14:27 GMT+02:00 Anthony Bykov <a.by...@postgrespro.ru>: > > > > > There are some moments I should mention: > > > 1. {"1":1}::jsonb is transformed into HV {"1"=>"1"}, while > > > ["1","2"]::jsonb is transformed into AV ["1", "2"] > > > > > > 2. If there is a numeric value appear in jsonb, it will be > > > transformed to SVnv through string (Numeric->String->SV->SVnv). Not > > > the best solution, but as far as I understand this is usual > > > practise in postgresql to serialize Numerics and de-serialize them. > > > > > > 3. SVnv is transformed into jsonb through string > > > (SVnv->String->Numeric). > > > > > > An example may also be helpful to understand extension. So, as an > > > example, function "test" transforms incoming jsonb into perl, > > > transforms it back into jsonb and returns it. > > > > > > create extension jsonb_plperl cascade; > > > > > > create or replace function test(val jsonb) > > > returns jsonb > > > transform for type jsonb > > > language plperl > > > as $$ > > > return $_[0]; > > > $$; > > > > > > select test('{"1":1,"example": null}'::jsonb); > > > > > > > > I am looking to this patch: > > > > 1. the patch contains some artefacts - look the word "hstore" > > > > 2. I got lot of warnings > > > > > > make[1]: Vstupuje se do adresáře > > „/home/pavel/src/postgresql/contrib/jsonb_plperl“ > > gcc -Wall -Wmissing-prototypes -Wpointer-arith > > -Wdeclaration-after-statement -Wendif-labels > > -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing > > -fwrapv -fexcess-precision=standard -g -ggdb -Og -g3 > > -fno-omit-frame-pointer -fPIC -I../../src/pl/plperl -I. -I. > > -I../../src/include -D_GNU_SOURCE -I/usr/include/libxml2 > > -I/usr/lib64/perl5/CORE -c -o jsonb_plperl.o jsonb_plperl.c > > jsonb_plperl.c: In function ‘SV_FromJsonbValue’: jsonb_plperl.c:83:9: > > warning: ‘result’ may be used uninitialized in this function > > [-Wmaybe-uninitialized] return (result); > > ^ > > jsonb_plperl.c: In function ‘SV_FromJsonb’: > > jsonb_plperl.c:95:10: warning: ‘object’ may be used uninitialized in > > this function [-Wmaybe-uninitialized] > > HV *object; > > ^~~~~~ > > In file included from /usr/lib64/perl5/CORE/perl.h:5644:0, > > from ../../src/pl/plperl/plperl.h:52, > > from jsonb_plperl.c:17: > > /usr/lib64/perl5/CORE/embed.h:404:19: warning: ‘value’ may be used > > uninitialized in this function [-Wmaybe-uninitialized] > > #define newRV(a) Perl_newRV(aTHX_ a) > > ^~~~~~~~~~ > > jsonb_plperl.c:101:10: note: ‘value’ was declared here > > SV *value; > > ^~~~~ > > gcc -Wall -Wmissing-prototypes -Wpointer-arith > > -Wdeclaration-after-statement -Wendif-labels > > -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing > > -fwrapv -fexcess-precision=standard -g -ggdb -Og -g3 > > -fno-omit-frame-pointer -fPIC -shared -o jsonb_plperl.so > > jsonb_plperl.o -L../../src/port -L../../src/common -Wl,--as-needed > > -Wl,-rpath,'/usr/lib64/perl5/CORE',--enable-new-dtags -Wl,-z,relro > > -specs=/usr/lib/rpm/redhat/redhat-hardened-ld > > -fstack-protector-strong -L/usr/local/lib -L/usr/lib64/perl5/CORE > > -lperl -lpthread -lresolv -lnsl -ldl -lm -lcrypt -lutil -lc make[1]: > > Opouští se adresář „/home/pavel/src/postgresql/contrib/jsonb_plperl“ > > > > [pavel@nemesis contrib]$ gcc --version > > gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2) > > Copyright (C) 2017 Free Software Foundation, Inc. > > This is free software; see the source for copying conditions. There > > is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A > > PARTICULAR PURPOSE. > > > > 3. regress tests passed > > > > 4. There are not any documentation - probably it should be part of > > PLPerl > > > > 5. The regress tests doesn't coverage other datatypes than numbers. I > > miss boolean, binary, object, ... Maybe using data::dumper or some > > similar can be interesting > > > > Note - it is great extension, I am pleasured so transformations are > > used. > > > > Regards > > > > Pavel > > > > > > -- > > > Sent via pgsql-hackers mailing list (pgsql-hack...@postgresql.org) > > > To make changes to your subscription: > > > http://www.postgresql.org/mailpref/pgsql-hackers > > > > > Hello, > Thank you for your review. I have fixed most of your comments, except > for the 5-th part, about data::dumper - I just couldn't understand > your point, but I've added more tests with more complex objects if this > helps. > > Please, take a look at new patch. You can find it in attachments to > this message (it is called "0001-jsonb_plperl-extension-v2.patch") > > > I'm curious, how much benefit we could get from this ? There are several > publicly available json datasets, which can be used to measure performance > gaining. I have bookmarks and review datasets available from > http://www.sai.msu.su/~megera/postgres/files/, look at js.dump.gz and > jr.dump.gz >
I don't expect significant performance effect - it remove some transformations - perl object -> json | json -> jsonb - but on modern cpu these transformations should be fast. For me - main benefit is user comfort - it does direct transformation from perl object -> jsonb But some performance check can be interesting Regards Pavel > > > -- > Anthony Bykov > Postgres Professional: http://www.postgrespro.com > The Russian Postgres Company > > >