mirror of https://github.com/postgres/postgres
Behaves more or less unchanged compared to Python 2, but the new language variant is called plpython3u. Documentation describing the naming scheme is included.REL8_5_ALPHA3_BRANCH
parent
21d11e7ee2
commit
dd4cd55c15
@ -0,0 +1,589 @@ |
|||||||
|
-- |
||||||
|
-- Test data type behavior |
||||||
|
-- |
||||||
|
-- |
||||||
|
-- Base/common types |
||||||
|
-- |
||||||
|
CREATE FUNCTION test_type_conversion_bool(x bool) RETURNS bool AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_bool(true); |
||||||
|
INFO: (True, <class 'bool'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool" |
||||||
|
test_type_conversion_bool |
||||||
|
--------------------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bool(false); |
||||||
|
INFO: (False, <class 'bool'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool" |
||||||
|
test_type_conversion_bool |
||||||
|
--------------------------- |
||||||
|
f |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bool(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool" |
||||||
|
test_type_conversion_bool |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
-- test various other ways to express Booleans in Python |
||||||
|
CREATE FUNCTION test_type_conversion_bool_other(n int) RETURNS bool AS $$ |
||||||
|
# numbers |
||||||
|
if n == 0: |
||||||
|
ret = 0 |
||||||
|
elif n == 1: |
||||||
|
ret = 5 |
||||||
|
# strings |
||||||
|
elif n == 2: |
||||||
|
ret = '' |
||||||
|
elif n == 3: |
||||||
|
ret = 'fa' # true in Python, false in PostgreSQL |
||||||
|
# containers |
||||||
|
elif n == 4: |
||||||
|
ret = [] |
||||||
|
elif n == 5: |
||||||
|
ret = [0] |
||||||
|
plpy.info(ret, not not ret) |
||||||
|
return ret |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_bool_other(0); |
||||||
|
INFO: (0, False) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool_other" |
||||||
|
test_type_conversion_bool_other |
||||||
|
--------------------------------- |
||||||
|
f |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bool_other(1); |
||||||
|
INFO: (5, True) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool_other" |
||||||
|
test_type_conversion_bool_other |
||||||
|
--------------------------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bool_other(2); |
||||||
|
INFO: ('', False) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool_other" |
||||||
|
test_type_conversion_bool_other |
||||||
|
--------------------------------- |
||||||
|
f |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bool_other(3); |
||||||
|
INFO: ('fa', True) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool_other" |
||||||
|
test_type_conversion_bool_other |
||||||
|
--------------------------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bool_other(4); |
||||||
|
INFO: ([], False) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool_other" |
||||||
|
test_type_conversion_bool_other |
||||||
|
--------------------------------- |
||||||
|
f |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bool_other(5); |
||||||
|
INFO: ([0], True) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bool_other" |
||||||
|
test_type_conversion_bool_other |
||||||
|
--------------------------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_char(x char) RETURNS char AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_char('a'); |
||||||
|
INFO: ('a', <class 'str'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_char" |
||||||
|
test_type_conversion_char |
||||||
|
--------------------------- |
||||||
|
a |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_char(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_char" |
||||||
|
test_type_conversion_char |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_int2(x int2) RETURNS int2 AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_int2(100::int2); |
||||||
|
INFO: (100, <class 'int'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int2" |
||||||
|
test_type_conversion_int2 |
||||||
|
--------------------------- |
||||||
|
100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_int2(-100::int2); |
||||||
|
INFO: (-100, <class 'int'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int2" |
||||||
|
test_type_conversion_int2 |
||||||
|
--------------------------- |
||||||
|
-100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_int2(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int2" |
||||||
|
test_type_conversion_int2 |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_int4(x int4) RETURNS int4 AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_int4(100); |
||||||
|
INFO: (100, <class 'int'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int4" |
||||||
|
test_type_conversion_int4 |
||||||
|
--------------------------- |
||||||
|
100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_int4(-100); |
||||||
|
INFO: (-100, <class 'int'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int4" |
||||||
|
test_type_conversion_int4 |
||||||
|
--------------------------- |
||||||
|
-100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_int4(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int4" |
||||||
|
test_type_conversion_int4 |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_int8(x int8) RETURNS int8 AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_int8(100); |
||||||
|
INFO: (100L, <type 'long'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int8" |
||||||
|
test_type_conversion_int8 |
||||||
|
--------------------------- |
||||||
|
100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_int8(-100); |
||||||
|
INFO: (-100L, <type 'long'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int8" |
||||||
|
test_type_conversion_int8 |
||||||
|
--------------------------- |
||||||
|
-100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_int8(5000000000); |
||||||
|
INFO: (5000000000L, <type 'long'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int8" |
||||||
|
test_type_conversion_int8 |
||||||
|
--------------------------- |
||||||
|
5000000000 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_int8(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_int8" |
||||||
|
test_type_conversion_int8 |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_numeric(x numeric) RETURNS numeric AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
/* The current implementation converts numeric to float. */ |
||||||
|
SELECT * FROM test_type_conversion_numeric(100); |
||||||
|
INFO: (100.0, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_numeric" |
||||||
|
test_type_conversion_numeric |
||||||
|
------------------------------ |
||||||
|
100.0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_numeric(-100); |
||||||
|
INFO: (-100.0, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_numeric" |
||||||
|
test_type_conversion_numeric |
||||||
|
------------------------------ |
||||||
|
-100.0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_numeric(5000000000.5); |
||||||
|
INFO: (5000000000.5, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_numeric" |
||||||
|
test_type_conversion_numeric |
||||||
|
------------------------------ |
||||||
|
5000000000.5 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_numeric(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_numeric" |
||||||
|
test_type_conversion_numeric |
||||||
|
------------------------------ |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_float4(x float4) RETURNS float4 AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_float4(100); |
||||||
|
INFO: (100.0, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float4" |
||||||
|
test_type_conversion_float4 |
||||||
|
----------------------------- |
||||||
|
100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_float4(-100); |
||||||
|
INFO: (-100.0, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float4" |
||||||
|
test_type_conversion_float4 |
||||||
|
----------------------------- |
||||||
|
-100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_float4(5000.5); |
||||||
|
INFO: (5000.5, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float4" |
||||||
|
test_type_conversion_float4 |
||||||
|
----------------------------- |
||||||
|
5000.5 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_float4(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float4" |
||||||
|
test_type_conversion_float4 |
||||||
|
----------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_float8(x float8) RETURNS float8 AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_float8(100); |
||||||
|
INFO: (100.0, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float8" |
||||||
|
test_type_conversion_float8 |
||||||
|
----------------------------- |
||||||
|
100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_float8(-100); |
||||||
|
INFO: (-100.0, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float8" |
||||||
|
test_type_conversion_float8 |
||||||
|
----------------------------- |
||||||
|
-100 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_float8(5000000000.5); |
||||||
|
INFO: (5000000000.5, <class 'float'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float8" |
||||||
|
test_type_conversion_float8 |
||||||
|
----------------------------- |
||||||
|
5000000000.5 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_float8(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_float8" |
||||||
|
test_type_conversion_float8 |
||||||
|
----------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_text('hello world'); |
||||||
|
INFO: ('hello world', <class 'str'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_text" |
||||||
|
test_type_conversion_text |
||||||
|
--------------------------- |
||||||
|
hello world |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_text(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_text" |
||||||
|
test_type_conversion_text |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_bytea(x bytea) RETURNS bytea AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_bytea('hello world'); |
||||||
|
INFO: (b'hello world', <class 'bytes'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bytea" |
||||||
|
test_type_conversion_bytea |
||||||
|
---------------------------- |
||||||
|
\x68656c6c6f20776f726c64 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bytea(E'null\\000byte'); |
||||||
|
INFO: (b'null\x00byte', <class 'bytes'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bytea" |
||||||
|
test_type_conversion_bytea |
||||||
|
---------------------------- |
||||||
|
\x6e756c6c0062797465 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bytea(null); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bytea" |
||||||
|
test_type_conversion_bytea |
||||||
|
---------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_marshal() RETURNS bytea AS $$ |
||||||
|
import marshal |
||||||
|
return marshal.dumps('hello world') |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
CREATE FUNCTION test_type_unmarshal(x bytea) RETURNS text AS $$ |
||||||
|
import marshal |
||||||
|
try: |
||||||
|
return marshal.loads(x) |
||||||
|
except ValueError, e: |
||||||
|
return 'FAILED: ' + str(e) |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT test_type_unmarshal(x) FROM test_type_marshal() x; |
||||||
|
test_type_unmarshal |
||||||
|
--------------------- |
||||||
|
hello world |
||||||
|
(1 row) |
||||||
|
|
||||||
|
-- |
||||||
|
-- Domains |
||||||
|
-- |
||||||
|
CREATE DOMAIN booltrue AS bool CHECK (VALUE IS TRUE OR VALUE IS NULL); |
||||||
|
CREATE FUNCTION test_type_conversion_booltrue(x booltrue, y bool) RETURNS booltrue AS $$ |
||||||
|
return y |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_booltrue(true, true); |
||||||
|
test_type_conversion_booltrue |
||||||
|
------------------------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_booltrue(false, true); |
||||||
|
ERROR: value for domain booltrue violates check constraint "booltrue_check" |
||||||
|
SELECT * FROM test_type_conversion_booltrue(true, false); |
||||||
|
ERROR: value for domain booltrue violates check constraint "booltrue_check" |
||||||
|
CONTEXT: while creating return value |
||||||
|
PL/Python function "test_type_conversion_booltrue" |
||||||
|
CREATE DOMAIN uint2 AS int2 CHECK (VALUE >= 0); |
||||||
|
CREATE FUNCTION test_type_conversion_uint2(x uint2, y int) RETURNS uint2 AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return y |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_uint2(100::uint2, 50); |
||||||
|
INFO: (100, <class 'int'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_uint2" |
||||||
|
test_type_conversion_uint2 |
||||||
|
---------------------------- |
||||||
|
50 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_uint2(100::uint2, -50); |
||||||
|
INFO: (100, <class 'int'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_uint2" |
||||||
|
ERROR: value for domain uint2 violates check constraint "uint2_check" |
||||||
|
CONTEXT: while creating return value |
||||||
|
PL/Python function "test_type_conversion_uint2" |
||||||
|
SELECT * FROM test_type_conversion_uint2(null, 1); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_uint2" |
||||||
|
test_type_conversion_uint2 |
||||||
|
---------------------------- |
||||||
|
1 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE DOMAIN nnint AS int CHECK (VALUE IS NOT NULL); |
||||||
|
CREATE FUNCTION test_type_conversion_nnint(x nnint, y int) RETURNS nnint AS $$ |
||||||
|
return y |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_nnint(10, 20); |
||||||
|
test_type_conversion_nnint |
||||||
|
---------------------------- |
||||||
|
20 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_nnint(null, 20); |
||||||
|
ERROR: value for domain nnint violates check constraint "nnint_check" |
||||||
|
SELECT * FROM test_type_conversion_nnint(10, null); |
||||||
|
ERROR: value for domain nnint violates check constraint "nnint_check" |
||||||
|
CONTEXT: while creating return value |
||||||
|
PL/Python function "test_type_conversion_nnint" |
||||||
|
CREATE DOMAIN bytea10 AS bytea CHECK (octet_length(VALUE) = 10 AND VALUE IS NOT NULL); |
||||||
|
CREATE FUNCTION test_type_conversion_bytea10(x bytea10, y bytea) RETURNS bytea10 AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return y |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_bytea10('hello wold', 'hello wold'); |
||||||
|
INFO: (b'hello wold', <class 'bytes'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bytea10" |
||||||
|
test_type_conversion_bytea10 |
||||||
|
------------------------------ |
||||||
|
\x68656c6c6f20776f6c64 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_bytea10('hello world', 'hello wold'); |
||||||
|
ERROR: value for domain bytea10 violates check constraint "bytea10_check" |
||||||
|
SELECT * FROM test_type_conversion_bytea10('hello word', 'hello world'); |
||||||
|
INFO: (b'hello word', <class 'bytes'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bytea10" |
||||||
|
ERROR: value for domain bytea10 violates check constraint "bytea10_check" |
||||||
|
CONTEXT: while creating return value |
||||||
|
PL/Python function "test_type_conversion_bytea10" |
||||||
|
SELECT * FROM test_type_conversion_bytea10(null, 'hello word'); |
||||||
|
ERROR: value for domain bytea10 violates check constraint "bytea10_check" |
||||||
|
SELECT * FROM test_type_conversion_bytea10('hello word', null); |
||||||
|
INFO: (b'hello word', <class 'bytes'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_bytea10" |
||||||
|
ERROR: value for domain bytea10 violates check constraint "bytea10_check" |
||||||
|
CONTEXT: while creating return value |
||||||
|
PL/Python function "test_type_conversion_bytea10" |
||||||
|
-- |
||||||
|
-- Arrays |
||||||
|
-- |
||||||
|
CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]); |
||||||
|
INFO: ([0, 100], <class 'list'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_array_int4" |
||||||
|
test_type_conversion_array_int4 |
||||||
|
--------------------------------- |
||||||
|
{0,100} |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]); |
||||||
|
INFO: ([0, -100, 55], <class 'list'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_array_int4" |
||||||
|
test_type_conversion_array_int4 |
||||||
|
--------------------------------- |
||||||
|
{0,-100,55} |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_array_int4(ARRAY[NULL,1]); |
||||||
|
INFO: ([None, 1], <class 'list'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_array_int4" |
||||||
|
test_type_conversion_array_int4 |
||||||
|
--------------------------------- |
||||||
|
{NULL,1} |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_array_int4(ARRAY[]::integer[]); |
||||||
|
INFO: ([], <class 'list'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_array_int4" |
||||||
|
test_type_conversion_array_int4 |
||||||
|
--------------------------------- |
||||||
|
{} |
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_array_int4(NULL); |
||||||
|
INFO: (None, <class 'NoneType'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_array_int4" |
||||||
|
test_type_conversion_array_int4 |
||||||
|
--------------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]); |
||||||
|
ERROR: cannot convert multidimensional array to Python list |
||||||
|
DETAIL: PL/Python only supports one-dimensional arrays. |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_array_int4" |
||||||
|
CREATE FUNCTION test_type_conversion_array_bytea(x bytea[]) RETURNS bytea[] AS $$ |
||||||
|
plpy.info(x, type(x)) |
||||||
|
return x |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_array_bytea(ARRAY[E'\\xdeadbeef'::bytea, NULL]); |
||||||
|
INFO: ([b'\xde\xad\xbe\xef', None], <class 'list'>) |
||||||
|
CONTEXT: PL/Python function "test_type_conversion_array_bytea" |
||||||
|
test_type_conversion_array_bytea |
||||||
|
---------------------------------- |
||||||
|
{"\\xdeadbeef",NULL} |
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_array_mixed1() RETURNS text[] AS $$ |
||||||
|
return [123, 'abc'] |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_array_mixed1(); |
||||||
|
test_type_conversion_array_mixed1 |
||||||
|
----------------------------------- |
||||||
|
{123,abc} |
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_array_mixed2() RETURNS int[] AS $$ |
||||||
|
return [123, 'abc'] |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_array_mixed2(); |
||||||
|
ERROR: invalid input syntax for integer: "abc" |
||||||
|
CONTEXT: while creating return value |
||||||
|
PL/Python function "test_type_conversion_array_mixed2" |
||||||
|
CREATE FUNCTION test_type_conversion_array_record() RETURNS type_record[] AS $$ |
||||||
|
return [None] |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_array_record(); |
||||||
|
ERROR: PL/Python functions cannot return type type_record[] |
||||||
|
DETAIL: PL/Python does not support conversion to arrays of row types. |
||||||
|
CREATE FUNCTION test_type_conversion_array_string() RETURNS text[] AS $$ |
||||||
|
return 'abc' |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_array_string(); |
||||||
|
test_type_conversion_array_string |
||||||
|
----------------------------------- |
||||||
|
{a,b,c} |
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_array_tuple() RETURNS text[] AS $$ |
||||||
|
return ('abc', 'def') |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_array_tuple(); |
||||||
|
test_type_conversion_array_tuple |
||||||
|
---------------------------------- |
||||||
|
{abc,def} |
||||||
|
(1 row) |
||||||
|
|
||||||
|
CREATE FUNCTION test_type_conversion_array_error() RETURNS int[] AS $$ |
||||||
|
return 5 |
||||||
|
$$ LANGUAGE plpythonu; |
||||||
|
SELECT * FROM test_type_conversion_array_error(); |
||||||
|
ERROR: PL/Python: return value of function with array return type is not a Python sequence |
||||||
|
CONTEXT: while creating return value |
||||||
|
PL/Python function "test_type_conversion_array_error" |
Loading…
Reference in new issue