mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	These tests don't work reliably with pre-2.6 Python versions, since
Python code like float('inf') was not guaranteed to work before that,
even granting an IEEE-compliant platform.
Since there's no explicit handling of these cases in jsonb_plpython,
we're not adding any real code coverage by testing them, and thus
it doesn't seem to make sense to go to any great lengths to work
around the test instability.
Discussion: https://postgr.es/m/E1f1AMU-00031c-9N@gemulon.postgresql.org
		
	
		
			
				
	
	
		
			307 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| CREATE EXTENSION jsonb_plpython2u CASCADE;
 | |
| NOTICE:  installing required extension "plpython2u"
 | |
| -- test jsonb -> python dict
 | |
| CREATE FUNCTION test1(val jsonb) RETURNS int
 | |
| LANGUAGE plpythonu
 | |
| 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 plpython2u
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| 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 plpythonu
 | |
| TRANSFORM FOR TYPE jsonb
 | |
| AS $$
 | |
| x = 0xff
 | |
| return x
 | |
| $$;
 | |
| SELECT testDecimal();
 | |
|  testdecimal 
 | |
| -------------
 | |
|  255
 | |
| (1 row)
 | |
| 
 | |
| -- tuple -> jsonb
 | |
| CREATE FUNCTION testTuple() RETURNS jsonb
 | |
| LANGUAGE plpythonu
 | |
| 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 plpythonu
 | |
| 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)
 | |
| 
 |