PolarDB-for-PostgreSQL
305 строк · 5.3 Кб
1CREATE EXTENSION jsonb_plpython2u CASCADE;
2NOTICE: installing required extension "plpython2u"
3-- test jsonb -> python dict
4CREATE FUNCTION test1(val jsonb) RETURNS int
5LANGUAGE plpythonu
6TRANSFORM FOR TYPE jsonb
7AS $$
8assert isinstance(val, dict)
9assert(val == {'a': 1, 'c': 'NULL'})
10return len(val)
11$$;
12SELECT test1('{"a": 1, "c": "NULL"}'::jsonb);
13test1
14-------
152
16(1 row)
17
18-- test jsonb -> python dict
19-- complex dict with dicts as value
20CREATE FUNCTION test1complex(val jsonb) RETURNS int
21LANGUAGE plpython2u
22TRANSFORM FOR TYPE jsonb
23AS $$
24assert isinstance(val, dict)
25assert(val == {"d": {"d": 1}})
26return len(val)
27$$;
28SELECT test1complex('{"d": {"d": 1}}'::jsonb);
29test1complex
30--------------
311
32(1 row)
33
34-- test jsonb[] -> python dict
35-- dict with array as value
36CREATE FUNCTION test1arr(val jsonb) RETURNS int
37LANGUAGE plpythonu
38TRANSFORM FOR TYPE jsonb
39AS $$
40assert isinstance(val, dict)
41assert(val == {"d": [12, 1]})
42return len(val)
43$$;
44SELECT test1arr('{"d":[12, 1]}'::jsonb);
45test1arr
46----------
471
48(1 row)
49
50-- test jsonb[] -> python list
51-- simple list
52CREATE FUNCTION test2arr(val jsonb) RETURNS int
53LANGUAGE plpythonu
54TRANSFORM FOR TYPE jsonb
55AS $$
56assert isinstance(val, list)
57assert(val == [12, 1])
58return len(val)
59$$;
60SELECT test2arr('[12, 1]'::jsonb);
61test2arr
62----------
632
64(1 row)
65
66-- test jsonb[] -> python list
67-- array of dicts
68CREATE FUNCTION test3arr(val jsonb) RETURNS int
69LANGUAGE plpythonu
70TRANSFORM FOR TYPE jsonb
71AS $$
72assert isinstance(val, list)
73assert(val == [{"a": 1,"b": 2}, {"c": 3,"d": 4}])
74return len(val)
75$$;
76SELECT test3arr('[{"a": 1, "b": 2}, {"c": 3,"d": 4}]'::jsonb);
77test3arr
78----------
792
80(1 row)
81
82-- test jsonb int -> python int
83CREATE FUNCTION test1int(val jsonb) RETURNS int
84LANGUAGE plpythonu
85TRANSFORM FOR TYPE jsonb
86AS $$
87assert(val == 1)
88return val
89$$;
90SELECT test1int('1'::jsonb);
91test1int
92----------
931
94(1 row)
95
96-- test jsonb string -> python string
97CREATE FUNCTION test1string(val jsonb) RETURNS text
98LANGUAGE plpythonu
99TRANSFORM FOR TYPE jsonb
100AS $$
101assert(val == "a")
102return val
103$$;
104SELECT test1string('"a"'::jsonb);
105test1string
106-------------
107a
108(1 row)
109
110-- test jsonb null -> python None
111CREATE FUNCTION test1null(val jsonb) RETURNS int
112LANGUAGE plpythonu
113TRANSFORM FOR TYPE jsonb
114AS $$
115assert(val == None)
116return 1
117$$;
118SELECT test1null('null'::jsonb);
119test1null
120-----------
1211
122(1 row)
123
124-- test python -> jsonb
125CREATE FUNCTION roundtrip(val jsonb) RETURNS jsonb
126LANGUAGE plpythonu
127TRANSFORM FOR TYPE jsonb
128as $$
129return val
130$$;
131SELECT roundtrip('null'::jsonb);
132roundtrip
133-----------
134
135(1 row)
136
137SELECT roundtrip('1'::jsonb);
138roundtrip
139-----------
1401
141(1 row)
142
143SELECT roundtrip('1234567890.0987654321'::jsonb);
144roundtrip
145-----------------------
1461234567890.0987654321
147(1 row)
148
149SELECT roundtrip('-1234567890.0987654321'::jsonb);
150roundtrip
151------------------------
152-1234567890.0987654321
153(1 row)
154
155SELECT roundtrip('true'::jsonb);
156roundtrip
157-----------
158true
159(1 row)
160
161SELECT roundtrip('"string"'::jsonb);
162roundtrip
163-----------
164"string"
165(1 row)
166
167SELECT roundtrip('{"1": null}'::jsonb);
168roundtrip
169-------------
170{"1": null}
171(1 row)
172
173SELECT roundtrip('{"1": 1}'::jsonb);
174roundtrip
175-----------
176{"1": 1}
177(1 row)
178
179SELECT roundtrip('{"1": true}'::jsonb);
180roundtrip
181-------------
182{"1": true}
183(1 row)
184
185SELECT roundtrip('{"1": "string"}'::jsonb);
186roundtrip
187-----------------
188{"1": "string"}
189(1 row)
190
191SELECT roundtrip('[null]'::jsonb);
192roundtrip
193-----------
194[null]
195(1 row)
196
197SELECT roundtrip('[1]'::jsonb);
198roundtrip
199-----------
200[1]
201(1 row)
202
203SELECT roundtrip('[true]'::jsonb);
204roundtrip
205-----------
206[true]
207(1 row)
208
209SELECT roundtrip('["string"]'::jsonb);
210roundtrip
211------------
212["string"]
213(1 row)
214
215SELECT roundtrip('[null, 1]'::jsonb);
216roundtrip
217-----------
218[null, 1]
219(1 row)
220
221SELECT roundtrip('[1, true]'::jsonb);
222roundtrip
223-----------
224[1, true]
225(1 row)
226
227SELECT roundtrip('[true, "string"]'::jsonb);
228roundtrip
229------------------
230[true, "string"]
231(1 row)
232
233SELECT roundtrip('["string", "string2"]'::jsonb);
234roundtrip
235-----------------------
236["string", "string2"]
237(1 row)
238
239-- complex numbers -> jsonb
240CREATE FUNCTION testComplexNumbers() RETURNS jsonb
241LANGUAGE plpythonu
242TRANSFORM FOR TYPE jsonb
243AS $$
244x = 1 + 2j
245return x
246$$;
247SELECT testComplexNumbers();
248ERROR: could not convert value "(1+2j)" to jsonb
249CONTEXT: while creating return value
250PL/Python function "testcomplexnumbers"
251-- range -> jsonb
252CREATE FUNCTION testRange() RETURNS jsonb
253LANGUAGE plpythonu
254TRANSFORM FOR TYPE jsonb
255AS $$
256x = range(3)
257return x
258$$;
259SELECT testRange();
260testrange
261-----------
262[0, 1, 2]
263(1 row)
264
265-- 0xff -> jsonb
266CREATE FUNCTION testDecimal() RETURNS jsonb
267LANGUAGE plpythonu
268TRANSFORM FOR TYPE jsonb
269AS $$
270x = 0xff
271return x
272$$;
273SELECT testDecimal();
274testdecimal
275-------------
276255
277(1 row)
278
279-- tuple -> jsonb
280CREATE FUNCTION testTuple() RETURNS jsonb
281LANGUAGE plpythonu
282TRANSFORM FOR TYPE jsonb
283AS $$
284x = (1, 'String', None)
285return x
286$$;
287SELECT testTuple();
288testtuple
289---------------------
290[1, "String", null]
291(1 row)
292
293-- interesting dict -> jsonb
294CREATE FUNCTION test_dict1() RETURNS jsonb
295LANGUAGE plpythonu
296TRANSFORM FOR TYPE jsonb
297AS $$
298x = {"a": 1, None: 2, 33: 3}
299return x
300$$;
301SELECT test_dict1();
302test_dict1
303--------------------------
304{"": 2, "a": 1, "33": 3}
305(1 row)
306
307