transforms vs. CLOBBER_CACHE_ALWAYS

Started by Andrew Dunstanover 10 years ago8 messages
#1Andrew Dunstan
andrew@dunslane.net
1 attachment(s)

friarbird is a FreeBSD buildfarm animal running with
-DCLOBBER_CACHE_ALWAYS. It usually completes a run in about 6.5 hours.
However, it's been stuck since Monday running the plpython regression
tests. The only relevant commit seems to be the transforms feature.
Here's what it's been doing:

pl_regression=# select * from pg_stat_activity where
application_name = 'pg_regress';
-[ RECORD 1 ]----+------------------------------
datid | 27438
datname | pl_regression
pid | 15434
usesysid | 10
usename | buildfarm
application_name | pg_regress
client_addr |
client_hostname |
client_port | -1
backend_start | 2015-04-27 05:51:12.689281-04
xact_start | 2015-04-27 05:51:28.324329-04
query_start | 2015-04-27 05:51:28.324329-04
state_change | 2015-04-27 05:51:28.324341-04
waiting | f
state | active
backend_xid |
backend_xmin | 5540
query | SELECT cursor_plan();

I imagine it was in some sort of infinite loop. gdb says it's all in
src/backend/utils/cache/plancache.c, although not the same line each
time I run it.

I ended up killing it accidentally, but I hope this helps narrow the
problem down.

The buildfarm server rejected the report because the snapshot was so
old, but the relevant report is attached.

cheers

andrew

Attachments:

