| CREATE EXTENSION jsonb_plperl CASCADE; |
| NOTICE: installing required extension "plperl" |
| CREATE FUNCTION testHVToJsonb() RETURNS jsonb |
| LANGUAGE plperl |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| $val = {a => 1, b => 'boo', c => undef}; |
| return $val; |
| $$; |
| SELECT testHVToJsonb(); |
| testhvtojsonb |
| --------------------------------- |
| {"a": 1, "b": "boo", "c": null} |
| (1 row) |
| |
| 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(); |
| testavtojsonb |
| --------------------------------------------- |
| [{"a": 1, "b": "boo", "c": null}, {"d": 2}] |
| (1 row) |
| |
| CREATE FUNCTION testSVToJsonb() RETURNS jsonb |
| LANGUAGE plperl |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| $val = 1; |
| return $val; |
| $$; |
| SELECT testSVToJsonb(); |
| testsvtojsonb |
| --------------- |
| 1 |
| (1 row) |
| |
| 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); |
| ?column? |
| ---------- |
| t |
| (1 row) |
| |
| -- 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(); |
| testregexpresulttojsonb |
| ------------------------- |
| 0 |
| (1 row) |
| |
| -- 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'); |
| testtexttojsonbobject |
| ----------------------- |
| {"a": "abc"} |
| (1 row) |
| |
| SELECT testTextToJsonbObject(NULL); |
| testtexttojsonbobject |
| ----------------------- |
| {"a": null} |
| (1 row) |
| |
| 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; |
| ?column? |
| ---------- |
| t |
| (1 row) |
| |
| SELECT roundtrip('1'); |
| roundtrip |
| ----------- |
| 1 |
| (1 row) |
| |
| SELECT roundtrip('1E+131071'); |
| ERROR: cannot convert infinity to jsonb |
| CONTEXT: PL/Perl function "roundtrip" |
| SELECT roundtrip('-1'); |
| roundtrip |
| ----------- |
| -1 |
| (1 row) |
| |
| SELECT roundtrip('1.2'); |
| roundtrip |
| ----------- |
| 1.2 |
| (1 row) |
| |
| SELECT roundtrip('-1.2'); |
| roundtrip |
| ----------- |
| -1.2 |
| (1 row) |
| |
| SELECT roundtrip('"string"'); |
| roundtrip |
| ----------- |
| "string" |
| (1 row) |
| |
| SELECT roundtrip('"NaN"'); |
| roundtrip |
| ----------- |
| "NaN" |
| (1 row) |
| |
| SELECT roundtrip('true'); |
| roundtrip |
| ----------- |
| 1 |
| (1 row) |
| |
| SELECT roundtrip('false'); |
| roundtrip |
| ----------- |
| 0 |
| (1 row) |
| |
| SELECT roundtrip('[]', 'ARRAY'); |
| roundtrip |
| ----------- |
| [] |
| (1 row) |
| |
| SELECT roundtrip('[null, null]', 'ARRAY'); |
| roundtrip |
| -------------- |
| [null, null] |
| (1 row) |
| |
| SELECT roundtrip('[1, 2, 3]', 'ARRAY'); |
| roundtrip |
| ----------- |
| [1, 2, 3] |
| (1 row) |
| |
| SELECT roundtrip('[-1, 2, -3]', 'ARRAY'); |
| roundtrip |
| ------------- |
| [-1, 2, -3] |
| (1 row) |
| |
| SELECT roundtrip('[1.2, 2.3, 3.4]', 'ARRAY'); |
| roundtrip |
| ----------------- |
| [1.2, 2.3, 3.4] |
| (1 row) |
| |
| SELECT roundtrip('[-1.2, 2.3, -3.4]', 'ARRAY'); |
| roundtrip |
| ------------------- |
| [-1.2, 2.3, -3.4] |
| (1 row) |
| |
| SELECT roundtrip('["string1", "string2"]', 'ARRAY'); |
| roundtrip |
| ------------------------ |
| ["string1", "string2"] |
| (1 row) |
| |
| SELECT roundtrip('[["string1", "string2"]]', 'ARRAY'); |
| roundtrip |
| -------------------------- |
| [["string1", "string2"]] |
| (1 row) |
| |
| SELECT roundtrip('{}', 'HASH'); |
| roundtrip |
| ----------- |
| {} |
| (1 row) |
| |
| SELECT roundtrip('{"1": null}', 'HASH'); |
| roundtrip |
| ------------- |
| {"1": null} |
| (1 row) |
| |
| SELECT roundtrip('{"1": 1}', 'HASH'); |
| roundtrip |
| ----------- |
| {"1": 1} |
| (1 row) |
| |
| SELECT roundtrip('{"1": -1}', 'HASH'); |
| roundtrip |
| ----------- |
| {"1": -1} |
| (1 row) |
| |
| SELECT roundtrip('{"1": 1.1}', 'HASH'); |
| roundtrip |
| ------------ |
| {"1": 1.1} |
| (1 row) |
| |
| SELECT roundtrip('{"1": -1.1}', 'HASH'); |
| roundtrip |
| ------------- |
| {"1": -1.1} |
| (1 row) |
| |
| SELECT roundtrip('{"1": "string1"}', 'HASH'); |
| roundtrip |
| ------------------ |
| {"1": "string1"} |
| (1 row) |
| |
| SELECT roundtrip('{"1": {"2": [3, 4, 5]}, "2": 3}', 'HASH'); |
| roundtrip |
| --------------------------------- |
| {"1": {"2": [3, 4, 5]}, "2": 3} |
| (1 row) |
| |
| \set VERBOSITY terse \\ -- suppress cascade details |
| DROP EXTENSION plperl CASCADE; |
| NOTICE: drop cascades to 8 other objects |