mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-08 01:17:36 +08:00
Split the plpython regression test into test cases arranged by topic, instead
of the previous monolithic setup-create-run sequence, that was apparently inherited from a previous test infrastructure, but makes working with the tests and adding new ones weird.
This commit is contained in:
@ -1,73 +1,23 @@
|
||||
-- first some tests of basic functionality
|
||||
--
|
||||
-- better succeed
|
||||
--
|
||||
-- really stupid function just to get the module loaded
|
||||
CREATE FUNCTION stupid() RETURNS text AS 'return "zarkon"' LANGUAGE plpythonu;
|
||||
select stupid();
|
||||
stupid
|
||||
--------
|
||||
zarkon
|
||||
(1 row)
|
||||
|
||||
-- check static and global data
|
||||
--
|
||||
SELECT static_test();
|
||||
static_test
|
||||
-------------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
SELECT static_test();
|
||||
static_test
|
||||
-------------
|
||||
2
|
||||
(1 row)
|
||||
|
||||
SELECT global_test_one();
|
||||
global_test_one
|
||||
--------------------------------------------------------
|
||||
SD: set by global_test_one, GD: set by global_test_one
|
||||
(1 row)
|
||||
|
||||
SELECT global_test_two();
|
||||
global_test_two
|
||||
--------------------------------------------------------
|
||||
SD: set by global_test_two, GD: set by global_test_one
|
||||
(1 row)
|
||||
|
||||
-- import python modules
|
||||
--
|
||||
SELECT import_fail();
|
||||
NOTICE: ('import socket failed -- No module named foosocket',)
|
||||
CONTEXT: PL/Python function "import_fail"
|
||||
import_fail
|
||||
--------------------
|
||||
failed as expected
|
||||
(1 row)
|
||||
|
||||
SELECT import_succeed();
|
||||
import_succeed
|
||||
------------------------
|
||||
succeeded, as expected
|
||||
(1 row)
|
||||
|
||||
-- test import and simple argument handling
|
||||
--
|
||||
SELECT import_test_one('sha hash of this string');
|
||||
import_test_one
|
||||
------------------------------------------
|
||||
a04e23cb9b1a09cd1051a04a7c571aae0f90346c
|
||||
(1 row)
|
||||
|
||||
-- test import and tuple argument handling
|
||||
--
|
||||
select import_test_two(users) from users where fname = 'willem';
|
||||
import_test_two
|
||||
-------------------------------------------------------------------
|
||||
sha hash of willemdoe is 3cde6b574953b0ca937b4d76ebc40d534d910759
|
||||
(1 row)
|
||||
|
||||
-- test multiple arguments
|
||||
--
|
||||
CREATE FUNCTION argument_test_one(u users, a1 text, a2 text) RETURNS text
|
||||
AS
|
||||
'keys = u.keys()
|
||||
keys.sort()
|
||||
out = []
|
||||
for key in keys:
|
||||
out.append("%s: %s" % (key, u[key]))
|
||||
words = a1 + " " + a2 + " => {" + ", ".join(out) + "}"
|
||||
return words'
|
||||
LANGUAGE plpythonu;
|
||||
select argument_test_one(users, fname, lname) from users where lname = 'doe' order by 1;
|
||||
argument_test_one
|
||||
-----------------------------------------------------------------------
|
||||
@ -76,488 +26,3 @@ select argument_test_one(users, fname, lname) from users where lname = 'doe' ord
|
||||
willem doe => {fname: willem, lname: doe, userid: 3, username: w_doe}
|
||||
(3 rows)
|
||||
|
||||
-- spi and nested calls
|
||||
--
|
||||
select nested_call_one('pass this along');
|
||||
nested_call_one
|
||||
-----------------------------------------------------------------
|
||||
{'nested_call_two': "{'nested_call_three': 'pass this along'}"}
|
||||
(1 row)
|
||||
|
||||
select spi_prepared_plan_test_one('doe');
|
||||
spi_prepared_plan_test_one
|
||||
----------------------------
|
||||
there are 3 does
|
||||
(1 row)
|
||||
|
||||
select spi_prepared_plan_test_one('smith');
|
||||
spi_prepared_plan_test_one
|
||||
----------------------------
|
||||
there are 1 smiths
|
||||
(1 row)
|
||||
|
||||
select spi_prepared_plan_test_nested('smith');
|
||||
spi_prepared_plan_test_nested
|
||||
-------------------------------
|
||||
there are 1 smiths
|
||||
(1 row)
|
||||
|
||||
-- quick peek at the table
|
||||
--
|
||||
SELECT * FROM users;
|
||||
fname | lname | username | userid
|
||||
--------+-------+----------+--------
|
||||
jane | doe | j_doe | 1
|
||||
john | doe | johnd | 2
|
||||
willem | doe | w_doe | 3
|
||||
rick | smith | slash | 4
|
||||
(4 rows)
|
||||
|
||||
-- should fail
|
||||
--
|
||||
UPDATE users SET fname = 'william' WHERE fname = 'willem';
|
||||
-- should modify william to willem and create username
|
||||
--
|
||||
INSERT INTO users (fname, lname) VALUES ('william', 'smith');
|
||||
INSERT INTO users (fname, lname, username) VALUES ('charles', 'darwin', 'beagle');
|
||||
SELECT * FROM users;
|
||||
fname | lname | username | userid
|
||||
---------+--------+----------+--------
|
||||
jane | doe | j_doe | 1
|
||||
john | doe | johnd | 2
|
||||
willem | doe | w_doe | 3
|
||||
rick | smith | slash | 4
|
||||
willem | smith | w_smith | 5
|
||||
charles | darwin | beagle | 6
|
||||
(6 rows)
|
||||
|
||||
SELECT join_sequences(sequences) FROM sequences;
|
||||
join_sequences
|
||||
----------------
|
||||
ABCDEFGHIJKL
|
||||
ABCDEF
|
||||
ABCDEF
|
||||
ABCDEF
|
||||
ABCDEF
|
||||
ABCDEF
|
||||
(6 rows)
|
||||
|
||||
SELECT join_sequences(sequences) FROM sequences
|
||||
WHERE join_sequences(sequences) ~* '^A';
|
||||
join_sequences
|
||||
----------------
|
||||
ABCDEFGHIJKL
|
||||
ABCDEF
|
||||
ABCDEF
|
||||
ABCDEF
|
||||
ABCDEF
|
||||
ABCDEF
|
||||
(6 rows)
|
||||
|
||||
SELECT join_sequences(sequences) FROM sequences
|
||||
WHERE join_sequences(sequences) ~* '^B';
|
||||
join_sequences
|
||||
----------------
|
||||
(0 rows)
|
||||
|
||||
-- error in trigger
|
||||
--
|
||||
--
|
||||
-- Check Universal Newline Support
|
||||
--
|
||||
SELECT newline_lf();
|
||||
newline_lf
|
||||
------------
|
||||
123
|
||||
(1 row)
|
||||
|
||||
SELECT newline_cr();
|
||||
newline_cr
|
||||
------------
|
||||
123
|
||||
(1 row)
|
||||
|
||||
SELECT newline_crlf();
|
||||
newline_crlf
|
||||
--------------
|
||||
123
|
||||
(1 row)
|
||||
|
||||
-- Tests for functions returning void
|
||||
SELECT test_void_func1(), test_void_func1() IS NULL AS "is null";
|
||||
test_void_func1 | is null
|
||||
-----------------+---------
|
||||
| f
|
||||
(1 row)
|
||||
|
||||
SELECT test_void_func2(); -- should fail
|
||||
ERROR: PL/Python function with return type "void" did not return None
|
||||
CONTEXT: PL/Python function "test_void_func2"
|
||||
SELECT test_return_none(), test_return_none() IS NULL AS "is null";
|
||||
test_return_none | is null
|
||||
------------------+---------
|
||||
| t
|
||||
(1 row)
|
||||
|
||||
-- Test for functions with named and nameless parameters
|
||||
SELECT test_param_names0(2,7);
|
||||
test_param_names0
|
||||
-------------------
|
||||
9
|
||||
(1 row)
|
||||
|
||||
SELECT test_param_names1(1,'text');
|
||||
test_param_names1
|
||||
-------------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
SELECT test_param_names2(users) from users;
|
||||
test_param_names2
|
||||
----------------------------------------------------------------------------
|
||||
{'lname': 'doe', 'username': 'j_doe', 'userid': 1, 'fname': 'jane'}
|
||||
{'lname': 'doe', 'username': 'johnd', 'userid': 2, 'fname': 'john'}
|
||||
{'lname': 'doe', 'username': 'w_doe', 'userid': 3, 'fname': 'willem'}
|
||||
{'lname': 'smith', 'username': 'slash', 'userid': 4, 'fname': 'rick'}
|
||||
{'lname': 'smith', 'username': 'w_smith', 'userid': 5, 'fname': 'willem'}
|
||||
{'lname': 'darwin', 'username': 'beagle', 'userid': 6, 'fname': 'charles'}
|
||||
(6 rows)
|
||||
|
||||
SELECT test_param_names3(1);
|
||||
test_param_names3
|
||||
-------------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
-- Test set returning functions
|
||||
SELECT test_setof_as_list(0, 'list');
|
||||
test_setof_as_list
|
||||
--------------------
|
||||
(0 rows)
|
||||
|
||||
SELECT test_setof_as_list(1, 'list');
|
||||
test_setof_as_list
|
||||
--------------------
|
||||
list
|
||||
(1 row)
|
||||
|
||||
SELECT test_setof_as_list(2, 'list');
|
||||
test_setof_as_list
|
||||
--------------------
|
||||
list
|
||||
list
|
||||
(2 rows)
|
||||
|
||||
SELECT test_setof_as_list(2, null);
|
||||
test_setof_as_list
|
||||
--------------------
|
||||
|
||||
|
||||
(2 rows)
|
||||
|
||||
SELECT test_setof_as_tuple(0, 'tuple');
|
||||
test_setof_as_tuple
|
||||
---------------------
|
||||
(0 rows)
|
||||
|
||||
SELECT test_setof_as_tuple(1, 'tuple');
|
||||
test_setof_as_tuple
|
||||
---------------------
|
||||
tuple
|
||||
(1 row)
|
||||
|
||||
SELECT test_setof_as_tuple(2, 'tuple');
|
||||
test_setof_as_tuple
|
||||
---------------------
|
||||
tuple
|
||||
tuple
|
||||
(2 rows)
|
||||
|
||||
SELECT test_setof_as_tuple(2, null);
|
||||
test_setof_as_tuple
|
||||
---------------------
|
||||
|
||||
|
||||
(2 rows)
|
||||
|
||||
SELECT test_setof_as_iterator(0, 'list');
|
||||
test_setof_as_iterator
|
||||
------------------------
|
||||
(0 rows)
|
||||
|
||||
SELECT test_setof_as_iterator(1, 'list');
|
||||
test_setof_as_iterator
|
||||
------------------------
|
||||
list
|
||||
(1 row)
|
||||
|
||||
SELECT test_setof_as_iterator(2, 'list');
|
||||
test_setof_as_iterator
|
||||
------------------------
|
||||
list
|
||||
list
|
||||
(2 rows)
|
||||
|
||||
SELECT test_setof_as_iterator(2, null);
|
||||
test_setof_as_iterator
|
||||
------------------------
|
||||
|
||||
|
||||
(2 rows)
|
||||
|
||||
-- Test tuple returning functions
|
||||
SELECT * FROM test_table_record_as('dict', null, null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('dict', 'one', null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
one |
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('dict', null, 2, false);
|
||||
first | second
|
||||
-------+--------
|
||||
| 2
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('dict', 'three', 3, false);
|
||||
first | second
|
||||
-------+--------
|
||||
three | 3
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('dict', null, null, true);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('tuple', null, null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('tuple', 'one', null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
one |
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('tuple', null, 2, false);
|
||||
first | second
|
||||
-------+--------
|
||||
| 2
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('tuple', 'three', 3, false);
|
||||
first | second
|
||||
-------+--------
|
||||
three | 3
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('tuple', null, null, true);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('list', null, null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('list', 'one', null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
one |
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('list', null, 2, false);
|
||||
first | second
|
||||
-------+--------
|
||||
| 2
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('list', 'three', 3, false);
|
||||
first | second
|
||||
-------+--------
|
||||
three | 3
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('list', null, null, true);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('obj', null, null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('obj', 'one', null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
one |
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('obj', null, 2, false);
|
||||
first | second
|
||||
-------+--------
|
||||
| 2
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('obj', 'three', 3, false);
|
||||
first | second
|
||||
-------+--------
|
||||
three | 3
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_table_record_as('obj', null, null, true);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('dict', null, null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('dict', 'one', null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
one |
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('dict', null, 2, false);
|
||||
first | second
|
||||
-------+--------
|
||||
| 2
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('dict', 'three', 3, false);
|
||||
first | second
|
||||
-------+--------
|
||||
three | 3
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('dict', null, null, true);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('tuple', null, null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('tuple', 'one', null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
one |
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('tuple', null, 2, false);
|
||||
first | second
|
||||
-------+--------
|
||||
| 2
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('tuple', 'three', 3, false);
|
||||
first | second
|
||||
-------+--------
|
||||
three | 3
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('tuple', null, null, true);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('list', null, null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('list', 'one', null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
one |
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('list', null, 2, false);
|
||||
first | second
|
||||
-------+--------
|
||||
| 2
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('list', 'three', 3, false);
|
||||
first | second
|
||||
-------+--------
|
||||
three | 3
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('list', null, null, true);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('obj', null, null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('obj', 'one', null, false);
|
||||
first | second
|
||||
-------+--------
|
||||
one |
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('obj', null, 2, false);
|
||||
first | second
|
||||
-------+--------
|
||||
| 2
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('obj', 'three', 3, false);
|
||||
first | second
|
||||
-------+--------
|
||||
three | 3
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_type_record_as('obj', null, null, true);
|
||||
first | second
|
||||
-------+--------
|
||||
|
|
||||
(1 row)
|
||||
|
||||
SELECT * FROM test_in_out_params('test_in');
|
||||
second
|
||||
-------------------
|
||||
test_in_in_to_out
|
||||
(1 row)
|
||||
|
||||
-- this doesn't work yet :-(
|
||||
SELECT * FROM test_in_out_params_multi('test_in');
|
||||
ERROR: PL/Python functions cannot return type record
|
||||
SELECT * FROM test_inout_params('test_in');
|
||||
first
|
||||
---------------
|
||||
test_in_inout
|
||||
(1 row)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user