gmake -C plpgsql installcheck gmake[1]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/pl/plpgsql\' gmake -C src installcheck gmake[2]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/pl/plpgsql/src\' gmake[2]: Nothing to be done for `installcheck\'. gmake[2]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/pl/plpgsql/src\' gmake[1]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/pl/plpgsql\' gmake -C plperl installcheck gmake[1]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/pl/plperl\' gmake -C ../../../src/test/regress pg_regress gmake[2]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/test/regress\' gmake -C ../../../src/port all gmake[3]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/port\' gmake -C ../backend submake-errcodes gmake[4]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/backend\' gmake[4]: Nothing to be done for `submake-errcodes\'. gmake[4]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/backend\' gmake[3]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/port\' gmake -C ../../../src/common all gmake[3]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/common\' gmake -C ../backend submake-errcodes gmake[4]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/backend\' gmake[4]: Nothing to be done for `submake-errcodes\'. gmake[4]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/backend\' gmake[3]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/common\' gmake[2]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/test/regress\' ../../../src/test/regress/pg_regress --inputdir=/pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plperl --bindir=\'/pgbuild/root/HEAD/inst/bin\' --port=5678 --dbname=pl_regression --load-extension=plperl --load-extension=plperlu plperl plperl_lc plperl_trigger plperl_shared plperl_elog plperl_util plperl_init plperlu plperl_array plperl_plperlu (using postmaster on Unix socket, port 5678) ============== dropping database "pl_regression" ============== NOTICE: database "pl_regression" does not exist, skipping DROP DATABASE ============== creating database "pl_regression" ============== CREATE DATABASE ALTER DATABASE ============== installing plperl ============== CREATE EXTENSION ============== installing plperlu ============== CREATE EXTENSION ============== running regression test queries ============== test plperl ... ok test plperl_lc ... ok test plperl_trigger ... ok test plperl_shared ... ok test plperl_elog ... ok test plperl_util ... ok test plperl_init ... ok test plperlu ... ok test plperl_array ... ok test plperl_plperlu ... ok ====================== All 10 tests passed. ====================== gmake[1]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/pl/plperl\' gmake -C plpython installcheck gmake[1]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/pl/plpython\' gmake -C ../../../src/test/regress pg_regress gmake[2]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/test/regress\' gmake -C ../../../src/port all gmake[3]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/port\' gmake -C ../backend submake-errcodes gmake[4]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/backend\' gmake[4]: Nothing to be done for `submake-errcodes\'. gmake[4]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/backend\' gmake[3]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/port\' gmake -C ../../../src/common all gmake[3]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/common\' gmake -C ../backend submake-errcodes gmake[4]: Entering directory `/pgbuild/root/HEAD/pgsql.build/src/backend\' gmake[4]: Nothing to be done for `submake-errcodes\'. gmake[4]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/backend\' gmake[3]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/common\' gmake[2]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/test/regress\' ../../../src/test/regress/pg_regress --inputdir=/pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython --bindir=\'/pgbuild/root/HEAD/inst/bin\' --port=5678 --dbname=pl_regression --load-extension=plpythonu plpython_schema plpython_populate plpython_test plpython_do plpython_global plpython_import plpython_spi plpython_newline plpython_void plpython_params plpython_setof plpython_record plpython_trigger plpython_types plpython_error plpython_unicode plpython_quote plpython_composite plpython_subtransaction plpython_drop (using postmaster on Unix socket, port 5678) ============== dropping database "pl_regression" ============== DROP DATABASE ============== creating database "pl_regression" ============== CREATE DATABASE ALTER DATABASE ============== installing plpythonu ============== CREATE EXTENSION ============== running regression test queries ============== test plpython_schema ... ok test plpython_populate ... ok test plpython_test ... ok test plpython_do ... ok test plpython_global ... FAILED test plpython_import ... ok test plpython_spi ... FAILED (test process exited with exit code 2) test plpython_newline ... FAILED (test process exited with exit code 2) test plpython_void ... FAILED (test process exited with exit code 2) test plpython_params ... FAILED (test process exited with exit code 2) test plpython_setof ... FAILED (test process exited with exit code 2) test plpython_record ... ok test plpython_trigger ... ok test plpython_types ... ok test plpython_error ... ok test plpython_unicode ... ok test plpython_quote ... ok test plpython_composite ... FAILED (test process exited with exit code 2) test plpython_subtransaction ... FAILED (test process exited with exit code 2) test plpython_drop ... FAILED (test process exited with exit code 2) ======================= 9 of 20 tests failed. ======================= The differences that caused some tests to fail can be viewed in the file "/pgbuild/root/HEAD/pgsql.build/src/pl/plpython/regression.diffs". A copy of the test summary that you see above is saved in the file "/pgbuild/root/HEAD/pgsql.build/src/pl/plpython/regression.out". gmake[1]: *** [installcheck] Error 1 gmake[1]: Leaving directory `/pgbuild/root/HEAD/pgsql.build/src/pl/plpython\' gmake: *** [installcheck-plpython-recurse] Error 2 ================= pgsql.build/src/pl/plpython/regression.diffs =================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_global.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_global.out Mon Apr 27 05:51:11 2015 *************** *** 35,41 **** SELECT static_test(); static_test ------------- ! 2 (1 row) SELECT global_test_one(); --- 35,41 ---- SELECT static_test(); static_test ------------- ! 1 (1 row) SELECT global_test_one(); ====================================================================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_spi.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_spi.out Thu Apr 30 14:16:32 2015 *************** *** 428,449 **** (1 row) SELECT cursor_plan(); ! cursor_plan ! ------------- ! willem ! jane ! john ! (3 rows) ! ! SELECT cursor_plan_wrong_args(); ! ERROR: TypeError: Expected sequence of 1 argument, got 2: [\'a\', \'b\'] ! CONTEXT: Traceback (most recent call last): ! PL/Python function "cursor_plan_wrong_args", line 4, in ! c = plpy.cursor(plan, ["a", "b"]) ! PL/Python function "cursor_plan_wrong_args" ! SELECT plan_composite_args(); ! plan_composite_args ! --------------------- ! (3,label) ! (1 row) ! --- 428,434 ---- (1 row) SELECT cursor_plan(); ! server closed the connection unexpectedly ! This probably means the server terminated abnormally ! before or while processing the request. ! connection to server was lost ====================================================================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_newline.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_newline.out Thu Apr 30 14:16:33 2015 *************** *** 1,30 **** ! -- ! -- Universal Newline Support ! -- ! CREATE OR REPLACE FUNCTION newline_lf() RETURNS integer AS ! E\'x = 100\\ny = 23\\nreturn x + y\\n\' ! LANGUAGE plpythonu; ! CREATE OR REPLACE FUNCTION newline_cr() RETURNS integer AS ! E\'x = 100\\ry = 23\\rreturn x + y\\r\' ! LANGUAGE plpythonu; ! CREATE OR REPLACE FUNCTION newline_crlf() RETURNS integer AS ! E\'x = 100\\r\\ny = 23\\r\\nreturn x + y\\r\\n\' ! LANGUAGE plpythonu; ! SELECT newline_lf(); ! newline_lf ! ------------ ! 123 ! (1 row) ! ! SELECT newline_cr(); ! newline_cr ! ------------ ! 123 ! (1 row) ! ! SELECT newline_crlf(); ! newline_crlf ! -------------- ! 123 ! (1 row) ! --- 1 ---- ! psql: FATAL: the database system is in recovery mode ====================================================================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_void.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_void.out Thu Apr 30 14:16:33 2015 *************** *** 1,30 **** ! -- ! -- Tests for functions that return void ! -- ! CREATE FUNCTION test_void_func1() RETURNS void AS $$ ! x = 10 ! $$ LANGUAGE plpythonu; ! -- illegal: can\'t return non-None value in void-returning func ! CREATE FUNCTION test_void_func2() RETURNS void AS $$ ! return 10 ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION test_return_none() RETURNS int AS $$ ! None ! $$ LANGUAGE plpythonu; ! -- 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) ! --- 1 ---- ! psql: FATAL: the database system is in recovery mode ====================================================================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_params.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_params.out Thu Apr 30 14:16:33 2015 *************** *** 1,64 **** ! -- ! -- Test named and nameless parameters ! -- ! CREATE FUNCTION test_param_names0(integer, integer) RETURNS int AS $$ ! return args[0] + args[1] ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION test_param_names1(a0 integer, a1 text) RETURNS boolean AS $$ ! assert a0 == args[0] ! assert a1 == args[1] ! return True ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION test_param_names2(u users) RETURNS text AS $$ ! assert u == args[0] ! if isinstance(u, dict): ! # stringify dict the hard way because otherwise the order is implementation-dependent ! u_keys = list(u.keys()) ! u_keys.sort() ! s = \'{\' + \', \'.join([repr(k) + \': \' + repr(u[k]) for k in u_keys]) + \'}\' ! else: ! s = str(u) ! return s ! $$ LANGUAGE plpythonu; ! -- use deliberately wrong parameter names ! CREATE FUNCTION test_param_names3(a0 integer) RETURNS boolean AS $$ ! try: ! assert a1 == args[0] ! return False ! except NameError, e: ! assert e.args[0].find("a1") > -1 ! return True ! $$ LANGUAGE plpythonu; ! 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 ! ----------------------------------------------------------------------- ! {\'fname\': \'jane\', \'lname\': \'doe\', \'userid\': 1, \'username\': \'j_doe\'} ! {\'fname\': \'john\', \'lname\': \'doe\', \'userid\': 2, \'username\': \'johnd\'} ! {\'fname\': \'willem\', \'lname\': \'doe\', \'userid\': 3, \'username\': \'w_doe\'} ! {\'fname\': \'rick\', \'lname\': \'smith\', \'userid\': 4, \'username\': \'slash\'} ! (4 rows) ! ! SELECT test_param_names2(NULL); ! test_param_names2 ! ------------------- ! None ! (1 row) ! ! SELECT test_param_names3(1); ! test_param_names3 ! ------------------- ! t ! (1 row) ! --- 1 ---- ! psql: FATAL: the database system is in recovery mode ====================================================================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_setof.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_setof.out Thu Apr 30 14:16:33 2015 *************** *** 1,174 **** ! -- ! -- Test returning SETOF ! -- ! CREATE FUNCTION test_setof_error() RETURNS SETOF text AS $$ ! return 37 ! $$ LANGUAGE plpythonu; ! SELECT test_setof_error(); ! ERROR: returned object cannot be iterated ! DETAIL: PL/Python set-returning functions must return an iterable object. ! CONTEXT: PL/Python function "test_setof_error" ! CREATE FUNCTION test_setof_as_list(count integer, content text) RETURNS SETOF text AS $$ ! return [ content ]*count ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION test_setof_as_tuple(count integer, content text) RETURNS SETOF text AS $$ ! t = () ! for i in range(count): ! t += ( content, ) ! return t ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION test_setof_as_iterator(count integer, content text) RETURNS SETOF text AS $$ ! class producer: ! def __init__ (self, icount, icontent): ! self.icontent = icontent ! self.icount = icount ! def __iter__ (self): ! return self ! def next (self): ! if self.icount == 0: ! raise StopIteration ! self.icount -= 1 ! return self.icontent ! return producer(count, content) ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION test_setof_spi_in_iterator() RETURNS SETOF text AS ! $$ ! for s in (\'Hello\', \'Brave\', \'New\', \'World\'): ! plpy.execute(\'select 1\') ! yield s ! plpy.execute(\'select 2\') ! $$ ! LANGUAGE plpythonu; ! -- 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) ! ! -- returns set of named-composite-type tuples ! CREATE OR REPLACE FUNCTION get_user_records() ! RETURNS SETOF users ! AS $$ ! return plpy.execute("SELECT * FROM users ORDER BY username") ! $$ LANGUAGE plpythonu; ! SELECT get_user_records(); ! get_user_records ! ---------------------- ! (jane,doe,j_doe,1) ! (john,doe,johnd,2) ! (rick,smith,slash,4) ! (willem,doe,w_doe,3) ! (4 rows) ! ! SELECT * FROM get_user_records(); ! fname | lname | username | userid ! --------+-------+----------+-------- ! jane | doe | j_doe | 1 ! john | doe | johnd | 2 ! rick | smith | slash | 4 ! willem | doe | w_doe | 3 ! (4 rows) ! ! -- same, but returning set of RECORD ! CREATE OR REPLACE FUNCTION get_user_records2() ! RETURNS TABLE(fname text, lname text, username text, userid int) ! AS $$ ! return plpy.execute("SELECT * FROM users ORDER BY username") ! $$ LANGUAGE plpythonu; ! SELECT get_user_records2(); ! get_user_records2 ! ---------------------- ! (jane,doe,j_doe,1) ! (john,doe,johnd,2) ! (rick,smith,slash,4) ! (willem,doe,w_doe,3) ! (4 rows) ! ! SELECT * FROM get_user_records2(); ! fname | lname | username | userid ! --------+-------+----------+-------- ! jane | doe | j_doe | 1 ! john | doe | johnd | 2 ! rick | smith | slash | 4 ! willem | doe | w_doe | 3 ! (4 rows) ! --- 1 ---- ! psql: FATAL: the database system is in recovery mode ====================================================================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_composite.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_composite.out Thu Apr 30 14:20:23 2015 *************** *** 29,365 **** return [(1, 2)] * n $$ LANGUAGE plpythonu; SELECT multiout_simple_setof(); ! multiout_simple_setof ! ----------------------- ! (1,2) ! (1 row) ! ! SELECT * FROM multiout_simple_setof(); ! column1 | column2 ! ---------+--------- ! 1 | 2 ! (1 row) ! ! SELECT * FROM multiout_simple_setof(3); ! column1 | column2 ! ---------+--------- ! 1 | 2 ! 1 | 2 ! 1 | 2 ! (3 rows) ! ! CREATE FUNCTION multiout_record_as(typ text, ! first text, OUT first text, ! second integer, OUT second integer, ! retnull boolean) RETURNS record AS $$ ! if retnull: ! return None ! if typ == \'dict\': ! return { \'first\': first, \'second\': second, \'additionalfield\': \'must not cause trouble\' } ! elif typ == \'tuple\': ! return ( first, second ) ! elif typ == \'list\': ! return [ first, second ] ! elif typ == \'obj\': ! class type_record: pass ! type_record.first = first ! type_record.second = second ! return type_record ! $$ LANGUAGE plpythonu; ! SELECT * FROM multiout_record_as(\'dict\', \'foo\', 1, \'f\'); ! first | second ! -------+-------- ! foo | 1 ! (1 row) ! ! SELECT multiout_record_as(\'dict\', \'foo\', 1, \'f\'); ! multiout_record_as ! -------------------- ! (foo,1) ! (1 row) ! ! SELECT *, s IS NULL AS snull FROM multiout_record_as(\'tuple\', \'xxx\', NULL, \'f\') AS f(f, s); ! f | s | snull ! -----+---+------- ! xxx | | t ! (1 row) ! ! SELECT *, f IS NULL AS fnull, s IS NULL AS snull FROM multiout_record_as(\'tuple\', \'xxx\', 1, \'t\') AS f(f, s); ! f | s | fnull | snull ! ---+---+-------+------- ! | | t | t ! (1 row) ! ! SELECT * FROM multiout_record_as(\'obj\', NULL, 10, \'f\'); ! first | second ! -------+-------- ! | 10 ! (1 row) ! ! CREATE FUNCTION multiout_setof(n integer, ! OUT power_of_2 integer, ! OUT length integer) RETURNS SETOF record AS $$ ! for i in range(n): ! power = 2 ** i ! length = plpy.execute("select length(\'%d\')" % power)[0][\'length\'] ! yield power, length ! $$ LANGUAGE plpythonu; ! SELECT * FROM multiout_setof(3); ! power_of_2 | length ! ------------+-------- ! 1 | 1 ! 2 | 1 ! 4 | 1 ! (3 rows) ! ! SELECT multiout_setof(5); ! multiout_setof ! ---------------- ! (1,1) ! (2,1) ! (4,1) ! (8,1) ! (16,2) ! (5 rows) ! ! CREATE FUNCTION multiout_return_table() RETURNS TABLE (x integer, y text) AS $$ ! return [{\'x\': 4, \'y\' :\'four\'}, ! {\'x\': 7, \'y\' :\'seven\'}, ! {\'x\': 0, \'y\' :\'zero\'}] ! $$ LANGUAGE plpythonu; ! SELECT * FROM multiout_return_table(); ! x | y ! ---+------- ! 4 | four ! 7 | seven ! 0 | zero ! (3 rows) ! ! CREATE FUNCTION multiout_array(OUT integer[], OUT text) RETURNS SETOF record AS $$ ! yield [[1], \'a\'] ! yield [[1,2], \'b\'] ! yield [[1,2,3], None] ! $$ LANGUAGE plpythonu; ! SELECT * FROM multiout_array(); ! column1 | column2 ! ---------+--------- ! {1} | a ! {1,2} | b ! {1,2,3} | ! (3 rows) ! ! CREATE FUNCTION singleout_composite(OUT type_record) AS $$ ! return {\'first\': 1, \'second\': 2} ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION multiout_composite(OUT type_record) RETURNS SETOF type_record AS $$ ! return [{\'first\': 1, \'second\': 2}, ! {\'first\': 3, \'second\': 4 }] ! $$ LANGUAGE plpythonu; ! SELECT * FROM singleout_composite(); ! first | second ! -------+-------- ! 1 | 2 ! (1 row) ! ! SELECT * FROM multiout_composite(); ! first | second ! -------+-------- ! 1 | 2 ! 3 | 4 ! (2 rows) ! ! -- composite OUT parameters in functions returning RECORD not supported yet ! CREATE FUNCTION multiout_composite(INOUT n integer, OUT type_record) AS $$ ! return (n, (n * 2, n * 3)) ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION multiout_table_type_setof(typ text, returnnull boolean, INOUT n integer, OUT table_record) RETURNS SETOF record AS $$ ! if returnnull: ! d = None ! elif typ == \'dict\': ! d = {\'first\': n * 2, \'second\': n * 3, \'extra\': \'not important\'} ! elif typ == \'tuple\': ! d = (n * 2, n * 3) ! elif typ == \'obj\': ! class d: pass ! d.first = n * 2 ! d.second = n * 3 ! for i in range(n): ! yield (i, d) ! $$ LANGUAGE plpythonu; ! SELECT * FROM multiout_composite(2); ! n | column2 ! ---+--------- ! 2 | (4,6) ! (1 row) ! ! SELECT * FROM multiout_table_type_setof(\'dict\', \'f\', 3); ! n | column2 ! ---+--------- ! 0 | (6,9) ! 1 | (6,9) ! 2 | (6,9) ! (3 rows) ! ! SELECT * FROM multiout_table_type_setof(\'tuple\', \'f\', 2); ! n | column2 ! ---+--------- ! 0 | (4,6) ! 1 | (4,6) ! (2 rows) ! ! SELECT * FROM multiout_table_type_setof(\'obj\', \'f\', 4); ! n | column2 ! ---+--------- ! 0 | (8,12) ! 1 | (8,12) ! 2 | (8,12) ! 3 | (8,12) ! (4 rows) ! ! SELECT * FROM multiout_table_type_setof(\'dict\', \'t\', 3); ! n | column2 ! ---+--------- ! 0 | ! 1 | ! 2 | ! (3 rows) ! ! -- check what happens if a type changes under us ! CREATE TABLE changing ( ! i integer, ! j integer ! ); ! CREATE FUNCTION changing_test(OUT n integer, OUT changing) RETURNS SETOF record AS $$ ! return [(1, {\'i\': 1, \'j\': 2}), ! (1, (3, 4))] ! $$ LANGUAGE plpythonu; ! SELECT * FROM changing_test(); ! n | column2 ! ---+--------- ! 1 | (1,2) ! 1 | (3,4) ! (2 rows) ! ! ALTER TABLE changing DROP COLUMN j; ! SELECT * FROM changing_test(); ! ERROR: length of returned sequence did not match number of columns in row ! CONTEXT: while creating return value ! PL/Python function "changing_test" ! SELECT * FROM changing_test(); ! ERROR: length of returned sequence did not match number of columns in row ! CONTEXT: while creating return value ! PL/Python function "changing_test" ! ALTER TABLE changing ADD COLUMN j integer; ! SELECT * FROM changing_test(); ! n | column2 ! ---+--------- ! 1 | (1,2) ! 1 | (3,4) ! (2 rows) ! ! -- tables of composite types ! CREATE FUNCTION composite_types_table(OUT tab table_record[], OUT typ type_record[] ) RETURNS SETOF record AS $$ ! yield {\'tab\': [[\'first\', 1], [\'second\', 2]], ! \'typ\': [{\'first\': \'third\', \'second\': 3}, ! {\'first\': \'fourth\', \'second\': 4}]} ! yield {\'tab\': [[\'first\', 1], [\'second\', 2]], ! \'typ\': [{\'first\': \'third\', \'second\': 3}, ! {\'first\': \'fourth\', \'second\': 4}]} ! yield {\'tab\': [[\'first\', 1], [\'second\', 2]], ! \'typ\': [{\'first\': \'third\', \'second\': 3}, ! {\'first\': \'fourth\', \'second\': 4}]} ! $$ LANGUAGE plpythonu; ! SELECT * FROM composite_types_table(); ! tab | typ ! ----------------------------+---------------------------- ! {"(first,1)","(second,2)"} | {"(third,3)","(fourth,4)"} ! {"(first,1)","(second,2)"} | {"(third,3)","(fourth,4)"} ! {"(first,1)","(second,2)"} | {"(third,3)","(fourth,4)"} ! (3 rows) ! ! -- check what happens if the output record descriptor changes ! CREATE FUNCTION return_record(t text) RETURNS record AS $$ ! return {\'t\': t, \'val\': 10} ! $$ LANGUAGE plpythonu; ! SELECT * FROM return_record(\'abc\') AS r(t text, val integer); ! t | val ! -----+----- ! abc | 10 ! (1 row) ! ! SELECT * FROM return_record(\'abc\') AS r(t text, val bigint); ! t | val ! -----+----- ! abc | 10 ! (1 row) ! ! SELECT * FROM return_record(\'abc\') AS r(t text, val integer); ! t | val ! -----+----- ! abc | 10 ! (1 row) ! ! SELECT * FROM return_record(\'abc\') AS r(t varchar(30), val integer); ! t | val ! -----+----- ! abc | 10 ! (1 row) ! ! SELECT * FROM return_record(\'abc\') AS r(t varchar(100), val integer); ! t | val ! -----+----- ! abc | 10 ! (1 row) ! ! SELECT * FROM return_record(\'999\') AS r(val text, t integer); ! val | t ! -----+----- ! 10 | 999 ! (1 row) ! ! CREATE FUNCTION return_record_2(t text) RETURNS record AS $$ ! return {\'v1\':1,\'v2\':2,t:3} ! $$ LANGUAGE plpythonu; ! SELECT * FROM return_record_2(\'v3\') AS (v3 int, v2 int, v1 int); ! v3 | v2 | v1 ! ----+----+---- ! 3 | 2 | 1 ! (1 row) ! ! SELECT * FROM return_record_2(\'v3\') AS (v2 int, v3 int, v1 int); ! v2 | v3 | v1 ! ----+----+---- ! 2 | 3 | 1 ! (1 row) ! ! SELECT * FROM return_record_2(\'v4\') AS (v1 int, v4 int, v2 int); ! v1 | v4 | v2 ! ----+----+---- ! 1 | 3 | 2 ! (1 row) ! ! SELECT * FROM return_record_2(\'v4\') AS (v1 int, v4 int, v2 int); ! v1 | v4 | v2 ! ----+----+---- ! 1 | 3 | 2 ! (1 row) ! ! -- error ! SELECT * FROM return_record_2(\'v4\') AS (v1 int, v3 int, v2 int); ! ERROR: key "v3" not found in mapping ! HINT: To return null in a column, add the value None to the mapping with the key named after the column. ! CONTEXT: while creating return value ! PL/Python function "return_record_2" ! -- works ! SELECT * FROM return_record_2(\'v3\') AS (v1 int, v3 int, v2 int); ! v1 | v3 | v2 ! ----+----+---- ! 1 | 3 | 2 ! (1 row) ! ! SELECT * FROM return_record_2(\'v3\') AS (v1 int, v2 int, v3 int); ! v1 | v2 | v3 ! ----+----+---- ! 1 | 2 | 3 ! (1 row) ! --- 29,35 ---- return [(1, 2)] * n $$ LANGUAGE plpythonu; SELECT multiout_simple_setof(); ! server closed the connection unexpectedly ! This probably means the server terminated abnormally ! before or while processing the request. ! connection to server was lost ====================================================================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_subtransaction_0.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_subtransaction.out Thu Apr 30 14:20:23 2015 *************** *** 1,453 **** ! -- ! -- Test explicit subtransactions ! -- ! -- Test table to see if transactions get properly rolled back ! CREATE TABLE subtransaction_tbl ( ! i integer ! ); ! -- Explicit case for Python <2.6 ! CREATE FUNCTION subtransaction_test(what_error text = NULL) RETURNS text ! AS $$ ! import sys ! subxact = plpy.subtransaction() ! subxact.__enter__() ! exc = True ! try: ! try: ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)") ! if what_error == "SPI": ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (\'oops\')") ! elif what_error == "Python": ! plpy.attribute_error ! except: ! exc = False ! subxact.__exit__(*sys.exc_info()) ! raise ! finally: ! if exc: ! subxact.__exit__(None, None, None) ! $$ LANGUAGE plpythonu; ! SELECT subtransaction_test(); ! subtransaction_test ! --------------------- ! ! (1 row) ! ! SELECT * FROM subtransaction_tbl; ! i ! --- ! 1 ! 2 ! (2 rows) ! ! TRUNCATE subtransaction_tbl; ! SELECT subtransaction_test(\'SPI\'); ! ERROR: spiexceptions.InvalidTextRepresentation: invalid input syntax for integer: "oops" ! LINE 1: INSERT INTO subtransaction_tbl VALUES (\'oops\') ! ^ ! QUERY: INSERT INTO subtransaction_tbl VALUES (\'oops\') ! CONTEXT: Traceback (most recent call last): ! PL/Python function "subtransaction_test", line 11, in ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (\'oops\')") ! PL/Python function "subtransaction_test" ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! SELECT subtransaction_test(\'Python\'); ! ERROR: AttributeError: \'module\' object has no attribute \'attribute_error\' ! CONTEXT: Traceback (most recent call last): ! PL/Python function "subtransaction_test", line 13, in ! plpy.attribute_error ! PL/Python function "subtransaction_test" ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! -- Context manager case for Python >=2.6 ! CREATE FUNCTION subtransaction_ctx_test(what_error text = NULL) RETURNS text ! AS $$ ! with plpy.subtransaction(): ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)") ! if what_error == "SPI": ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (\'oops\')") ! elif what_error == "Python": ! plpy.attribute_error ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "subtransaction_ctx_test" ! DETAIL: SyntaxError: invalid syntax (line 3) ! SELECT subtransaction_ctx_test(); ! ERROR: function subtransaction_ctx_test() does not exist ! LINE 1: SELECT subtransaction_ctx_test(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! SELECT subtransaction_ctx_test(\'SPI\'); ! ERROR: function subtransaction_ctx_test(unknown) does not exist ! LINE 1: SELECT subtransaction_ctx_test(\'SPI\'); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! SELECT subtransaction_ctx_test(\'Python\'); ! ERROR: function subtransaction_ctx_test(unknown) does not exist ! LINE 1: SELECT subtransaction_ctx_test(\'Python\'); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! -- Nested subtransactions ! CREATE FUNCTION subtransaction_nested_test(swallow boolean = \'f\') RETURNS text ! AS $$ ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! with plpy.subtransaction(): ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)") ! try: ! with plpy.subtransaction(): ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (3)") ! plpy.execute("error") ! except plpy.SPIError, e: ! if not swallow: ! raise ! plpy.notice("Swallowed %r" % e) ! return "ok" ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "subtransaction_nested_test" ! DETAIL: SyntaxError: invalid syntax (line 4) ! SELECT subtransaction_nested_test(); ! ERROR: function subtransaction_nested_test() does not exist ! LINE 1: SELECT subtransaction_nested_test(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! SELECT subtransaction_nested_test(\'t\'); ! ERROR: function subtransaction_nested_test(unknown) does not exist ! LINE 1: SELECT subtransaction_nested_test(\'t\'); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! -- Nested subtransactions that recursively call code dealing with ! -- subtransactions ! CREATE FUNCTION subtransaction_deeply_nested_test() RETURNS text ! AS $$ ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! with plpy.subtransaction(): ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)") ! plpy.execute("SELECT subtransaction_nested_test(\'t\')") ! return "ok" ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "subtransaction_deeply_nested_test" ! DETAIL: SyntaxError: invalid syntax (line 4) ! SELECT subtransaction_deeply_nested_test(); ! ERROR: function subtransaction_deeply_nested_test() does not exist ! LINE 1: SELECT subtransaction_deeply_nested_test(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! -- Error conditions from not opening/closing subtransactions ! CREATE FUNCTION subtransaction_exit_without_enter() RETURNS void ! AS $$ ! plpy.subtransaction().__exit__(None, None, None) ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION subtransaction_enter_without_exit() RETURNS void ! AS $$ ! plpy.subtransaction().__enter__() ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION subtransaction_exit_twice() RETURNS void ! AS $$ ! plpy.subtransaction().__enter__() ! plpy.subtransaction().__exit__(None, None, None) ! plpy.subtransaction().__exit__(None, None, None) ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION subtransaction_enter_twice() RETURNS void ! AS $$ ! plpy.subtransaction().__enter__() ! plpy.subtransaction().__enter__() ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION subtransaction_exit_same_subtransaction_twice() RETURNS void ! AS $$ ! s = plpy.subtransaction() ! s.__enter__() ! s.__exit__(None, None, None) ! s.__exit__(None, None, None) ! $$ LANGUAGE plpythonu; ! CREATE FUNCTION subtransaction_enter_same_subtransaction_twice() RETURNS void ! AS $$ ! s = plpy.subtransaction() ! s.__enter__() ! s.__enter__() ! s.__exit__(None, None, None) ! $$ LANGUAGE plpythonu; ! -- No warnings here, as the subtransaction gets indeed closed ! CREATE FUNCTION subtransaction_enter_subtransaction_in_with() RETURNS void ! AS $$ ! with plpy.subtransaction() as s: ! s.__enter__() ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "subtransaction_enter_subtransaction_in_with" ! DETAIL: SyntaxError: invalid syntax (line 3) ! CREATE FUNCTION subtransaction_exit_subtransaction_in_with() RETURNS void ! AS $$ ! with plpy.subtransaction() as s: ! s.__exit__(None, None, None) ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "subtransaction_exit_subtransaction_in_with" ! DETAIL: SyntaxError: invalid syntax (line 3) ! SELECT subtransaction_exit_without_enter(); ! ERROR: ValueError: this subtransaction has not been entered ! CONTEXT: Traceback (most recent call last): ! PL/Python function "subtransaction_exit_without_enter", line 2, in ! plpy.subtransaction().__exit__(None, None, None) ! PL/Python function "subtransaction_exit_without_enter" ! SELECT subtransaction_enter_without_exit(); ! WARNING: forcibly aborting a subtransaction that has not been exited ! CONTEXT: PL/Python function "subtransaction_enter_without_exit" ! subtransaction_enter_without_exit ! ----------------------------------- ! ! (1 row) ! ! SELECT subtransaction_exit_twice(); ! WARNING: forcibly aborting a subtransaction that has not been exited ! CONTEXT: PL/Python function "subtransaction_exit_twice" ! ERROR: ValueError: this subtransaction has not been entered ! CONTEXT: Traceback (most recent call last): ! PL/Python function "subtransaction_exit_twice", line 3, in ! plpy.subtransaction().__exit__(None, None, None) ! PL/Python function "subtransaction_exit_twice" ! SELECT subtransaction_enter_twice(); ! WARNING: forcibly aborting a subtransaction that has not been exited ! CONTEXT: PL/Python function "subtransaction_enter_twice" ! WARNING: forcibly aborting a subtransaction that has not been exited ! CONTEXT: PL/Python function "subtransaction_enter_twice" ! subtransaction_enter_twice ! ---------------------------- ! ! (1 row) ! ! SELECT subtransaction_exit_same_subtransaction_twice(); ! ERROR: ValueError: this subtransaction has already been exited ! CONTEXT: Traceback (most recent call last): ! PL/Python function "subtransaction_exit_same_subtransaction_twice", line 5, in ! s.__exit__(None, None, None) ! PL/Python function "subtransaction_exit_same_subtransaction_twice" ! SELECT subtransaction_enter_same_subtransaction_twice(); ! WARNING: forcibly aborting a subtransaction that has not been exited ! CONTEXT: PL/Python function "subtransaction_enter_same_subtransaction_twice" ! ERROR: ValueError: this subtransaction has already been entered ! CONTEXT: Traceback (most recent call last): ! PL/Python function "subtransaction_enter_same_subtransaction_twice", line 4, in ! s.__enter__() ! PL/Python function "subtransaction_enter_same_subtransaction_twice" ! SELECT subtransaction_enter_subtransaction_in_with(); ! ERROR: function subtransaction_enter_subtransaction_in_with() does not exist ! LINE 1: SELECT subtransaction_enter_subtransaction_in_with(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT subtransaction_exit_subtransaction_in_with(); ! ERROR: function subtransaction_exit_subtransaction_in_with() does not exist ! LINE 1: SELECT subtransaction_exit_subtransaction_in_with(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! -- Make sure we don\'t get a "current transaction is aborted" error ! SELECT 1 as test; ! test ! ------ ! 1 ! (1 row) ! ! -- Mix explicit subtransactions and normal SPI calls ! CREATE FUNCTION subtransaction_mix_explicit_and_implicit() RETURNS void ! AS $$ ! p = plpy.prepare("INSERT INTO subtransaction_tbl VALUES ($1)", ["integer"]) ! try: ! with plpy.subtransaction(): ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! plpy.execute(p, [2]) ! plpy.execute(p, ["wrong"]) ! except plpy.SPIError: ! plpy.warning("Caught a SPI error from an explicit subtransaction") ! ! try: ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! plpy.execute(p, [2]) ! plpy.execute(p, ["wrong"]) ! except plpy.SPIError: ! plpy.warning("Caught a SPI error") ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "subtransaction_mix_explicit_and_implicit" ! DETAIL: SyntaxError: invalid syntax (line 5) ! SELECT subtransaction_mix_explicit_and_implicit(); ! ERROR: function subtransaction_mix_explicit_and_implicit() does not exist ! LINE 1: SELECT subtransaction_mix_explicit_and_implicit(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! -- Alternative method names for Python <2.6 ! CREATE FUNCTION subtransaction_alternative_names() RETURNS void ! AS $$ ! s = plpy.subtransaction() ! s.enter() ! s.exit(None, None, None) ! $$ LANGUAGE plpythonu; ! SELECT subtransaction_alternative_names(); ! subtransaction_alternative_names ! ---------------------------------- ! ! (1 row) ! ! -- try/catch inside a subtransaction block ! CREATE FUNCTION try_catch_inside_subtransaction() RETURNS void ! AS $$ ! with plpy.subtransaction(): ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! try: ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (\'a\')") ! except plpy.SPIError: ! plpy.notice("caught") ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "try_catch_inside_subtransaction" ! DETAIL: SyntaxError: invalid syntax (line 3) ! SELECT try_catch_inside_subtransaction(); ! ERROR: function try_catch_inside_subtransaction() does not exist ! LINE 1: SELECT try_catch_inside_subtransaction(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! TRUNCATE subtransaction_tbl; ! ALTER TABLE subtransaction_tbl ADD PRIMARY KEY (i); ! CREATE FUNCTION pk_violation_inside_subtransaction() RETURNS void ! AS $$ ! with plpy.subtransaction(): ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! try: ! plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)") ! except plpy.SPIError: ! plpy.notice("caught") ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "pk_violation_inside_subtransaction" ! DETAIL: SyntaxError: invalid syntax (line 3) ! SELECT pk_violation_inside_subtransaction(); ! ERROR: function pk_violation_inside_subtransaction() does not exist ! LINE 1: SELECT pk_violation_inside_subtransaction(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT * FROM subtransaction_tbl; ! i ! --- ! (0 rows) ! ! DROP TABLE subtransaction_tbl; ! -- cursor/subtransactions interactions ! CREATE FUNCTION cursor_in_subxact() RETURNS int AS $$ ! with plpy.subtransaction(): ! cur = plpy.cursor("select * from generate_series(1, 20) as gen(i)") ! cur.fetch(10) ! fetched = cur.fetch(10); ! return int(fetched[5]["i"]) ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "cursor_in_subxact" ! DETAIL: SyntaxError: invalid syntax (line 3) ! CREATE FUNCTION cursor_aborted_subxact() RETURNS int AS $$ ! try: ! with plpy.subtransaction(): ! cur = plpy.cursor("select * from generate_series(1, 20) as gen(i)") ! cur.fetch(10); ! plpy.execute("select no_such_function()") ! except plpy.SPIError: ! fetched = cur.fetch(10) ! return int(fetched[5]["i"]) ! return 0 # not reached ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "cursor_aborted_subxact" ! DETAIL: SyntaxError: invalid syntax (line 4) ! CREATE FUNCTION cursor_plan_aborted_subxact() RETURNS int AS $$ ! try: ! with plpy.subtransaction(): ! plpy.execute(\'create temporary table tmp(i) \' ! \'as select generate_series(1, 10)\') ! plan = plpy.prepare("select i from tmp") ! cur = plpy.cursor(plan) ! plpy.execute("select no_such_function()") ! except plpy.SPIError: ! fetched = cur.fetch(5) ! return fetched[2]["i"] ! return 0 # not reached ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "cursor_plan_aborted_subxact" ! DETAIL: SyntaxError: invalid syntax (line 4) ! CREATE FUNCTION cursor_close_aborted_subxact() RETURNS boolean AS $$ ! try: ! with plpy.subtransaction(): ! cur = plpy.cursor(\'select 1\') ! plpy.execute("select no_such_function()") ! except plpy.SPIError: ! cur.close() ! return True ! return False # not reached ! $$ LANGUAGE plpythonu; ! ERROR: could not compile PL/Python function "cursor_close_aborted_subxact" ! DETAIL: SyntaxError: invalid syntax (line 4) ! SELECT cursor_in_subxact(); ! ERROR: function cursor_in_subxact() does not exist ! LINE 1: SELECT cursor_in_subxact(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT cursor_aborted_subxact(); ! ERROR: function cursor_aborted_subxact() does not exist ! LINE 1: SELECT cursor_aborted_subxact(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT cursor_plan_aborted_subxact(); ! ERROR: function cursor_plan_aborted_subxact() does not exist ! LINE 1: SELECT cursor_plan_aborted_subxact(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. ! SELECT cursor_close_aborted_subxact(); ! ERROR: function cursor_close_aborted_subxact() does not exist ! LINE 1: SELECT cursor_close_aborted_subxact(); ! ^ ! HINT: No function matches the given name and argument types. You might need to add explicit type casts. --- 1 ---- ! psql: FATAL: the database system is in recovery mode ====================================================================== *** /pgbuild/root/HEAD/pgsql.build/../pgsql/src/pl/plpython/expected/plpython_drop.out Mon Aug 18 19:29:17 2014 --- /pgbuild/root/HEAD/pgsql.build/src/pl/plpython/results/plpython_drop.out Thu Apr 30 14:20:23 2015 *************** *** 1,6 **** ! -- ! -- For paranoia\'s sake, don\'t leave an untrusted language sitting around ! -- ! SET client_min_messages = WARNING; ! DROP EXTENSION plpythonu CASCADE; ! DROP EXTENSION IF EXISTS plpython2u CASCADE; --- 1 ---- ! psql: FATAL: the database system is in recovery mode ====================================================================== ================= /pgbuild/root/HEAD/inst/logfile =================== 2015-04-27 05:50:10.135 EDT [553e0652.3beb:1] LOG: database system was shut down at 2015-04-27 05:49:59 EDT 2015-04-27 05:50:10.138 EDT [553e0652.3bea:1] LOG: database system is ready to accept connections 2015-04-27 05:50:10.139 EDT [553e0652.3bef:1] LOG: autovacuum launcher started 2015-04-27 05:50:11.112 EDT [553e0653.3bf1:1] LOG: connection received: host=[local] 2015-04-27 05:50:11.113 EDT [553e0653.3bf1:2] LOG: connection authorized: user=buildfarm database=postgres 2015-04-27 05:50:11.322 EDT [553e0653.3bf1:3] LOG: disconnection: session time: 0:00:00.209 user=buildfarm database=postgres host=[local] 2015-04-27 05:50:11.599 EDT [553e0653.3bfe:1] LOG: connection received: host=[local] 2015-04-27 05:50:11.600 EDT [553e0653.3bfe:2] LOG: connection authorized: user=buildfarm database=postgres 2015-04-27 05:50:11.817 EDT [553e0653.3bfe:3] LOG: statement: DROP DATABASE IF EXISTS "pl_regression" 2015-04-27 05:50:11.818 EDT [553e0653.3bfe:4] LOG: disconnection: session time: 0:00:00.218 user=buildfarm database=postgres host=[local] 2015-04-27 05:50:11.823 EDT [553e0653.3c00:1] LOG: connection received: host=[local] 2015-04-27 05:50:11.824 EDT [553e0653.3c00:2] LOG: connection authorized: user=buildfarm database=postgres 2015-04-27 05:50:12.045 EDT [553e0653.3c00:3] LOG: statement: CREATE DATABASE "pl_regression" TEMPLATE=template0 2015-04-27 05:50:13.464 EDT [553e0653.3c00:4] LOG: disconnection: session time: 0:00:01.640 user=buildfarm database=postgres host=[local] 2015-04-27 05:50:13.471 EDT [553e0655.3c02:1] LOG: connection received: host=[local] 2015-04-27 05:50:13.472 EDT [553e0655.3c02:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:13.672 EDT [553e0655.3c02:3] LOG: statement: ALTER DATABASE "pl_regression" SET lc_messages TO \'C\';ALTER DATABASE "pl_regression" SET lc_monetary TO \'C\';ALTER DATABASE "pl_regression" SET lc_numeric TO \'C\';ALTER DATABASE "pl_regression" SET lc_time TO \'C\';ALTER DATABASE "pl_regression" SET timezone_abbreviations TO \'Default\'; 2015-04-27 05:50:13.714 EDT [553e0655.3c02:4] LOG: disconnection: session time: 0:00:00.243 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:13.721 EDT [553e0655.3c04:1] LOG: connection received: host=[local] 2015-04-27 05:50:13.722 EDT [553e0655.3c04:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:13.939 EDT [553e0655.3c04:3] LOG: statement: CREATE EXTENSION IF NOT EXISTS "plperl" 2015-04-27 05:50:14.481 EDT [553e0655.3c04:4] LOG: disconnection: session time: 0:00:00.760 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:14.488 EDT [553e0656.3c06:1] LOG: connection received: host=[local] 2015-04-27 05:50:14.489 EDT [553e0656.3c06:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:14.727 EDT [553e0656.3c06:3] LOG: statement: CREATE EXTENSION IF NOT EXISTS "plperlu" 2015-04-27 05:50:15.263 EDT [553e0656.3c06:4] LOG: disconnection: session time: 0:00:00.775 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:15.270 EDT [553e0657.3c08:1] LOG: connection received: host=[local] 2015-04-27 05:50:15.271 EDT [553e0657.3c08:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:15.493 EDT [553e0657.3c08:3] LOG: statement: CREATE OR REPLACE FUNCTION perl_int(int) RETURNS INTEGER AS $$ return undef; $$ LANGUAGE plperl; 2015-04-27 05:50:15.744 EDT [553e0657.3c08:4] LOG: statement: SELECT perl_int(11); 2015-04-27 05:50:15.778 EDT [553e0657.3c08:5] LOG: statement: SELECT * FROM perl_int(42); 2015-04-27 05:50:15.833 EDT [553e0657.3c08:6] LOG: statement: CREATE OR REPLACE FUNCTION perl_int(int) RETURNS INTEGER AS $$ return $_[0] + 1; $$ LANGUAGE plperl; 2015-04-27 05:50:15.977 EDT [553e0657.3c08:7] LOG: statement: SELECT perl_int(11); 2015-04-27 05:50:16.011 EDT [553e0657.3c08:8] LOG: statement: SELECT * FROM perl_int(42); 2015-04-27 05:50:16.066 EDT [553e0657.3c08:9] LOG: statement: CREATE OR REPLACE FUNCTION perl_set_int(int) RETURNS SETOF INTEGER AS $$ return undef; $$ LANGUAGE plperl; 2015-04-27 05:50:16.217 EDT [553e0657.3c08:10] LOG: statement: SELECT perl_set_int(5); 2015-04-27 05:50:16.252 EDT [553e0657.3c08:11] LOG: statement: SELECT * FROM perl_set_int(5); 2015-04-27 05:50:16.306 EDT [553e0657.3c08:12] LOG: statement: CREATE OR REPLACE FUNCTION perl_set_int(int) RETURNS SETOF INTEGER AS $$ return [0..$_[0]]; $$ LANGUAGE plperl; 2015-04-27 05:50:16.440 EDT [553e0657.3c08:13] LOG: statement: SELECT perl_set_int(5); 2015-04-27 05:50:16.477 EDT [553e0657.3c08:14] LOG: statement: SELECT * FROM perl_set_int(5); 2015-04-27 05:50:16.530 EDT [553e0657.3c08:15] LOG: statement: CREATE TYPE testnestperl AS (f5 integer[]); 2015-04-27 05:50:16.774 EDT [553e0657.3c08:16] LOG: statement: CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text, f4 testnestperl); 2015-04-27 05:50:17.091 EDT [553e0657.3c08:17] LOG: statement: CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$ return undef; $$ LANGUAGE plperl; 2015-04-27 05:50:17.238 EDT [553e0657.3c08:18] LOG: statement: SELECT perl_row(); 2015-04-27 05:50:17.270 EDT [553e0657.3c08:19] LOG: statement: SELECT * FROM perl_row(); 2015-04-27 05:50:17.344 EDT [553e0657.3c08:20] LOG: statement: CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$ return {f2 => \'hello\', f1 => 1, f3 => \'world\', \'f4\' => { \'f5\' => [[1]] } }; $$ LANGUAGE plperl; 2015-04-27 05:50:17.486 EDT [553e0657.3c08:21] LOG: statement: SELECT perl_row(); 2015-04-27 05:50:17.544 EDT [553e0657.3c08:22] LOG: statement: SELECT * FROM perl_row(); 2015-04-27 05:50:17.637 EDT [553e0657.3c08:23] LOG: statement: CREATE OR REPLACE FUNCTION perl_row_lit() RETURNS testrowperl AS $$ return \'(1,hello,world,"({{1}})")\'; $$ LANGUAGE plperl; 2015-04-27 05:50:17.786 EDT [553e0657.3c08:24] LOG: statement: SELECT perl_row_lit(); 2015-04-27 05:50:17.841 EDT [553e0657.3c08:25] LOG: statement: CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$ return undef; $$ LANGUAGE plperl; 2015-04-27 05:50:17.991 EDT [553e0657.3c08:26] LOG: statement: SELECT perl_set(); 2015-04-27 05:50:18.025 EDT [553e0657.3c08:27] LOG: statement: SELECT * FROM perl_set(); 2015-04-27 05:50:18.094 EDT [553e0657.3c08:28] LOG: statement: CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$ return [ { f1 => 1, f2 => \'Hello\', f3 => \'World\' }, undef, { f1 => 3, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => {} }, { f1 => 4, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => { \'f5\' => undef }}, { f1 => 5, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => { \'f5\' => \'{1}\' }}, { f1 => 6, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => { \'f5\' => [1] }}, ]; $$ LANGUAGE plperl; 2015-04-27 05:50:18.231 EDT [553e0657.3c08:29] LOG: statement: SELECT perl_set(); 2015-04-27 05:50:18.272 EDT [553e0657.3c08:30] ERROR: SETOF-composite-returning PL/Perl function must call return_next with reference to hash 2015-04-27 05:50:18.272 EDT [553e0657.3c08:31] CONTEXT: PL/Perl function "perl_set" 2015-04-27 05:50:18.272 EDT [553e0657.3c08:32] STATEMENT: SELECT perl_set(); 2015-04-27 05:50:18.272 EDT [553e0657.3c08:33] LOG: statement: SELECT * FROM perl_set(); 2015-04-27 05:50:18.347 EDT [553e0657.3c08:34] ERROR: SETOF-composite-returning PL/Perl function must call return_next with reference to hash 2015-04-27 05:50:18.347 EDT [553e0657.3c08:35] CONTEXT: PL/Perl function "perl_set" 2015-04-27 05:50:18.347 EDT [553e0657.3c08:36] STATEMENT: SELECT * FROM perl_set(); 2015-04-27 05:50:18.347 EDT [553e0657.3c08:37] LOG: statement: CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$ return [ { f1 => 1, f2 => \'Hello\', f3 => \'World\' }, { f1 => 2, f2 => \'Hello\', f3 => \'PostgreSQL\', \'f4\' => undef }, { f1 => 3, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => {} }, { f1 => 4, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => { \'f5\' => undef }}, { f1 => 5, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => { \'f5\' => \'{1}\' }}, { f1 => 6, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => { \'f5\' => [1] }}, { f1 => 7, f2 => \'Hello\', f3 => \'PL/Perl\', \'f4\' => \'({1})\' }, ]; $$ LANGUAGE plperl; 2015-04-27 05:50:18.483 EDT [553e0657.3c08:38] LOG: statement: SELECT perl_set(); 2015-04-27 05:50:18.593 EDT [553e0657.3c08:39] LOG: statement: SELECT * FROM perl_set(); 2015-04-27 05:50:18.731 EDT [553e0657.3c08:40] LOG: statement: CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$ return undef; $$ LANGUAGE plperl; 2015-04-27 05:50:18.863 EDT [553e0657.3c08:41] LOG: statement: SELECT perl_record(); 2015-04-27 05:50:18.896 EDT [553e0657.3c08:42] LOG: statement: SELECT * FROM perl_record(); 2015-04-27 05:50:18.916 EDT [553e0657.3c08:43] ERROR: a column definition list is required for functions returning "record" at character 15 2015-04-27 05:50:18.916 EDT [553e0657.3c08:44] STATEMENT: SELECT * FROM perl_record(); 2015-04-27 05:50:18.916 EDT [553e0657.3c08:45] LOG: statement: SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text, f4 testnestperl); 2015-04-27 05:50:19.055 EDT [553e0657.3c08:46] LOG: statement: CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$ return {f2 => \'hello\', f1 => 1, f3 => \'world\', \'f4\' => { \'f5\' => [1] } }; $$ LANGUAGE plperl; 2015-04-27 05:50:19.175 EDT [553e0657.3c08:47] LOG: statement: SELECT perl_record(); 2015-04-27 05:50:19.207 EDT [553e0657.3c08:48] ERROR: function returning record called in context that cannot accept type record 2015-04-27 05:50:19.207 EDT [553e0657.3c08:49] CONTEXT: PL/Perl function "perl_record" 2015-04-27 05:50:19.207 EDT [553e0657.3c08:50] STATEMENT: SELECT perl_record(); 2015-04-27 05:50:19.207 EDT [553e0657.3c08:51] LOG: statement: SELECT * FROM perl_record(); 2015-04-27 05:50:19.227 EDT [553e0657.3c08:52] ERROR: a column definition list is required for functions returning "record" at character 15 2015-04-27 05:50:19.227 EDT [553e0657.3c08:53] STATEMENT: SELECT * FROM perl_record(); 2015-04-27 05:50:19.227 EDT [553e0657.3c08:54] LOG: statement: SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text, f4 testnestperl); 2015-04-27 05:50:19.389 EDT [553e0657.3c08:55] LOG: statement: CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$ return undef; $$ LANGUAGE plperl; 2015-04-27 05:50:19.524 EDT [553e0657.3c08:56] LOG: statement: SELECT perl_record_set(); 2015-04-27 05:50:19.558 EDT [553e0657.3c08:57] ERROR: set-valued function called in context that cannot accept a set 2015-04-27 05:50:19.558 EDT [553e0657.3c08:58] CONTEXT: PL/Perl function "perl_record_set" 2015-04-27 05:50:19.558 EDT [553e0657.3c08:59] STATEMENT: SELECT perl_record_set(); 2015-04-27 05:50:19.558 EDT [553e0657.3c08:60] LOG: statement: SELECT * FROM perl_record_set(); 2015-04-27 05:50:19.578 EDT [553e0657.3c08:61] ERROR: a column definition list is required for functions returning "record" at character 15 2015-04-27 05:50:19.578 EDT [553e0657.3c08:62] STATEMENT: SELECT * FROM perl_record_set(); 2015-04-27 05:50:19.578 EDT [553e0657.3c08:63] LOG: statement: SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text); 2015-04-27 05:50:19.679 EDT [553e0657.3c08:64] LOG: statement: CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$ return [ { f1 => 1, f2 => \'Hello\', f3 => \'World\' }, undef, { f1 => 3, f2 => \'Hello\', f3 => \'PL/Perl\' } ]; $$ LANGUAGE plperl; 2015-04-27 05:50:19.802 EDT [553e0657.3c08:65] LOG: statement: SELECT perl_record_set(); 2015-04-27 05:50:19.838 EDT [553e0657.3c08:66] ERROR: set-valued function called in context that cannot accept a set 2015-04-27 05:50:19.838 EDT [553e0657.3c08:67] CONTEXT: PL/Perl function "perl_record_set" 2015-04-27 05:50:19.838 EDT [553e0657.3c08:68] STATEMENT: SELECT perl_record_set(); 2015-04-27 05:50:19.839 EDT [553e0657.3c08:69] LOG: statement: SELECT * FROM perl_record_set(); 2015-04-27 05:50:19.859 EDT [553e0657.3c08:70] ERROR: a column definition list is required for functions returning "record" at character 15 2015-04-27 05:50:19.859 EDT [553e0657.3c08:71] STATEMENT: SELECT * FROM perl_record_set(); 2015-04-27 05:50:19.859 EDT [553e0657.3c08:72] LOG: statement: SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text); 2015-04-27 05:50:19.967 EDT [553e0657.3c08:73] ERROR: SETOF-composite-returning PL/Perl function must call return_next with reference to hash 2015-04-27 05:50:19.967 EDT [553e0657.3c08:74] CONTEXT: PL/Perl function "perl_record_set" 2015-04-27 05:50:19.967 EDT [553e0657.3c08:75] STATEMENT: SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text); 2015-04-27 05:50:19.967 EDT [553e0657.3c08:76] LOG: statement: CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$ return [ { f1 => 1, f2 => \'Hello\', f3 => \'World\' }, { f1 => 2, f2 => \'Hello\', f3 => \'PostgreSQL\' }, { f1 => 3, f2 => \'Hello\', f3 => \'PL/Perl\' } ]; $$ LANGUAGE plperl; 2015-04-27 05:50:20.086 EDT [553e0657.3c08:77] LOG: statement: SELECT perl_record_set(); 2015-04-27 05:50:20.120 EDT [553e0657.3c08:78] ERROR: set-valued function called in context that cannot accept a set 2015-04-27 05:50:20.120 EDT [553e0657.3c08:79] CONTEXT: PL/Perl function "perl_record_set" 2015-04-27 05:50:20.120 EDT [553e0657.3c08:80] STATEMENT: SELECT perl_record_set(); 2015-04-27 05:50:20.120 EDT [553e0657.3c08:81] LOG: statement: SELECT * FROM perl_record_set(); 2015-04-27 05:50:20.140 EDT [553e0657.3c08:82] ERROR: a column definition list is required for functions returning "record" at character 15 2015-04-27 05:50:20.140 EDT [553e0657.3c08:83] STATEMENT: SELECT * FROM perl_record_set(); 2015-04-27 05:50:20.140 EDT [553e0657.3c08:84] LOG: statement: SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text); 2015-04-27 05:50:20.261 EDT [553e0657.3c08:85] LOG: statement: CREATE OR REPLACE FUNCTION perl_out_params(f1 out integer, f2 out text, f3 out text) AS $$ return {f2 => \'hello\', f1 => 1, f3 => \'world\'}; $$ LANGUAGE plperl; 2015-04-27 05:50:20.445 EDT [553e0657.3c08:86] LOG: statement: SELECT perl_out_params(); 2015-04-27 05:50:20.491 EDT [553e0657.3c08:87] LOG: statement: SELECT * FROM perl_out_params(); 2015-04-27 05:50:20.577 EDT [553e0657.3c08:88] LOG: statement: SELECT (perl_out_params()).f2; 2015-04-27 05:50:20.623 EDT [553e0657.3c08:89] LOG: statement: CREATE OR REPLACE FUNCTION perl_out_params_set(out f1 integer, out f2 text, out f3 text) RETURNS SETOF record AS $$ return [ { f1 => 1, f2 => \'Hello\', f3 => \'World\' }, { f1 => 2, f2 => \'Hello\', f3 => \'PostgreSQL\' }, { f1 => 3, f2 => \'Hello\', f3 => \'PL/Perl\' } ]; $$ LANGUAGE plperl; 2015-04-27 05:50:20.824 EDT [553e0657.3c08:90] LOG: statement: SELECT perl_out_params_set(); 2015-04-27 05:50:20.886 EDT [553e0657.3c08:91] LOG: statement: SELECT * FROM perl_out_params_set(); 2015-04-27 05:50:20.976 EDT [553e0657.3c08:92] LOG: statement: SELECT (perl_out_params_set()).f3; 2015-04-27 05:50:21.035 EDT [553e0657.3c08:93] LOG: statement: CREATE TYPE footype AS (x INTEGER, y INTEGER); 2015-04-27 05:50:21.289 EDT [553e0657.3c08:94] LOG: statement: CREATE OR REPLACE FUNCTION foo_good() RETURNS SETOF footype AS $$ return [ {x => 1, y => 2}, {x => 3, y => 4} ]; $$ LANGUAGE plperl; 2015-04-27 05:50:21.441 EDT [553e0657.3c08:95] LOG: statement: SELECT * FROM foo_good(); 2015-04-27 05:50:21.498 EDT [553e0657.3c08:96] LOG: statement: CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$ return {y => 3, z => 4}; $$ LANGUAGE plperl; 2015-04-27 05:50:21.648 EDT [553e0657.3c08:97] LOG: statement: SELECT * FROM foo_bad(); 2015-04-27 05:50:21.705 EDT [553e0657.3c08:98] ERROR: Perl hash contains nonexistent column "z" 2015-04-27 05:50:21.705 EDT [553e0657.3c08:99] CONTEXT: PL/Perl function "foo_bad" 2015-04-27 05:50:21.706 EDT [553e0657.3c08:100] STATEMENT: SELECT * FROM foo_bad(); 2015-04-27 05:50:21.706 EDT [553e0657.3c08:101] LOG: statement: CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$ return 42; $$ LANGUAGE plperl; 2015-04-27 05:50:21.842 EDT [553e0657.3c08:102] LOG: statement: SELECT * FROM foo_bad(); 2015-04-27 05:50:21.894 EDT [553e0657.3c08:103] ERROR: malformed record literal: "42" 2015-04-27 05:50:21.894 EDT [553e0657.3c08:104] DETAIL: Missing left parenthesis. 2015-04-27 05:50:21.894 EDT [553e0657.3c08:105] CONTEXT: PL/Perl function "foo_bad" 2015-04-27 05:50:21.894 EDT [553e0657.3c08:106] STATEMENT: SELECT * FROM foo_bad(); 2015-04-27 05:50:21.895 EDT [553e0657.3c08:107] LOG: statement: CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$ return [ [1, 2], [3, 4] ]; $$ LANGUAGE plperl; 2015-04-27 05:50:22.029 EDT [553e0657.3c08:108] LOG: statement: SELECT * FROM foo_bad(); 2015-04-27 05:50:22.093 EDT [553e0657.3c08:109] ERROR: cannot convert Perl array to non-array type footype 2015-04-27 05:50:22.093 EDT [553e0657.3c08:110] CONTEXT: PL/Perl function "foo_bad" 2015-04-27 05:50:22.093 EDT [553e0657.3c08:111] STATEMENT: SELECT * FROM foo_bad(); 2015-04-27 05:50:22.093 EDT [553e0657.3c08:112] LOG: statement: CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$ return 42; $$ LANGUAGE plperl; 2015-04-27 05:50:22.245 EDT [553e0657.3c08:113] LOG: statement: SELECT * FROM foo_set_bad(); 2015-04-27 05:50:22.299 EDT [553e0657.3c08:114] ERROR: set-returning PL/Perl function must return reference to array or use return_next 2015-04-27 05:50:22.299 EDT [553e0657.3c08:115] CONTEXT: PL/Perl function "foo_set_bad" 2015-04-27 05:50:22.299 EDT [553e0657.3c08:116] STATEMENT: SELECT * FROM foo_set_bad(); 2015-04-27 05:50:22.300 EDT [553e0657.3c08:117] LOG: statement: CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$ return {y => 3, z => 4}; $$ LANGUAGE plperl; 2015-04-27 05:50:22.439 EDT [553e0657.3c08:118] LOG: statement: SELECT * FROM foo_set_bad(); 2015-04-27 05:50:22.491 EDT [553e0657.3c08:119] ERROR: set-returning PL/Perl function must return reference to array or use return_next 2015-04-27 05:50:22.491 EDT [553e0657.3c08:120] CONTEXT: PL/Perl function "foo_set_bad" 2015-04-27 05:50:22.491 EDT [553e0657.3c08:121] STATEMENT: SELECT * FROM foo_set_bad(); 2015-04-27 05:50:22.491 EDT [553e0657.3c08:122] LOG: statement: CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$ return [ [1, 2], [3, 4] ]; $$ LANGUAGE plperl; 2015-04-27 05:50:22.625 EDT [553e0657.3c08:123] LOG: statement: SELECT * FROM foo_set_bad(); 2015-04-27 05:50:22.682 EDT [553e0657.3c08:124] ERROR: SETOF-composite-returning PL/Perl function must call return_next with reference to hash 2015-04-27 05:50:22.682 EDT [553e0657.3c08:125] CONTEXT: PL/Perl function "foo_set_bad" 2015-04-27 05:50:22.682 EDT [553e0657.3c08:126] STATEMENT: SELECT * FROM foo_set_bad(); 2015-04-27 05:50:22.682 EDT [553e0657.3c08:127] LOG: statement: CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$ return [ {y => 3, z => 4} ]; $$ LANGUAGE plperl; 2015-04-27 05:50:22.822 EDT [553e0657.3c08:128] LOG: statement: SELECT * FROM foo_set_bad(); 2015-04-27 05:50:22.881 EDT [553e0657.3c08:129] ERROR: Perl hash contains nonexistent column "z" 2015-04-27 05:50:22.881 EDT [553e0657.3c08:130] CONTEXT: PL/Perl function "foo_set_bad" 2015-04-27 05:50:22.881 EDT [553e0657.3c08:131] STATEMENT: SELECT * FROM foo_set_bad(); 2015-04-27 05:50:22.881 EDT [553e0657.3c08:132] LOG: statement: CREATE OR REPLACE FUNCTION perl_get_field(footype, text) RETURNS integer AS $$ return $_[0]->{$_[1]}; $$ LANGUAGE plperl; 2015-04-27 05:50:23.080 EDT [553e0657.3c08:133] LOG: statement: SELECT perl_get_field((11,12), \'x\'); 2015-04-27 05:50:23.137 EDT [553e0657.3c08:134] LOG: statement: SELECT perl_get_field((11,12), \'y\'); 2015-04-27 05:50:23.194 EDT [553e0657.3c08:135] LOG: statement: SELECT perl_get_field((11,12), \'z\'); 2015-04-27 05:50:23.251 EDT [553e0657.3c08:136] LOG: statement: CREATE OR REPLACE FUNCTION perl_srf_rn() RETURNS SETOF RECORD AS $$ my $i = 0; for ("World", "PostgreSQL", "PL/Perl") { return_next({f1=>++$i, f2=>\'Hello\', f3=>$_}); } return; $$ language plperl; 2015-04-27 05:50:23.383 EDT [553e0657.3c08:137] LOG: statement: SELECT * from perl_srf_rn() AS (f1 INTEGER, f2 TEXT, f3 TEXT); 2015-04-27 05:50:23.500 EDT [553e0657.3c08:138] LOG: statement: CREATE OR REPLACE FUNCTION perl_spi_func() RETURNS SETOF INTEGER AS $$ my $x = spi_query("select 1 as a union select 2 as a"); while (defined (my $y = spi_fetchrow($x))) { return_next($y->{a}); } return; $$ LANGUAGE plperl; 2015-04-27 05:50:23.625 EDT [553e0657.3c08:139] LOG: statement: SELECT * from perl_spi_func(); 2015-04-27 05:50:23.951 EDT [553e0657.3c08:140] LOG: statement: CREATE OR REPLACE FUNCTION perl_spi_func2() RETURNS INTEGER AS $$ my $x = spi_query("select 1 as a union select 2 as a"); spi_cursor_close( $x); return 0; $$ LANGUAGE plperl; 2015-04-27 05:50:24.079 EDT [553e0657.3c08:141] LOG: statement: SELECT * from perl_spi_func2(); 2015-04-27 05:50:24.484 EDT [553e0657.3c08:142] LOG: statement: CREATE OR REPLACE FUNCTION recurse(i int) RETURNS SETOF TEXT LANGUAGE plperl AS $$ my $i = shift; foreach my $x (1..$i) { return_next "hello $x"; } if ($i > 2) { my $z = $i-1; my $cursor = spi_query("select * from recurse($z)"); while (defined(my $row = spi_fetchrow($cursor))) { return_next "recurse $i: $row->{recurse}"; } } return undef; $$; 2015-04-27 05:50:24.693 EDT [553e0657.3c08:143] LOG: statement: SELECT * FROM recurse(2); 2015-04-27 05:50:24.752 EDT [553e0657.3c08:144] LOG: statement: SELECT * FROM recurse(3); 2015-04-27 05:50:24.880 EDT [553e0657.3c08:145] LOG: statement: CREATE OR REPLACE FUNCTION array_of_text() RETURNS TEXT[][] LANGUAGE plperl as $$ return [[\'a"b\',undef,\'c,d\'],[\'e\\\\f\',undef,\'g\']]; $$; 2015-04-27 05:50:25.017 EDT [553e0657.3c08:146] LOG: statement: SELECT array_of_text(); 2015-04-27 05:50:25.059 EDT [553e0657.3c08:147] LOG: statement: CREATE OR REPLACE FUNCTION perl_spi_prepared(INTEGER) RETURNS INTEGER AS $$ my $x = spi_prepare(\'select $1 AS a\', \'INTEGER\'); my $q = spi_exec_prepared( $x, $_[0] + 1); spi_freeplan($x); return $q->{rows}->[0]->{a}; $$ LANGUAGE plperl; 2015-04-27 05:50:25.415 EDT [553e0657.3c08:148] LOG: statement: SELECT * from perl_spi_prepared(42); 2015-04-27 05:50:25.507 EDT [553e0657.3c08:149] LOG: statement: CREATE OR REPLACE FUNCTION perl_spi_prepared_set(INTEGER, INTEGER) RETURNS SETOF INTEGER AS $$ my $x = spi_prepare(\'SELECT $1 AS a union select $2 as a\', \'INT4\', \'INT4\'); my $q = spi_query_prepared( $x, 1+$_[0], 2+$_[1]); while (defined (my $y = spi_fetchrow($q))) { return_next $y->{a}; } spi_freeplan($x); return; $$ LANGUAGE plperl; 2015-04-27 05:50:25.679 EDT [553e0657.3c08:150] LOG: statement: SELECT * from perl_spi_prepared_set(1,2); 2015-04-27 05:50:26.300 EDT [553e0657.3c08:151] LOG: statement: CREATE OR REPLACE FUNCTION perl_spi_prepared_double(double precision) RETURNS double precision AS $$ my $x = spi_prepare(\'SELECT 10.0 * $1 AS a\', \'DOUBLE PRECISION\'); my $q = spi_query_prepared($x,$_[0]); my $result; while (defined (my $y = spi_fetchrow($q))) { $result = $y->{a}; } spi_freeplan($x); return $result; $$ LANGUAGE plperl; 2015-04-27 05:50:26.450 EDT [553e0657.3c08:152] LOG: statement: SELECT perl_spi_prepared_double(4.35) as "double precision"; 2015-04-27 05:50:27.361 EDT [553e0657.3c08:153] LOG: statement: CREATE OR REPLACE FUNCTION perl_spi_prepared_bad(double precision) RETURNS double precision AS $$ my $x = spi_prepare(\'SELECT 10.0 * $1 AS a\', \'does_not_exist\'); my $q = spi_query_prepared($x,$_[0]); my $result; while (defined (my $y = spi_fetchrow($q))) { $result = $y->{a}; } spi_freeplan($x); return $result; $$ LANGUAGE plperl; 2015-04-27 05:50:27.533 EDT [553e0657.3c08:154] LOG: statement: SELECT perl_spi_prepared_bad(4.35) as "double precision"; 2015-04-27 05:50:27.626 EDT [553e0657.3c08:155] ERROR: type "does_not_exist" does not exist at line 2. 2015-04-27 05:50:27.626 EDT [553e0657.3c08:156] CONTEXT: PL/Perl function "perl_spi_prepared_bad" 2015-04-27 05:50:27.626 EDT [553e0657.3c08:157] STATEMENT: SELECT perl_spi_prepared_bad(4.35) as "double precision"; 2015-04-27 05:50:27.626 EDT [553e0657.3c08:158] LOG: statement: CREATE OR REPLACE FUNCTION perl_spi_prepared() RETURNS INTEGER AS $$ my $x = spi_prepare(\'select $1::footype AS a\', \'footype\'); my $q = spi_exec_prepared( $x, \'(1, 2)\'); spi_freeplan($x); return $q->{rows}->[0]->{a}->{x}; $$ LANGUAGE plperl; 2015-04-27 05:50:27.763 EDT [553e0657.3c08:159] LOG: statement: SELECT * from perl_spi_prepared(); 2015-04-27 05:50:27.892 EDT [553e0657.3c08:160] LOG: statement: CREATE OR REPLACE FUNCTION perl_spi_prepared_row(footype) RETURNS footype AS $$ my $footype = shift; my $x = spi_prepare(\'select $1 AS a\', \'footype\'); my $q = spi_exec_prepared( $x, {}, $footype ); spi_freeplan($x); return $q->{rows}->[0]->{a}; $$ LANGUAGE plperl; 2015-04-27 05:50:28.098 EDT [553e0657.3c08:161] LOG: statement: SELECT * from perl_spi_prepared_row(\'(1, 2)\'); 2015-04-27 05:50:28.230 EDT [553e0657.3c08:162] LOG: statement: DO $$ $a = \'This is a test\'; elog(NOTICE, $a); $$ LANGUAGE plperl; 2015-04-27 05:50:28.236 EDT [553e0657.3c08:163] LOG: statement: DO $$ system("/nonesuch"); $$ LANGUAGE plperl; 2015-04-27 05:50:28.242 EDT [553e0657.3c08:164] ERROR: \'system\' trapped by operation mask at line 1. 2015-04-27 05:50:28.242 EDT [553e0657.3c08:165] CONTEXT: PL/Perl anonymous code block 2015-04-27 05:50:28.242 EDT [553e0657.3c08:166] STATEMENT: DO $$ system("/nonesuch"); $$ LANGUAGE plperl; 2015-04-27 05:50:28.243 EDT [553e0657.3c08:167] LOG: statement: DO $$ qx("/nonesuch"); $$ LANGUAGE plperl; 2015-04-27 05:50:28.249 EDT [553e0657.3c08:168] ERROR: \'quoted execution (``, qx)\' trapped by operation mask at line 1. 2015-04-27 05:50:28.249 EDT [553e0657.3c08:169] CONTEXT: PL/Perl anonymous code block 2015-04-27 05:50:28.249 EDT [553e0657.3c08:170] STATEMENT: DO $$ qx("/nonesuch"); $$ LANGUAGE plperl; 2015-04-27 05:50:28.249 EDT [553e0657.3c08:171] LOG: statement: DO $$ open my $fh, " qw(void) ; my @y; my $x = sort @y; 1; $do$ LANGUAGE plperl; 2015-04-27 05:50:28.287 EDT [553e0657.3c08:191] ERROR: Useless use of sort in scalar context at line 1. 2015-04-27 05:50:28.287 EDT [553e0657.3c08:192] CONTEXT: PL/Perl anonymous code block 2015-04-27 05:50:28.287 EDT [553e0657.3c08:193] STATEMENT: DO $do$ use warnings FATAL => qw(void) ; my @y; my $x = sort @y; 1; $do$ LANGUAGE plperl; 2015-04-27 05:50:28.287 EDT [553e0657.3c08:194] LOG: statement: CREATE OR REPLACE FUNCTION myfuncs() RETURNS void AS $$ $_SHARED{myquote} = sub { my $arg = shift; $arg =~ s/([\'\\\\])/\\\\$1/g; return "\'$arg\'"; }; $$ LANGUAGE plperl; 2015-04-27 05:50:28.428 EDT [553e0657.3c08:195] LOG: statement: SELECT myfuncs(); 2015-04-27 05:50:28.463 EDT [553e0657.3c08:196] LOG: statement: CREATE OR REPLACE FUNCTION text_arrayref() RETURNS text AS $$ return [\'array\']; $$ LANGUAGE plperl; 2015-04-27 05:50:28.604 EDT [553e0657.3c08:197] LOG: statement: SELECT text_arrayref(); 2015-04-27 05:50:28.644 EDT [553e0657.3c08:198] ERROR: cannot convert Perl array to non-array type text 2015-04-27 05:50:28.644 EDT [553e0657.3c08:199] CONTEXT: PL/Perl function "text_arrayref" 2015-04-27 05:50:28.644 EDT [553e0657.3c08:200] STATEMENT: SELECT text_arrayref(); 2015-04-27 05:50:28.644 EDT [553e0657.3c08:201] LOG: statement: CREATE OR REPLACE FUNCTION text_hashref() RETURNS text AS $$ return {\'hash\'=>1}; $$ LANGUAGE plperl; 2015-04-27 05:50:28.784 EDT [553e0657.3c08:202] LOG: statement: SELECT text_hashref(); 2015-04-27 05:50:28.825 EDT [553e0657.3c08:203] ERROR: cannot convert Perl hash to non-composite type text 2015-04-27 05:50:28.825 EDT [553e0657.3c08:204] CONTEXT: PL/Perl function "text_hashref" 2015-04-27 05:50:28.825 EDT [553e0657.3c08:205] STATEMENT: SELECT text_hashref(); 2015-04-27 05:50:28.825 EDT [553e0657.3c08:206] LOG: statement: CREATE OR REPLACE FUNCTION text_obj() RETURNS text AS $$ return bless({}, \'Fake::Object\'); $$ LANGUAGE plperl; 2015-04-27 05:50:28.966 EDT [553e0657.3c08:207] LOG: statement: SELECT text_obj(); 2015-04-27 05:50:29.007 EDT [553e0657.3c08:208] ERROR: cannot convert Perl hash to non-composite type text 2015-04-27 05:50:29.007 EDT [553e0657.3c08:209] CONTEXT: PL/Perl function "text_obj" 2015-04-27 05:50:29.007 EDT [553e0657.3c08:210] STATEMENT: SELECT text_obj(); 2015-04-27 05:50:29.008 EDT [553e0657.3c08:211] LOG: statement: CREATE OR REPLACE FUNCTION text_scalarref() RETURNS text AS $$ my $str = \'str\'; return \\$str; $$ LANGUAGE plperl; 2015-04-27 05:50:29.148 EDT [553e0657.3c08:212] LOG: statement: SELECT text_scalarref(); 2015-04-27 05:50:29.181 EDT [553e0657.3c08:213] ERROR: PL/Perl function must return reference to hash or array 2015-04-27 05:50:29.181 EDT [553e0657.3c08:214] CONTEXT: PL/Perl function "text_scalarref" 2015-04-27 05:50:29.181 EDT [553e0657.3c08:215] STATEMENT: SELECT text_scalarref(); 2015-04-27 05:50:29.181 EDT [553e0657.3c08:216] LOG: statement: CREATE OR REPLACE FUNCTION self_modify(INTEGER) RETURNS INTEGER AS $$ spi_exec_query(\'CREATE OR REPLACE FUNCTION self_modify(INTEGER) RETURNS INTEGER AS \\\'return $_[0] * 3;\\\' LANGUAGE plperl;\'); spi_exec_query(\'select self_modify(42) AS a\'); return $_[0] * 2; $$ LANGUAGE plperl; 2015-04-27 05:50:29.343 EDT [553e0657.3c08:217] LOG: statement: SELECT self_modify(42); 2015-04-27 05:50:29.554 EDT [553e0657.3c08:218] LOG: statement: SELECT self_modify(42); 2015-04-27 05:50:29.589 EDT [553e0657.3c08:219] LOG: disconnection: session time: 0:00:14.318 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:29.604 EDT [553e0665.3c0b:1] LOG: connection received: host=[local] 2015-04-27 05:50:29.605 EDT [553e0665.3c0b:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:29.807 EDT [553e0665.3c0b:3] LOG: statement: CREATE OR REPLACE FUNCTION perl_zerob() RETURNS TEXT AS $$ return "abcd\\0efg"; $$ LANGUAGE plperl; 2015-04-27 05:50:29.972 EDT [553e0665.3c0b:4] LOG: statement: SELECT perl_zerob(); 2015-04-27 05:50:30.000 EDT [553e0665.3c0b:5] ERROR: invalid byte sequence for encoding "UTF8": 0x00 2015-04-27 05:50:30.000 EDT [553e0665.3c0b:6] CONTEXT: PL/Perl function "perl_zerob" 2015-04-27 05:50:30.000 EDT [553e0665.3c0b:7] STATEMENT: SELECT perl_zerob(); 2015-04-27 05:50:30.000 EDT [553e0665.3c0b:8] LOG: disconnection: session time: 0:00:00.396 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:30.013 EDT [553e0666.3c0e:1] LOG: connection received: host=[local] 2015-04-27 05:50:30.014 EDT [553e0666.3c0e:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:30.218 EDT [553e0666.3c0e:3] LOG: statement: CREATE TYPE rowcomp as (i int); 2015-04-27 05:50:30.451 EDT [553e0666.3c0e:4] LOG: statement: CREATE TYPE rowcompnest as (rfoo rowcomp); 2015-04-27 05:50:30.706 EDT [553e0666.3c0e:5] LOG: statement: CREATE TABLE trigger_test ( i int, v varchar, foo rowcompnest ); 2015-04-27 05:50:31.279 EDT [553e0666.3c0e:6] LOG: statement: CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger LANGUAGE plperl AS $$ # make sure keys are sorted for consistent results - perl no longer # hashes in repeatable fashion across runs sub str { my $val = shift; if (!defined $val) { return \'NULL\'; } elsif (ref $val eq \'HASH\') { my $str = \'\'; foreach my $rowkey (sort keys %$val) { $str .= ", " if $str; my $rowval = str($val->{$rowkey}); $str .= "\'$rowkey\' => $rowval"; } return \'{\'. $str .\'}\'; } elsif (ref $val eq \'ARRAY\') { my $str = \'\'; for my $argval (@$val) { $str .= ", " if $str; $str .= str($argval); } return \'[\'. $str .\']\'; } else { return "\'$val\'"; } } foreach my $key (sort keys %$_TD) { my $val = $_TD->{$key}; # relid is variable, so we can not use it repeatably $val = "bogus:12345" if $key eq \'relid\'; elog(NOTICE, "\\$_TD->\\{$key\\} = ". str($val)); } return undef; # allow statement to proceed; $$; 2015-04-27 05:50:31.447 EDT [553e0666.3c0e:7] LOG: statement: CREATE TRIGGER show_trigger_data_trig BEFORE INSERT OR UPDATE OR DELETE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,\'skidoo\'); 2015-04-27 05:50:31.557 EDT [553e0666.3c0e:8] LOG: statement: insert into trigger_test values(1,\'insert\', \'("(1)")\'); 2015-04-27 05:50:31.637 EDT [553e0666.3c0e:9] LOG: statement: update trigger_test set v = \'update\' where i = 1; 2015-04-27 05:50:31.847 EDT [553e0666.3c0e:10] LOG: statement: delete from trigger_test; 2015-04-27 05:50:31.951 EDT [553e0666.3c0e:11] LOG: statement: DROP TRIGGER show_trigger_data_trig on trigger_test; 2015-04-27 05:50:32.024 EDT [553e0666.3c0e:12] LOG: statement: insert into trigger_test values(1,\'insert\', \'("(1)")\'); 2015-04-27 05:50:32.063 EDT [553e0666.3c0e:13] LOG: statement: CREATE VIEW trigger_test_view AS SELECT * FROM trigger_test; 2015-04-27 05:50:32.439 EDT [553e0666.3c0e:14] LOG: statement: CREATE TRIGGER show_trigger_data_trig INSTEAD OF INSERT OR UPDATE OR DELETE ON trigger_test_view FOR EACH ROW EXECUTE PROCEDURE trigger_data(24,\'skidoo view\'); 2015-04-27 05:50:32.618 EDT [553e0666.3c0e:15] LOG: statement: insert into trigger_test_view values(2,\'insert\', \'("(2)")\'); 2015-04-27 05:50:32.741 EDT [553e0666.3c0e:16] LOG: statement: update trigger_test_view set v = \'update\', foo = \'("(3)")\' where i = 1; 2015-04-27 05:50:33.078 EDT [553e0666.3c0e:17] LOG: statement: delete from trigger_test_view; 2015-04-27 05:50:33.223 EDT [553e0666.3c0e:18] LOG: statement: DROP VIEW trigger_test_view; 2015-04-27 05:50:33.521 EDT [553e0666.3c0e:19] LOG: statement: delete from trigger_test; 2015-04-27 05:50:33.581 EDT [553e0666.3c0e:20] LOG: statement: DROP FUNCTION trigger_data(); 2015-04-27 05:50:33.653 EDT [553e0666.3c0e:21] LOG: statement: CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$ if (($_TD->{new}{i}>=100) || ($_TD->{new}{i}<=0)) { return "SKIP"; # Skip INSERT/UPDATE command } elsif ($_TD->{new}{v} ne "immortal") { $_TD->{new}{v} .= "(modified by trigger)"; $_TD->{new}{foo}{rfoo}{i}++; return "MODIFY"; # Modify tuple and proceed INSERT/UPDATE command } else { return; # Proceed INSERT/UPDATE command } $$ LANGUAGE plperl; 2015-04-27 05:50:33.785 EDT [553e0666.3c0e:22] LOG: statement: CREATE TRIGGER "test_valid_id_trig" BEFORE INSERT OR UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE "valid_id"(); 2015-04-27 05:50:33.918 EDT [553e0666.3c0e:23] LOG: statement: INSERT INTO trigger_test (i, v, foo) VALUES (1,\'first line\', \'("(1)")\'); 2015-04-27 05:50:34.020 EDT [553e0666.3c0e:24] LOG: statement: INSERT INTO trigger_test (i, v, foo) VALUES (2,\'second line\', \'("(2)")\'); 2015-04-27 05:50:34.119 EDT [553e0666.3c0e:25] LOG: statement: INSERT INTO trigger_test (i, v, foo) VALUES (3,\'third line\', \'("(3)")\'); 2015-04-27 05:50:34.218 EDT [553e0666.3c0e:26] LOG: statement: INSERT INTO trigger_test (i, v, foo) VALUES (4,\'immortal\', \'("(4)")\'); 2015-04-27 05:50:34.300 EDT [553e0666.3c0e:27] LOG: statement: INSERT INTO trigger_test (i, v) VALUES (101,\'bad id\'); 2015-04-27 05:50:34.363 EDT [553e0666.3c0e:28] LOG: statement: SELECT * FROM trigger_test; 2015-04-27 05:50:34.462 EDT [553e0666.3c0e:29] LOG: statement: UPDATE trigger_test SET i = 5 where i=3; 2015-04-27 05:50:34.686 EDT [553e0666.3c0e:30] LOG: statement: UPDATE trigger_test SET i = 100 where i=1; 2015-04-27 05:50:34.892 EDT [553e0666.3c0e:31] LOG: statement: SELECT * FROM trigger_test; 2015-04-27 05:50:34.991 EDT [553e0666.3c0e:32] LOG: statement: DROP TRIGGER "test_valid_id_trig" ON trigger_test; 2015-04-27 05:50:35.065 EDT [553e0666.3c0e:33] LOG: statement: CREATE OR REPLACE FUNCTION trigger_recurse() RETURNS trigger AS $$ use strict; if ($_TD->{new}{i} == 10000) { spi_exec_query("insert into trigger_test (i, v) values (20000, \'child\');"); if ($_TD->{new}{i} != 10000) { die "recursive trigger modified: ". $_TD->{new}{i}; } } return; $$ LANGUAGE plperl; 2015-04-27 05:50:35.193 EDT [553e0666.3c0e:34] LOG: statement: CREATE TRIGGER "test_trigger_recurse" BEFORE INSERT ON trigger_test FOR EACH ROW EXECUTE PROCEDURE "trigger_recurse"(); 2015-04-27 05:50:35.326 EDT [553e0666.3c0e:35] LOG: statement: INSERT INTO trigger_test (i, v) values (10000, \'top\'); 2015-04-27 05:50:35.457 EDT [553e0666.3c0e:36] LOG: statement: SELECT * FROM trigger_test; 2015-04-27 05:50:35.557 EDT [553e0666.3c0e:37] LOG: statement: CREATE OR REPLACE FUNCTION immortal() RETURNS trigger AS $$ if ($_TD->{old}{v} eq $_TD->{args}[0]) { return "SKIP"; # Skip DELETE command } else { return; # Proceed DELETE command }; $$ LANGUAGE plperl; 2015-04-27 05:50:35.685 EDT [553e0666.3c0e:38] LOG: statement: CREATE TRIGGER "immortal_trig" BEFORE DELETE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE immortal(\'immortal\'); 2015-04-27 05:50:35.819 EDT [553e0666.3c0e:39] LOG: statement: DELETE FROM trigger_test; 2015-04-27 05:50:36.041 EDT [553e0666.3c0e:40] LOG: statement: SELECT * FROM trigger_test; 2015-04-27 05:50:36.139 EDT [553e0666.3c0e:41] LOG: statement: CREATE FUNCTION direct_trigger() RETURNS trigger AS $$ return; $$ LANGUAGE plperl; 2015-04-27 05:50:36.270 EDT [553e0666.3c0e:42] LOG: statement: SELECT direct_trigger(); 2015-04-27 05:50:36.305 EDT [553e0666.3c0e:43] ERROR: trigger functions can only be called as triggers 2015-04-27 05:50:36.305 EDT [553e0666.3c0e:44] CONTEXT: compilation of PL/Perl function "direct_trigger" 2015-04-27 05:50:36.305 EDT [553e0666.3c0e:45] STATEMENT: SELECT direct_trigger(); 2015-04-27 05:50:36.305 EDT [553e0666.3c0e:46] LOG: statement: create or replace function perlsnitch() returns event_trigger language plperl as $$ elog(NOTICE, "perlsnitch: " . $_TD->{event} . " " . $_TD->{tag} . " "); $$; 2015-04-27 05:50:36.433 EDT [553e0666.3c0e:47] LOG: statement: create event trigger perl_a_snitch on ddl_command_start execute procedure perlsnitch(); 2015-04-27 05:50:36.492 EDT [553e0666.3c0e:48] LOG: statement: create event trigger perl_b_snitch on ddl_command_end execute procedure perlsnitch(); 2015-04-27 05:50:36.550 EDT [553e0666.3c0e:49] LOG: statement: create or replace function foobar() returns int language sql as $$select 1;$$; 2015-04-27 05:50:36.673 EDT [553e0666.3c0e:50] LOG: statement: alter function foobar() cost 77; 2015-04-27 05:50:36.732 EDT [553e0666.3c0e:51] LOG: statement: drop function foobar(); 2015-04-27 05:50:36.824 EDT [553e0666.3c0e:52] LOG: statement: create table foo(); 2015-04-27 05:50:37.065 EDT [553e0666.3c0e:53] LOG: statement: drop table foo; 2015-04-27 05:50:37.270 EDT [553e0666.3c0e:54] LOG: statement: drop event trigger perl_a_snitch; 2015-04-27 05:50:37.322 EDT [553e0666.3c0e:55] LOG: statement: drop event trigger perl_b_snitch; 2015-04-27 05:50:37.374 EDT [553e0666.3c0e:56] LOG: disconnection: session time: 0:00:07.360 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:37.387 EDT [553e066d.3c11:1] LOG: connection received: host=[local] 2015-04-27 05:50:37.387 EDT [553e066d.3c11:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:37.599 EDT [553e066d.3c11:3] LOG: statement: SET plperl.on_plperl_init = \'$_SHARED{on_init} = 42\'; 2015-04-27 05:50:37.599 EDT [553e066d.3c11:4] LOG: statement: create function setme(key text, val text) returns void language plperl as $$ my $key = shift; my $val = shift; $_SHARED{$key}= $val; $$; 2015-04-27 05:50:37.809 EDT [553e066d.3c11:5] LOG: statement: create function getme(key text) returns text language plperl as $$ my $key = shift; return $_SHARED{$key}; $$; 2015-04-27 05:50:37.958 EDT [553e066d.3c11:6] LOG: statement: select setme(\'ourkey\',\'ourval\'); 2015-04-27 05:50:37.991 EDT [553e066d.3c11:7] LOG: statement: select getme(\'ourkey\'); 2015-04-27 05:50:38.036 EDT [553e066d.3c11:8] LOG: statement: select getme(\'on_init\'); 2015-04-27 05:50:38.080 EDT [553e066d.3c11:9] LOG: statement: create or replace function perl_shared() returns int as $$ use strict; my $val = $_SHARED{\'stuff\'}; $_SHARED{\'stuff\'} = \'1\'; return $val; $$ language plperl; 2015-04-27 05:50:38.203 EDT [553e066d.3c11:10] LOG: statement: select perl_shared(); 2015-04-27 05:50:38.233 EDT [553e066d.3c11:11] LOG: statement: select perl_shared(); 2015-04-27 05:50:38.265 EDT [553e066d.3c11:12] LOG: disconnection: session time: 0:00:00.878 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:38.292 EDT [553e066e.3c14:1] LOG: connection received: host=[local] 2015-04-27 05:50:38.292 EDT [553e066e.3c14:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:38.494 EDT [553e066e.3c14:3] LOG: statement: create or replace function perl_elog(text) returns void language plperl as $$ my $msg = shift; elog(NOTICE,$msg); $$; 2015-04-27 05:50:38.683 EDT [553e066e.3c14:4] LOG: statement: select perl_elog(\'explicit elog\'); 2015-04-27 05:50:38.729 EDT [553e066e.3c14:5] LOG: statement: create or replace function perl_warn(text) returns void language plperl as $$ my $msg = shift; warn($msg); $$; 2015-04-27 05:50:38.880 EDT [553e066e.3c14:6] LOG: statement: select perl_warn(\'implicit elog via warn\'); 2015-04-27 05:50:38.924 EDT [553e066e.3c14:7] WARNING: implicit elog via warn at line 4. 2015-04-27 05:50:38.924 EDT [553e066e.3c14:8] CONTEXT: PL/Perl function "perl_warn" 2015-04-27 05:50:38.927 EDT [553e066e.3c14:9] LOG: statement: SET plperl.use_strict = true; 2015-04-27 05:50:38.927 EDT [553e066e.3c14:10] LOG: statement: create or replace function uses_global() returns text language plperl as $$ $global = 1; $other_global = 2; return \'uses_global worked\'; $$; 2015-04-27 05:50:39.050 EDT [553e066e.3c14:11] ERROR: Global symbol "$global" requires explicit package name at line 3. Global symbol "$other_global" requires explicit package name at line 4. 2015-04-27 05:50:39.050 EDT [553e066e.3c14:12] CONTEXT: compilation of PL/Perl function "uses_global" 2015-04-27 05:50:39.050 EDT [553e066e.3c14:13] STATEMENT: create or replace function uses_global() returns text language plperl as $$ $global = 1; $other_global = 2; return \'uses_global worked\'; $$; 2015-04-27 05:50:39.050 EDT [553e066e.3c14:14] LOG: statement: select uses_global(); 2015-04-27 05:50:39.060 EDT [553e066e.3c14:15] ERROR: function uses_global() does not exist at character 8 2015-04-27 05:50:39.060 EDT [553e066e.3c14:16] HINT: No function matches the given name and argument types. You might need to add explicit type casts. 2015-04-27 05:50:39.061 EDT [553e066e.3c14:17] STATEMENT: select uses_global(); 2015-04-27 05:50:39.061 EDT [553e066e.3c14:18] LOG: statement: SET plperl.use_strict = false; 2015-04-27 05:50:39.061 EDT [553e066e.3c14:19] LOG: statement: create or replace function uses_global() returns text language plperl as $$ $global = 1; $other_global=2; return \'uses_global worked\'; $$; 2015-04-27 05:50:39.186 EDT [553e066e.3c14:20] LOG: statement: select uses_global(); 2015-04-27 05:50:39.217 EDT [553e066e.3c14:21] LOG: statement: do language plperl $$ elog(NOTICE, ${^TAINT}); $$; 2015-04-27 05:50:39.222 EDT [553e066e.3c14:22] LOG: statement: create or replace function just_die() returns void language plperl AS $$ die "just die"; $$; 2015-04-27 05:50:39.349 EDT [553e066e.3c14:23] LOG: statement: select just_die(); 2015-04-27 05:50:39.377 EDT [553e066e.3c14:24] ERROR: just die at line 2. 2015-04-27 05:50:39.377 EDT [553e066e.3c14:25] CONTEXT: PL/Perl function "just_die" 2015-04-27 05:50:39.377 EDT [553e066e.3c14:26] STATEMENT: select just_die(); 2015-04-27 05:50:39.377 EDT [553e066e.3c14:27] LOG: statement: create or replace function die_caller() returns int language plpgsql as $$ BEGIN BEGIN PERFORM just_die(); EXCEPTION WHEN OTHERS THEN RAISE NOTICE \'caught die\'; END; RETURN 1; END; $$; 2015-04-27 05:50:39.512 EDT [553e066e.3c14:28] LOG: statement: select die_caller(); 2015-04-27 05:50:39.644 EDT [553e066e.3c14:29] LOG: statement: create or replace function indirect_die_caller() returns int language plperl as $$ my $prepared = spi_prepare(\'SELECT die_caller() AS fx\'); my $a = spi_exec_prepared($prepared)->{rows}->[0]->{fx}; my $b = spi_exec_prepared($prepared)->{rows}->[0]->{fx}; return $a + $b; $$; 2015-04-27 05:50:39.774 EDT [553e066e.3c14:30] LOG: statement: select indirect_die_caller(); 2015-04-27 05:50:39.990 EDT [553e066e.3c14:31] LOG: disconnection: session time: 0:00:01.698 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:40.003 EDT [553e0670.3c17:1] LOG: connection received: host=[local] 2015-04-27 05:50:40.004 EDT [553e0670.3c17:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:40.213 EDT [553e0670.3c17:3] LOG: statement: create or replace function perl_quote_literal() returns setof text language plperl as $$ return_next "undef: ".quote_literal(undef); return_next sprintf"$_: ".quote_literal($_) for q{foo}, q{a\'b}, q{a"b}, q{c\'\'d}, q{e\\f}, q{}; return undef; $$; 2015-04-27 05:50:40.484 EDT [553e0670.3c17:4] LOG: statement: select perl_quote_literal(); 2015-04-27 05:50:40.525 EDT [553e0670.3c17:5] LOG: statement: create or replace function perl_quote_nullable() returns setof text language plperl as $$ return_next "undef: ".quote_nullable(undef); return_next sprintf"$_: ".quote_nullable($_) for q{foo}, q{a\'b}, q{a"b}, q{c\'\'d}, q{e\\f}, q{}; return undef; $$; 2015-04-27 05:50:40.661 EDT [553e0670.3c17:6] LOG: statement: select perl_quote_nullable(); 2015-04-27 05:50:40.698 EDT [553e0670.3c17:7] LOG: statement: create or replace function perl_quote_ident() returns setof text language plperl as $$ return_next "undef: ".quote_ident(undef); # generates undef warning if warnings enabled return_next "$_: ".quote_ident($_) for q{foo}, q{a\'b}, q{a"b}, q{c\'\'d}, q{e\\f}, q{g.h}, q{}; return undef; $$; 2015-04-27 05:50:40.828 EDT [553e0670.3c17:8] LOG: statement: select perl_quote_ident(); 2015-04-27 05:50:40.863 EDT [553e0670.3c17:9] LOG: statement: create or replace function perl_decode_bytea() returns setof text language plperl as $$ return_next "undef: ".decode_bytea(undef); # generates undef warning if warnings enabled return_next "$_: ".decode_bytea($_) for q{foo}, q{a\\047b}, q{}; return undef; $$; 2015-04-27 05:50:40.993 EDT [553e0670.3c17:10] LOG: statement: select perl_decode_bytea(); 2015-04-27 05:50:41.028 EDT [553e0670.3c17:11] LOG: statement: create or replace function perl_encode_bytea() returns setof text language plperl as $$ return_next encode_bytea(undef); # generates undef warning if warnings enabled return_next encode_bytea($_) for q{@}, qq{@\\x01@}, qq{@\\x00@}, q{}; return undef; $$; 2015-04-27 05:50:41.154 EDT [553e0670.3c17:12] LOG: statement: select perl_encode_bytea(); 2015-04-27 05:50:41.188 EDT [553e0670.3c17:13] LOG: statement: create or replace function perl_encode_array_literal() returns setof text language plperl as $$ return_next encode_array_literal(undef); return_next encode_array_literal(0); return_next encode_array_literal(42); return_next encode_array_literal($_) for [], [0], [1..5], [[]], [[1,2,[3]],4]; return_next encode_array_literal($_,\'|\') for [], [0], [1..5], [[]], [[1,2,[3]],4]; return undef; $$; 2015-04-27 05:50:41.317 EDT [553e0670.3c17:14] LOG: statement: select perl_encode_array_literal(); 2015-04-27 05:50:41.352 EDT [553e0670.3c17:15] LOG: statement: create or replace function perl_encode_array_constructor() returns setof text language plperl as $$ return_next encode_array_constructor(undef); return_next encode_array_constructor(0); return_next encode_array_constructor(42); return_next encode_array_constructor($_) for [], [0], [1..5], [[]], [[1,2,[3]],4]; return undef; $$; 2015-04-27 05:50:41.478 EDT [553e0670.3c17:16] LOG: statement: select perl_encode_array_constructor(); 2015-04-27 05:50:41.513 EDT [553e0670.3c17:17] LOG: statement: create or replace function perl_looks_like_number() returns setof text language plperl as $$ return_next "undef is undef" if not defined looks_like_number(undef); return_next quote_nullable($_).": ". (looks_like_number($_) ? "number" : "not number") for \'foo\', 0, 1, 1.3, \'+3.e-4\', \'42 x\', # trailing garbage \'99 \', # trailing space \' 99\', # leading space \' \', # only space \'\'; # empty string return undef; $$; 2015-04-27 05:50:41.639 EDT [553e0670.3c17:18] LOG: statement: select perl_looks_like_number(); 2015-04-27 05:50:41.673 EDT [553e0670.3c17:19] LOG: statement: create type perl_foo as (a integer, b text[]); 2015-04-27 05:50:41.929 EDT [553e0670.3c17:20] LOG: statement: create type perl_bar as (c perl_foo[]); 2015-04-27 05:50:42.190 EDT [553e0670.3c17:21] LOG: statement: create or replace function perl_encode_typed_literal() returns setof text language plperl as $$ return_next encode_typed_literal(undef, \'text\'); return_next encode_typed_literal([[1,2,3],[3,2,1],[1,3,2]], \'integer[]\'); return_next encode_typed_literal({a => 1, b => [\'PL\',\'/\',\'Perl\']}, \'perl_foo\'); return_next encode_typed_literal({c => [{a => 9, b => [\'PostgreSQL\']}, {b => [\'Postgres\'], a => 1}]}, \'perl_bar\'); $$; 2015-04-27 05:50:42.317 EDT [553e0670.3c17:22] LOG: statement: select perl_encode_typed_literal(); 2015-04-27 05:50:42.459 EDT [553e0670.3c17:23] LOG: disconnection: session time: 0:00:02.455 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:42.470 EDT [553e0672.3c1b:1] LOG: connection received: host=[local] 2015-04-27 05:50:42.471 EDT [553e0672.3c1b:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:42.672 EDT [553e0672.3c1b:3] LOG: statement: LOAD \'plperl\'; 2015-04-27 05:50:42.683 EDT [553e0672.3c1b:4] LOG: statement: SET SESSION plperl.on_plperl_init = \' system("/nonesuch"); \'; 2015-04-27 05:50:42.684 EDT [553e0672.3c1b:5] LOG: statement: SHOW plperl.on_plperl_init; 2015-04-27 05:50:42.686 EDT [553e0672.3c1b:6] LOG: statement: DO $$ warn 42 $$ language plperl; 2015-04-27 05:50:42.715 EDT [553e0672.3c1b:7] ERROR: \'system\' trapped by operation mask at line 1. 2015-04-27 05:50:42.715 EDT [553e0672.3c1b:8] CONTEXT: while executing plperl.on_plperl_init PL/Perl anonymous code block 2015-04-27 05:50:42.715 EDT [553e0672.3c1b:9] STATEMENT: DO $$ warn 42 $$ language plperl; 2015-04-27 05:50:42.715 EDT [553e0672.3c1b:10] LOG: disconnection: session time: 0:00:00.245 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:42.727 EDT [553e0672.3c1e:1] LOG: connection received: host=[local] 2015-04-27 05:50:42.728 EDT [553e0672.3c1e:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:42.929 EDT [553e0672.3c1e:3] LOG: statement: LOAD \'plperl\'; 2015-04-27 05:50:42.941 EDT [553e0672.3c1e:4] LOG: statement: SET plperl.on_plperlu_init = \'$_SHARED{init} = 42\'; 2015-04-27 05:50:42.942 EDT [553e0672.3c1e:5] LOG: statement: DO $$ warn $_SHARED{init} $$ language plperlu; 2015-04-27 05:50:42.947 EDT [553e0672.3c1e:6] WARNING: 42 at line 1. 2015-04-27 05:50:42.947 EDT [553e0672.3c1e:7] CONTEXT: PL/Perl anonymous code block 2015-04-27 05:50:42.948 EDT [553e0672.3c1e:8] LOG: statement: CREATE OR REPLACE FUNCTION perl_unicode_regex(text) RETURNS INTEGER AS $$ return ($_[0] =~ /\\x{263A}|happy/i) ? 1 : 0; # unicode smiley $$ LANGUAGE plperlu; 2015-04-27 05:50:43.121 EDT [553e0672.3c1e:9] LOG: disconnection: session time: 0:00:00.393 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:43.133 EDT [553e0673.3c21:1] LOG: connection received: host=[local] 2015-04-27 05:50:43.133 EDT [553e0673.3c21:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:43.336 EDT [553e0673.3c21:3] LOG: statement: CREATE OR REPLACE FUNCTION plperl_sum_array(INTEGER[]) RETURNS text AS $$ my $array_arg = shift; my $result = 0; my @arrays; push @arrays, @$array_arg; while (@arrays > 0) { my $el = shift @arrays; if (is_array_ref($el)) { push @arrays, @$el; } else { $result += $el; } } return $result.\' \'.$array_arg; $$ LANGUAGE plperl; 2015-04-27 05:50:43.525 EDT [553e0673.3c21:4] LOG: statement: select plperl_sum_array(\'{1,2,NULL}\'); 2015-04-27 05:50:43.585 EDT [553e0673.3c21:5] LOG: statement: select plperl_sum_array(\'{}\'); 2015-04-27 05:50:43.644 EDT [553e0673.3c21:6] LOG: statement: select plperl_sum_array(\'{{1,2,3}, {4,5,6}}\'); 2015-04-27 05:50:43.703 EDT [553e0673.3c21:7] LOG: statement: select plperl_sum_array(\'{{{1,2,3}, {4,5,6}}, {{7,8,9}, {10,11,12}}}\'); 2015-04-27 05:50:43.762 EDT [553e0673.3c21:8] LOG: statement: select plperl_sum_array(ARRAY[[[[[[1,2],[3,4]],[[5,6],[7,8]]],[[[9,10],[11,12]], [[13,14],[15,16]]]], [[[[17,18],[19,20]],[[21,22],[23,24]]],[[[25,26],[27,28]],[[29,30],[31,32]]]]], [[[[[1,2],[3,4]],[[5,6],[7,8]]],[[[9,10],[11,12]],[[13,14],[15,16]]]], [[[[17,18],[19,20]],[[21,22],[23,24]]],[[[25,26],[27,28]],[[29,30],[31,32]]]]]]); 2015-04-27 05:50:44.144 EDT [553e0673.3c21:9] LOG: statement: select plperl_sum_array(\'{{{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}}, {{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}, {{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}}\' ); 2015-04-27 05:50:44.174 EDT [553e0673.3c21:10] ERROR: number of array dimensions (7) exceeds the maximum allowed (6) at character 25 2015-04-27 05:50:44.174 EDT [553e0673.3c21:11] STATEMENT: select plperl_sum_array(\'{{{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}}, {{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}, {{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}}\' ); 2015-04-27 05:50:44.174 EDT [553e0673.3c21:12] LOG: statement: select plperl_sum_array(\'{{{1,2,3}, {4,5,6,7}}, {{7,8,9}, {10, 11, 12}}}\'); 2015-04-27 05:50:44.205 EDT [553e0673.3c21:13] ERROR: malformed array literal: "{{{1,2,3}, {4,5,6,7}}, {{7,8,9}, {10, 11, 12}}}" at character 25 2015-04-27 05:50:44.205 EDT [553e0673.3c21:14] DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. 2015-04-27 05:50:44.205 EDT [553e0673.3c21:15] STATEMENT: select plperl_sum_array(\'{{{1,2,3}, {4,5,6,7}}, {{7,8,9}, {10, 11, 12}}}\'); 2015-04-27 05:50:44.205 EDT [553e0673.3c21:16] LOG: statement: CREATE OR REPLACE FUNCTION plperl_concat(TEXT[]) RETURNS TEXT AS $$ my $array_arg = shift; my $result = ""; my @arrays; push @arrays, @$array_arg; while (@arrays > 0) { my $el = shift @arrays; if (is_array_ref($el)) { push @arrays, @$el; } else { $result .= $el; } } return $result.\' \'.$array_arg; $$ LANGUAGE plperl; 2015-04-27 05:50:44.362 EDT [553e0673.3c21:17] LOG: statement: select plperl_concat(\'{"NULL","NULL","NULL\'\'"}\'); 2015-04-27 05:50:44.417 EDT [553e0673.3c21:18] LOG: statement: select plperl_concat(\'{{NULL,NULL,NULL}}\'); 2015-04-27 05:50:44.472 EDT [553e0673.3c21:19] LOG: statement: select plperl_concat(\'{"hello"," ","world!"}\'); 2015-04-27 05:50:44.529 EDT [553e0673.3c21:20] LOG: statement: CREATE TYPE foo AS (bar INTEGER, baz TEXT); 2015-04-27 05:50:44.782 EDT [553e0673.3c21:21] LOG: statement: CREATE OR REPLACE FUNCTION plperl_array_of_rows(foo[]) RETURNS TEXT AS $$ my $array_arg = shift; my $result = ""; for my $row_ref (@$array_arg) { die "not a hash reference" unless (ref $row_ref eq "HASH"); $result .= $row_ref->{bar}." items of ".$row_ref->{baz}.";"; } return $result .\' \'. $array_arg; $$ LANGUAGE plperl; 2015-04-27 05:50:44.956 EDT [553e0673.3c21:22] LOG: statement: select plperl_array_of_rows(ARRAY[ ROW(2, \'coffee\'), ROW(0, \'sugar\')]::foo[]); 2015-04-27 05:50:45.109 EDT [553e0673.3c21:23] LOG: statement: CREATE TYPE rowfoo AS (bar INTEGER, baz INTEGER[]); 2015-04-27 05:50:45.359 EDT [553e0673.3c21:24] LOG: statement: CREATE OR REPLACE FUNCTION plperl_sum_row_elements(rowfoo) RETURNS TEXT AS $$ my $row_ref = shift; my $result; if (ref $row_ref ne \'HASH\') { $result = 0; } else { $result = $row_ref->{bar}; die "not an array reference".ref ($row_ref->{baz}) unless (is_array_ref($row_ref->{baz})); # process a single-dimensional array foreach my $elem (@{$row_ref->{baz}}) { $result += $elem unless ref $elem; } } return $result; $$ LANGUAGE plperl; 2015-04-27 05:50:45.534 EDT [553e0673.3c21:25] LOG: statement: select plperl_sum_row_elements(ROW(1, ARRAY[2,3,4,5,6,7,8,9,10])::rowfoo); 2015-04-27 05:50:45.632 EDT [553e0673.3c21:26] LOG: statement: CREATE TYPE rowbar AS (foo rowfoo[]); 2015-04-27 05:50:45.903 EDT [553e0673.3c21:27] LOG: statement: CREATE OR REPLACE FUNCTION plperl_sum_array_of_rows(rowbar) RETURNS TEXT AS $$ my $rowfoo_ref = shift; my $result = 0; if (ref $rowfoo_ref eq \'HASH\') { my $row_array_ref = $rowfoo_ref->{foo}; if (is_array_ref($row_array_ref)) { foreach my $row_ref (@{$row_array_ref}) { if (ref $row_ref eq \'HASH\') { $result += $row_ref->{bar}; die "not an array reference".ref ($row_ref->{baz}) unless (is_array_ref($row_ref->{baz})); foreach my $elem (@{$row_ref->{baz}}) { $result += $elem unless ref $elem; } } else { die "element baz is not a reference to a rowfoo"; } } } else { die "not a reference to an array of rowfoo elements" } } else { die "not a reference to type rowbar"; } return $result; $$ LANGUAGE plperl; 2015-04-27 05:50:46.087 EDT [553e0673.3c21:28] LOG: statement: select plperl_sum_array_of_rows(ROW(ARRAY[ROW(1, ARRAY[2,3,4,5,6,7,8,9,10])::rowfoo, ROW(11, ARRAY[12,13,14,15,16,17,18,19,20])::rowfoo])::rowbar); 2015-04-27 05:50:46.325 EDT [553e0673.3c21:29] LOG: statement: CREATE OR REPLACE FUNCTION plperl_arrays_out(OUT INTEGER[]) AS $$ return [[1,2,3],[4,5,6]]; $$ LANGUAGE plperl; 2015-04-27 05:50:46.466 EDT [553e0673.3c21:30] LOG: statement: select plperl_arrays_out(); 2015-04-27 05:50:46.504 EDT [553e0673.3c21:31] LOG: statement: CREATE OR REPLACE FUNCTION plperl_arrays_inout(INTEGER[]) returns INTEGER[] AS $$ return shift; $$ LANGUAGE plperl; 2015-04-27 05:50:46.656 EDT [553e0673.3c21:32] LOG: statement: select plperl_arrays_inout(\'{{1}, {2}, {3}}\'); 2015-04-27 05:50:46.716 EDT [553e0673.3c21:33] LOG: statement: CREATE OR REPLACE FUNCTION plperl_arrays_inout_l(INTEGER[]) returns INTEGER[] AS $$ return shift.\'\'; # stringify it $$ LANGUAGE plperl; 2015-04-27 05:50:46.867 EDT [553e0673.3c21:34] LOG: statement: select plperl_arrays_inout_l(\'{{1}, {2}, {3}}\'); 2015-04-27 05:50:46.930 EDT [553e0673.3c21:35] LOG: statement: create or replace function perl_setof_array(integer[]) returns setof integer[] language plperl as $$ my $arr = shift; for my $r (@$arr) { return_next $r; } return undef; $$; 2015-04-27 05:50:47.082 EDT [553e0673.3c21:36] LOG: statement: select perl_setof_array(\'{{1}, {2}, {3}}\'); 2015-04-27 05:50:47.156 EDT [553e0673.3c21:37] LOG: disconnection: session time: 0:00:04.023 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:47.170 EDT [553e0677.3c24:1] LOG: connection received: host=[local] 2015-04-27 05:50:47.171 EDT [553e0677.3c24:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:47.376 EDT [553e0677.3c24:3] LOG: statement: CREATE OR REPLACE FUNCTION bar() RETURNS integer AS $$ #die \'BANG!\'; # causes server process to exit(2) # alternative - causes server process to exit(255) spi_exec_query("invalid sql statement"); $$ language plperl; 2015-04-27 05:50:47.560 EDT [553e0677.3c24:4] LOG: statement: CREATE OR REPLACE FUNCTION foo() RETURNS integer AS $$ spi_exec_query("SELECT * FROM bar()"); return 1; $$ LANGUAGE plperlu; 2015-04-27 05:50:47.696 EDT [553e0677.3c24:5] LOG: statement: SELECT * FROM bar(); 2015-04-27 05:50:47.749 EDT [553e0677.3c24:6] ERROR: syntax error at or near "invalid" at line 4. 2015-04-27 05:50:47.749 EDT [553e0677.3c24:7] CONTEXT: PL/Perl function "bar" 2015-04-27 05:50:47.749 EDT [553e0677.3c24:8] STATEMENT: SELECT * FROM bar(); 2015-04-27 05:50:47.749 EDT [553e0677.3c24:9] LOG: statement: SELECT * FROM foo(); 2015-04-27 05:50:47.851 EDT [553e0677.3c24:10] ERROR: syntax error at or near "invalid" at line 4. at line 2. 2015-04-27 05:50:47.851 EDT [553e0677.3c24:11] CONTEXT: PL/Perl function "foo" 2015-04-27 05:50:47.851 EDT [553e0677.3c24:12] STATEMENT: SELECT * FROM foo(); 2015-04-27 05:50:47.852 EDT [553e0677.3c24:13] LOG: statement: create or replace function foo(text) returns text language plperl as \'shift\'; 2015-04-27 05:50:48.007 EDT [553e0677.3c24:14] LOG: statement: select foo(\'hey\'); 2015-04-27 05:50:48.056 EDT [553e0677.3c24:15] LOG: statement: create or replace function foo(text) returns text language plperlu as \'shift\'; 2015-04-27 05:50:48.205 EDT [553e0677.3c24:16] LOG: statement: select foo(\'hey\'); 2015-04-27 05:50:48.254 EDT [553e0677.3c24:17] LOG: statement: create or replace function foo(text) returns text language plperl as \'shift\'; 2015-04-27 05:50:48.397 EDT [553e0677.3c24:18] LOG: statement: select foo(\'hey\'); 2015-04-27 05:50:48.445 EDT [553e0677.3c24:19] LOG: statement: create or replace function bar(text) returns text language plperlu as \'shift\'; 2015-04-27 05:50:48.595 EDT [553e0677.3c24:20] LOG: statement: select bar(\'hey\'); 2015-04-27 05:50:48.640 EDT [553e0677.3c24:21] LOG: statement: create or replace function bar(text) returns text language plperl as \'shift\'; 2015-04-27 05:50:48.778 EDT [553e0677.3c24:22] LOG: statement: select bar(\'hey\'); 2015-04-27 05:50:48.824 EDT [553e0677.3c24:23] LOG: statement: create or replace function bar(text) returns text language plperlu as \'shift\'; 2015-04-27 05:50:48.965 EDT [553e0677.3c24:24] LOG: statement: select bar(\'hey\'); 2015-04-27 05:50:49.009 EDT [553e0677.3c24:25] LOG: statement: CREATE OR REPLACE FUNCTION use_plperlu() RETURNS void LANGUAGE plperlu AS $$ use Errno; $$; 2015-04-27 05:50:49.146 EDT [553e0677.3c24:26] LOG: statement: CREATE OR REPLACE FUNCTION use_plperl() RETURNS void LANGUAGE plperl AS $$ use Errno; $$; 2015-04-27 05:50:49.272 EDT [553e0677.3c24:27] ERROR: Unable to load Errno.pm into plperl at line 2. BEGIN failed--compilation aborted at line 2. 2015-04-27 05:50:49.272 EDT [553e0677.3c24:28] CONTEXT: compilation of PL/Perl function "use_plperl" 2015-04-27 05:50:49.272 EDT [553e0677.3c24:29] STATEMENT: CREATE OR REPLACE FUNCTION use_plperl() RETURNS void LANGUAGE plperl AS $$ use Errno; $$; 2015-04-27 05:50:49.272 EDT [553e0677.3c24:30] LOG: statement: select use_plperlu(); 2015-04-27 05:50:49.302 EDT [553e0677.3c24:31] LOG: statement: CREATE OR REPLACE FUNCTION use_plperl() RETURNS void LANGUAGE plperl AS $$ use Errno; $$; 2015-04-27 05:50:49.427 EDT [553e0677.3c24:32] ERROR: Unable to load Errno.pm into plperl at line 2. BEGIN failed--compilation aborted at line 2. 2015-04-27 05:50:49.427 EDT [553e0677.3c24:33] CONTEXT: compilation of PL/Perl function "use_plperl" 2015-04-27 05:50:49.427 EDT [553e0677.3c24:34] STATEMENT: CREATE OR REPLACE FUNCTION use_plperl() RETURNS void LANGUAGE plperl AS $$ use Errno; $$; 2015-04-27 05:50:49.428 EDT [553e0677.3c24:35] LOG: disconnection: session time: 0:00:02.257 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:49.513 EDT [553e0679.3c2e:1] LOG: connection received: host=[local] 2015-04-27 05:50:49.513 EDT [553e0679.3c2e:2] LOG: connection authorized: user=buildfarm database=postgres 2015-04-27 05:50:49.723 EDT [553e0679.3c2e:3] LOG: statement: DROP DATABASE IF EXISTS "pl_regression" 2015-04-27 05:50:50.384 EDT [553e0679.3c2e:4] LOG: disconnection: session time: 0:00:00.871 user=buildfarm database=postgres host=[local] 2015-04-27 05:50:50.390 EDT [553e067a.3c30:1] LOG: connection received: host=[local] 2015-04-27 05:50:50.391 EDT [553e067a.3c30:2] LOG: connection authorized: user=buildfarm database=postgres 2015-04-27 05:50:50.600 EDT [553e067a.3c30:3] LOG: statement: CREATE DATABASE "pl_regression" TEMPLATE=template0 2015-04-27 05:50:51.385 EDT [553e067a.3c30:4] LOG: disconnection: session time: 0:00:00.995 user=buildfarm database=postgres host=[local] 2015-04-27 05:50:51.392 EDT [553e067b.3c32:1] LOG: connection received: host=[local] 2015-04-27 05:50:51.393 EDT [553e067b.3c32:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:51.597 EDT [553e067b.3c32:3] LOG: statement: ALTER DATABASE "pl_regression" SET lc_messages TO \'C\';ALTER DATABASE "pl_regression" SET lc_monetary TO \'C\';ALTER DATABASE "pl_regression" SET lc_numeric TO \'C\';ALTER DATABASE "pl_regression" SET lc_time TO \'C\';ALTER DATABASE "pl_regression" SET timezone_abbreviations TO \'Default\'; 2015-04-27 05:50:51.638 EDT [553e067b.3c32:4] LOG: disconnection: session time: 0:00:00.246 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:51.645 EDT [553e067b.3c34:1] LOG: connection received: host=[local] 2015-04-27 05:50:51.645 EDT [553e067b.3c34:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:51.850 EDT [553e067b.3c34:3] LOG: statement: CREATE EXTENSION IF NOT EXISTS "plpythonu" 2015-04-27 05:50:52.470 EDT [553e067b.3c34:4] LOG: disconnection: session time: 0:00:00.825 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:50:52.478 EDT [553e067c.3c36:1] LOG: connection received: host=[local] 2015-04-27 05:50:52.479 EDT [553e067c.3c36:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:50:52.703 EDT [553e067c.3c36:3] LOG: statement: CREATE TABLE users ( fname text not null, lname text not null, username text, userid serial, PRIMARY KEY(lname, fname) ) ; 2015-04-27 05:50:54.248 EDT [553e067c.3c36:4] LOG: statement: CREATE INDEX users_username_idx ON users(username); 2015-04-27 05:50:54.537 EDT [553e067c.3c36:5] LOG: statement: CREATE INDEX users_fname_idx ON users(fname); 2015-04-27 05:50:54.814 EDT [553e067c.3c36:6] LOG: statement: CREATE INDEX users_lname_idx ON users(lname); 2015-04-27 05:50:55.096 EDT [553e067c.3c36:7] LOG: statement: CREATE INDEX users_userid_idx ON users(userid); 2015-04-27 05:50:55.277 EDT [553e067c.3c36:8] LOG: statement: CREATE TABLE taxonomy ( id serial primary key, name text unique ) ; 2015-04-27 05:50:56.984 EDT [553e067c.3c36:9] LOG: statement: CREATE TABLE entry ( accession text not null primary key, eid serial unique, txid int2 not null references taxonomy(id) ) ; 2015-04-27 05:50:58.892 EDT [553e067c.3c36:10] LOG: statement: CREATE TABLE sequences ( eid int4 not null references entry(eid), pid serial primary key, product text not null, sequence text not null, multipart bool default \'false\' ) ; 2015-04-27 05:51:00.672 EDT [553e067c.3c36:11] LOG: statement: CREATE INDEX sequences_product_idx ON sequences(product) ; 2015-04-27 05:51:01.002 EDT [553e067c.3c36:12] LOG: statement: CREATE TABLE xsequences ( pid int4 not null references sequences(pid), sequence text not null ) ; 2015-04-27 05:51:01.957 EDT [553e067c.3c36:13] LOG: statement: CREATE INDEX xsequences_pid_idx ON xsequences(pid) ; 2015-04-27 05:51:02.202 EDT [553e067c.3c36:14] LOG: disconnection: session time: 0:00:09.724 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:51:02.214 EDT [553e0686.3c3a:1] LOG: connection received: host=[local] 2015-04-27 05:51:02.215 EDT [553e0686.3c3a:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:51:02.419 EDT [553e0686.3c3a:3] LOG: statement: INSERT INTO users (fname, lname, username) VALUES (\'jane\', \'doe\', \'j_doe\'); 2015-04-27 05:51:02.485 EDT [553e0686.3c3a:4] LOG: statement: INSERT INTO users (fname, lname, username) VALUES (\'john\', \'doe\', \'johnd\'); 2015-04-27 05:51:02.549 EDT [553e0686.3c3a:5] LOG: statement: INSERT INTO users (fname, lname, username) VALUES (\'willem\', \'doe\', \'w_doe\'); 2015-04-27 05:51:02.615 EDT [553e0686.3c3a:6] LOG: statement: INSERT INTO users (fname, lname, username) VALUES (\'rick\', \'smith\', \'slash\'); 2015-04-27 05:51:02.680 EDT [553e0686.3c3a:7] LOG: statement: INSERT INTO taxonomy (name) VALUES (\'HIV I\') ; 2015-04-27 05:51:02.739 EDT [553e0686.3c3a:8] LOG: statement: INSERT INTO taxonomy (name) VALUES (\'HIV II\') ; 2015-04-27 05:51:02.798 EDT [553e0686.3c3a:9] LOG: statement: INSERT INTO taxonomy (name) VALUES (\'HCV\') ; 2015-04-27 05:51:02.856 EDT [553e0686.3c3a:10] LOG: statement: INSERT INTO entry (accession, txid) VALUES (\'A00001\', \'1\') ; 2015-04-27 05:51:03.253 EDT [553e0686.3c3a:11] LOG: statement: INSERT INTO entry (accession, txid) VALUES (\'A00002\', \'1\') ; 2015-04-27 05:51:03.635 EDT [553e0686.3c3a:12] LOG: statement: INSERT INTO entry (accession, txid) VALUES (\'A00003\', \'1\') ; 2015-04-27 05:51:04.000 EDT [553e0686.3c3a:13] LOG: statement: INSERT INTO entry (accession, txid) VALUES (\'A00004\', \'2\') ; 2015-04-27 05:51:04.375 EDT [553e0686.3c3a:14] LOG: statement: INSERT INTO entry (accession, txid) VALUES (\'A00005\', \'2\') ; 2015-04-27 05:51:04.747 EDT [553e0686.3c3a:15] LOG: statement: INSERT INTO entry (accession, txid) VALUES (\'A00006\', \'3\') ; 2015-04-27 05:51:05.127 EDT [553e0686.3c3a:16] LOG: statement: INSERT INTO sequences (sequence, eid, product, multipart) VALUES (\'ABCDEF\', 1, \'env\', \'true\') ; 2015-04-27 05:51:05.524 EDT [553e0686.3c3a:17] LOG: statement: INSERT INTO xsequences (sequence, pid) VALUES (\'GHIJKL\', 1) ; 2015-04-27 05:51:05.896 EDT [553e0686.3c3a:18] LOG: statement: INSERT INTO sequences (sequence, eid, product) VALUES (\'ABCDEF\', 2, \'env\') ; 2015-04-27 05:51:06.287 EDT [553e0686.3c3a:19] LOG: statement: INSERT INTO sequences (sequence, eid, product) VALUES (\'ABCDEF\', 3, \'env\') ; 2015-04-27 05:51:06.674 EDT [553e0686.3c3a:20] LOG: statement: INSERT INTO sequences (sequence, eid, product) VALUES (\'ABCDEF\', 4, \'gag\') ; 2015-04-27 05:51:07.056 EDT [553e0686.3c3a:21] LOG: statement: INSERT INTO sequences (sequence, eid, product) VALUES (\'ABCDEF\', 5, \'env\') ; 2015-04-27 05:51:07.436 EDT [553e0686.3c3a:22] LOG: statement: INSERT INTO sequences (sequence, eid, product) VALUES (\'ABCDEF\', 6, \'ns1\') ; 2015-04-27 05:51:07.812 EDT [553e0686.3c3a:23] LOG: disconnection: session time: 0:00:05.598 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:51:07.828 EDT [553e068b.3c3d:1] LOG: connection received: host=[local] 2015-04-27 05:51:07.829 EDT [553e068b.3c3d:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:51:08.043 EDT [553e068b.3c3d:3] LOG: statement: CREATE EXTENSION plpython2u; 2015-04-27 05:51:08.578 EDT [553e068b.3c3d:4] LOG: statement: CREATE FUNCTION stupid() RETURNS text AS \'return "zarkon"\' LANGUAGE plpythonu; 2015-04-27 05:51:08.702 EDT [553e068b.3c3d:5] LOG: statement: select stupid(); 2015-04-27 05:51:08.734 EDT [553e068b.3c3d:6] LOG: statement: CREATE FUNCTION stupidn() RETURNS text AS \'return "zarkon"\' LANGUAGE plpython2u; 2015-04-27 05:51:08.857 EDT [553e068b.3c3d:7] LOG: statement: select stupidn(); 2015-04-27 05:51:08.888 EDT [553e068b.3c3d:8] LOG: statement: CREATE FUNCTION argument_test_one(u users, a1 text, a2 text) RETURNS text AS \'keys = list(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; 2015-04-27 05:51:09.096 EDT [553e068b.3c3d:9] LOG: statement: select argument_test_one(users, fname, lname) from users where lname = \'doe\' order by 1; 2015-04-27 05:51:10.008 EDT [553e068b.3c3d:10] LOG: statement: CREATE FUNCTION module_contents() RETURNS text AS $$ contents = list(filter(lambda x: not x.startswith("__"), dir(plpy))) contents.sort() return ", ".join(contents) $$ LANGUAGE plpythonu; 2015-04-27 05:51:10.137 EDT [553e068b.3c3d:11] LOG: statement: select module_contents(); 2015-04-27 05:51:10.171 EDT [553e068b.3c3d:12] LOG: statement: CREATE FUNCTION elog_test() RETURNS void AS $$ plpy.debug(\'debug\') plpy.log(\'log\') plpy.info(\'info\') plpy.info(37) plpy.info() plpy.info(\'info\', 37, [1, 2, 3]) plpy.notice(\'notice\') plpy.warning(\'warning\') plpy.error(\'error\') $$ LANGUAGE plpythonu; 2015-04-27 05:51:10.301 EDT [553e068b.3c3d:13] LOG: statement: SELECT elog_test(); 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:14] LOG: log 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:15] CONTEXT: PL/Python function "elog_test" 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:16] STATEMENT: SELECT elog_test(); 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:17] WARNING: warning 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:18] CONTEXT: PL/Python function "elog_test" 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:19] ERROR: plpy.Error: error 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:20] CONTEXT: Traceback (most recent call last): PL/Python function "elog_test", line 10, in plpy.error(\'error\') PL/Python function "elog_test" 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:21] STATEMENT: SELECT elog_test(); 2015-04-27 05:51:10.335 EDT [553e068b.3c3d:22] LOG: disconnection: session time: 0:00:02.507 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:51:10.349 EDT [553e068e.3c40:1] LOG: connection received: host=[local] 2015-04-27 05:51:10.350 EDT [553e068e.3c40:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:51:10.570 EDT [553e068e.3c40:3] LOG: statement: DO $$ plpy.notice("This is plpythonu.") $$ LANGUAGE plpythonu; 2015-04-27 05:51:10.608 EDT [553e068e.3c40:4] LOG: statement: DO $$ plpy.notice("This is plpython2u.") $$ LANGUAGE plpython2u; 2015-04-27 05:51:10.614 EDT [553e068e.3c40:5] LOG: statement: DO $$ raise Exception("error test") $$ LANGUAGE plpythonu; 2015-04-27 05:51:10.619 EDT [553e068e.3c40:6] ERROR: Exception: error test 2015-04-27 05:51:10.619 EDT [553e068e.3c40:7] CONTEXT: Traceback (most recent call last): PL/Python anonymous code block, line 1, in raise Exception("error test") PL/Python anonymous code block 2015-04-27 05:51:10.619 EDT [553e068e.3c40:8] STATEMENT: DO $$ raise Exception("error test") $$ LANGUAGE plpythonu; 2015-04-27 05:51:10.620 EDT [553e068e.3c40:9] LOG: disconnection: session time: 0:00:00.270 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:51:10.636 EDT [553e068e.3c43:1] LOG: connection received: host=[local] 2015-04-27 05:51:10.637 EDT [553e068e.3c43:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:51:10.846 EDT [553e068e.3c43:3] LOG: statement: CREATE FUNCTION global_test_one() returns text AS \'if "global_test" not in SD: SD["global_test"] = "set by global_test_one" if "global_test" not in GD: GD["global_test"] = "set by global_test_one" return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]\' LANGUAGE plpythonu; 2015-04-27 05:51:11.006 EDT [553e068e.3c43:4] LOG: statement: CREATE FUNCTION global_test_two() returns text AS \'if "global_test" not in SD: SD["global_test"] = "set by global_test_two" if "global_test" not in GD: GD["global_test"] = "set by global_test_two" return "SD: " + SD["global_test"] + ", GD: " + GD["global_test"]\' LANGUAGE plpythonu; 2015-04-27 05:51:11.136 EDT [553e068e.3c43:5] LOG: statement: CREATE FUNCTION static_test() returns int4 AS \'if "call" in SD: SD["call"] = SD["call"] + 1 else: SD["call"] = 1 return SD["call"] \' LANGUAGE plpythonu; 2015-04-27 05:51:11.264 EDT [553e068e.3c43:6] LOG: statement: SELECT static_test(); 2015-04-27 05:51:11.297 EDT [553e068e.3c43:7] LOG: statement: SELECT static_test(); 2015-04-27 05:51:11.330 EDT [553e068e.3c43:8] LOG: statement: SELECT global_test_one(); 2015-04-27 05:51:11.362 EDT [553e068e.3c43:9] LOG: statement: SELECT global_test_two(); 2015-04-27 05:51:11.394 EDT [553e068e.3c43:10] LOG: disconnection: session time: 0:00:00.758 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:51:11.423 EDT [553e068f.3c47:1] LOG: connection received: host=[local] 2015-04-27 05:51:11.424 EDT [553e068f.3c47:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:51:11.647 EDT [553e068f.3c47:3] LOG: statement: CREATE FUNCTION import_fail() returns text AS \'try: import foosocket except ImportError: return "failed as expected" return "succeeded, that wasn\'\'t supposed to happen"\' LANGUAGE plpythonu; 2015-04-27 05:51:11.802 EDT [553e068f.3c47:4] LOG: statement: CREATE FUNCTION import_succeed() returns text AS \'try: import array import bisect import calendar import cmath import errno import math import operator import random import re import string import time except Exception, ex: plpy.notice("import failed -- %s" % str(ex)) return "failed, that wasn\'\'t supposed to happen" return "succeeded, as expected"\' LANGUAGE plpythonu; 2015-04-27 05:51:11.921 EDT [553e068f.3c47:5] LOG: statement: CREATE FUNCTION import_test_one(p text) RETURNS text AS \'try: import hashlib digest = hashlib.sha1(p.encode("ascii")) except ImportError: import sha digest = sha.new(p) return digest.hexdigest()\' LANGUAGE plpythonu; 2015-04-27 05:51:12.066 EDT [553e068f.3c47:6] LOG: statement: CREATE FUNCTION import_test_two(u users) RETURNS text AS \'plain = u["fname"] + u["lname"] try: import hashlib digest = hashlib.sha1(plain.encode("ascii")) except ImportError: import sha digest = sha.new(plain); return "sha hash of " + plain + " is " + digest.hexdigest()\' LANGUAGE plpythonu; 2015-04-27 05:51:12.235 EDT [553e068f.3c47:7] LOG: statement: SELECT import_fail(); 2015-04-27 05:51:12.267 EDT [553e068f.3c47:8] LOG: statement: SELECT import_succeed(); 2015-04-27 05:51:12.379 EDT [553e068f.3c47:9] LOG: statement: SELECT import_test_one(\'sha hash of this string\'); 2015-04-27 05:51:12.427 EDT [553e068f.3c47:10] LOG: statement: select import_test_two(users) from users where fname = \'willem\'; 2015-04-27 05:51:12.676 EDT [553e068f.3c47:11] LOG: disconnection: session time: 0:00:01.252 user=buildfarm database=pl_regression host=[local] 2015-04-27 05:51:12.689 EDT [553e0690.3c4a:1] LOG: connection received: host=[local] 2015-04-27 05:51:12.690 EDT [553e0690.3c4a:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-27 05:51:12.890 EDT [553e0690.3c4a:3] LOG: statement: CREATE FUNCTION nested_call_one(a text) RETURNS text AS \'q = "SELECT nested_call_two(\'\'%s\'\')" % a r = plpy.execute(q) return r[0]\' LANGUAGE plpythonu ; 2015-04-27 05:51:13.065 EDT [553e0690.3c4a:4] LOG: statement: CREATE FUNCTION nested_call_two(a text) RETURNS text AS \'q = "SELECT nested_call_three(\'\'%s\'\')" % a r = plpy.execute(q) return r[0]\' LANGUAGE plpythonu ; 2015-04-27 05:51:13.205 EDT [553e0690.3c4a:5] LOG: statement: CREATE FUNCTION nested_call_three(a text) RETURNS text AS \'return a\' LANGUAGE plpythonu ; 2015-04-27 05:51:13.351 EDT [553e0690.3c4a:6] LOG: statement: CREATE FUNCTION spi_prepared_plan_test_one(a text) RETURNS text AS \'if "myplan" not in SD: q = "SELECT count(*) FROM users WHERE lname = $1" SD["myplan"] = plpy.prepare(q, [ "text" ]) try: rv = plpy.execute(SD["myplan"], [a]) return "there are " + str(rv[0]["count"]) + " " + str(a) + "s" except Exception, ex: plpy.error(str(ex)) return None \' LANGUAGE plpythonu; 2015-04-27 05:51:13.497 EDT [553e0690.3c4a:7] LOG: statement: CREATE FUNCTION spi_prepared_plan_test_nested(a text) RETURNS text AS \'if "myplan" not in SD: q = "SELECT spi_prepared_plan_test_one(\'\'%s\'\') as count" % a SD["myplan"] = plpy.prepare(q) try: rv = plpy.execute(SD["myplan"]) if len(rv): return rv[0]["count"] except Exception, ex: plpy.error(str(ex)) return None \' LANGUAGE plpythonu; 2015-04-27 05:51:13.642 EDT [553e0690.3c4a:8] LOG: statement: CREATE FUNCTION join_sequences(s sequences) RETURNS text AS \'if not s["multipart"]: return s["sequence"] q = "SELECT sequence FROM xsequences WHERE pid = \'\'%s\'\'" % s["pid"] rv = plpy.execute(q) seq = s["sequence"] for r in rv: seq = seq + r["sequence"] return seq \' LANGUAGE plpythonu; 2015-04-27 05:51:13.809 EDT [553e0690.3c4a:9] LOG: statement: select nested_call_one(\'pass this along\'); 2015-04-27 05:51:13.948 EDT [553e0690.3c4a:10] LOG: statement: select spi_prepared_plan_test_one(\'doe\'); 2015-04-27 05:51:14.352 EDT [553e0690.3c4a:11] LOG: statement: select spi_prepared_plan_test_one(\'smith\'); 2015-04-27 05:51:14.744 EDT [553e0690.3c4a:12] LOG: statement: select spi_prepared_plan_test_nested(\'smith\'); 2015-04-27 05:51:15.226 EDT [553e0690.3c4a:13] LOG: statement: SELECT join_sequences(sequences) FROM sequences; 2015-04-27 05:51:15.655 EDT [553e0690.3c4a:14] LOG: statement: SELECT join_sequences(sequences) FROM sequences WHERE join_sequences(sequences) ~* \'^A\'; 2015-04-27 05:51:16.473 EDT [553e0690.3c4a:15] LOG: statement: SELECT join_sequences(sequences) FROM sequences WHERE join_sequences(sequences) ~* \'^B\'; 2015-04-27 05:51:16.973 EDT [553e0690.3c4a:16] LOG: statement: CREATE FUNCTION result_metadata_test(cmd text) RETURNS int AS $$ plan = plpy.prepare(cmd) plpy.info(plan.status()) # not really documented or useful result = plpy.execute(plan) if result.status() > 0: plpy.info(result.colnames()) plpy.info(result.coltypes()) plpy.info(result.coltypmods()) return result.nrows() else: return None $$ LANGUAGE plpythonu; 2015-04-27 05:51:17.126 EDT [553e0690.3c4a:17] LOG: statement: SELECT result_metadata_test($$SELECT 1 AS foo, \'11\'::text AS bar UNION SELECT 2, \'22\'$$); 2015-04-27 05:51:18.667 EDT [553e0690.3c4a:18] LOG: statement: SELECT result_metadata_test($$CREATE TEMPORARY TABLE foo1 (a int, b text)$$); 2015-04-27 05:51:19.324 EDT [553e0690.3c4a:19] ERROR: plpy.Error: command did not produce a result set 2015-04-27 05:51:19.324 EDT [553e0690.3c4a:20] CONTEXT: Traceback (most recent call last): PL/Python function "result_metadata_test", line 6, in plpy.info(result.colnames()) PL/Python function "result_metadata_test" 2015-04-27 05:51:19.324 EDT [553e0690.3c4a:21] STATEMENT: SELECT result_metadata_test($$CREATE TEMPORARY TABLE foo1 (a int, b text)$$); 2015-04-27 05:51:19.334 EDT [553e0690.3c4a:22] LOG: statement: CREATE FUNCTION result_nrows_test(cmd text) RETURNS int AS $$ result = plpy.execute(cmd) return result.nrows() $$ LANGUAGE plpythonu; 2015-04-27 05:51:19.486 EDT [553e0690.3c4a:23] LOG: statement: SELECT result_nrows_test($$SELECT 1$$); 2015-04-27 05:51:19.542 EDT [553e0690.3c4a:24] LOG: statement: SELECT result_nrows_test($$CREATE TEMPORARY TABLE foo2 (a int, b text)$$); 2015-04-27 05:51:20.188 EDT [553e0690.3c4a:25] LOG: statement: SELECT result_nrows_test($$INSERT INTO foo2 VALUES (1, \'one\'), (2, \'two\')$$); 2015-04-27 05:51:20.281 EDT [553e0690.3c4a:26] LOG: statement: SELECT result_nrows_test($$UPDATE foo2 SET b = \'\' WHERE a = 2$$); 2015-04-27 05:51:20.466 EDT [553e0690.3c4a:27] LOG: statement: CREATE FUNCTION result_len_test(cmd text) RETURNS int AS $$ result = plpy.execute(cmd) return len(result) $$ LANGUAGE plpythonu; 2015-04-27 05:51:20.685 EDT [553e0690.3c4a:28] LOG: statement: SELECT result_len_test($$SELECT 1$$); 2015-04-27 05:51:20.748 EDT [553e0690.3c4a:29] LOG: statement: SELECT result_len_test($$CREATE TEMPORARY TABLE foo3 (a int, b text)$$); 2015-04-27 05:51:21.431 EDT [553e0690.3c4a:30] LOG: statement: SELECT result_len_test($$INSERT INTO foo3 VALUES (1, \'one\'), (2, \'two\')$$); 2015-04-27 05:51:21.531 EDT [553e0690.3c4a:31] LOG: statement: SELECT result_len_test($$UPDATE foo3 SET b= \'\' WHERE a = 2$$); 2015-04-27 05:51:21.716 EDT [553e0690.3c4a:32] LOG: statement: CREATE FUNCTION result_subscript_test() RETURNS void AS $$ result = plpy.execute("SELECT 1 AS c UNION SELECT 2 " "UNION SELECT 3 UNION SELECT 4") plpy.info(result[1][\'c\']) plpy.info(result[-1][\'c\']) plpy.info([item[\'c\'] for item in result[1:3]]) plpy.info([item[\'c\'] for item in result[::2]]) result[-1] = {\'c\': 1000} result[:2] = [{\'c\': 10}, {\'c\': 100}] plpy.info([item[\'c\'] for item in result[:]]) # raises TypeError, but the message differs on Python 2.6, so silence it try: plpy.info(result[\'foo\']) except TypeError: pass else: assert False, "TypeError not raised" $$ LANGUAGE plpythonu; 2015-04-27 05:51:21.946 EDT [553e0690.3c4a:33] LOG: statement: SELECT result_subscript_test(); 2015-04-27 05:51:22.801 EDT [553e0690.3c4a:34] LOG: statement: CREATE FUNCTION result_empty_test() RETURNS void AS $$ result = plpy.execute("select 1 where false") plpy.info(result[:]) $$ LANGUAGE plpythonu; 2015-04-27 05:51:22.957 EDT [553e0690.3c4a:35] LOG: statement: SELECT result_empty_test(); 2015-04-27 05:51:23.035 EDT [553e0690.3c4a:36] LOG: statement: CREATE FUNCTION result_str_test(cmd text) RETURNS text AS $$ plan = plpy.prepare(cmd) result = plpy.execute(plan) return str(result) $$ LANGUAGE plpythonu; 2015-04-27 05:51:23.251 EDT [553e0690.3c4a:37] LOG: statement: SELECT result_str_test($$SELECT 1 AS foo UNION SELECT 2$$); 2015-04-27 05:51:24.031 EDT [553e0690.3c4a:38] LOG: statement: SELECT result_str_test($$CREATE TEMPORARY TABLE foo1 (a int, b text)$$); 2015-04-27 05:51:24.675 EDT [553e0690.3c4a:39] LOG: statement: CREATE FUNCTION simple_cursor_test() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") does = 0 for row in res: if row[\'lname\'] == \'doe\': does += 1 return does $$ LANGUAGE plpythonu; 2015-04-27 05:51:24.811 EDT [553e0690.3c4a:40] LOG: statement: CREATE FUNCTION double_cursor_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") res.close() res.close() $$ LANGUAGE plpythonu; 2015-04-27 05:51:24.941 EDT [553e0690.3c4a:41] LOG: statement: CREATE FUNCTION cursor_fetch() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") assert len(res.fetch(3)) == 3 assert len(res.fetch(3)) == 1 assert len(res.fetch(3)) == 0 assert len(res.fetch(3)) == 0 try: # use next() or __next__(), the method name changed in # http://www.python.org/dev/peps/pep-3114/ try: res.next() except AttributeError: res.__next__() except StopIteration: pass else: assert False, "StopIteration not raised" $$ LANGUAGE plpythonu; 2015-04-27 05:51:25.073 EDT [553e0690.3c4a:42] LOG: statement: CREATE FUNCTION cursor_mix_next_and_fetch() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users order by fname") assert len(res.fetch(2)) == 2 item = None try: item = res.next() except AttributeError: item = res.__next__() assert item[\'fname\'] == \'rick\' assert len(res.fetch(2)) == 1 $$ LANGUAGE plpythonu; 2015-04-27 05:51:25.209 EDT [553e0690.3c4a:43] LOG: statement: CREATE FUNCTION fetch_after_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") res.close() try: res.fetch(1) except ValueError: pass else: assert False, "ValueError not raised" $$ LANGUAGE plpythonu; 2015-04-27 05:51:25.339 EDT [553e0690.3c4a:44] LOG: statement: CREATE FUNCTION next_after_close() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users") res.close() try: try: res.next() except AttributeError: res.__next__() except ValueError: pass else: assert False, "ValueError not raised" $$ LANGUAGE plpythonu; 2015-04-27 05:51:25.470 EDT [553e0690.3c4a:45] LOG: statement: CREATE FUNCTION cursor_fetch_next_empty() RETURNS int AS $$ res = plpy.cursor("select fname, lname from users where false") assert len(res.fetch(1)) == 0 try: try: res.next() except AttributeError: res.__next__() except StopIteration: pass else: assert False, "StopIteration not raised" $$ LANGUAGE plpythonu; 2015-04-27 05:51:25.687 EDT [553e0690.3c4a:46] LOG: statement: CREATE FUNCTION cursor_plan() RETURNS SETOF text AS $$ plan = plpy.prepare( "select fname, lname from users where fname like $1 || \'%\' order by fname", ["text"]) for row in plpy.cursor(plan, ["w"]): yield row[\'fname\'] for row in plpy.cursor(plan, ["j"]): yield row[\'fname\'] $$ LANGUAGE plpythonu; 2015-04-27 05:51:25.830 EDT [553e0690.3c4a:47] LOG: statement: CREATE FUNCTION cursor_plan_wrong_args() RETURNS SETOF text AS $$ plan = plpy.prepare("select fname, lname from users where fname like $1 || \'%\'", ["text"]) c = plpy.cursor(plan, ["a", "b"]) $$ LANGUAGE plpythonu; 2015-04-27 05:51:25.982 EDT [553e0690.3c4a:48] LOG: statement: CREATE TYPE test_composite_type AS ( a1 int, a2 varchar ); 2015-04-27 05:51:26.271 EDT [553e0690.3c4a:49] LOG: statement: CREATE OR REPLACE FUNCTION plan_composite_args() RETURNS test_composite_type AS $$ plan = plpy.prepare("select $1 as c1", ["test_composite_type"]) res = plpy.execute(plan, [{"a1": 3, "a2": "label"}]) return res[0]["c1"] $$ LANGUAGE plpythonu; 2015-04-27 05:51:26.464 EDT [553e0690.3c4a:50] LOG: statement: SELECT simple_cursor_test(); 2015-04-27 05:51:26.632 EDT [553e0690.3c4a:51] LOG: statement: SELECT double_cursor_close(); 2015-04-27 05:51:26.796 EDT [553e0690.3c4a:52] LOG: statement: SELECT cursor_fetch(); 2015-04-27 05:51:26.988 EDT [553e0690.3c4a:53] LOG: statement: SELECT cursor_mix_next_and_fetch(); 2015-04-27 05:51:27.801 EDT [553e0690.3c4a:54] LOG: statement: SELECT fetch_after_close(); 2015-04-27 05:51:27.973 EDT [553e0690.3c4a:55] LOG: statement: SELECT next_after_close(); 2015-04-27 05:51:28.139 EDT [553e0690.3c4a:56] LOG: statement: SELECT cursor_fetch_next_empty(); 2015-04-27 05:51:28.324 EDT [553e0690.3c4a:57] LOG: statement: SELECT cursor_plan(); 2015-04-30 13:23:51.170 EDT [55426527.94e3:1] LOG: connection received: host=[local] 2015-04-30 13:23:51.193 EDT [55426527.94e3:2] LOG: connection authorized: user=andrew database=pl_regression 2015-04-30 13:23:51.198 EDT [55426527.94e3:3] FATAL: role "andrew" does not exist 2015-04-30 13:24:01.088 EDT [55426531.94e5:1] LOG: connection received: host=[local] 2015-04-30 13:24:01.089 EDT [55426531.94e5:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 13:24:11.077 EDT [55426531.94e5:3] LOG: statement: select * from pg_stat_activity; 2015-04-30 13:52:32.707 EDT [55426531.94e5:4] LOG: disconnection: session time: 0:28:31.618 user=buildfarm database=pl_regression host=[local] 2015-04-30 13:52:41.477 EDT [55426be9.9560:1] LOG: connection received: host=[local] 2015-04-30 13:52:41.478 EDT [55426be9.9560:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 13:53:06.948 EDT [55426be9.9560:3] LOG: statement: select * from pg_stat_activity where appplication_name = \'pg_regress\'; 2015-04-30 13:53:06.969 EDT [55426be9.9560:4] ERROR: column "appplication_name" does not exist at character 38 2015-04-30 13:53:06.969 EDT [55426be9.9560:5] HINT: Perhaps you meant to reference the column "pg_stat_activity"."application_name". 2015-04-30 13:53:06.969 EDT [55426be9.9560:6] STATEMENT: select * from pg_stat_activity where appplication_name = \'pg_regress\'; 2015-04-30 13:53:14.813 EDT [55426be9.9560:7] LOG: statement: select * from pg_stat_activity where application_name = \'pg_regress\'; 2015-04-30 13:54:13.998 EDT [55426be9.9560:8] LOG: disconnection: session time: 0:01:32.520 user=buildfarm database=pl_regression host=[local] 2015-04-30 14:16:32.957 EDT [553e0652.3bea:2] LOG: server process (PID 15434) was terminated by signal 9: Killed 2015-04-30 14:16:32.957 EDT [553e0652.3bea:3] DETAIL: Failed process was running: SELECT cursor_plan(); 2015-04-30 14:16:32.957 EDT [553e0652.3bea:4] LOG: terminating any other active server processes 2015-04-30 14:16:32.986 EDT [553e0652.3bef:2] WARNING: terminating connection because of crash of another server process 2015-04-30 14:16:32.987 EDT [553e0652.3bef:3] DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 2015-04-30 14:16:32.987 EDT [553e0652.3bef:4] HINT: In a moment you should be able to reconnect to the database and repeat your command. 2015-04-30 14:16:33.010 EDT [55427181.95ed:1] LOG: connection received: host=[local] 2015-04-30 14:16:33.010 EDT [55427181.95ed:2] FATAL: the database system is in recovery mode 2015-04-30 14:16:33.055 EDT [553e0652.3bea:5] LOG: all server processes terminated; reinitializing 2015-04-30 14:16:33.230 EDT [55427181.95f2:1] LOG: connection received: host=[local] 2015-04-30 14:16:33.230 EDT [55427181.95f2:2] FATAL: the database system is in recovery mode 2015-04-30 14:16:33.242 EDT [55427181.95f1:1] LOG: database system was interrupted; last known up at 2015-04-27 05:56:13 EDT 2015-04-30 14:16:33.293 EDT [55427181.95f1:2] LOG: database system was not properly shut down; automatic recovery in progress 2015-04-30 14:16:33.293 EDT [55427181.95f6:1] LOG: connection received: host=[local] 2015-04-30 14:16:33.293 EDT [55427181.95f6:2] FATAL: the database system is in recovery mode 2015-04-30 14:16:33.318 EDT [55427181.95f1:3] LOG: invalid record length at 0/9E8F8A8 2015-04-30 14:16:33.318 EDT [55427181.95f1:4] LOG: redo is not required 2015-04-30 14:16:33.347 EDT [55427181.95fa:1] LOG: connection received: host=[local] 2015-04-30 14:16:33.347 EDT [55427181.95fa:2] FATAL: the database system is in recovery mode 2015-04-30 14:16:33.355 EDT [553e0652.3bea:6] LOG: database system is ready to accept connections 2015-04-30 14:16:33.356 EDT [55427181.95ff:1] LOG: autovacuum launcher started 2015-04-30 14:16:33.381 EDT [55427181.9603:1] LOG: connection received: host=[local] 2015-04-30 14:16:33.390 EDT [55427181.9603:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 14:16:33.729 EDT [55427181.9603:3] LOG: statement: CREATE TABLE table_record ( first text, second int4 ) ; 2015-04-30 14:16:34.372 EDT [55427181.9603:4] LOG: statement: CREATE TYPE type_record AS ( first text, second int4 ) ; 2015-04-30 14:16:34.624 EDT [55427181.9603:5] LOG: statement: CREATE FUNCTION test_table_record_as(typ text, first text, second integer, retnull boolean) RETURNS table_record AS $$ if retnull: return None if typ == \'dict\': return { \'first\': first, \'second\': second, \'additionalfield\': \'must not cause trouble\' } elif typ == \'tuple\': return ( first, second ) elif typ == \'list\': return [ first, second ] elif typ == \'obj\': class type_record: pass type_record.first = first type_record.second = second return type_record $$ LANGUAGE plpythonu; 2015-04-30 14:16:35.198 EDT [55427181.9603:6] LOG: statement: CREATE FUNCTION test_type_record_as(typ text, first text, second integer, retnull boolean) RETURNS type_record AS $$ if retnull: return None if typ == \'dict\': return { \'first\': first, \'second\': second, \'additionalfield\': \'must not cause trouble\' } elif typ == \'tuple\': return ( first, second ) elif typ == \'list\': return [ first, second ] elif typ == \'obj\': class type_record: pass type_record.first = first type_record.second = second return type_record elif typ == \'str\': return "(\'%s\',%r)" % (first, second) $$ LANGUAGE plpythonu; 2015-04-30 14:16:35.424 EDT [55427181.9603:7] LOG: statement: CREATE FUNCTION test_in_out_params(first in text, second out text) AS $$ return first + \'_in_to_out\'; $$ LANGUAGE plpythonu; 2015-04-30 14:16:35.578 EDT [55427181.9603:8] LOG: statement: CREATE FUNCTION test_in_out_params_multi(first in text, second out text, third out text) AS $$ return (first + \'_record_in_to_out_1\', first + \'_record_in_to_out_2\'); $$ LANGUAGE plpythonu; 2015-04-30 14:16:35.757 EDT [55427181.9603:9] LOG: statement: CREATE FUNCTION test_inout_params(first inout text) AS $$ return first + \'_inout\'; $$ LANGUAGE plpythonu; 2015-04-30 14:16:35.891 EDT [55427181.9603:10] LOG: statement: SELECT * FROM test_table_record_as(\'dict\', null, null, false); 2015-04-30 14:16:35.988 EDT [55427181.9603:11] LOG: statement: SELECT * FROM test_table_record_as(\'dict\', \'one\', null, false); 2015-04-30 14:16:36.082 EDT [55427181.9603:12] LOG: statement: SELECT * FROM test_table_record_as(\'dict\', null, 2, false); 2015-04-30 14:16:36.175 EDT [55427181.9603:13] LOG: statement: SELECT * FROM test_table_record_as(\'dict\', \'three\', 3, false); 2015-04-30 14:16:36.270 EDT [55427181.9603:14] LOG: statement: SELECT * FROM test_table_record_as(\'dict\', null, null, true); 2015-04-30 14:16:36.358 EDT [55427181.9603:15] LOG: statement: SELECT * FROM test_table_record_as(\'tuple\', null, null, false); 2015-04-30 14:16:36.454 EDT [55427181.9603:16] LOG: statement: SELECT * FROM test_table_record_as(\'tuple\', \'one\', null, false); 2015-04-30 14:16:36.548 EDT [55427181.9603:17] LOG: statement: SELECT * FROM test_table_record_as(\'tuple\', null, 2, false); 2015-04-30 14:16:36.640 EDT [55427181.9603:18] LOG: statement: SELECT * FROM test_table_record_as(\'tuple\', \'three\', 3, false); 2015-04-30 14:16:36.735 EDT [55427181.9603:19] LOG: statement: SELECT * FROM test_table_record_as(\'tuple\', null, null, true); 2015-04-30 14:16:36.823 EDT [55427181.9603:20] LOG: statement: SELECT * FROM test_table_record_as(\'list\', null, null, false); 2015-04-30 14:16:36.925 EDT [55427181.9603:21] LOG: statement: SELECT * FROM test_table_record_as(\'list\', \'one\', null, false); 2015-04-30 14:16:37.022 EDT [55427181.9603:22] LOG: statement: SELECT * FROM test_table_record_as(\'list\', null, 2, false); 2015-04-30 14:16:37.113 EDT [55427181.9603:23] LOG: statement: SELECT * FROM test_table_record_as(\'list\', \'three\', 3, false); 2015-04-30 14:16:37.207 EDT [55427181.9603:24] LOG: statement: SELECT * FROM test_table_record_as(\'list\', null, null, true); 2015-04-30 14:16:37.294 EDT [55427181.9603:25] LOG: statement: SELECT * FROM test_table_record_as(\'obj\', null, null, false); 2015-04-30 14:16:37.390 EDT [55427181.9603:26] LOG: statement: SELECT * FROM test_table_record_as(\'obj\', \'one\', null, false); 2015-04-30 14:16:37.484 EDT [55427181.9603:27] LOG: statement: SELECT * FROM test_table_record_as(\'obj\', null, 2, false); 2015-04-30 14:16:37.577 EDT [55427181.9603:28] LOG: statement: SELECT * FROM test_table_record_as(\'obj\', \'three\', 3, false); 2015-04-30 14:16:37.669 EDT [55427181.9603:29] LOG: statement: SELECT * FROM test_table_record_as(\'obj\', null, null, true); 2015-04-30 14:16:37.756 EDT [55427181.9603:30] LOG: statement: SELECT * FROM test_type_record_as(\'dict\', null, null, false); 2015-04-30 14:16:37.851 EDT [55427181.9603:31] LOG: statement: SELECT * FROM test_type_record_as(\'dict\', \'one\', null, false); 2015-04-30 14:16:37.967 EDT [55427181.9603:32] LOG: statement: SELECT * FROM test_type_record_as(\'dict\', null, 2, false); 2015-04-30 14:16:38.060 EDT [55427181.9603:33] LOG: statement: SELECT * FROM test_type_record_as(\'dict\', \'three\', 3, false); 2015-04-30 14:16:38.152 EDT [55427181.9603:34] LOG: statement: SELECT * FROM test_type_record_as(\'dict\', null, null, true); 2015-04-30 14:16:38.242 EDT [55427181.9603:35] LOG: statement: SELECT * FROM test_type_record_as(\'tuple\', null, null, false); 2015-04-30 14:16:38.337 EDT [55427181.9603:36] LOG: statement: SELECT * FROM test_type_record_as(\'tuple\', \'one\', null, false); 2015-04-30 14:16:38.433 EDT [55427181.9603:37] LOG: statement: SELECT * FROM test_type_record_as(\'tuple\', null, 2, false); 2015-04-30 14:16:38.526 EDT [55427181.9603:38] LOG: statement: SELECT * FROM test_type_record_as(\'tuple\', \'three\', 3, false); 2015-04-30 14:16:38.618 EDT [55427181.9603:39] LOG: statement: SELECT * FROM test_type_record_as(\'tuple\', null, null, true); 2015-04-30 14:16:38.705 EDT [55427181.9603:40] LOG: statement: SELECT * FROM test_type_record_as(\'list\', null, null, false); 2015-04-30 14:16:38.801 EDT [55427181.9603:41] LOG: statement: SELECT * FROM test_type_record_as(\'list\', \'one\', null, false); 2015-04-30 14:16:38.895 EDT [55427181.9603:42] LOG: statement: SELECT * FROM test_type_record_as(\'list\', null, 2, false); 2015-04-30 14:16:38.988 EDT [55427181.9603:43] LOG: statement: SELECT * FROM test_type_record_as(\'list\', \'three\', 3, false); 2015-04-30 14:16:39.080 EDT [55427181.9603:44] LOG: statement: SELECT * FROM test_type_record_as(\'list\', null, null, true); 2015-04-30 14:16:39.167 EDT [55427181.9603:45] LOG: statement: SELECT * FROM test_type_record_as(\'obj\', null, null, false); 2015-04-30 14:16:39.265 EDT [55427181.9603:46] LOG: statement: SELECT * FROM test_type_record_as(\'obj\', \'one\', null, false); 2015-04-30 14:16:39.364 EDT [55427181.9603:47] LOG: statement: SELECT * FROM test_type_record_as(\'obj\', null, 2, false); 2015-04-30 14:16:39.460 EDT [55427181.9603:48] LOG: statement: SELECT * FROM test_type_record_as(\'obj\', \'three\', 3, false); 2015-04-30 14:16:39.556 EDT [55427181.9603:49] LOG: statement: SELECT * FROM test_type_record_as(\'obj\', null, null, true); 2015-04-30 14:16:39.671 EDT [55427181.9603:50] LOG: statement: SELECT * FROM test_type_record_as(\'str\', \'one\', 1, false); 2015-04-30 14:16:39.768 EDT [55427181.9603:51] LOG: statement: SELECT * FROM test_in_out_params(\'test_in\'); 2015-04-30 14:16:39.837 EDT [55427181.9603:52] LOG: statement: SELECT * FROM test_in_out_params_multi(\'test_in\'); 2015-04-30 14:16:39.912 EDT [55427181.9603:53] LOG: statement: SELECT * FROM test_inout_params(\'test_in\'); 2015-04-30 14:16:39.983 EDT [55427181.9603:54] LOG: statement: ALTER TABLE table_record DROP COLUMN first; 2015-04-30 14:16:40.110 EDT [55427181.9603:55] LOG: statement: ALTER TABLE table_record DROP COLUMN second; 2015-04-30 14:16:40.205 EDT [55427181.9603:56] LOG: statement: ALTER TABLE table_record ADD COLUMN first text; 2015-04-30 14:16:40.286 EDT [55427181.9603:57] LOG: statement: ALTER TABLE table_record ADD COLUMN second int4; 2015-04-30 14:16:40.368 EDT [55427181.9603:58] LOG: statement: SELECT * FROM test_table_record_as(\'obj\', \'one\', 1, false); 2015-04-30 14:16:40.466 EDT [55427181.9603:59] LOG: statement: ALTER TYPE type_record DROP ATTRIBUTE first; 2015-04-30 14:16:40.558 EDT [55427181.9603:60] LOG: statement: ALTER TYPE type_record DROP ATTRIBUTE second; 2015-04-30 14:16:40.650 EDT [55427181.9603:61] LOG: statement: ALTER TYPE type_record ADD ATTRIBUTE first text; 2015-04-30 14:16:40.729 EDT [55427181.9603:62] LOG: statement: ALTER TYPE type_record ADD ATTRIBUTE second int4; 2015-04-30 14:16:40.809 EDT [55427181.9603:63] LOG: statement: SELECT * FROM test_type_record_as(\'obj\', \'one\', 1, false); 2015-04-30 14:16:40.904 EDT [55427181.9603:64] LOG: statement: CREATE FUNCTION test_type_record_error1() RETURNS type_record AS $$ return { \'first\': \'first\' } $$ LANGUAGE plpythonu; 2015-04-30 14:16:41.047 EDT [55427181.9603:65] LOG: statement: SELECT * FROM test_type_record_error1(); 2015-04-30 14:16:41.121 EDT [55427181.9603:66] ERROR: key "second" not found in mapping 2015-04-30 14:16:41.121 EDT [55427181.9603:67] HINT: To return null in a column, add the value None to the mapping with the key named after the column. 2015-04-30 14:16:41.121 EDT [55427181.9603:68] CONTEXT: while creating return value PL/Python function "test_type_record_error1" 2015-04-30 14:16:41.121 EDT [55427181.9603:69] STATEMENT: SELECT * FROM test_type_record_error1(); 2015-04-30 14:16:41.121 EDT [55427181.9603:70] LOG: statement: CREATE FUNCTION test_type_record_error2() RETURNS type_record AS $$ return [ \'first\' ] $$ LANGUAGE plpythonu; 2015-04-30 14:16:41.267 EDT [55427181.9603:71] LOG: statement: SELECT * FROM test_type_record_error2(); 2015-04-30 14:16:41.333 EDT [55427181.9603:72] ERROR: length of returned sequence did not match number of columns in row 2015-04-30 14:16:41.333 EDT [55427181.9603:73] CONTEXT: while creating return value PL/Python function "test_type_record_error2" 2015-04-30 14:16:41.333 EDT [55427181.9603:74] STATEMENT: SELECT * FROM test_type_record_error2(); 2015-04-30 14:16:41.333 EDT [55427181.9603:75] LOG: statement: CREATE FUNCTION test_type_record_error3() RETURNS type_record AS $$ class type_record: pass type_record.first = \'first\' return type_record $$ LANGUAGE plpythonu; 2015-04-30 14:16:41.475 EDT [55427181.9603:76] LOG: statement: SELECT * FROM test_type_record_error3(); 2015-04-30 14:16:41.547 EDT [55427181.9603:77] ERROR: attribute "second" does not exist in Python object 2015-04-30 14:16:41.547 EDT [55427181.9603:78] HINT: To return null in a column, let the returned object have an attribute named after column with value None. 2015-04-30 14:16:41.547 EDT [55427181.9603:79] CONTEXT: while creating return value PL/Python function "test_type_record_error3" 2015-04-30 14:16:41.547 EDT [55427181.9603:80] STATEMENT: SELECT * FROM test_type_record_error3(); 2015-04-30 14:16:41.547 EDT [55427181.9603:81] LOG: statement: CREATE FUNCTION test_type_record_error4() RETURNS type_record AS $$ return \'foo\' $$ LANGUAGE plpythonu; 2015-04-30 14:16:41.688 EDT [55427181.9603:82] LOG: statement: SELECT * FROM test_type_record_error4(); 2015-04-30 14:16:41.756 EDT [55427181.9603:83] ERROR: malformed record literal: "foo" 2015-04-30 14:16:41.756 EDT [55427181.9603:84] DETAIL: Missing left parenthesis. 2015-04-30 14:16:41.756 EDT [55427181.9603:85] CONTEXT: while creating return value PL/Python function "test_type_record_error4" 2015-04-30 14:16:41.757 EDT [55427181.9603:86] STATEMENT: SELECT * FROM test_type_record_error4(); 2015-04-30 14:16:41.757 EDT [55427181.9603:87] LOG: disconnection: session time: 0:00:08.376 user=buildfarm database=pl_regression host=[local] 2015-04-30 14:16:41.781 EDT [55427189.9607:1] LOG: connection received: host=[local] 2015-04-30 14:16:41.782 EDT [55427189.9607:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 14:16:41.984 EDT [55427189.9607:3] LOG: statement: CREATE FUNCTION users_insert() returns trigger AS \'if TD["new"]["fname"] == None or TD["new"]["lname"] == None: return "SKIP" if TD["new"]["username"] == None: TD["new"]["username"] = TD["new"]["fname"][:1] + "_" + TD["new"]["lname"] rv = "MODIFY" else: rv = None if TD["new"]["fname"] == "william": TD["new"]["fname"] = TD["args"][0] rv = "MODIFY" return rv\' LANGUAGE plpythonu; 2015-04-30 14:16:42.173 EDT [55427189.9607:4] LOG: statement: CREATE FUNCTION users_update() returns trigger AS \'if TD["event"] == "UPDATE": if TD["old"]["fname"] != TD["new"]["fname"] and TD["old"]["fname"] == TD["args"][0]: return "SKIP" return None\' LANGUAGE plpythonu; 2015-04-30 14:16:42.291 EDT [55427189.9607:5] LOG: statement: CREATE FUNCTION users_delete() RETURNS trigger AS \'if TD["old"]["fname"] == TD["args"][0]: return "SKIP" return None\' LANGUAGE plpythonu; 2015-04-30 14:16:42.410 EDT [55427189.9607:6] LOG: statement: CREATE TRIGGER users_insert_trig BEFORE INSERT ON users FOR EACH ROW EXECUTE PROCEDURE users_insert (\'willem\'); 2015-04-30 14:16:42.532 EDT [55427189.9607:7] LOG: statement: CREATE TRIGGER users_update_trig BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE users_update (\'willem\'); 2015-04-30 14:16:42.644 EDT [55427189.9607:8] LOG: statement: CREATE TRIGGER users_delete_trig BEFORE DELETE ON users FOR EACH ROW EXECUTE PROCEDURE users_delete (\'willem\'); 2015-04-30 14:16:42.755 EDT [55427189.9607:9] LOG: statement: SELECT * FROM users; 2015-04-30 14:16:42.884 EDT [55427189.9607:10] LOG: statement: UPDATE users SET fname = \'william\' WHERE fname = \'willem\'; 2015-04-30 14:16:43.181 EDT [55427189.9607:11] LOG: statement: INSERT INTO users (fname, lname) VALUES (\'william\', \'smith\'); 2015-04-30 14:16:43.304 EDT [55427189.9607:12] LOG: statement: INSERT INTO users (fname, lname, username) VALUES (\'charles\', \'darwin\', \'beagle\'); 2015-04-30 14:16:43.422 EDT [55427189.9607:13] LOG: statement: SELECT * FROM users; 2015-04-30 14:16:43.528 EDT [55427189.9607:14] LOG: statement: CREATE TABLE trigger_test (i int, v text ); 2015-04-30 14:16:44.036 EDT [55427189.9607:15] LOG: statement: CREATE FUNCTION trigger_data() RETURNS trigger LANGUAGE plpythonu AS $$ if \'relid\' in TD: TD[\'relid\'] = "bogus:12345" skeys = list(TD.keys()) skeys.sort() for key in skeys: val = TD[key] if not isinstance(val, dict): plpy.notice("TD[" + key + "] => " + str(val)) else: # print dicts the hard way because otherwise the order is implementation-dependent valkeys = list(val.keys()) valkeys.sort() plpy.notice("TD[" + key + "] => " + \'{\' + \', \'.join([repr(k) + \': \' + repr(val[k]) for k in valkeys]) + \'}\') return None $$; 2015-04-30 14:16:44.158 EDT [55427189.9607:16] LOG: statement: CREATE TRIGGER show_trigger_data_trig_before BEFORE INSERT OR UPDATE OR DELETE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,\'skidoo\'); 2015-04-30 14:16:44.270 EDT [55427189.9607:17] LOG: statement: CREATE TRIGGER show_trigger_data_trig_after AFTER INSERT OR UPDATE OR DELETE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,\'skidoo\'); 2015-04-30 14:16:44.408 EDT [55427189.9607:18] LOG: statement: CREATE TRIGGER show_trigger_data_trig_stmt BEFORE INSERT OR UPDATE OR DELETE OR TRUNCATE ON trigger_test FOR EACH STATEMENT EXECUTE PROCEDURE trigger_data(23,\'skidoo\'); 2015-04-30 14:16:44.546 EDT [55427189.9607:19] LOG: statement: insert into trigger_test values(1,\'insert\'); 2015-04-30 14:16:44.707 EDT [55427189.9607:20] LOG: statement: update trigger_test set v = \'update\' where i = 1; 2015-04-30 14:16:44.981 EDT [55427189.9607:21] LOG: statement: delete from trigger_test; 2015-04-30 14:16:45.167 EDT [55427189.9607:22] LOG: statement: truncate table trigger_test; 2015-04-30 14:16:45.289 EDT [55427189.9607:23] LOG: statement: DROP TRIGGER show_trigger_data_trig_stmt on trigger_test; 2015-04-30 14:16:45.366 EDT [55427189.9607:24] LOG: statement: DROP TRIGGER show_trigger_data_trig_before on trigger_test; 2015-04-30 14:16:45.442 EDT [55427189.9607:25] LOG: statement: DROP TRIGGER show_trigger_data_trig_after on trigger_test; 2015-04-30 14:16:45.518 EDT [55427189.9607:26] LOG: statement: insert into trigger_test values(1,\'insert\'); 2015-04-30 14:16:45.542 EDT [55427189.9607:27] LOG: statement: CREATE VIEW trigger_test_view AS SELECT * FROM trigger_test; 2015-04-30 14:16:45.884 EDT [55427189.9607:28] LOG: statement: CREATE TRIGGER show_trigger_data_trig INSTEAD OF INSERT OR UPDATE OR DELETE ON trigger_test_view FOR EACH ROW EXECUTE PROCEDURE trigger_data(24,\'skidoo view\'); 2015-04-30 14:16:46.046 EDT [55427189.9607:29] LOG: statement: insert into trigger_test_view values(2,\'insert\'); 2015-04-30 14:16:46.142 EDT [55427189.9607:30] LOG: statement: update trigger_test_view set v = \'update\' where i = 1; 2015-04-30 14:16:46.403 EDT [55427189.9607:31] LOG: statement: delete from trigger_test_view; 2015-04-30 14:16:46.535 EDT [55427189.9607:32] LOG: statement: DROP FUNCTION trigger_data() CASCADE; 2015-04-30 14:16:46.665 EDT [55427189.9607:33] LOG: statement: DROP VIEW trigger_test_view; 2015-04-30 14:16:46.910 EDT [55427189.9607:34] LOG: statement: delete from trigger_test; 2015-04-30 14:16:46.957 EDT [55427189.9607:35] LOG: statement: INSERT INTO trigger_test VALUES (0, \'zero\'); 2015-04-30 14:16:46.981 EDT [55427189.9607:36] LOG: statement: CREATE FUNCTION stupid1() RETURNS trigger AS $$ return 37 $$ LANGUAGE plpythonu; 2015-04-30 14:16:47.107 EDT [55427189.9607:37] LOG: statement: CREATE TRIGGER stupid_trigger1 BEFORE INSERT ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid1(); 2015-04-30 14:16:47.243 EDT [55427189.9607:38] LOG: statement: INSERT INTO trigger_test VALUES (1, \'one\'); 2015-04-30 14:16:47.311 EDT [55427189.9607:39] ERROR: unexpected return value from trigger procedure 2015-04-30 14:16:47.311 EDT [55427189.9607:40] DETAIL: Expected None or a string. 2015-04-30 14:16:47.311 EDT [55427189.9607:41] CONTEXT: PL/Python function "stupid1" 2015-04-30 14:16:47.311 EDT [55427189.9607:42] STATEMENT: INSERT INTO trigger_test VALUES (1, \'one\'); 2015-04-30 14:16:47.311 EDT [55427189.9607:43] LOG: statement: DROP TRIGGER stupid_trigger1 ON trigger_test; 2015-04-30 14:16:47.388 EDT [55427189.9607:44] LOG: statement: CREATE FUNCTION stupid2() RETURNS trigger AS $$ return "MODIFY" $$ LANGUAGE plpythonu; 2015-04-30 14:16:47.512 EDT [55427189.9607:45] LOG: statement: CREATE TRIGGER stupid_trigger2 BEFORE DELETE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid2(); 2015-04-30 14:16:47.646 EDT [55427189.9607:46] LOG: statement: DELETE FROM trigger_test WHERE i = 0; 2015-04-30 14:16:47.806 EDT [55427189.9607:47] WARNING: PL/Python trigger function returned "MODIFY" in a DELETE trigger -- ignored 2015-04-30 14:16:47.806 EDT [55427189.9607:48] CONTEXT: PL/Python function "stupid2" 2015-04-30 14:16:47.806 EDT [55427189.9607:49] LOG: statement: DROP TRIGGER stupid_trigger2 ON trigger_test; 2015-04-30 14:16:47.881 EDT [55427189.9607:50] LOG: statement: INSERT INTO trigger_test VALUES (0, \'zero\'); 2015-04-30 14:16:47.906 EDT [55427189.9607:51] LOG: statement: CREATE FUNCTION stupid3() RETURNS trigger AS $$ return "foo" $$ LANGUAGE plpythonu; 2015-04-30 14:16:48.029 EDT [55427189.9607:52] LOG: statement: CREATE TRIGGER stupid_trigger3 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid3(); 2015-04-30 14:16:48.164 EDT [55427189.9607:53] LOG: statement: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:48.345 EDT [55427189.9607:54] ERROR: unexpected return value from trigger procedure 2015-04-30 14:16:48.345 EDT [55427189.9607:55] DETAIL: Expected None, "OK", "SKIP", or "MODIFY". 2015-04-30 14:16:48.345 EDT [55427189.9607:56] CONTEXT: PL/Python function "stupid3" 2015-04-30 14:16:48.345 EDT [55427189.9607:57] STATEMENT: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:48.346 EDT [55427189.9607:58] LOG: statement: DROP TRIGGER stupid_trigger3 ON trigger_test; 2015-04-30 14:16:48.423 EDT [55427189.9607:59] LOG: statement: CREATE FUNCTION stupid3u() RETURNS trigger AS $$ return u"foo" $$ LANGUAGE plpythonu; 2015-04-30 14:16:48.548 EDT [55427189.9607:60] LOG: statement: CREATE TRIGGER stupid_trigger3 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid3u(); 2015-04-30 14:16:48.682 EDT [55427189.9607:61] LOG: statement: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:48.862 EDT [55427189.9607:62] ERROR: unexpected return value from trigger procedure 2015-04-30 14:16:48.862 EDT [55427189.9607:63] DETAIL: Expected None, "OK", "SKIP", or "MODIFY". 2015-04-30 14:16:48.862 EDT [55427189.9607:64] CONTEXT: PL/Python function "stupid3u" 2015-04-30 14:16:48.862 EDT [55427189.9607:65] STATEMENT: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:48.862 EDT [55427189.9607:66] LOG: statement: DROP TRIGGER stupid_trigger3 ON trigger_test; 2015-04-30 14:16:48.938 EDT [55427189.9607:67] LOG: statement: CREATE FUNCTION stupid4() RETURNS trigger AS $$ del TD["new"] return "MODIFY"; $$ LANGUAGE plpythonu; 2015-04-30 14:16:49.062 EDT [55427189.9607:68] LOG: statement: CREATE TRIGGER stupid_trigger4 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid4(); 2015-04-30 14:16:49.209 EDT [55427189.9607:69] LOG: statement: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:49.390 EDT [55427189.9607:70] ERROR: TD["new"] deleted, cannot modify row 2015-04-30 14:16:49.390 EDT [55427189.9607:71] CONTEXT: while modifying trigger row PL/Python function "stupid4" 2015-04-30 14:16:49.390 EDT [55427189.9607:72] STATEMENT: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:49.390 EDT [55427189.9607:73] LOG: statement: DROP TRIGGER stupid_trigger4 ON trigger_test; 2015-04-30 14:16:49.468 EDT [55427189.9607:74] LOG: statement: CREATE FUNCTION stupid5() RETURNS trigger AS $$ TD["new"] = [\'foo\', \'bar\'] return "MODIFY"; $$ LANGUAGE plpythonu; 2015-04-30 14:16:49.591 EDT [55427189.9607:75] LOG: statement: CREATE TRIGGER stupid_trigger5 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid5(); 2015-04-30 14:16:49.726 EDT [55427189.9607:76] LOG: statement: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:49.904 EDT [55427189.9607:77] ERROR: TD["new"] is not a dictionary 2015-04-30 14:16:49.904 EDT [55427189.9607:78] CONTEXT: while modifying trigger row PL/Python function "stupid5" 2015-04-30 14:16:49.904 EDT [55427189.9607:79] STATEMENT: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:49.904 EDT [55427189.9607:80] LOG: statement: DROP TRIGGER stupid_trigger5 ON trigger_test; 2015-04-30 14:16:49.979 EDT [55427189.9607:81] LOG: statement: CREATE FUNCTION stupid6() RETURNS trigger AS $$ TD["new"] = {1: \'foo\', 2: \'bar\'} return "MODIFY"; $$ LANGUAGE plpythonu; 2015-04-30 14:16:50.103 EDT [55427189.9607:82] LOG: statement: CREATE TRIGGER stupid_trigger6 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid6(); 2015-04-30 14:16:50.240 EDT [55427189.9607:83] LOG: statement: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:50.421 EDT [55427189.9607:84] ERROR: TD["new"] dictionary key at ordinal position 0 is not a string 2015-04-30 14:16:50.421 EDT [55427189.9607:85] CONTEXT: while modifying trigger row PL/Python function "stupid6" 2015-04-30 14:16:50.421 EDT [55427189.9607:86] STATEMENT: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:50.422 EDT [55427189.9607:87] LOG: statement: DROP TRIGGER stupid_trigger6 ON trigger_test; 2015-04-30 14:16:50.497 EDT [55427189.9607:88] LOG: statement: CREATE FUNCTION stupid7() RETURNS trigger AS $$ TD["new"] = {\'v\': \'foo\', \'a\': \'bar\'} return "MODIFY"; $$ LANGUAGE plpythonu; 2015-04-30 14:16:50.620 EDT [55427189.9607:89] LOG: statement: CREATE TRIGGER stupid_trigger7 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid7(); 2015-04-30 14:16:50.755 EDT [55427189.9607:90] LOG: statement: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:50.933 EDT [55427189.9607:91] ERROR: key "a" found in TD["new"] does not exist as a column in the triggering row 2015-04-30 14:16:50.933 EDT [55427189.9607:92] CONTEXT: while modifying trigger row PL/Python function "stupid7" 2015-04-30 14:16:50.933 EDT [55427189.9607:93] STATEMENT: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:50.933 EDT [55427189.9607:94] LOG: statement: DROP TRIGGER stupid_trigger7 ON trigger_test; 2015-04-30 14:16:51.008 EDT [55427189.9607:95] LOG: statement: CREATE FUNCTION stupid7u() RETURNS trigger AS $$ TD["new"] = {u\'v\': \'foo\', u\'a\': \'bar\'} return "MODIFY" $$ LANGUAGE plpythonu; 2015-04-30 14:16:51.131 EDT [55427189.9607:96] LOG: statement: CREATE TRIGGER stupid_trigger7 BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE stupid7u(); 2015-04-30 14:16:51.268 EDT [55427189.9607:97] LOG: statement: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:51.448 EDT [55427189.9607:98] ERROR: key "a" found in TD["new"] does not exist as a column in the triggering row 2015-04-30 14:16:51.449 EDT [55427189.9607:99] CONTEXT: while modifying trigger row PL/Python function "stupid7u" 2015-04-30 14:16:51.449 EDT [55427189.9607:100] STATEMENT: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:51.449 EDT [55427189.9607:101] LOG: statement: DROP TRIGGER stupid_trigger7 ON trigger_test; 2015-04-30 14:16:51.524 EDT [55427189.9607:102] LOG: statement: SELECT stupid7(); 2015-04-30 14:16:51.556 EDT [55427189.9607:103] ERROR: trigger functions can only be called as triggers 2015-04-30 14:16:51.556 EDT [55427189.9607:104] STATEMENT: SELECT stupid7(); 2015-04-30 14:16:51.556 EDT [55427189.9607:105] LOG: statement: SELECT * FROM trigger_test; 2015-04-30 14:16:51.620 EDT [55427189.9607:106] LOG: statement: CREATE FUNCTION test_null() RETURNS trigger AS $$ TD["new"][\'v\'] = None return "MODIFY" $$ LANGUAGE plpythonu; 2015-04-30 14:16:51.743 EDT [55427189.9607:107] LOG: statement: CREATE TRIGGER test_null_trigger BEFORE UPDATE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE test_null(); 2015-04-30 14:16:51.877 EDT [55427189.9607:108] LOG: statement: UPDATE trigger_test SET v = \'null\' WHERE i = 0; 2015-04-30 14:16:52.056 EDT [55427189.9607:109] LOG: statement: DROP TRIGGER test_null_trigger ON trigger_test; 2015-04-30 14:16:52.131 EDT [55427189.9607:110] LOG: statement: SELECT * FROM trigger_test; 2015-04-30 14:16:52.195 EDT [55427189.9607:111] LOG: statement: SET DateStyle = \'ISO\'; 2015-04-30 14:16:52.196 EDT [55427189.9607:112] LOG: statement: CREATE FUNCTION set_modif_time() RETURNS trigger AS $$ TD[\'new\'][\'modif_time\'] = \'2010-10-13 21:57:28.930486\' return \'MODIFY\' $$ LANGUAGE plpythonu; 2015-04-30 14:16:52.321 EDT [55427189.9607:113] LOG: statement: CREATE TABLE pb (a TEXT, modif_time TIMESTAMP(0) WITHOUT TIME ZONE); 2015-04-30 14:16:52.854 EDT [55427189.9607:114] LOG: statement: CREATE TRIGGER set_modif_time BEFORE UPDATE ON pb FOR EACH ROW EXECUTE PROCEDURE set_modif_time(); 2015-04-30 14:16:52.970 EDT [55427189.9607:115] LOG: statement: INSERT INTO pb VALUES (\'a\', \'2010-10-09 21:57:33.930486\'); 2015-04-30 14:16:53.035 EDT [55427189.9607:116] LOG: statement: SELECT * FROM pb; 2015-04-30 14:16:53.103 EDT [55427189.9607:117] LOG: statement: UPDATE pb SET a = \'b\'; 2015-04-30 14:16:53.218 EDT [55427189.9607:118] LOG: statement: SELECT * FROM pb; 2015-04-30 14:16:53.284 EDT [55427189.9607:119] LOG: statement: CREATE TABLE comp1 (i integer, j boolean); 2015-04-30 14:16:53.570 EDT [55427189.9607:120] LOG: statement: CREATE TYPE comp2 AS (k integer, l boolean); 2015-04-30 14:16:53.828 EDT [55427189.9607:121] LOG: statement: CREATE TABLE composite_trigger_test (f1 comp1, f2 comp2); 2015-04-30 14:16:54.419 EDT [55427189.9607:122] LOG: statement: CREATE FUNCTION composite_trigger_f() RETURNS trigger AS $$ TD[\'new\'][\'f1\'] = (3, False) TD[\'new\'][\'f2\'] = {\'k\': 7, \'l\': \'yes\', \'ignored\': 10} return \'MODIFY\' $$ LANGUAGE plpythonu; 2015-04-30 14:16:54.548 EDT [55427189.9607:123] LOG: statement: CREATE TRIGGER composite_trigger BEFORE INSERT ON composite_trigger_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_f(); 2015-04-30 14:16:54.665 EDT [55427189.9607:124] LOG: statement: INSERT INTO composite_trigger_test VALUES (NULL, NULL); 2015-04-30 14:16:54.773 EDT [55427189.9607:125] LOG: statement: SELECT * FROM composite_trigger_test; 2015-04-30 14:16:54.857 EDT [55427189.9607:126] LOG: statement: CREATE TABLE composite_trigger_noop_test (f1 comp1, f2 comp2); 2015-04-30 14:16:55.463 EDT [55427189.9607:127] LOG: statement: CREATE FUNCTION composite_trigger_noop_f() RETURNS trigger AS $$ return \'MODIFY\' $$ LANGUAGE plpythonu; 2015-04-30 14:16:55.590 EDT [55427189.9607:128] LOG: statement: CREATE TRIGGER composite_trigger_noop BEFORE INSERT ON composite_trigger_noop_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_noop_f(); 2015-04-30 14:16:55.703 EDT [55427189.9607:129] LOG: statement: INSERT INTO composite_trigger_noop_test VALUES (NULL, NULL); 2015-04-30 14:16:55.776 EDT [55427189.9607:130] LOG: statement: INSERT INTO composite_trigger_noop_test VALUES (ROW(1, \'f\'), NULL); 2015-04-30 14:16:55.907 EDT [55427189.9607:131] LOG: statement: INSERT INTO composite_trigger_noop_test VALUES (ROW(NULL, \'t\'), ROW(1, \'f\')); 2015-04-30 14:16:56.095 EDT [55427189.9607:132] LOG: statement: SELECT * FROM composite_trigger_noop_test; 2015-04-30 14:16:56.178 EDT [55427189.9607:133] LOG: statement: CREATE TYPE comp3 AS (c1 comp1, c2 comp2, m integer); 2015-04-30 14:16:56.521 EDT [55427189.9607:134] LOG: statement: CREATE TABLE composite_trigger_nested_test(c comp3); 2015-04-30 14:16:57.070 EDT [55427189.9607:135] LOG: statement: CREATE FUNCTION composite_trigger_nested_f() RETURNS trigger AS $$ return \'MODIFY\' $$ LANGUAGE plpythonu; 2015-04-30 14:16:57.197 EDT [55427189.9607:136] LOG: statement: CREATE TRIGGER composite_trigger_nested BEFORE INSERT ON composite_trigger_nested_test FOR EACH ROW EXECUTE PROCEDURE composite_trigger_nested_f(); 2015-04-30 14:16:57.313 EDT [55427189.9607:137] LOG: statement: INSERT INTO composite_trigger_nested_test VALUES (NULL); 2015-04-30 14:16:57.371 EDT [55427189.9607:138] LOG: statement: INSERT INTO composite_trigger_nested_test VALUES (ROW(ROW(1, \'f\'), NULL, 3)); 2015-04-30 14:16:57.549 EDT [55427189.9607:139] LOG: statement: INSERT INTO composite_trigger_nested_test VALUES (ROW(ROW(NULL, \'t\'), ROW(1, \'f\'), NULL)); 2015-04-30 14:16:57.781 EDT [55427189.9607:140] LOG: statement: SELECT * FROM composite_trigger_nested_test; 2015-04-30 14:16:57.844 EDT [55427189.9607:141] LOG: statement: CREATE FUNCTION trig1234() RETURNS trigger LANGUAGE plpythonu AS $$ TD["new"]["data"] = \'1234\' return \'MODIFY\' $$; 2015-04-30 14:16:57.971 EDT [55427189.9607:142] LOG: statement: CREATE TABLE a(data text); 2015-04-30 14:16:58.474 EDT [55427189.9607:143] LOG: statement: CREATE TABLE b(data int); 2015-04-30 14:16:58.735 EDT [55427189.9607:144] LOG: statement: CREATE TRIGGER a_t BEFORE INSERT ON a FOR EACH ROW EXECUTE PROCEDURE trig1234(); 2015-04-30 14:16:58.850 EDT [55427189.9607:145] LOG: statement: CREATE TRIGGER b_t BEFORE INSERT ON b FOR EACH ROW EXECUTE PROCEDURE trig1234(); 2015-04-30 14:16:58.964 EDT [55427189.9607:146] LOG: statement: INSERT INTO a DEFAULT VALUES; 2015-04-30 14:16:59.026 EDT [55427189.9607:147] LOG: statement: SELECT * FROM a; 2015-04-30 14:16:59.061 EDT [55427189.9607:148] LOG: statement: DROP TABLE a; 2015-04-30 14:16:59.478 EDT [55427189.9607:149] LOG: statement: INSERT INTO b DEFAULT VALUES; 2015-04-30 14:16:59.540 EDT [55427189.9607:150] LOG: statement: SELECT * FROM b; 2015-04-30 14:16:59.574 EDT [55427189.9607:151] LOG: disconnection: session time: 0:00:17.793 user=buildfarm database=pl_regression host=[local] 2015-04-30 14:16:59.587 EDT [5542719b.960a:1] LOG: connection received: host=[local] 2015-04-30 14:16:59.588 EDT [5542719b.960a:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 14:16:59.804 EDT [5542719b.960a:3] LOG: statement: CREATE FUNCTION test_type_conversion_bool(x bool) RETURNS bool AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:16:59.979 EDT [5542719b.960a:4] LOG: statement: SELECT * FROM test_type_conversion_bool(true); 2015-04-30 14:17:00.039 EDT [5542719b.960a:5] LOG: statement: SELECT * FROM test_type_conversion_bool(false); 2015-04-30 14:17:00.099 EDT [5542719b.960a:6] LOG: statement: SELECT * FROM test_type_conversion_bool(null); 2015-04-30 14:17:00.165 EDT [5542719b.960a:7] LOG: statement: 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; 2015-04-30 14:17:00.309 EDT [5542719b.960a:8] LOG: statement: SELECT * FROM test_type_conversion_bool_other(0); 2015-04-30 14:17:00.368 EDT [5542719b.960a:9] LOG: statement: SELECT * FROM test_type_conversion_bool_other(1); 2015-04-30 14:17:00.428 EDT [5542719b.960a:10] LOG: statement: SELECT * FROM test_type_conversion_bool_other(2); 2015-04-30 14:17:00.486 EDT [5542719b.960a:11] LOG: statement: SELECT * FROM test_type_conversion_bool_other(3); 2015-04-30 14:17:00.544 EDT [5542719b.960a:12] LOG: statement: SELECT * FROM test_type_conversion_bool_other(4); 2015-04-30 14:17:00.602 EDT [5542719b.960a:13] LOG: statement: SELECT * FROM test_type_conversion_bool_other(5); 2015-04-30 14:17:00.661 EDT [5542719b.960a:14] LOG: statement: CREATE FUNCTION test_type_conversion_char(x char) RETURNS char AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:00.797 EDT [5542719b.960a:15] LOG: statement: SELECT * FROM test_type_conversion_char(\'a\'); 2015-04-30 14:17:00.864 EDT [5542719b.960a:16] LOG: statement: SELECT * FROM test_type_conversion_char(null); 2015-04-30 14:17:00.930 EDT [5542719b.960a:17] LOG: statement: CREATE FUNCTION test_type_conversion_int2(x int2) RETURNS int2 AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:01.073 EDT [5542719b.960a:18] LOG: statement: SELECT * FROM test_type_conversion_int2(100::int2); 2015-04-30 14:17:01.162 EDT [5542719b.960a:19] LOG: statement: SELECT * FROM test_type_conversion_int2(-100::int2); 2015-04-30 14:17:01.283 EDT [5542719b.960a:20] LOG: statement: SELECT * FROM test_type_conversion_int2(null); 2015-04-30 14:17:01.351 EDT [5542719b.960a:21] LOG: statement: CREATE FUNCTION test_type_conversion_int4(x int4) RETURNS int4 AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:01.499 EDT [5542719b.960a:22] LOG: statement: SELECT * FROM test_type_conversion_int4(100); 2015-04-30 14:17:01.555 EDT [5542719b.960a:23] LOG: statement: SELECT * FROM test_type_conversion_int4(-100); 2015-04-30 14:17:01.610 EDT [5542719b.960a:24] LOG: statement: SELECT * FROM test_type_conversion_int4(null); 2015-04-30 14:17:01.678 EDT [5542719b.960a:25] LOG: statement: CREATE FUNCTION test_type_conversion_int8(x int8) RETURNS int8 AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:01.824 EDT [5542719b.960a:26] LOG: statement: SELECT * FROM test_type_conversion_int8(100); 2015-04-30 14:17:01.916 EDT [5542719b.960a:27] LOG: statement: SELECT * FROM test_type_conversion_int8(-100); 2015-04-30 14:17:02.008 EDT [5542719b.960a:28] LOG: statement: SELECT * FROM test_type_conversion_int8(5000000000); 2015-04-30 14:17:02.064 EDT [5542719b.960a:29] LOG: statement: SELECT * FROM test_type_conversion_int8(null); 2015-04-30 14:17:02.132 EDT [5542719b.960a:30] LOG: statement: CREATE FUNCTION test_type_conversion_numeric(x numeric) RETURNS numeric AS $$ # print just the class name, not the type, to avoid differences # between decimal and cdecimal plpy.info(str(x), x.__class__.__name__) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:02.276 EDT [5542719b.960a:31] LOG: statement: SELECT * FROM test_type_conversion_numeric(100); 2015-04-30 14:17:02.465 EDT [5542719b.960a:32] LOG: statement: SELECT * FROM test_type_conversion_numeric(-100); 2015-04-30 14:17:02.558 EDT [5542719b.960a:33] LOG: statement: SELECT * FROM test_type_conversion_numeric(100.0); 2015-04-30 14:17:02.614 EDT [5542719b.960a:34] LOG: statement: SELECT * FROM test_type_conversion_numeric(100.00); 2015-04-30 14:17:02.670 EDT [5542719b.960a:35] LOG: statement: SELECT * FROM test_type_conversion_numeric(5000000000.5); 2015-04-30 14:17:02.725 EDT [5542719b.960a:36] LOG: statement: SELECT * FROM test_type_conversion_numeric(1234567890.0987654321); 2015-04-30 14:17:02.783 EDT [5542719b.960a:37] LOG: statement: SELECT * FROM test_type_conversion_numeric(-1234567890.0987654321); 2015-04-30 14:17:02.839 EDT [5542719b.960a:38] LOG: statement: SELECT * FROM test_type_conversion_numeric(null); 2015-04-30 14:17:02.909 EDT [5542719b.960a:39] LOG: statement: CREATE FUNCTION test_type_conversion_float4(x float4) RETURNS float4 AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:03.057 EDT [5542719b.960a:40] LOG: statement: SELECT * FROM test_type_conversion_float4(100); 2015-04-30 14:17:03.155 EDT [5542719b.960a:41] LOG: statement: SELECT * FROM test_type_conversion_float4(-100); 2015-04-30 14:17:03.251 EDT [5542719b.960a:42] LOG: statement: SELECT * FROM test_type_conversion_float4(5000.5); 2015-04-30 14:17:03.345 EDT [5542719b.960a:43] LOG: statement: SELECT * FROM test_type_conversion_float4(null); 2015-04-30 14:17:03.415 EDT [5542719b.960a:44] LOG: statement: CREATE FUNCTION test_type_conversion_float8(x float8) RETURNS float8 AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:03.564 EDT [5542719b.960a:45] LOG: statement: SELECT * FROM test_type_conversion_float8(100); 2015-04-30 14:17:03.659 EDT [5542719b.960a:46] LOG: statement: SELECT * FROM test_type_conversion_float8(-100); 2015-04-30 14:17:03.754 EDT [5542719b.960a:47] LOG: statement: SELECT * FROM test_type_conversion_float8(5000000000.5); 2015-04-30 14:17:03.847 EDT [5542719b.960a:48] LOG: statement: SELECT * FROM test_type_conversion_float8(null); 2015-04-30 14:17:03.915 EDT [5542719b.960a:49] LOG: statement: SELECT * FROM test_type_conversion_float8(100100100.654321); 2015-04-30 14:17:04.008 EDT [5542719b.960a:50] LOG: statement: CREATE FUNCTION test_type_conversion_oid(x oid) RETURNS oid AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:04.157 EDT [5542719b.960a:51] LOG: statement: SELECT * FROM test_type_conversion_oid(100); 2015-04-30 14:17:04.246 EDT [5542719b.960a:52] LOG: statement: SELECT * FROM test_type_conversion_oid(2147483649); 2015-04-30 14:17:04.339 EDT [5542719b.960a:53] LOG: statement: SELECT * FROM test_type_conversion_oid(null); 2015-04-30 14:17:04.411 EDT [5542719b.960a:54] LOG: statement: CREATE FUNCTION test_type_conversion_text(x text) RETURNS text AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:04.558 EDT [5542719b.960a:55] LOG: statement: SELECT * FROM test_type_conversion_text(\'hello world\'); 2015-04-30 14:17:04.627 EDT [5542719b.960a:56] LOG: statement: SELECT * FROM test_type_conversion_text(null); 2015-04-30 14:17:04.696 EDT [5542719b.960a:57] LOG: statement: CREATE FUNCTION test_type_conversion_bytea(x bytea) RETURNS bytea AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:04.845 EDT [5542719b.960a:58] LOG: statement: SELECT * FROM test_type_conversion_bytea(\'hello world\'); 2015-04-30 14:17:04.914 EDT [5542719b.960a:59] LOG: statement: SELECT * FROM test_type_conversion_bytea(E\'null\\\\000byte\'); 2015-04-30 14:17:04.984 EDT [5542719b.960a:60] LOG: statement: SELECT * FROM test_type_conversion_bytea(null); 2015-04-30 14:17:05.053 EDT [5542719b.960a:61] LOG: statement: CREATE FUNCTION test_type_marshal() RETURNS bytea AS $$ import marshal return marshal.dumps(\'hello world\') $$ LANGUAGE plpythonu; 2015-04-30 14:17:05.177 EDT [5542719b.960a:62] LOG: statement: 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; 2015-04-30 14:17:05.326 EDT [5542719b.960a:63] LOG: statement: SELECT test_type_unmarshal(x) FROM test_type_marshal() x; 2015-04-30 14:17:05.421 EDT [5542719b.960a:64] LOG: statement: CREATE DOMAIN booltrue AS bool CHECK (VALUE IS TRUE OR VALUE IS NULL); 2015-04-30 14:17:05.603 EDT [5542719b.960a:65] LOG: statement: CREATE FUNCTION test_type_conversion_booltrue(x booltrue, y bool) RETURNS booltrue AS $$ return y $$ LANGUAGE plpythonu; 2015-04-30 14:17:05.823 EDT [5542719b.960a:66] LOG: statement: SELECT * FROM test_type_conversion_booltrue(true, true); 2015-04-30 14:17:05.978 EDT [5542719b.960a:67] LOG: statement: SELECT * FROM test_type_conversion_booltrue(false, true); 2015-04-30 14:17:06.103 EDT [5542719b.960a:68] ERROR: value for domain booltrue violates check constraint "booltrue_check" 2015-04-30 14:17:06.103 EDT [5542719b.960a:69] STATEMENT: SELECT * FROM test_type_conversion_booltrue(false, true); 2015-04-30 14:17:06.103 EDT [5542719b.960a:70] LOG: statement: SELECT * FROM test_type_conversion_booltrue(true, false); 2015-04-30 14:17:06.270 EDT [5542719b.960a:71] ERROR: value for domain booltrue violates check constraint "booltrue_check" 2015-04-30 14:17:06.270 EDT [5542719b.960a:72] CONTEXT: while creating return value PL/Python function "test_type_conversion_booltrue" 2015-04-30 14:17:06.270 EDT [5542719b.960a:73] STATEMENT: SELECT * FROM test_type_conversion_booltrue(true, false); 2015-04-30 14:17:06.270 EDT [5542719b.960a:74] LOG: statement: CREATE DOMAIN uint2 AS int2 CHECK (VALUE >= 0); 2015-04-30 14:17:06.506 EDT [5542719b.960a:75] LOG: statement: CREATE FUNCTION test_type_conversion_uint2(x uint2, y int) RETURNS uint2 AS $$ plpy.info(x, type(x)) return y $$ LANGUAGE plpythonu; 2015-04-30 14:17:06.722 EDT [5542719b.960a:76] LOG: statement: SELECT * FROM test_type_conversion_uint2(100::uint2, 50); 2015-04-30 14:17:06.906 EDT [5542719b.960a:77] LOG: statement: SELECT * FROM test_type_conversion_uint2(100::uint2, -50); 2015-04-30 14:17:07.108 EDT [5542719b.960a:78] ERROR: value for domain uint2 violates check constraint "uint2_check" 2015-04-30 14:17:07.108 EDT [5542719b.960a:79] CONTEXT: while creating return value PL/Python function "test_type_conversion_uint2" 2015-04-30 14:17:07.108 EDT [5542719b.960a:80] STATEMENT: SELECT * FROM test_type_conversion_uint2(100::uint2, -50); 2015-04-30 14:17:07.108 EDT [5542719b.960a:81] LOG: statement: SELECT * FROM test_type_conversion_uint2(null, 1); 2015-04-30 14:17:07.249 EDT [5542719b.960a:82] LOG: statement: CREATE DOMAIN nnint AS int CHECK (VALUE IS NOT NULL); 2015-04-30 14:17:07.405 EDT [5542719b.960a:83] LOG: statement: CREATE FUNCTION test_type_conversion_nnint(x nnint, y int) RETURNS nnint AS $$ return y $$ LANGUAGE plpythonu; 2015-04-30 14:17:07.626 EDT [5542719b.960a:84] LOG: statement: SELECT * FROM test_type_conversion_nnint(10, 20); 2015-04-30 14:17:07.757 EDT [5542719b.960a:85] LOG: statement: SELECT * FROM test_type_conversion_nnint(null, 20); 2015-04-30 14:17:07.855 EDT [5542719b.960a:86] ERROR: value for domain nnint violates check constraint "nnint_check" 2015-04-30 14:17:07.855 EDT [5542719b.960a:87] STATEMENT: SELECT * FROM test_type_conversion_nnint(null, 20); 2015-04-30 14:17:07.856 EDT [5542719b.960a:88] LOG: statement: SELECT * FROM test_type_conversion_nnint(10, null); 2015-04-30 14:17:07.997 EDT [5542719b.960a:89] ERROR: value for domain nnint violates check constraint "nnint_check" 2015-04-30 14:17:07.997 EDT [5542719b.960a:90] CONTEXT: while creating return value PL/Python function "test_type_conversion_nnint" 2015-04-30 14:17:07.997 EDT [5542719b.960a:91] STATEMENT: SELECT * FROM test_type_conversion_nnint(10, null); 2015-04-30 14:17:07.997 EDT [5542719b.960a:92] LOG: statement: CREATE DOMAIN bytea10 AS bytea CHECK (octet_length(VALUE) = 10 AND VALUE IS NOT NULL); 2015-04-30 14:17:08.267 EDT [5542719b.960a:93] LOG: statement: CREATE FUNCTION test_type_conversion_bytea10(x bytea10, y bytea) RETURNS bytea10 AS $$ plpy.info(x, type(x)) return y $$ LANGUAGE plpythonu; 2015-04-30 14:17:08.490 EDT [5542719b.960a:94] LOG: statement: SELECT * FROM test_type_conversion_bytea10(\'hello wold\', \'hello wold\'); 2015-04-30 14:17:08.635 EDT [5542719b.960a:95] LOG: statement: SELECT * FROM test_type_conversion_bytea10(\'hello world\', \'hello wold\'); 2015-04-30 14:17:08.750 EDT [5542719b.960a:96] ERROR: value for domain bytea10 violates check constraint "bytea10_check" 2015-04-30 14:17:08.750 EDT [5542719b.960a:97] STATEMENT: SELECT * FROM test_type_conversion_bytea10(\'hello world\', \'hello wold\'); 2015-04-30 14:17:08.750 EDT [5542719b.960a:98] LOG: statement: SELECT * FROM test_type_conversion_bytea10(\'hello word\', \'hello world\'); 2015-04-30 14:17:08.909 EDT [5542719b.960a:99] ERROR: value for domain bytea10 violates check constraint "bytea10_check" 2015-04-30 14:17:08.909 EDT [5542719b.960a:100] CONTEXT: while creating return value PL/Python function "test_type_conversion_bytea10" 2015-04-30 14:17:08.909 EDT [5542719b.960a:101] STATEMENT: SELECT * FROM test_type_conversion_bytea10(\'hello word\', \'hello world\'); 2015-04-30 14:17:08.910 EDT [5542719b.960a:102] LOG: statement: SELECT * FROM test_type_conversion_bytea10(null, \'hello word\'); 2015-04-30 14:17:09.025 EDT [5542719b.960a:103] ERROR: value for domain bytea10 violates check constraint "bytea10_check" 2015-04-30 14:17:09.025 EDT [5542719b.960a:104] STATEMENT: SELECT * FROM test_type_conversion_bytea10(null, \'hello word\'); 2015-04-30 14:17:09.026 EDT [5542719b.960a:105] LOG: statement: SELECT * FROM test_type_conversion_bytea10(\'hello word\', null); 2015-04-30 14:17:09.186 EDT [5542719b.960a:106] ERROR: value for domain bytea10 violates check constraint "bytea10_check" 2015-04-30 14:17:09.186 EDT [5542719b.960a:107] CONTEXT: while creating return value PL/Python function "test_type_conversion_bytea10" 2015-04-30 14:17:09.186 EDT [5542719b.960a:108] STATEMENT: SELECT * FROM test_type_conversion_bytea10(\'hello word\', null); 2015-04-30 14:17:09.187 EDT [5542719b.960a:109] LOG: statement: CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:09.348 EDT [5542719b.960a:110] LOG: statement: SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]); 2015-04-30 14:17:09.424 EDT [5542719b.960a:111] LOG: statement: SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]); 2015-04-30 14:17:09.497 EDT [5542719b.960a:112] LOG: statement: SELECT * FROM test_type_conversion_array_int4(ARRAY[NULL,1]); 2015-04-30 14:17:09.578 EDT [5542719b.960a:113] LOG: statement: SELECT * FROM test_type_conversion_array_int4(ARRAY[]::integer[]); 2015-04-30 14:17:09.657 EDT [5542719b.960a:114] LOG: statement: SELECT * FROM test_type_conversion_array_int4(NULL); 2015-04-30 14:17:09.737 EDT [5542719b.960a:115] LOG: statement: SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]); 2015-04-30 14:17:09.815 EDT [5542719b.960a:116] ERROR: cannot convert multidimensional array to Python list 2015-04-30 14:17:09.815 EDT [5542719b.960a:117] DETAIL: PL/Python only supports one-dimensional arrays. 2015-04-30 14:17:09.815 EDT [5542719b.960a:118] CONTEXT: PL/Python function "test_type_conversion_array_int4" 2015-04-30 14:17:09.815 EDT [5542719b.960a:119] STATEMENT: SELECT * FROM test_type_conversion_array_int4(ARRAY[[1,2,3],[4,5,6]]); 2015-04-30 14:17:09.815 EDT [5542719b.960a:120] LOG: statement: CREATE FUNCTION test_type_conversion_array_text(x text[]) RETURNS text[] AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:09.976 EDT [5542719b.960a:121] LOG: statement: SELECT * FROM test_type_conversion_array_text(ARRAY[\'foo\', \'bar\']); 2015-04-30 14:17:10.051 EDT [5542719b.960a:122] LOG: statement: CREATE FUNCTION test_type_conversion_array_bytea(x bytea[]) RETURNS bytea[] AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:10.213 EDT [5542719b.960a:123] LOG: statement: SELECT * FROM test_type_conversion_array_bytea(ARRAY[E\'\\\\xdeadbeef\'::bytea, NULL]); 2015-04-30 14:17:10.308 EDT [5542719b.960a:124] LOG: statement: CREATE FUNCTION test_type_conversion_array_mixed1() RETURNS text[] AS $$ return [123, \'abc\'] $$ LANGUAGE plpythonu; 2015-04-30 14:17:10.441 EDT [5542719b.960a:125] LOG: statement: SELECT * FROM test_type_conversion_array_mixed1(); 2015-04-30 14:17:10.504 EDT [5542719b.960a:126] LOG: statement: CREATE FUNCTION test_type_conversion_array_mixed2() RETURNS int[] AS $$ return [123, \'abc\'] $$ LANGUAGE plpythonu; 2015-04-30 14:17:10.631 EDT [5542719b.960a:127] LOG: statement: SELECT * FROM test_type_conversion_array_mixed2(); 2015-04-30 14:17:10.688 EDT [5542719b.960a:128] ERROR: invalid input syntax for integer: "abc" 2015-04-30 14:17:10.688 EDT [5542719b.960a:129] CONTEXT: while creating return value PL/Python function "test_type_conversion_array_mixed2" 2015-04-30 14:17:10.688 EDT [5542719b.960a:130] STATEMENT: SELECT * FROM test_type_conversion_array_mixed2(); 2015-04-30 14:17:10.688 EDT [5542719b.960a:131] LOG: statement: CREATE FUNCTION test_type_conversion_array_record() RETURNS type_record[] AS $$ return [{\'first\': \'one\', \'second\': 42}, {\'first\': \'two\', \'second\': 11}] $$ LANGUAGE plpythonu; 2015-04-30 14:17:10.836 EDT [5542719b.960a:132] LOG: statement: SELECT * FROM test_type_conversion_array_record(); 2015-04-30 14:17:10.917 EDT [5542719b.960a:133] LOG: statement: CREATE FUNCTION test_type_conversion_array_string() RETURNS text[] AS $$ return \'abc\' $$ LANGUAGE plpythonu; 2015-04-30 14:17:11.047 EDT [5542719b.960a:134] LOG: statement: SELECT * FROM test_type_conversion_array_string(); 2015-04-30 14:17:11.109 EDT [5542719b.960a:135] LOG: statement: CREATE FUNCTION test_type_conversion_array_tuple() RETURNS text[] AS $$ return (\'abc\', \'def\') $$ LANGUAGE plpythonu; 2015-04-30 14:17:11.242 EDT [5542719b.960a:136] LOG: statement: SELECT * FROM test_type_conversion_array_tuple(); 2015-04-30 14:17:11.305 EDT [5542719b.960a:137] LOG: statement: CREATE FUNCTION test_type_conversion_array_error() RETURNS int[] AS $$ return 5 $$ LANGUAGE plpythonu; 2015-04-30 14:17:11.434 EDT [5542719b.960a:138] LOG: statement: SELECT * FROM test_type_conversion_array_error(); 2015-04-30 14:17:11.492 EDT [5542719b.960a:139] ERROR: return value of function with array return type is not a Python sequence 2015-04-30 14:17:11.492 EDT [5542719b.960a:140] CONTEXT: while creating return value PL/Python function "test_type_conversion_array_error" 2015-04-30 14:17:11.492 EDT [5542719b.960a:141] STATEMENT: SELECT * FROM test_type_conversion_array_error(); 2015-04-30 14:17:11.492 EDT [5542719b.960a:142] LOG: statement: CREATE DOMAIN ordered_pair_domain AS integer[] CHECK (array_length(VALUE,1)=2 AND VALUE[1] < VALUE[2]); 2015-04-30 14:17:11.835 EDT [5542719b.960a:143] LOG: statement: CREATE FUNCTION test_type_conversion_array_domain(x ordered_pair_domain) RETURNS ordered_pair_domain AS $$ plpy.info(x, type(x)) return x $$ LANGUAGE plpythonu; 2015-04-30 14:17:12.032 EDT [5542719b.960a:144] LOG: statement: SELECT * FROM test_type_conversion_array_domain(ARRAY[0, 100]::ordered_pair_domain); 2015-04-30 14:17:12.285 EDT [5542719b.960a:145] LOG: statement: SELECT * FROM test_type_conversion_array_domain(NULL::ordered_pair_domain); 2015-04-30 14:17:12.508 EDT [5542719b.960a:146] LOG: statement: CREATE FUNCTION test_type_conversion_array_domain_check_violation() RETURNS ordered_pair_domain AS $$ return [2,1] $$ LANGUAGE plpythonu; 2015-04-30 14:17:12.657 EDT [5542719b.960a:147] LOG: statement: SELECT * FROM test_type_conversion_array_domain_check_violation(); 2015-04-30 14:17:12.787 EDT [5542719b.960a:148] ERROR: value for domain ordered_pair_domain violates check constraint "ordered_pair_domain_check" 2015-04-30 14:17:12.787 EDT [5542719b.960a:149] CONTEXT: while creating return value PL/Python function "test_type_conversion_array_domain_check_violation" 2015-04-30 14:17:12.787 EDT [5542719b.960a:150] STATEMENT: SELECT * FROM test_type_conversion_array_domain_check_violation(); 2015-04-30 14:17:12.787 EDT [5542719b.960a:151] LOG: statement: CREATE TABLE employee ( name text, basesalary integer, bonus integer ); 2015-04-30 14:17:13.367 EDT [5542719b.960a:152] LOG: statement: INSERT INTO employee VALUES (\'John\', 100, 10), (\'Mary\', 200, 10); 2015-04-30 14:17:13.399 EDT [5542719b.960a:153] LOG: statement: CREATE OR REPLACE FUNCTION test_composite_table_input(e employee) RETURNS integer AS $$ return e[\'basesalary\'] + e[\'bonus\'] $$ LANGUAGE plpythonu; 2015-04-30 14:17:13.571 EDT [5542719b.960a:154] LOG: statement: SELECT name, test_composite_table_input(employee.*) FROM employee; 2015-04-30 14:17:13.696 EDT [5542719b.960a:155] LOG: statement: ALTER TABLE employee DROP bonus; 2015-04-30 14:17:13.796 EDT [5542719b.960a:156] LOG: statement: SELECT name, test_composite_table_input(employee.*) FROM employee; 2015-04-30 14:17:13.890 EDT [5542719b.960a:157] ERROR: KeyError: \'bonus\' 2015-04-30 14:17:13.890 EDT [5542719b.960a:158] CONTEXT: Traceback (most recent call last): PL/Python function "test_composite_table_input", line 2, in return e[\'basesalary\'] + e[\'bonus\'] PL/Python function "test_composite_table_input" 2015-04-30 14:17:13.890 EDT [5542719b.960a:159] STATEMENT: SELECT name, test_composite_table_input(employee.*) FROM employee; 2015-04-30 14:17:13.890 EDT [5542719b.960a:160] LOG: statement: ALTER TABLE employee ADD bonus integer; 2015-04-30 14:17:13.966 EDT [5542719b.960a:161] LOG: statement: UPDATE employee SET bonus = 10; 2015-04-30 14:17:14.028 EDT [5542719b.960a:162] LOG: statement: SELECT name, test_composite_table_input(employee.*) FROM employee; 2015-04-30 14:17:14.153 EDT [5542719b.960a:163] LOG: statement: CREATE TYPE named_pair AS ( i integer, j integer ); 2015-04-30 14:17:14.413 EDT [5542719b.960a:164] LOG: statement: CREATE OR REPLACE FUNCTION test_composite_type_input(p named_pair) RETURNS integer AS $$ return sum(p.values()) $$ LANGUAGE plpythonu; 2015-04-30 14:17:14.587 EDT [5542719b.960a:165] LOG: statement: SELECT test_composite_type_input(row(1, 2)); 2015-04-30 14:17:14.666 EDT [5542719b.960a:166] LOG: statement: ALTER TYPE named_pair RENAME TO named_pair_2; 2015-04-30 14:17:14.749 EDT [5542719b.960a:167] LOG: statement: SELECT test_composite_type_input(row(1, 2)); 2015-04-30 14:17:14.828 EDT [5542719b.960a:168] LOG: statement: CREATE OR REPLACE FUNCTION test_prep_bool_input() RETURNS int LANGUAGE plpythonu AS $$ plan = plpy.prepare("SELECT CASE WHEN $1 THEN 1 ELSE 0 END AS val", [\'boolean\']) rv = plpy.execute(plan, [\'fa\'], 5) # \'fa\' is true in Python return rv[0][\'val\'] $$; 2015-04-30 14:17:14.953 EDT [5542719b.960a:169] LOG: statement: SELECT test_prep_bool_input(); 2015-04-30 14:17:15.022 EDT [5542719b.960a:170] LOG: statement: CREATE OR REPLACE FUNCTION test_prep_bool_output() RETURNS bool LANGUAGE plpythonu AS $$ plan = plpy.prepare("SELECT $1 = 1 AS val", [\'int\']) rv = plpy.execute(plan, [0], 5) plpy.info(rv[0]) return rv[0][\'val\'] $$; 2015-04-30 14:17:15.150 EDT [5542719b.960a:171] LOG: statement: SELECT test_prep_bool_output(); 2015-04-30 14:17:15.282 EDT [5542719b.960a:172] LOG: statement: CREATE OR REPLACE FUNCTION test_prep_bytea_input(bb bytea) RETURNS int LANGUAGE plpythonu AS $$ plan = plpy.prepare("SELECT octet_length($1) AS val", [\'bytea\']) rv = plpy.execute(plan, [bb], 5) return rv[0][\'val\'] $$; 2015-04-30 14:17:15.435 EDT [5542719b.960a:173] LOG: statement: SELECT test_prep_bytea_input(E\'a\\\\000b\'); 2015-04-30 14:17:15.556 EDT [5542719b.960a:174] LOG: statement: CREATE OR REPLACE FUNCTION test_prep_bytea_output() RETURNS bytea LANGUAGE plpythonu AS $$ plan = plpy.prepare("SELECT decode(\'aa00bb\', \'hex\') AS val") rv = plpy.execute(plan, [], 5) plpy.info(rv[0]) return rv[0][\'val\'] $$; 2015-04-30 14:17:15.684 EDT [5542719b.960a:175] LOG: statement: SELECT test_prep_bytea_output(); 2015-04-30 14:17:15.773 EDT [5542719b.960a:176] LOG: disconnection: session time: 0:00:16.186 user=buildfarm database=pl_regression host=[local] 2015-04-30 14:17:15.851 EDT [554271ab.960d:1] LOG: connection received: host=[local] 2015-04-30 14:17:15.851 EDT [554271ab.960d:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 14:17:16.055 EDT [554271ab.960d:3] LOG: statement: /* Flat out Python syntax error */ CREATE FUNCTION python_syntax_error() RETURNS text AS \'.syntaxerror\' LANGUAGE plpythonu; 2015-04-30 14:17:16.212 EDT [554271ab.960d:4] ERROR: could not compile PL/Python function "python_syntax_error" 2015-04-30 14:17:16.212 EDT [554271ab.960d:5] DETAIL: SyntaxError: invalid syntax (, line 2) 2015-04-30 14:17:16.212 EDT [554271ab.960d:6] STATEMENT: /* Flat out Python syntax error */ CREATE FUNCTION python_syntax_error() RETURNS text AS \'.syntaxerror\' LANGUAGE plpythonu; 2015-04-30 14:17:16.213 EDT [554271ab.960d:7] LOG: statement: /* With check_function_bodies = false the function should get defined * and the error reported when called */ SET check_function_bodies = false; 2015-04-30 14:17:16.213 EDT [554271ab.960d:8] LOG: statement: CREATE FUNCTION python_syntax_error() RETURNS text AS \'.syntaxerror\' LANGUAGE plpythonu; 2015-04-30 14:17:16.330 EDT [554271ab.960d:9] LOG: statement: SELECT python_syntax_error(); 2015-04-30 14:17:16.361 EDT [554271ab.960d:10] ERROR: could not compile PL/Python function "python_syntax_error" 2015-04-30 14:17:16.361 EDT [554271ab.960d:11] DETAIL: SyntaxError: invalid syntax (, line 2) 2015-04-30 14:17:16.361 EDT [554271ab.960d:12] STATEMENT: SELECT python_syntax_error(); 2015-04-30 14:17:16.361 EDT [554271ab.960d:13] LOG: statement: /* Run the function twice to check if the hashtable entry gets cleaned up */ SELECT python_syntax_error(); 2015-04-30 14:17:16.391 EDT [554271ab.960d:14] ERROR: could not compile PL/Python function "python_syntax_error" 2015-04-30 14:17:16.391 EDT [554271ab.960d:15] DETAIL: SyntaxError: invalid syntax (, line 2) 2015-04-30 14:17:16.391 EDT [554271ab.960d:16] STATEMENT: /* Run the function twice to check if the hashtable entry gets cleaned up */ SELECT python_syntax_error(); 2015-04-30 14:17:16.392 EDT [554271ab.960d:17] LOG: statement: RESET check_function_bodies; 2015-04-30 14:17:16.392 EDT [554271ab.960d:18] LOG: statement: /* Flat out syntax error */ CREATE FUNCTION sql_syntax_error() RETURNS text AS \'plpy.execute("syntax error")\' LANGUAGE plpythonu; 2015-04-30 14:17:16.514 EDT [554271ab.960d:19] LOG: statement: SELECT sql_syntax_error(); 2015-04-30 14:17:16.544 EDT [554271ab.960d:20] ERROR: spiexceptions.SyntaxError: syntax error at or near "syntax" at character 1 2015-04-30 14:17:16.544 EDT [554271ab.960d:21] QUERY: syntax error 2015-04-30 14:17:16.544 EDT [554271ab.960d:22] CONTEXT: Traceback (most recent call last): PL/Python function "sql_syntax_error", line 1, in plpy.execute("syntax error") PL/Python function "sql_syntax_error" 2015-04-30 14:17:16.544 EDT [554271ab.960d:23] STATEMENT: SELECT sql_syntax_error(); 2015-04-30 14:17:16.544 EDT [554271ab.960d:24] LOG: statement: /* check the handling of uncaught python exceptions */ CREATE FUNCTION exception_index_invalid(text) RETURNS text AS \'return args[1]\' LANGUAGE plpythonu; 2015-04-30 14:17:16.687 EDT [554271ab.960d:25] LOG: statement: SELECT exception_index_invalid(\'test\'); 2015-04-30 14:17:16.732 EDT [554271ab.960d:26] ERROR: IndexError: list index out of range 2015-04-30 14:17:16.732 EDT [554271ab.960d:27] CONTEXT: Traceback (most recent call last): PL/Python function "exception_index_invalid", line 1, in return args[1] PL/Python function "exception_index_invalid" 2015-04-30 14:17:16.732 EDT [554271ab.960d:28] STATEMENT: SELECT exception_index_invalid(\'test\'); 2015-04-30 14:17:16.732 EDT [554271ab.960d:29] LOG: statement: /* check handling of nested exceptions */ CREATE FUNCTION exception_index_invalid_nested() RETURNS text AS \'rv = plpy.execute("SELECT test5(\'\'foo\'\')") return rv[0]\' LANGUAGE plpythonu; 2015-04-30 14:17:16.852 EDT [554271ab.960d:30] LOG: statement: SELECT exception_index_invalid_nested(); 2015-04-30 14:17:16.916 EDT [554271ab.960d:31] ERROR: spiexceptions.UndefinedFunction: function test5(unknown) does not exist at character 8 2015-04-30 14:17:16.916 EDT [554271ab.960d:32] HINT: No function matches the given name and argument types. You might need to add explicit type casts. 2015-04-30 14:17:16.916 EDT [554271ab.960d:33] QUERY: SELECT test5(\'foo\') 2015-04-30 14:17:16.916 EDT [554271ab.960d:34] CONTEXT: Traceback (most recent call last): PL/Python function "exception_index_invalid_nested", line 1, in rv = plpy.execute("SELECT test5(\'foo\')") PL/Python function "exception_index_invalid_nested" 2015-04-30 14:17:16.916 EDT [554271ab.960d:35] STATEMENT: SELECT exception_index_invalid_nested(); 2015-04-30 14:17:16.916 EDT [554271ab.960d:36] LOG: statement: /* a typo */ CREATE FUNCTION invalid_type_uncaught(a text) RETURNS text AS \'if "plan" not in SD: q = "SELECT fname FROM users WHERE lname = $1" SD["plan"] = plpy.prepare(q, [ "test" ]) rv = plpy.execute(SD["plan"], [ a ]) if len(rv): return rv[0]["fname"] return None \' LANGUAGE plpythonu; 2015-04-30 14:17:17.060 EDT [554271ab.960d:37] LOG: statement: SELECT invalid_type_uncaught(\'rick\'); 2015-04-30 14:17:17.118 EDT [554271ab.960d:38] ERROR: spiexceptions.UndefinedObject: type "test" does not exist 2015-04-30 14:17:17.118 EDT [554271ab.960d:39] CONTEXT: Traceback (most recent call last): PL/Python function "invalid_type_uncaught", line 3, in SD["plan"] = plpy.prepare(q, [ "test" ]) PL/Python function "invalid_type_uncaught" 2015-04-30 14:17:17.118 EDT [554271ab.960d:40] STATEMENT: SELECT invalid_type_uncaught(\'rick\'); 2015-04-30 14:17:17.118 EDT [554271ab.960d:41] LOG: statement: /* for what it\'s worth catch the exception generated by * the typo, and return None */ CREATE FUNCTION invalid_type_caught(a text) RETURNS text AS \'if "plan" not in SD: q = "SELECT fname FROM users WHERE lname = $1" try: SD["plan"] = plpy.prepare(q, [ "test" ]) except plpy.SPIError, ex: plpy.notice(str(ex)) return None rv = plpy.execute(SD["plan"], [ a ]) if len(rv): return rv[0]["fname"] return None \' LANGUAGE plpythonu; 2015-04-30 14:17:17.263 EDT [554271ab.960d:42] LOG: statement: SELECT invalid_type_caught(\'rick\'); 2015-04-30 14:17:17.323 EDT [554271ab.960d:43] LOG: statement: /* for what it\'s worth catch the exception generated by * the typo, and reraise it as a plain error */ CREATE FUNCTION invalid_type_reraised(a text) RETURNS text AS \'if "plan" not in SD: q = "SELECT fname FROM users WHERE lname = $1" try: SD["plan"] = plpy.prepare(q, [ "test" ]) except plpy.SPIError, ex: plpy.error(str(ex)) rv = plpy.execute(SD["plan"], [ a ]) if len(rv): return rv[0]["fname"] return None \' LANGUAGE plpythonu; 2015-04-30 14:17:17.468 EDT [554271ab.960d:44] LOG: statement: SELECT invalid_type_reraised(\'rick\'); 2015-04-30 14:17:17.526 EDT [554271ab.960d:45] ERROR: plpy.Error: type "test" does not exist 2015-04-30 14:17:17.526 EDT [554271ab.960d:46] CONTEXT: Traceback (most recent call last): PL/Python function "invalid_type_reraised", line 6, in plpy.error(str(ex)) PL/Python function "invalid_type_reraised" 2015-04-30 14:17:17.526 EDT [554271ab.960d:47] STATEMENT: SELECT invalid_type_reraised(\'rick\'); 2015-04-30 14:17:17.526 EDT [554271ab.960d:48] LOG: statement: /* no typo no messing about */ CREATE FUNCTION valid_type(a text) RETURNS text AS \'if "plan" not in SD: SD["plan"] = plpy.prepare("SELECT fname FROM users WHERE lname = $1", [ "text" ]) rv = plpy.execute(SD["plan"], [ a ]) if len(rv): return rv[0]["fname"] return None \' LANGUAGE plpythonu; 2015-04-30 14:17:17.669 EDT [554271ab.960d:49] LOG: statement: SELECT valid_type(\'rick\'); 2015-04-30 14:17:17.998 EDT [554271ab.960d:50] LOG: statement: /* error in nested functions to get a traceback */ CREATE FUNCTION nested_error() RETURNS text AS \'def fun1(): plpy.error("boom") def fun2(): fun1() def fun3(): fun2() fun3() return "not reached" \' LANGUAGE plpythonu; 2015-04-30 14:17:18.121 EDT [554271ab.960d:51] LOG: statement: SELECT nested_error(); 2015-04-30 14:17:18.169 EDT [554271ab.960d:52] ERROR: plpy.Error: boom 2015-04-30 14:17:18.169 EDT [554271ab.960d:53] CONTEXT: Traceback (most recent call last): PL/Python function "nested_error", line 10, in fun3() PL/Python function "nested_error", line 8, in fun3 fun2() PL/Python function "nested_error", line 5, in fun2 fun1() PL/Python function "nested_error", line 2, in fun1 plpy.error("boom") PL/Python function "nested_error" 2015-04-30 14:17:18.169 EDT [554271ab.960d:54] STATEMENT: SELECT nested_error(); 2015-04-30 14:17:18.169 EDT [554271ab.960d:55] LOG: statement: /* raising plpy.Error is just like calling plpy.error */ CREATE FUNCTION nested_error_raise() RETURNS text AS \'def fun1(): raise plpy.Error("boom") def fun2(): fun1() def fun3(): fun2() fun3() return "not reached" \' LANGUAGE plpythonu; 2015-04-30 14:17:18.295 EDT [554271ab.960d:56] LOG: statement: SELECT nested_error_raise(); 2015-04-30 14:17:18.327 EDT [554271ab.960d:57] ERROR: plpy.Error: boom 2015-04-30 14:17:18.327 EDT [554271ab.960d:58] CONTEXT: Traceback (most recent call last): PL/Python function "nested_error_raise", line 10, in fun3() PL/Python function "nested_error_raise", line 8, in fun3 fun2() PL/Python function "nested_error_raise", line 5, in fun2 fun1() PL/Python function "nested_error_raise", line 2, in fun1 raise plpy.Error("boom") PL/Python function "nested_error_raise" 2015-04-30 14:17:18.327 EDT [554271ab.960d:59] STATEMENT: SELECT nested_error_raise(); 2015-04-30 14:17:18.327 EDT [554271ab.960d:60] LOG: statement: /* using plpy.warning should not produce a traceback */ CREATE FUNCTION nested_warning() RETURNS text AS \'def fun1(): plpy.warning("boom") def fun2(): fun1() def fun3(): fun2() fun3() return "you\'\'ve been warned" \' LANGUAGE plpythonu; 2015-04-30 14:17:18.453 EDT [554271ab.960d:61] LOG: statement: SELECT nested_warning(); 2015-04-30 14:17:18.485 EDT [554271ab.960d:62] WARNING: boom 2015-04-30 14:17:18.485 EDT [554271ab.960d:63] CONTEXT: PL/Python function "nested_warning" 2015-04-30 14:17:18.485 EDT [554271ab.960d:64] LOG: statement: /* AttributeError at toplevel used to give segfaults with the traceback */ CREATE FUNCTION toplevel_attribute_error() RETURNS void AS $$ plpy.nonexistent $$ LANGUAGE plpythonu; 2015-04-30 14:17:18.609 EDT [554271ab.960d:65] LOG: statement: SELECT toplevel_attribute_error(); 2015-04-30 14:17:18.640 EDT [554271ab.960d:66] ERROR: AttributeError: \'module\' object has no attribute \'nonexistent\' 2015-04-30 14:17:18.640 EDT [554271ab.960d:67] CONTEXT: Traceback (most recent call last): PL/Python function "toplevel_attribute_error", line 2, in plpy.nonexistent PL/Python function "toplevel_attribute_error" 2015-04-30 14:17:18.640 EDT [554271ab.960d:68] STATEMENT: SELECT toplevel_attribute_error(); 2015-04-30 14:17:18.641 EDT [554271ab.960d:69] LOG: statement: /* Calling PL/Python functions from SQL and vice versa should not lose context. */ CREATE OR REPLACE FUNCTION python_traceback() RETURNS void AS $$ def first(): second() def second(): third() def third(): plpy.execute("select sql_error()") first() $$ LANGUAGE plpythonu; 2015-04-30 14:17:18.764 EDT [554271ab.960d:70] LOG: statement: CREATE OR REPLACE FUNCTION sql_error() RETURNS void AS $$ begin select 1/0; end $$ LANGUAGE plpgsql; 2015-04-30 14:17:18.945 EDT [554271ab.960d:71] LOG: statement: CREATE OR REPLACE FUNCTION python_from_sql_error() RETURNS void AS $$ begin select python_traceback(); end $$ LANGUAGE plpgsql; 2015-04-30 14:17:19.091 EDT [554271ab.960d:72] LOG: statement: CREATE OR REPLACE FUNCTION sql_from_python_error() RETURNS void AS $$ plpy.execute("select sql_error()") $$ LANGUAGE plpythonu; 2015-04-30 14:17:19.217 EDT [554271ab.960d:73] LOG: statement: SELECT python_traceback(); 2015-04-30 14:17:19.370 EDT [554271ab.960d:74] ERROR: spiexceptions.DivisionByZero: division by zero 2015-04-30 14:17:19.370 EDT [554271ab.960d:75] CONTEXT: Traceback (most recent call last): PL/Python function "python_traceback", line 11, in first() PL/Python function "python_traceback", line 3, in first second() PL/Python function "python_traceback", line 6, in second third() PL/Python function "python_traceback", line 9, in third plpy.execute("select sql_error()") PL/Python function "python_traceback" 2015-04-30 14:17:19.370 EDT [554271ab.960d:76] STATEMENT: SELECT python_traceback(); 2015-04-30 14:17:19.371 EDT [554271ab.960d:77] LOG: statement: SELECT sql_error(); 2015-04-30 14:17:19.438 EDT [554271ab.960d:78] ERROR: division by zero 2015-04-30 14:17:19.438 EDT [554271ab.960d:79] CONTEXT: SQL statement "select 1/0" PL/pgSQL function sql_error() line 3 at SQL statement 2015-04-30 14:17:19.438 EDT [554271ab.960d:80] STATEMENT: SELECT sql_error(); 2015-04-30 14:17:19.438 EDT [554271ab.960d:81] LOG: statement: SELECT python_from_sql_error(); 2015-04-30 14:17:19.629 EDT [554271ab.960d:82] ERROR: spiexceptions.DivisionByZero: division by zero 2015-04-30 14:17:19.629 EDT [554271ab.960d:83] CONTEXT: Traceback (most recent call last): PL/Python function "python_traceback", line 11, in first() PL/Python function "python_traceback", line 3, in first second() PL/Python function "python_traceback", line 6, in second third() PL/Python function "python_traceback", line 9, in third plpy.execute("select sql_error()") PL/Python function "python_traceback" SQL statement "select python_traceback()" PL/pgSQL function python_from_sql_error() line 3 at SQL statement 2015-04-30 14:17:19.629 EDT [554271ab.960d:84] STATEMENT: SELECT python_from_sql_error(); 2015-04-30 14:17:19.630 EDT [554271ab.960d:85] LOG: statement: SELECT sql_from_python_error(); 2015-04-30 14:17:19.728 EDT [554271ab.960d:86] ERROR: spiexceptions.DivisionByZero: division by zero 2015-04-30 14:17:19.728 EDT [554271ab.960d:87] CONTEXT: Traceback (most recent call last): PL/Python function "sql_from_python_error", line 2, in plpy.execute("select sql_error()") PL/Python function "sql_from_python_error" 2015-04-30 14:17:19.728 EDT [554271ab.960d:88] STATEMENT: SELECT sql_from_python_error(); 2015-04-30 14:17:19.728 EDT [554271ab.960d:89] LOG: statement: /* check catching specific types of exceptions */ CREATE TABLE specific ( i integer PRIMARY KEY ); 2015-04-30 14:17:20.194 EDT [554271ab.960d:90] LOG: statement: CREATE FUNCTION specific_exception(i integer) RETURNS void AS $$ from plpy import spiexceptions try: plpy.execute("insert into specific values (%s)" % (i or "NULL")); except spiexceptions.NotNullViolation, e: plpy.notice("Violated the NOT NULL constraint, sqlstate %s" % e.sqlstate) except spiexceptions.UniqueViolation, e: plpy.notice("Violated the UNIQUE constraint, sqlstate %s" % e.sqlstate) $$ LANGUAGE plpythonu; 2015-04-30 14:17:20.344 EDT [554271ab.960d:91] LOG: statement: SELECT specific_exception(2); 2015-04-30 14:17:20.406 EDT [554271ab.960d:92] LOG: statement: SELECT specific_exception(NULL); 2015-04-30 14:17:20.491 EDT [554271ab.960d:93] LOG: statement: SELECT specific_exception(2); 2015-04-30 14:17:20.565 EDT [554271ab.960d:94] LOG: statement: /* SPI errors in PL/Python functions should preserve the SQLSTATE value */ CREATE FUNCTION python_unique_violation() RETURNS void AS $$ plpy.execute("insert into specific values (1)") plpy.execute("insert into specific values (1)") $$ LANGUAGE plpythonu; 2015-04-30 14:17:20.691 EDT [554271ab.960d:95] LOG: statement: CREATE FUNCTION catch_python_unique_violation() RETURNS text AS $$ begin begin perform python_unique_violation(); exception when unique_violation then return \'ok\'; end; return \'not reached\'; end; $$ language plpgsql; 2015-04-30 14:17:20.836 EDT [554271ab.960d:96] LOG: statement: SELECT catch_python_unique_violation(); 2015-04-30 14:17:21.041 EDT [554271ab.960d:97] LOG: statement: /* manually starting subtransactions - a bad idea */ CREATE FUNCTION manual_subxact() RETURNS void AS $$ plpy.execute("savepoint save") plpy.execute("create table foo(x integer)") plpy.execute("rollback to save") $$ LANGUAGE plpythonu; 2015-04-30 14:17:21.168 EDT [554271ab.960d:98] LOG: statement: SELECT manual_subxact(); 2015-04-30 14:17:21.201 EDT [554271ab.960d:99] ERROR: plpy.SPIError: SPI_execute failed: SPI_ERROR_TRANSACTION 2015-04-30 14:17:21.201 EDT [554271ab.960d:100] CONTEXT: Traceback (most recent call last): PL/Python function "manual_subxact", line 2, in plpy.execute("savepoint save") PL/Python function "manual_subxact" 2015-04-30 14:17:21.201 EDT [554271ab.960d:101] STATEMENT: SELECT manual_subxact(); 2015-04-30 14:17:21.201 EDT [554271ab.960d:102] LOG: statement: /* same for prepared plans */ CREATE FUNCTION manual_subxact_prepared() RETURNS void AS $$ save = plpy.prepare("savepoint save") rollback = plpy.prepare("rollback to save") plpy.execute(save) plpy.execute("create table foo(x integer)") plpy.execute(rollback) $$ LANGUAGE plpythonu; 2015-04-30 14:17:21.329 EDT [554271ab.960d:103] LOG: statement: SELECT manual_subxact_prepared(); 2015-04-30 14:17:21.363 EDT [554271ab.960d:104] ERROR: plpy.SPIError: SPI_execute_plan failed: SPI_ERROR_TRANSACTION 2015-04-30 14:17:21.363 EDT [554271ab.960d:105] CONTEXT: Traceback (most recent call last): PL/Python function "manual_subxact_prepared", line 4, in plpy.execute(save) PL/Python function "manual_subxact_prepared" 2015-04-30 14:17:21.363 EDT [554271ab.960d:106] STATEMENT: SELECT manual_subxact_prepared(); 2015-04-30 14:17:21.363 EDT [554271ab.960d:107] LOG: statement: /* raising plpy.spiexception.* from python code should preserve sqlstate */ CREATE FUNCTION plpy_raise_spiexception() RETURNS void AS $$ raise plpy.spiexceptions.DivisionByZero() $$ LANGUAGE plpythonu; 2015-04-30 14:17:21.491 EDT [554271ab.960d:108] LOG: statement: DO $$ BEGIN SELECT plpy_raise_spiexception(); EXCEPTION WHEN division_by_zero THEN -- NOOP END $$ LANGUAGE plpgsql; 2015-04-30 14:17:21.589 EDT [554271ab.960d:109] LOG: statement: /* setting a custom sqlstate should be handled */ CREATE FUNCTION plpy_raise_spiexception_override() RETURNS void AS $$ exc = plpy.spiexceptions.DivisionByZero() exc.sqlstate = \'SILLY\' raise exc $$ LANGUAGE plpythonu; 2015-04-30 14:17:21.739 EDT [554271ab.960d:110] LOG: statement: DO $$ BEGIN SELECT plpy_raise_spiexception_override(); EXCEPTION WHEN SQLSTATE \'SILLY\' THEN -- NOOP END $$ LANGUAGE plpgsql; 2015-04-30 14:17:21.836 EDT [554271ab.960d:111] LOG: disconnection: session time: 0:00:05.985 user=buildfarm database=pl_regression host=[local] 2015-04-30 14:17:21.869 EDT [554271b1.9610:1] LOG: connection received: host=[local] 2015-04-30 14:17:21.870 EDT [554271b1.9610:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 14:17:22.074 EDT [554271b1.9610:3] LOG: statement: SET client_encoding TO UTF8; 2015-04-30 14:17:22.075 EDT [554271b1.9610:4] LOG: statement: CREATE TABLE unicode_test ( testvalue text NOT NULL ); 2015-04-30 14:17:22.572 EDT [554271b1.9610:5] LOG: statement: CREATE FUNCTION unicode_return() RETURNS text AS E\' return u"\\\\xA0" \' LANGUAGE plpythonu; 2015-04-30 14:17:22.758 EDT [554271b1.9610:6] LOG: statement: CREATE FUNCTION unicode_trigger() RETURNS trigger AS E\' TD["new"]["testvalue"] = u"\\\\xA0" return "MODIFY" \' LANGUAGE plpythonu; 2015-04-30 14:17:22.876 EDT [554271b1.9610:7] LOG: statement: CREATE TRIGGER unicode_test_bi BEFORE INSERT ON unicode_test FOR EACH ROW EXECUTE PROCEDURE unicode_trigger(); 2015-04-30 14:17:22.984 EDT [554271b1.9610:8] LOG: statement: CREATE FUNCTION unicode_plan1() RETURNS text AS E\' plan = plpy.prepare("SELECT $1 AS testvalue", ["text"]) rv = plpy.execute(plan, [u"\\\\xA0"], 1) return rv[0]["testvalue"] \' LANGUAGE plpythonu; 2015-04-30 14:17:23.104 EDT [554271b1.9610:9] LOG: statement: CREATE FUNCTION unicode_plan2() RETURNS text AS E\' plan = plpy.prepare("SELECT $1 || $2 AS testvalue", ["text", u"text"]) rv = plpy.execute(plan, ["foo", "bar"], 1) return rv[0]["testvalue"] \' LANGUAGE plpythonu; 2015-04-30 14:17:23.225 EDT [554271b1.9610:10] LOG: statement: SELECT unicode_return(); 2015-04-30 14:17:23.257 EDT [554271b1.9610:11] LOG: statement: INSERT INTO unicode_test (testvalue) VALUES (\'test\'); 2015-04-30 14:17:23.315 EDT [554271b1.9610:12] LOG: statement: SELECT * FROM unicode_test; 2015-04-30 14:17:23.348 EDT [554271b1.9610:13] LOG: statement: SELECT unicode_plan1(); 2015-04-30 14:17:23.416 EDT [554271b1.9610:14] LOG: statement: SELECT unicode_plan2(); 2015-04-30 14:17:23.559 EDT [554271b1.9610:15] LOG: disconnection: session time: 0:00:01.690 user=buildfarm database=pl_regression host=[local] 2015-04-30 14:17:23.575 EDT [554271b3.9613:1] LOG: connection received: host=[local] 2015-04-30 14:17:23.576 EDT [554271b3.9613:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 14:17:23.781 EDT [554271b3.9613:3] LOG: statement: CREATE FUNCTION quote(t text, how text) RETURNS text AS $$ if how == "literal": return plpy.quote_literal(t) elif how == "nullable": return plpy.quote_nullable(t) elif how == "ident": return plpy.quote_ident(t) else: raise plpy.Error("unrecognized quote type %s" % how) $$ LANGUAGE plpythonu; 2015-04-30 14:17:23.978 EDT [554271b3.9613:4] LOG: statement: SELECT quote(t, \'literal\') FROM (VALUES (\'abc\'), (\'a\'\'bc\'), (\'\'\'abc\'\'\'), (\'\'), (\'\'\'\'), (\'xyzv\')) AS v(t); 2015-04-30 14:17:24.042 EDT [554271b3.9613:5] LOG: statement: SELECT quote(t, \'nullable\') FROM (VALUES (\'abc\'), (\'a\'\'bc\'), (\'\'\'abc\'\'\'), (\'\'), (\'\'\'\'), (NULL)) AS v(t); 2015-04-30 14:17:24.104 EDT [554271b3.9613:6] LOG: statement: SELECT quote(t, \'ident\') FROM (VALUES (\'abc\'), (\'a b c\'), (\'a " \'\'abc\'\'\')) AS v(t); 2015-04-30 14:17:24.153 EDT [554271b3.9613:7] LOG: disconnection: session time: 0:00:00.578 user=buildfarm database=pl_regression host=[local] 2015-04-30 14:17:24.165 EDT [554271b4.9616:1] LOG: connection received: host=[local] 2015-04-30 14:17:24.166 EDT [554271b4.9616:2] LOG: connection authorized: user=buildfarm database=pl_regression 2015-04-30 14:17:24.368 EDT [554271b4.9616:3] LOG: statement: CREATE FUNCTION multiout_simple(OUT i integer, OUT j integer) AS $$ return (1, 2) $$ LANGUAGE plpythonu; 2015-04-30 14:17:24.545 EDT [554271b4.9616:4] LOG: statement: SELECT multiout_simple(); 2015-04-30 14:17:24.584 EDT [554271b4.9616:5] LOG: statement: SELECT * FROM multiout_simple(); 2015-04-30 14:17:24.635 EDT [554271b4.9616:6] LOG: statement: SELECT i, j + 2 FROM multiout_simple(); 2015-04-30 14:17:24.723 EDT [554271b4.9616:7] LOG: statement: SELECT (multiout_simple()).j + 3; 2015-04-30 14:17:24.792 EDT [554271b4.9616:8] LOG: statement: CREATE FUNCTION multiout_simple_setof(n integer = 1, OUT integer, OUT integer) RETURNS SETOF record AS $$ return [(1, 2)] * n $$ LANGUAGE plpythonu; 2015-04-30 14:17:24.975 EDT [554271b4.9616:9] LOG: statement: SELECT multiout_simple_setof(); 2015-04-30 14:20:23.748 EDT [553e0652.3bea:7] LOG: server process (PID 38422) was terminated by signal 9: Killed 2015-04-30 14:20:23.748 EDT [553e0652.3bea:8] DETAIL: Failed process was running: SELECT multiout_simple_setof(); 2015-04-30 14:20:23.748 EDT [553e0652.3bea:9] LOG: terminating any other active server processes 2015-04-30 14:20:23.749 EDT [55427181.95ff:2] WARNING: terminating connection because of crash of another server process 2015-04-30 14:20:23.749 EDT [55427181.95ff:3] DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 2015-04-30 14:20:23.749 EDT [55427181.95ff:4] HINT: In a moment you should be able to reconnect to the database and repeat your command. 2015-04-30 14:20:23.782 EDT [553e0652.3bea:10] LOG: all server processes terminated; reinitializing 2015-04-30 14:20:23.797 EDT [55427267.9627:1] LOG: connection received: host=[local] 2015-04-30 14:20:23.797 EDT [55427267.9627:2] FATAL: the database system is in recovery mode 2015-04-30 14:20:23.797 EDT [55427267.9626:1] LOG: database system was interrupted; last known up at 2015-04-30 14:16:33 EDT 2015-04-30 14:20:23.798 EDT [55427267.9626:2] LOG: database system was not properly shut down; automatic recovery in progress 2015-04-30 14:20:23.808 EDT [55427267.9626:3] LOG: redo starts at 0/9E8F918 2015-04-30 14:20:23.825 EDT [55427267.9626:4] LOG: invalid record length at 0/9F38DD0 2015-04-30 14:20:23.825 EDT [55427267.9626:5] LOG: redo done at 0/9F38DA8 2015-04-30 14:20:23.825 EDT [55427267.9626:6] LOG: last completed transaction was at log time 2015-04-30 14:17:44.724146-04 2015-04-30 14:20:23.826 EDT [55427267.962d:1] LOG: connection received: host=[local] 2015-04-30 14:20:23.827 EDT [55427267.962d:2] FATAL: the database system is in recovery mode 2015-04-30 14:20:23.830 EDT [553e0652.3bea:11] LOG: database system is ready to accept connections 2015-04-30 14:20:23.831 EDT [55427267.9632:1] LOG: autovacuum launcher started