mirror of
https://github.com/postgres/postgres.git
synced 2025-07-23 03:21:12 +03:00
config
contrib
adminpack
amcheck
auth_delay
auto_explain
basebackup_to_shell
basic_archive
bloom
bool_plperl
btree_gin
btree_gist
citext
cube
dblink
dict_int
dict_xsyn
earthdistance
file_fdw
fuzzystrmatch
hstore
hstore_plperl
hstore_plpython
intagg
intarray
isn
jsonb_plperl
expected
sql
jsonb_plperl.sql
jsonb_plperlu.sql
.gitignore
Makefile
jsonb_plperl--1.0.sql
jsonb_plperl.c
jsonb_plperl.control
jsonb_plperlu--1.0.sql
jsonb_plperlu.control
jsonb_plpython
lo
ltree
ltree_plpython
oid2name
old_snapshot
pageinspect
passwordcheck
pg_buffercache
pg_freespacemap
pg_prewarm
pg_stat_statements
pg_surgery
pg_trgm
pg_visibility
pg_walinspect
pgcrypto
pgrowlocks
pgstattuple
postgres_fdw
seg
sepgsql
spi
sslinfo
start-scripts
tablefunc
tcn
test_decoding
tsm_system_rows
tsm_system_time
unaccent
uuid-ossp
vacuumlo
xml2
Makefile
README
contrib-global.mk
doc
src
.cirrus.yml
.dir-locals.el
.editorconfig
.git-blame-ignore-revs
.gitattributes
.gitignore
COPYRIGHT
GNUmakefile.in
HISTORY
Makefile
README
README.git
aclocal.m4
configure
configure.ac
Perl has multiple internal representations of "undef", and just testing for SvTYPE(x) == SVt_NULL doesn't recognize all of them, leading to "cannot transform this Perl type to jsonb" errors. Use the approved test SvOK() instead. Report and patch by Ivan Panchenko. Back-patch to v11 where this module was added. Discussion: https://postgr.es/m/1564783533.324795401@f193.i.mail.ru
118 lines
2.6 KiB
PL/PgSQL
118 lines
2.6 KiB
PL/PgSQL
CREATE EXTENSION jsonb_plperl CASCADE;
|
|
|
|
|
|
CREATE FUNCTION testHVToJsonb() RETURNS jsonb
|
|
LANGUAGE plperl
|
|
TRANSFORM FOR TYPE jsonb
|
|
AS $$
|
|
$val = {a => 1, b => 'boo', c => undef};
|
|
return $val;
|
|
$$;
|
|
|
|
SELECT testHVToJsonb();
|
|
|
|
|
|
CREATE FUNCTION testAVToJsonb() RETURNS jsonb
|
|
LANGUAGE plperl
|
|
TRANSFORM FOR TYPE jsonb
|
|
AS $$
|
|
$val = [{a => 1, b => 'boo', c => undef}, {d => 2}];
|
|
return $val;
|
|
$$;
|
|
|
|
SELECT testAVToJsonb();
|
|
|
|
|
|
CREATE FUNCTION testSVToJsonb() RETURNS jsonb
|
|
LANGUAGE plperl
|
|
TRANSFORM FOR TYPE jsonb
|
|
AS $$
|
|
$val = 1;
|
|
return $val;
|
|
$$;
|
|
|
|
SELECT testSVToJsonb();
|
|
|
|
|
|
CREATE FUNCTION testUVToJsonb() RETURNS jsonb
|
|
LANGUAGE plperl
|
|
TRANSFORM FOR TYPE jsonb
|
|
as $$
|
|
$val = ~0;
|
|
return $val;
|
|
$$;
|
|
|
|
-- this might produce either 18446744073709551615 or 4294967295
|
|
SELECT testUVToJsonb() IN ('18446744073709551615'::jsonb, '4294967295'::jsonb);
|
|
|
|
|
|
-- this revealed a bug in the original implementation
|
|
CREATE FUNCTION testRegexpResultToJsonb() RETURNS jsonb
|
|
LANGUAGE plperl
|
|
TRANSFORM FOR TYPE jsonb
|
|
AS $$
|
|
return ('1' =~ m(0\t2));
|
|
$$;
|
|
|
|
SELECT testRegexpResultToJsonb();
|
|
|
|
|
|
-- this revealed a different bug
|
|
CREATE FUNCTION testTextToJsonbObject(text) RETURNS jsonb
|
|
LANGUAGE plperl
|
|
TRANSFORM FOR TYPE jsonb
|
|
AS $$
|
|
my $x = shift;
|
|
return {a => $x};
|
|
$$;
|
|
|
|
SELECT testTextToJsonbObject('abc');
|
|
SELECT testTextToJsonbObject(NULL);
|
|
|
|
|
|
CREATE FUNCTION roundtrip(val jsonb, ref text = '') RETURNS jsonb
|
|
LANGUAGE plperl
|
|
TRANSFORM FOR TYPE jsonb
|
|
AS $$
|
|
# can't use Data::Dumper, but let's at least check for unexpected ref type
|
|
die 'unexpected '.(ref($_[0]) || 'not a').' reference'
|
|
if ref($_[0]) ne $_[1];
|
|
return $_[0];
|
|
$$;
|
|
|
|
|
|
SELECT roundtrip('null') is null;
|
|
SELECT roundtrip('1');
|
|
SELECT roundtrip('1E+131071');
|
|
SELECT roundtrip('-1');
|
|
SELECT roundtrip('1.2');
|
|
SELECT roundtrip('-1.2');
|
|
SELECT roundtrip('"string"');
|
|
SELECT roundtrip('"NaN"');
|
|
|
|
SELECT roundtrip('true');
|
|
SELECT roundtrip('false');
|
|
|
|
SELECT roundtrip('[]', 'ARRAY');
|
|
SELECT roundtrip('[null, null]', 'ARRAY');
|
|
SELECT roundtrip('[1, 2, 3]', 'ARRAY');
|
|
SELECT roundtrip('[-1, 2, -3]', 'ARRAY');
|
|
SELECT roundtrip('[1.2, 2.3, 3.4]', 'ARRAY');
|
|
SELECT roundtrip('[-1.2, 2.3, -3.4]', 'ARRAY');
|
|
SELECT roundtrip('["string1", "string2"]', 'ARRAY');
|
|
SELECT roundtrip('[["string1", "string2"]]', 'ARRAY');
|
|
|
|
SELECT roundtrip('{}', 'HASH');
|
|
SELECT roundtrip('{"1": null}', 'HASH');
|
|
SELECT roundtrip('{"1": 1}', 'HASH');
|
|
SELECT roundtrip('{"1": -1}', 'HASH');
|
|
SELECT roundtrip('{"1": 1.1}', 'HASH');
|
|
SELECT roundtrip('{"1": -1.1}', 'HASH');
|
|
SELECT roundtrip('{"1": "string1"}', 'HASH');
|
|
|
|
SELECT roundtrip('{"1": {"2": [3, 4, 5]}, "2": 3}', 'HASH');
|
|
|
|
|
|
\set VERBOSITY terse \\ -- suppress cascade details
|
|
DROP EXTENSION plperl CASCADE;
|