| CREATE EXTENSION jsonb_plpython3u CASCADE; |
| NOTICE: installing required extension "plpython3u" |
| -- test jsonb -> python dict |
| CREATE FUNCTION test1(val jsonb) RETURNS int |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| assert isinstance(val, dict) |
| assert(val == {'a': 1, 'c': 'NULL'}) |
| return len(val) |
| $$; |
| SELECT test1('{"a": 1, "c": "NULL"}'::jsonb); |
| test1 |
| ------- |
| 2 |
| (1 row) |
| |
| -- test jsonb -> python dict |
| -- complex dict with dicts as value |
| CREATE FUNCTION test1complex(val jsonb) RETURNS int |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| assert isinstance(val, dict) |
| assert(val == {"d": {"d": 1}}) |
| return len(val) |
| $$; |
| SELECT test1complex('{"d": {"d": 1}}'::jsonb); |
| test1complex |
| -------------- |
| 1 |
| (1 row) |
| |
| -- test jsonb[] -> python dict |
| -- dict with array as value |
| CREATE FUNCTION test1arr(val jsonb) RETURNS int |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| assert isinstance(val, dict) |
| assert(val == {"d": [12, 1]}) |
| return len(val) |
| $$; |
| SELECT test1arr('{"d":[12, 1]}'::jsonb); |
| test1arr |
| ---------- |
| 1 |
| (1 row) |
| |
| -- test jsonb[] -> python list |
| -- simple list |
| CREATE FUNCTION test2arr(val jsonb) RETURNS int |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| assert isinstance(val, list) |
| assert(val == [12, 1]) |
| return len(val) |
| $$; |
| SELECT test2arr('[12, 1]'::jsonb); |
| test2arr |
| ---------- |
| 2 |
| (1 row) |
| |
| -- test jsonb[] -> python list |
| -- array of dicts |
| CREATE FUNCTION test3arr(val jsonb) RETURNS int |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| assert isinstance(val, list) |
| assert(val == [{"a": 1,"b": 2}, {"c": 3,"d": 4}]) |
| return len(val) |
| $$; |
| SELECT test3arr('[{"a": 1, "b": 2}, {"c": 3,"d": 4}]'::jsonb); |
| test3arr |
| ---------- |
| 2 |
| (1 row) |
| |
| -- test jsonb int -> python int |
| CREATE FUNCTION test1int(val jsonb) RETURNS int |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| assert(val == 1) |
| return val |
| $$; |
| SELECT test1int('1'::jsonb); |
| test1int |
| ---------- |
| 1 |
| (1 row) |
| |
| -- test jsonb string -> python string |
| CREATE FUNCTION test1string(val jsonb) RETURNS text |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| assert(val == "a") |
| return val |
| $$; |
| SELECT test1string('"a"'::jsonb); |
| test1string |
| ------------- |
| a |
| (1 row) |
| |
| -- test jsonb null -> python None |
| CREATE FUNCTION test1null(val jsonb) RETURNS int |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| assert(val == None) |
| return 1 |
| $$; |
| SELECT test1null('null'::jsonb); |
| test1null |
| ----------- |
| 1 |
| (1 row) |
| |
| -- test python -> jsonb |
| CREATE FUNCTION roundtrip(val jsonb) RETURNS jsonb |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| as $$ |
| return val |
| $$; |
| SELECT roundtrip('null'::jsonb); |
| roundtrip |
| ----------- |
| |
| (1 row) |
| |
| SELECT roundtrip('1'::jsonb); |
| roundtrip |
| ----------- |
| 1 |
| (1 row) |
| |
| SELECT roundtrip('1234567890.0987654321'::jsonb); |
| roundtrip |
| ----------------------- |
| 1234567890.0987654321 |
| (1 row) |
| |
| SELECT roundtrip('-1234567890.0987654321'::jsonb); |
| roundtrip |
| ------------------------ |
| -1234567890.0987654321 |
| (1 row) |
| |
| SELECT roundtrip('true'::jsonb); |
| roundtrip |
| ----------- |
| true |
| (1 row) |
| |
| SELECT roundtrip('"string"'::jsonb); |
| roundtrip |
| ----------- |
| "string" |
| (1 row) |
| |
| SELECT roundtrip('{"1": null}'::jsonb); |
| roundtrip |
| ------------- |
| {"1": null} |
| (1 row) |
| |
| SELECT roundtrip('{"1": 1}'::jsonb); |
| roundtrip |
| ----------- |
| {"1": 1} |
| (1 row) |
| |
| SELECT roundtrip('{"1": true}'::jsonb); |
| roundtrip |
| ------------- |
| {"1": true} |
| (1 row) |
| |
| SELECT roundtrip('{"1": "string"}'::jsonb); |
| roundtrip |
| ----------------- |
| {"1": "string"} |
| (1 row) |
| |
| SELECT roundtrip('[null]'::jsonb); |
| roundtrip |
| ----------- |
| [null] |
| (1 row) |
| |
| SELECT roundtrip('[1]'::jsonb); |
| roundtrip |
| ----------- |
| [1] |
| (1 row) |
| |
| SELECT roundtrip('[true]'::jsonb); |
| roundtrip |
| ----------- |
| [true] |
| (1 row) |
| |
| SELECT roundtrip('["string"]'::jsonb); |
| roundtrip |
| ------------ |
| ["string"] |
| (1 row) |
| |
| SELECT roundtrip('[null, 1]'::jsonb); |
| roundtrip |
| ----------- |
| [null, 1] |
| (1 row) |
| |
| SELECT roundtrip('[1, true]'::jsonb); |
| roundtrip |
| ----------- |
| [1, true] |
| (1 row) |
| |
| SELECT roundtrip('[true, "string"]'::jsonb); |
| roundtrip |
| ------------------ |
| [true, "string"] |
| (1 row) |
| |
| SELECT roundtrip('["string", "string2"]'::jsonb); |
| roundtrip |
| ----------------------- |
| ["string", "string2"] |
| (1 row) |
| |
| -- complex numbers -> jsonb |
| CREATE FUNCTION testComplexNumbers() RETURNS jsonb |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| x = 1 + 2j |
| return x |
| $$; |
| SELECT testComplexNumbers(); |
| ERROR: could not convert value "(1+2j)" to jsonb |
| CONTEXT: while creating return value |
| PL/Python function "testcomplexnumbers" |
| -- range -> jsonb |
| CREATE FUNCTION testRange() RETURNS jsonb |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| x = range(3) |
| return x |
| $$; |
| SELECT testRange(); |
| testrange |
| ----------- |
| [0, 1, 2] |
| (1 row) |
| |
| -- 0xff -> jsonb |
| CREATE FUNCTION testDecimal() RETURNS jsonb |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| x = 0xff |
| return x |
| $$; |
| SELECT testDecimal(); |
| testdecimal |
| ------------- |
| 255 |
| (1 row) |
| |
| -- tuple -> jsonb |
| CREATE FUNCTION testTuple() RETURNS jsonb |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| x = (1, 'String', None) |
| return x |
| $$; |
| SELECT testTuple(); |
| testtuple |
| --------------------- |
| [1, "String", null] |
| (1 row) |
| |
| -- interesting dict -> jsonb |
| CREATE FUNCTION test_dict1() RETURNS jsonb |
| LANGUAGE plpython3u |
| TRANSFORM FOR TYPE jsonb |
| AS $$ |
| x = {"a": 1, None: 2, 33: 3} |
| return x |
| $$; |
| SELECT test_dict1(); |
| test_dict1 |
| -------------------------- |
| {"": 2, "a": 1, "33": 3} |
| (1 row) |
| |