fbf.txttext/plain; charset=UTF-8; name=fbf.txtDownload
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 <module>
!     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 <module>
!     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 <module>
!     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 <module>
!     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 <module>
!     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 <module>
!     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 <module>
!     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, "</nonesuch"; $$ LANGUAGE plperl;
2015-04-27 05:50:28.255 EDT [553e0657.3c08:172] ERROR:  \'open\' trapped by operation mask at line 1.
2015-04-27 05:50:28.255 EDT [553e0657.3c08:173] CONTEXT:  PL/Perl anonymous code block
2015-04-27 05:50:28.255 EDT [553e0657.3c08:174] STATEMENT:  DO $$ open my $fh, "</nonesuch"; $$ LANGUAGE plperl;
2015-04-27 05:50:28.255 EDT [553e0657.3c08:175] LOG:  statement: DO $$ eval q{chdir \'.\';}; warn "Caught: $@"; $$ LANGUAGE plperl;
2015-04-27 05:50:28.261 EDT [553e0657.3c08:176] WARNING:  Caught: \'chdir\' trapped by operation mask at line 1.
2015-04-27 05:50:28.261 EDT [553e0657.3c08:177] CONTEXT:  PL/Perl anonymous code block
2015-04-27 05:50:28.262 EDT [553e0657.3c08:178] LOG:  statement: DO $$ warn do "/dev/null"; $$ LANGUAGE plperl;
2015-04-27 05:50:28.268 EDT [553e0657.3c08:179] ERROR:  Unable to load /dev/null into plperl at line 1.
2015-04-27 05:50:28.268 EDT [553e0657.3c08:180] CONTEXT:  PL/Perl anonymous code block
2015-04-27 05:50:28.268 EDT [553e0657.3c08:181] STATEMENT:  DO $$ warn do "/dev/null"; $$ LANGUAGE plperl;
2015-04-27 05:50:28.268 EDT [553e0657.3c08:182] LOG:  statement: DO $$ use blib; $$ LANGUAGE plperl;
2015-04-27 05:50:28.274 EDT [553e0657.3c08:183] ERROR:  Unable to load blib.pm into plperl at line 1.
	BEGIN failed--compilation aborted at line 1.
2015-04-27 05:50:28.274 EDT [553e0657.3c08:184] CONTEXT:  PL/Perl anonymous code block
2015-04-27 05:50:28.274 EDT [553e0657.3c08:185] STATEMENT:  DO $$ use blib; $$ LANGUAGE plperl;
2015-04-27 05:50:28.274 EDT [553e0657.3c08:186] LOG:  statement: DO $do$ use strict; my $name = "foo"; my $ref = $$name; $do$ LANGUAGE plperl;
2015-04-27 05:50:28.280 EDT [553e0657.3c08:187] ERROR:  Can\'t use string ("foo") as a SCALAR ref while "strict refs" in use at line 1.
2015-04-27 05:50:28.280 EDT [553e0657.3c08:188] CONTEXT:  PL/Perl anonymous code block
2015-04-27 05:50:28.280 EDT [553e0657.3c08:189] STATEMENT:  DO $do$ use strict; my $name = "foo"; my $ref = $$name; $do$ LANGUAGE plperl;
2015-04-27 05:50:28.281 EDT [553e0657.3c08:190] LOG:  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: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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 (<string>, 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 (<string>, 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 (<string>, 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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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 <module>
	    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
#2Christian Ullrich
chris@chrullrich.net
In reply to: Andrew Dunstan (#1)
Re: transforms vs. CLOBBER_CACHE_ALWAYS

* Andrew Dunstan:

friarbird is a FreeBSD buildfarm animal running with
-DCLOBBER_CACHE_ALWAYS. It usually completes a run in about 6.5 hours.
However, it's been stuck since Monday running the plpython regression
tests. The only relevant commit seems to be the transforms feature.
Here's what it's been doing:

query | SELECT cursor_plan();

Same here, on jaguarundi. I actually killed it intentionally this
morning, hoping that whatever the problem was might have been fixed
already. No such luck.

I would suspect that it might have something to do with the OS, if all
the other CCA animals weren't lining up nicely behind in the buildfarm
status page.

I imagine it was in some sort of infinite loop. gdb says it's all in
src/backend/utils/cache/plancache.c, although not the same line each
time I run it.

I ktrace'd it this morning, but cleverly did not keep the dump. It
looked much the same to me, though, it was reading the same filenode
over and over again.

--
Christian

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Peter Eisentraut
peter_e@gmx.net
In reply to: Andrew Dunstan (#1)
Re: transforms vs. CLOBBER_CACHE_ALWAYS

On 4/30/15 2:49 PM, Andrew Dunstan wrote:

friarbird is a FreeBSD buildfarm animal running with
-DCLOBBER_CACHE_ALWAYS. It usually completes a run in about 6.5 hours.
However, it's been stuck since Monday running the plpython regression
tests. The only relevant commit seems to be the transforms feature.

I can reproduce it. I'll look into it.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Andrew Dunstan
andrew@dunslane.net
In reply to: Christian Ullrich (#2)
Re: transforms vs. CLOBBER_CACHE_ALWAYS

On 04/30/2015 09:09 PM, Christian Ullrich wrote:

* Andrew Dunstan:

friarbird is a FreeBSD buildfarm animal running with
-DCLOBBER_CACHE_ALWAYS. It usually completes a run in about 6.5 hours.
However, it's been stuck since Monday running the plpython regression
tests. The only relevant commit seems to be the transforms feature.
Here's what it's been doing:

query | SELECT cursor_plan();

Same here, on jaguarundi. I actually killed it intentionally this
morning, hoping that whatever the problem was might have been fixed
already. No such luck.

I would suspect that it might have something to do with the OS, if all
the other CCA animals weren't lining up nicely behind in the buildfarm
status page.

I imagine it was in some sort of infinite loop. gdb says it's all in
src/backend/utils/cache/plancache.c, although not the same line each
time I run it.

I ktrace'd it this morning, but cleverly did not keep the dump. It
looked much the same to me, though, it was reading the same filenode
over and over again.

Yeah, this happened again this morning, so it seems to be quite reliably
reproducible. I killed it and I've set friarbird to build without python
for now, but this is clearly an issue that needs to be resolved.

Side thought - maybe we need some sort of timeout mechanism for the
buildfarm to try to stop it from hanging. There is actually some timeout
code in there from back in the CVS days when occasionally CVS would
hang. It could be adapted to timeout other steps.

cheers

andrew

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#4)
Re: transforms vs. CLOBBER_CACHE_ALWAYS

On 05/01/2015 08:57 AM, Andrew Dunstan wrote:

On 04/30/2015 09:09 PM, Christian Ullrich wrote:

* Andrew Dunstan:

friarbird is a FreeBSD buildfarm animal running with
-DCLOBBER_CACHE_ALWAYS. It usually completes a run in about 6.5 hours.
However, it's been stuck since Monday running the plpython regression
tests. The only relevant commit seems to be the transforms feature.
Here's what it's been doing:

query | SELECT cursor_plan();

Same here, on jaguarundi. I actually killed it intentionally this
morning, hoping that whatever the problem was might have been fixed
already. No such luck.

I would suspect that it might have something to do with the OS, if
all the other CCA animals weren't lining up nicely behind in the
buildfarm status page.

Yeah, this happened again this morning, so it seems to be quite
reliably reproducible. I killed it and I've set friarbird to build
without python for now, but this is clearly an issue that needs to be
resolved.

And I have confirmed that it's not an OS problem - I have reproduced it
on a modern Linux instance (it's still running, in fact). So it's quite
clearly a bug that needs to be fixed.

cheers

andrew

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Christian Ullrich
chris@chrullrich.net
In reply to: Peter Eisentraut (#3)
Re: transforms vs. CLOBBER_CACHE_ALWAYS

* Peter Eisentraut wrote:

On 4/30/15 2:49 PM, Andrew Dunstan wrote:

friarbird is a FreeBSD buildfarm animal running with
-DCLOBBER_CACHE_ALWAYS. It usually completes a run in about 6.5 hours.
However, it's been stuck since Monday running the plpython regression
tests. The only relevant commit seems to be the transforms feature.

I can reproduce it. I'll look into it.

I looked over the CCA animals and noticed that pademelon and gaur are
apparently unaffected; what they have in common is the OS (HP-UX) and
the Python version (2.5). There's nothing I can do about OS-related
differences, but I thought I'd check the Python angle.

With Python 2.5.6, jaguarundi locks up on the plpython tests just the
same as with 3.4, and friarbird with 2.7. So that is not the culprit,
either.

I ran make check by hand, and noticed three tests where it seemed to
hang (I gave it at least three minutes each, and the functions in the
queries are simple):

plpython_spi SELECT cursor_plan();
plpython_setof SELECT test_setof_as_list(1, 'list');
plpython_composite SELECT multiout_simple_setof();

These are the only plpython tests that mention SETOF at all, and the
queries that hung are the first ones in their respective tests to
actually build a set.

Does that help?

--
Christian

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Christian Ullrich (#6)
Re: transforms vs. CLOBBER_CACHE_ALWAYS

Christian Ullrich <chris@chrullrich.net> writes:

* Peter Eisentraut wrote:

On 4/30/15 2:49 PM, Andrew Dunstan wrote:

friarbird is a FreeBSD buildfarm animal running with
-DCLOBBER_CACHE_ALWAYS. It usually completes a run in about 6.5 hours.
However, it's been stuck since Monday running the plpython regression
tests. The only relevant commit seems to be the transforms feature.

I can reproduce it. I'll look into it.

I looked over the CCA animals and noticed that pademelon and gaur are
apparently unaffected;

pademelon and gaur do not run CCA (if they did, it would take weeks for
a run to complete :-().

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Christian Ullrich
chris@chrullrich.net
In reply to: Tom Lane (#7)
Re: transforms vs. CLOBBER_CACHE_ALWAYS

* Tom Lane wrote:

Christian Ullrich <chris@chrullrich.net> writes:

* Peter Eisentraut wrote:

On 4/30/15 2:49 PM, Andrew Dunstan wrote:

friarbird is a FreeBSD buildfarm animal running with
-DCLOBBER_CACHE_ALWAYS. It usually completes a run in about 6.5 hours.
However, it's been stuck since Monday running the plpython regression
tests. The only relevant commit seems to be the transforms feature.

I can reproduce it. I'll look into it.

I looked over the CCA animals and noticed that pademelon and gaur are
apparently unaffected;

pademelon and gaur do not run CCA (if they did, it would take weeks for
a run to complete :-().

Ah. I obviously had associated the "note" icon with CCA. Sorry. OTOH, if
I had noticed that, I might not have gone into more detail ...

--
Christian

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers