| -- first some tests of basic functionality |
| -- |
| -- better succeed |
| -- |
| 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 |
| -- |
| select argument_test_one(users, fname, lname) from users where lname = 'doe' order by 1; |
| argument_test_one |
| ----------------------------------------------------------------------- |
| jane doe => {fname: jane, lname: doe, userid: 1, username: j_doe} |
| john doe => {fname: john, lname: doe, userid: 2, username: johnd} |
| 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 order by userid; |
| 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 order by userid; |
| 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) |
| |
| -- Greenplum doesn't support functions that execute SQL from segments |
| -- |
| -- SELECT join_sequences(sequences) FROM sequences; |
| -- SELECT join_sequences(sequences) FROM sequences |
| -- WHERE join_sequences(sequences) ~* '^A'; |
| -- SELECT join_sequences(sequences) FROM sequences |
| -- WHERE join_sequences(sequences) ~* '^B'; |
| SELECT result_nrows_test(); |
| INFO: True |
| CONTEXT: PL/Python function "result_nrows_test" |
| result_nrows_test |
| ------------------- |
| 2 |
| (1 row) |
| |
| -- test of exception handling |
| SELECT queryexec('SELECT 2'); |
| NOTICE: {'?column?': 2} |
| CONTEXT: PL/Python function "queryexec" |
| queryexec |
| ----------- |
| t |
| (1 row) |
| |
| SELECT queryexec('SELECT X'); |
| NOTICE: Error Trapped |
| CONTEXT: PL/Python function "queryexec" |
| queryexec |
| ----------- |
| f |
| (1 row) |
| |
| select module_contents(); |
| module_contents |
| -------------------------------------------------------------------------------------------------------------------------- |
| Error, Fatal, SPIError, debug, error, execute, fatal, info, log, notice, prepare, spiexceptions, subtransaction, warning |
| (1 row) |
| |
| SELECT elog_test(); |
| INFO: info |
| CONTEXT: PL/Python function "elog_test" |
| INFO: 37 |
| CONTEXT: PL/Python function "elog_test" |
| INFO: () |
| CONTEXT: PL/Python function "elog_test" |
| INFO: ('info', 37, [1, 2, 3]) |
| CONTEXT: PL/Python function "elog_test" |
| NOTICE: notice |
| CONTEXT: PL/Python function "elog_test" |
| WARNING: warning |
| CONTEXT: PL/Python function "elog_test" |
| ERROR: plpy.Error: error (plpython.c:4652) |
| CONTEXT: Traceback (most recent call last): |
| PL/Python function "elog_test", line 10, in <module> |
| plpy.error('error') |
| PL/Python function "elog_test" |
| -- 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: while creating return value |
| 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': 'johnd', 'userid': 2, 'fname': 'john'} |
| {'lname': 'smith', 'username': 'slash', 'userid': 4, 'fname': 'rick'} |
| {'lname': 'darwin', 'username': 'beagle', 'userid': 6, 'fname': 'charles'} |
| {'lname': 'doe', 'username': 'j_doe', 'userid': 1, 'fname': 'jane'} |
| {'lname': 'doe', 'username': 'w_doe', 'userid': 3, 'fname': 'willem'} |
| {'lname': 'smith', 'username': 'w_smith', 'userid': 5, 'fname': 'willem'} |
| (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) |
| |
| SELECT test_setof_spi_in_iterator(); |
| test_setof_spi_in_iterator |
| ---------------------------- |
| Hello |
| Brave |
| New |
| World |
| (4 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: length of returned sequence did not match number of columns in row |
| CONTEXT: while creating return value |
| PL/Python function "test_in_out_params_multi" |
| SELECT * FROM test_inout_params('test_in'); |
| first |
| --------------- |
| test_in_inout |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_bool(true); |
| test_type_conversion_bool |
| --------------------------- |
| t |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_bool(false); |
| test_type_conversion_bool |
| --------------------------- |
| f |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_bool(null); |
| test_type_conversion_bool |
| --------------------------- |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_char('a'); |
| test_type_conversion_char |
| --------------------------- |
| a |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_char(null); |
| test_type_conversion_char |
| --------------------------- |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_int2(100::int2); |
| test_type_conversion_int2 |
| --------------------------- |
| 100 |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_int2(null); |
| test_type_conversion_int2 |
| --------------------------- |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_int4(100); |
| test_type_conversion_int4 |
| --------------------------- |
| 100 |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_int4(null); |
| test_type_conversion_int4 |
| --------------------------- |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_int8(100); |
| test_type_conversion_int8 |
| --------------------------- |
| 100 |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_int8(null); |
| test_type_conversion_int8 |
| --------------------------- |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_float4(100); |
| test_type_conversion_float4 |
| ----------------------------- |
| 100 |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_float4(null); |
| test_type_conversion_float4 |
| ----------------------------- |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_float8(100); |
| test_type_conversion_float8 |
| ----------------------------- |
| 100 |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_float8(null); |
| test_type_conversion_float8 |
| ----------------------------- |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_numeric(100); |
| test_type_conversion_numeric |
| ------------------------------ |
| 100.0 |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_numeric(null); |
| test_type_conversion_numeric |
| ------------------------------ |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_text('hello world'); |
| test_type_conversion_text |
| --------------------------- |
| hello world |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_text(null); |
| test_type_conversion_text |
| --------------------------- |
| |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_bytea('hello world'); |
| test_type_conversion_bytea |
| ---------------------------- |
| hello world |
| (1 row) |
| |
| SELECT * FROM test_type_conversion_bytea(null); |
| test_type_conversion_bytea |
| ---------------------------- |
| |
| (1 row) |
| |
| SELECT test_type_unmarshal(x) FROM test_type_marshal() x; |
| test_type_unmarshal |
| --------------------- |
| hello world |
| (1 row) |
| |
| SELECT (split(10)).*; |
| a | b |
| ----+---- |
| 10 | 11 |
| 12 | 13 |
| (2 rows) |
| |
| SELECT * FROM split(100); |
| a | b |
| -----+----- |
| 100 | 101 |
| 102 | 103 |
| (2 rows) |
| |
| select unnamed_tuple_test(); |
| unnamed_tuple_test |
| -------------------- |
| |
| (1 row) |
| |
| select named_tuple_test(); |
| named_tuple_test |
| ------------------ |
| notice |
| (1 row) |
| |
| select oneline() |
| union all |
| select oneline2() |
| union all |
| select multiline() |
| union all |
| select multiline2() |
| union all |
| select multiline3() |
| oneline |
| ------------------------------------------------------------------------------------------------------------ |
| No spaces |
| "'a string with # and "" inside another string with # and '' inside |
| One space |
| Two spaces |
| Three spaces |
| No spaces |
| |
| The ' in the comment should not cause this line to begin with a tab |
| This is a rather long string containing |
| several lines of text just as you would do in C. |
| Note that whitespace at the beginning of the line issignificant. The string can contain both ' and ". |
| This is an another long string containing\n\ |
| two lines of text and defined with the r\"...\" syntax. |
| |
| # This is not a comment so the quotes at the end of the line do end the string |
| (5 rows) |
| |