diff --git a/src/pl/plpython/Makefile b/src/pl/plpython/Makefile
index 39cfb654fb2108441883aadfcdcc18a232ff639e..9f62e299f6099cfe9d904ebbd3ab872962f866ac 100644
--- a/src/pl/plpython/Makefile
+++ b/src/pl/plpython/Makefile
@@ -84,6 +84,7 @@ REGRESS = \
 	plpython_trigger \
 	plpython_types \
 	plpython_error \
+	plpython_ereport \
 	plpython_unicode \
 	plpython_quote \
 	plpython_composite \
diff --git a/src/pl/plpython/expected/plpython_ereport.out b/src/pl/plpython/expected/plpython_ereport.out
new file mode 100644
index 0000000000000000000000000000000000000000..8a6dfe4ec02b40d89f153519b8159d844f762892
--- /dev/null
+++ b/src/pl/plpython/expected/plpython_ereport.out
@@ -0,0 +1,191 @@
+CREATE FUNCTION elog_test() RETURNS void
+AS $$
+plpy.debug('debug', detail = 'some detail')
+plpy.log('log', detail = 'some detail')
+plpy.info('info', detail = 'some detail')
+plpy.info()
+plpy.info('the question', detail = 42);
+plpy.info('This is message text.',
+                    detail = 'This is detail text',
+                    hint = 'This is hint text.',
+                    sqlstate = 'XX000',
+                    schema = 'any info about schema',
+                    table = 'any info about table',
+                    column = 'any info about column',
+                    datatype = 'any info about datatype',
+                    constraint = 'any info about constraint')
+plpy.notice('notice', detail = 'some detail')
+plpy.warning('warning', detail = 'some detail')
+plpy.error('stop on error', detail = 'some detail', hint = 'some hint')
+$$ LANGUAGE plpythonu;
+SELECT elog_test();
+INFO:  info
+DETAIL:  some detail
+INFO:  ()
+INFO:  the question
+DETAIL:  42
+INFO:  This is message text.
+DETAIL:  This is detail text
+HINT:  This is hint text.
+NOTICE:  notice
+DETAIL:  some detail
+WARNING:  warning
+DETAIL:  some detail
+ERROR:  plpy.Error: stop on error
+DETAIL:  some detail
+HINT:  some hint
+CONTEXT:  Traceback (most recent call last):
+  PL/Python function "elog_test", line 18, in <module>
+    plpy.error('stop on error', detail = 'some detail', hint = 'some hint')
+PL/Python function "elog_test"
+do $$ plpy.info('other types', detail = (10,20)) $$ LANGUAGE plpythonu;
+INFO:  other types
+DETAIL:  (10, 20)
+do $$
+import time;
+from datetime import date
+plpy.info('other types', detail = date(2016,2,26))
+$$ LANGUAGE plpythonu;
+INFO:  other types
+DETAIL:  2016-02-26
+do $$
+basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
+plpy.info('other types', detail = basket)
+$$ LANGUAGE plpythonu;
+INFO:  other types
+DETAIL:  ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
+-- should fail
+do $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpythonu;
+ERROR:  invalid SQLSTATE code
+CONTEXT:  PL/Python anonymous code block
+do $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpythonu;
+ERROR:  'blabla' is an invalid keyword argument for this function
+CONTEXT:  PL/Python anonymous code block
+do $$ plpy.info('first message', message='second message') $$ LANGUAGE plpythonu;
+ERROR:  the message is already specified
+CONTEXT:  PL/Python anonymous code block
+do $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpythonu;
+ERROR:  the message is already specified
+CONTEXT:  PL/Python anonymous code block
+-- raise exception in python, handle exception in plgsql
+CREATE OR REPLACE FUNCTION raise_exception(_message text, _detail text DEFAULT NULL, _hint text DEFAULT NULL,
+						_sqlstate text DEFAULT NULL,
+						_schema text DEFAULT NULL, _table text DEFAULT NULL, _column text DEFAULT NULL,
+						_datatype text DEFAULT NULL, _constraint text DEFAULT NULL)
+RETURNS void AS $$
+kwargs = { "message":_message, "detail":_detail, "hint":_hint,
+			"sqlstate":_sqlstate, "schema":_schema, "table":_table,
+			"column":_column, "datatype":_datatype, "constraint":_constraint }
+# ignore None values - should work on Python2.3
+dict = {}
+for k in kwargs:
+	if kwargs[k] is not None:
+		dict[k] = kwargs[k]
+plpy.error(**dict)
+$$ LANGUAGE plpythonu;
+SELECT raise_exception('hello', 'world');
+ERROR:  plpy.Error: hello
+DETAIL:  world
+CONTEXT:  Traceback (most recent call last):
+  PL/Python function "raise_exception", line 10, in <module>
+    plpy.error(**dict)
+PL/Python function "raise_exception"
+SELECT raise_exception('message text', 'detail text', _sqlstate => 'YY333');
+ERROR:  plpy.Error: message text
+DETAIL:  detail text
+CONTEXT:  Traceback (most recent call last):
+  PL/Python function "raise_exception", line 10, in <module>
+    plpy.error(**dict)
+PL/Python function "raise_exception"
+SELECT raise_exception(_message => 'message text',
+						_detail => 'detail text',
+						_hint => 'hint text',
+						_sqlstate => 'XX555',
+						_schema => 'schema text',
+						_table => 'table text',
+						_column => 'column text',
+						_datatype => 'datatype text',
+						_constraint => 'constraint text');
+ERROR:  plpy.Error: message text
+DETAIL:  detail text
+HINT:  hint text
+CONTEXT:  Traceback (most recent call last):
+  PL/Python function "raise_exception", line 10, in <module>
+    plpy.error(**dict)
+PL/Python function "raise_exception"
+SELECT raise_exception(_message => 'message text',
+						_hint => 'hint text',
+						_schema => 'schema text',
+						_column => 'column text',
+						_constraint => 'constraint text');
+ERROR:  plpy.Error: message text
+HINT:  hint text
+CONTEXT:  Traceback (most recent call last):
+  PL/Python function "raise_exception", line 10, in <module>
+    plpy.error(**dict)
+PL/Python function "raise_exception"
+DO $$
+DECLARE
+  __message text;
+  __detail text;
+  __hint text;
+  __sqlstate text;
+  __schema_name text;
+  __table_name text;
+  __column_name text;
+  __datatype text;
+  __constraint text;
+BEGIN
+  BEGIN
+    PERFORM raise_exception(_message => 'message text',
+                            _detail => 'detail text',
+                            _hint => 'hint text',
+                            _sqlstate => 'XX555',
+                            _schema => 'schema text',
+                            _table => 'table text',
+                            _column => 'column text',
+                            _datatype => 'datatype text',
+                            _constraint => 'constraint text');
+  EXCEPTION WHEN SQLSTATE 'XX555' THEN
+    GET STACKED DIAGNOSTICS __message = MESSAGE_TEXT,
+                            __detail = PG_EXCEPTION_DETAIL,
+                            __hint = PG_EXCEPTION_HINT,
+                            __sqlstate = RETURNED_SQLSTATE,
+                            __schema_name = SCHEMA_NAME,
+                            __table_name = TABLE_NAME,
+                            __column_name = COLUMN_NAME,
+                            __datatype = PG_DATATYPE_NAME,
+                            __constraint = CONSTRAINT_NAME;
+    RAISE NOTICE 'handled exception'
+       USING DETAIL = format('message:(%s), detail:(%s), hint: (%s), sqlstate: (%s), '
+                             'schema:(%s), table:(%s), column:(%s), datatype:(%s), constraint:(%s)',
+                             __message, __detail, __hint, __sqlstate, __schema_name,
+                             __table_name, __column_name, __datatype, __constraint);
+  END;
+END;
+$$;
+NOTICE:  handled exception
+DETAIL:  message:(plpy.Error: message text), detail:(detail text), hint: (hint text), sqlstate: (XX555), schema:(schema text), table:(table text), column:(column text), datatype:(datatype text), constraint:(constraint text)
+-- the displayed context is different between Python2 and Python3,
+-- but that's not important for this test
+\set SHOW_CONTEXT never
+do $$
+try:
+	plpy.execute("select raise_exception(_message => 'my message', _sqlstate => 'XX987', _hint => 'some hint', _table=> 'users_tab', _datatype => 'user_type')")
+except Exception, e:
+	plpy.info(e.spidata)
+	raise e
+$$ LANGUAGE plpythonu;
+INFO:  (119577128, None, 'some hint', None, 0, None, 'users_tab', None, 'user_type', None)
+ERROR:  plpy.SPIError: plpy.Error: my message
+HINT:  some hint
+do $$
+try:
+  plpy.error(message  = 'my message', sqlstate = 'XX987', hint = 'some hint', table = 'users_tab', datatype = 'user_type')
+except Exception, e:
+  plpy.info('sqlstate: %s, hint: %s, tablename: %s, datatype: %s' % (e.sqlstate, e.hint, e.table_name, e.datatype_name))
+  raise e
+$$ LANGUAGE plpythonu;
+INFO:  sqlstate: XX987, hint: some hint, tablename: users_tab, datatype: user_type
+ERROR:  plpy.Error: my message
+HINT:  some hint
diff --git a/src/pl/plpython/expected/plpython_test.out b/src/pl/plpython/expected/plpython_test.out
index bdff07a5fb09471cdf84e652159effe108c50d78..adb82a89d604fc29e11501116fa7fe31e4b7f198 100644
--- a/src/pl/plpython/expected/plpython_test.out
+++ b/src/pl/plpython/expected/plpython_test.out
@@ -72,194 +72,3 @@ CONTEXT:  Traceback (most recent call last):
   PL/Python function "elog_test_basic", line 10, in <module>
     plpy.error('error')
 PL/Python function "elog_test_basic"
-CREATE FUNCTION elog_test() RETURNS void
-AS $$
-plpy.debug('debug', detail = 'some detail')
-plpy.log('log', detail = 'some detail')
-plpy.info('info', detail = 'some detail')
-plpy.info()
-plpy.info('the question', detail = 42);
-plpy.info('This is message text.',
-                    detail = 'This is detail text',
-                    hint = 'This is hint text.',
-                    sqlstate = 'XX000',
-                    schema = 'any info about schema',
-                    table = 'any info about table',
-                    column = 'any info about column',
-                    datatype = 'any info about datatype',
-                    constraint = 'any info about constraint')
-plpy.notice('notice', detail = 'some detail')
-plpy.warning('warning', detail = 'some detail')
-plpy.error('stop on error', detail = 'some detail', hint = 'some hint')
-$$ LANGUAGE plpythonu;
-SELECT elog_test();
-INFO:  info
-DETAIL:  some detail
-INFO:  ()
-INFO:  the question
-DETAIL:  42
-INFO:  This is message text.
-DETAIL:  This is detail text
-HINT:  This is hint text.
-NOTICE:  notice
-DETAIL:  some detail
-WARNING:  warning
-DETAIL:  some detail
-ERROR:  plpy.Error: stop on error
-DETAIL:  some detail
-HINT:  some hint
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "elog_test", line 18, in <module>
-    plpy.error('stop on error', detail = 'some detail', hint = 'some hint')
-PL/Python function "elog_test"
-do $$ plpy.info('other types', detail = (10,20)) $$ LANGUAGE plpythonu;
-INFO:  other types
-DETAIL:  (10, 20)
-do $$
-import time;
-from datetime import date
-plpy.info('other types', detail = date(2016,2,26))
-$$ LANGUAGE plpythonu;
-INFO:  other types
-DETAIL:  2016-02-26
-do $$
-basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
-plpy.info('other types', detail = basket)
-$$ LANGUAGE plpythonu;
-INFO:  other types
-DETAIL:  ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
--- should fail
-do $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpythonu;
-ERROR:  invalid SQLSTATE code
-CONTEXT:  PL/Python anonymous code block
-do $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpythonu;
-ERROR:  'blabla' is an invalid keyword argument for this function
-CONTEXT:  PL/Python anonymous code block
-do $$ plpy.info('first message', message='second message') $$ LANGUAGE plpythonu;
-ERROR:  the message is already specified
-CONTEXT:  PL/Python anonymous code block
-do $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpythonu;
-ERROR:  the message is already specified
-CONTEXT:  PL/Python anonymous code block
--- raise exception in python, handle exception in plgsql
-CREATE OR REPLACE FUNCTION raise_exception(_message text, _detail text DEFAULT NULL, _hint text DEFAULT NULL,
-						_sqlstate text DEFAULT NULL,
-						_schema text DEFAULT NULL, _table text DEFAULT NULL, _column text DEFAULT NULL,
-						_datatype text DEFAULT NULL, _constraint text DEFAULT NULL)
-RETURNS void AS $$
-kwargs = { "message":_message, "detail":_detail, "hint":_hint,
-			"sqlstate":_sqlstate, "schema":_schema, "table":_table,
-			"column":_column, "datatype":_datatype, "constraint":_constraint }
-# ignore None values - should work on Python2.3
-dict = {}
-for k in kwargs:
-	if kwargs[k] is not None:
-		dict[k] = kwargs[k]
-plpy.error(**dict)
-$$ LANGUAGE plpythonu;
-SELECT raise_exception('hello', 'world');
-ERROR:  plpy.Error: hello
-DETAIL:  world
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "raise_exception", line 10, in <module>
-    plpy.error(**dict)
-PL/Python function "raise_exception"
-SELECT raise_exception('message text', 'detail text', _sqlstate => 'YY333');
-ERROR:  plpy.Error: message text
-DETAIL:  detail text
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "raise_exception", line 10, in <module>
-    plpy.error(**dict)
-PL/Python function "raise_exception"
-SELECT raise_exception(_message => 'message text',
-						_detail => 'detail text',
-						_hint => 'hint text',
-						_sqlstate => 'XX555',
-						_schema => 'schema text',
-						_table => 'table text',
-						_column => 'column text',
-						_datatype => 'datatype text',
-						_constraint => 'constraint text');
-ERROR:  plpy.Error: message text
-DETAIL:  detail text
-HINT:  hint text
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "raise_exception", line 10, in <module>
-    plpy.error(**dict)
-PL/Python function "raise_exception"
-SELECT raise_exception(_message => 'message text',
-						_hint => 'hint text',
-						_schema => 'schema text',
-						_column => 'column text',
-						_constraint => 'constraint text');
-ERROR:  plpy.Error: message text
-HINT:  hint text
-CONTEXT:  Traceback (most recent call last):
-  PL/Python function "raise_exception", line 10, in <module>
-    plpy.error(**dict)
-PL/Python function "raise_exception"
-DO $$
-DECLARE
-  __message text;
-  __detail text;
-  __hint text;
-  __sqlstate text;
-  __schema_name text;
-  __table_name text;
-  __column_name text;
-  __datatype text;
-  __constraint text;
-BEGIN
-  BEGIN
-    PERFORM raise_exception(_message => 'message text',
-                            _detail => 'detail text',
-                            _hint => 'hint text',
-                            _sqlstate => 'XX555',
-                            _schema => 'schema text',
-                            _table => 'table text',
-                            _column => 'column text',
-                            _datatype => 'datatype text',
-                            _constraint => 'constraint text');
-  EXCEPTION WHEN SQLSTATE 'XX555' THEN
-    GET STACKED DIAGNOSTICS __message = MESSAGE_TEXT,
-                            __detail = PG_EXCEPTION_DETAIL,
-                            __hint = PG_EXCEPTION_HINT,
-                            __sqlstate = RETURNED_SQLSTATE,
-                            __schema_name = SCHEMA_NAME,
-                            __table_name = TABLE_NAME,
-                            __column_name = COLUMN_NAME,
-                            __datatype = PG_DATATYPE_NAME,
-                            __constraint = CONSTRAINT_NAME;
-    RAISE NOTICE 'handled exception'
-       USING DETAIL = format('message:(%s), detail:(%s), hint: (%s), sqlstate: (%s), '
-                             'schema:(%s), table:(%s), column:(%s), datatype:(%s), constraint:(%s)',
-                             __message, __detail, __hint, __sqlstate, __schema_name,
-                             __table_name, __column_name, __datatype, __constraint);
-  END;
-END;
-$$;
-NOTICE:  handled exception
-DETAIL:  message:(plpy.Error: message text), detail:(detail text), hint: (hint text), sqlstate: (XX555), schema:(schema text), table:(table text), column:(column text), datatype:(datatype text), constraint:(constraint text)
--- the displayed context is different between Python2 and Python3,
--- but that's not important for this test
-\set SHOW_CONTEXT never
-do $$
-try:
-	plpy.execute("select raise_exception(_message => 'my message', _sqlstate => 'XX987', _hint => 'some hint', _table=> 'users_tab', _datatype => 'user_type')")
-except Exception, e:
-	plpy.info(e.spidata)
-	raise e
-$$ LANGUAGE plpythonu;
-INFO:  (119577128, None, 'some hint', None, 0, None, 'users_tab', None, 'user_type', None)
-ERROR:  plpy.SPIError: plpy.Error: my message
-HINT:  some hint
-do $$
-try:
-  plpy.error(message  = 'my message', sqlstate = 'XX987', hint = 'some hint', table = 'users_tab', datatype = 'user_type')
-except Exception, e:
-  plpy.info('sqlstate: %s, hint: %s, tablename: %s, datatype: %s' % (e.sqlstate, e.hint, e.table_name, e.datatype_name))
-  raise e
-$$ LANGUAGE plpythonu;
-INFO:  sqlstate: XX987, hint: some hint, tablename: users_tab, datatype: user_type
-ERROR:  plpy.Error: my message
-HINT:  some hint
diff --git a/src/pl/plpython/sql/plpython_ereport.sql b/src/pl/plpython/sql/plpython_ereport.sql
new file mode 100644
index 0000000000000000000000000000000000000000..8303e15dcde4f99f5f1bc854e50df047c3db9c9d
--- /dev/null
+++ b/src/pl/plpython/sql/plpython_ereport.sql
@@ -0,0 +1,137 @@
+CREATE FUNCTION elog_test() RETURNS void
+AS $$
+plpy.debug('debug', detail = 'some detail')
+plpy.log('log', detail = 'some detail')
+plpy.info('info', detail = 'some detail')
+plpy.info()
+plpy.info('the question', detail = 42);
+plpy.info('This is message text.',
+                    detail = 'This is detail text',
+                    hint = 'This is hint text.',
+                    sqlstate = 'XX000',
+                    schema = 'any info about schema',
+                    table = 'any info about table',
+                    column = 'any info about column',
+                    datatype = 'any info about datatype',
+                    constraint = 'any info about constraint')
+plpy.notice('notice', detail = 'some detail')
+plpy.warning('warning', detail = 'some detail')
+plpy.error('stop on error', detail = 'some detail', hint = 'some hint')
+$$ LANGUAGE plpythonu;
+
+SELECT elog_test();
+
+do $$ plpy.info('other types', detail = (10,20)) $$ LANGUAGE plpythonu;
+
+do $$
+import time;
+from datetime import date
+plpy.info('other types', detail = date(2016,2,26))
+$$ LANGUAGE plpythonu;
+
+do $$
+basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
+plpy.info('other types', detail = basket)
+$$ LANGUAGE plpythonu;
+
+-- should fail
+do $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpythonu;
+do $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpythonu;
+do $$ plpy.info('first message', message='second message') $$ LANGUAGE plpythonu;
+do $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpythonu;
+
+-- raise exception in python, handle exception in plgsql
+CREATE OR REPLACE FUNCTION raise_exception(_message text, _detail text DEFAULT NULL, _hint text DEFAULT NULL,
+						_sqlstate text DEFAULT NULL,
+						_schema text DEFAULT NULL, _table text DEFAULT NULL, _column text DEFAULT NULL,
+						_datatype text DEFAULT NULL, _constraint text DEFAULT NULL)
+RETURNS void AS $$
+kwargs = { "message":_message, "detail":_detail, "hint":_hint,
+			"sqlstate":_sqlstate, "schema":_schema, "table":_table,
+			"column":_column, "datatype":_datatype, "constraint":_constraint }
+# ignore None values - should work on Python2.3
+dict = {}
+for k in kwargs:
+	if kwargs[k] is not None:
+		dict[k] = kwargs[k]
+plpy.error(**dict)
+$$ LANGUAGE plpythonu;
+
+SELECT raise_exception('hello', 'world');
+SELECT raise_exception('message text', 'detail text', _sqlstate => 'YY333');
+SELECT raise_exception(_message => 'message text',
+						_detail => 'detail text',
+						_hint => 'hint text',
+						_sqlstate => 'XX555',
+						_schema => 'schema text',
+						_table => 'table text',
+						_column => 'column text',
+						_datatype => 'datatype text',
+						_constraint => 'constraint text');
+
+SELECT raise_exception(_message => 'message text',
+						_hint => 'hint text',
+						_schema => 'schema text',
+						_column => 'column text',
+						_constraint => 'constraint text');
+
+DO $$
+DECLARE
+  __message text;
+  __detail text;
+  __hint text;
+  __sqlstate text;
+  __schema_name text;
+  __table_name text;
+  __column_name text;
+  __datatype text;
+  __constraint text;
+BEGIN
+  BEGIN
+    PERFORM raise_exception(_message => 'message text',
+                            _detail => 'detail text',
+                            _hint => 'hint text',
+                            _sqlstate => 'XX555',
+                            _schema => 'schema text',
+                            _table => 'table text',
+                            _column => 'column text',
+                            _datatype => 'datatype text',
+                            _constraint => 'constraint text');
+  EXCEPTION WHEN SQLSTATE 'XX555' THEN
+    GET STACKED DIAGNOSTICS __message = MESSAGE_TEXT,
+                            __detail = PG_EXCEPTION_DETAIL,
+                            __hint = PG_EXCEPTION_HINT,
+                            __sqlstate = RETURNED_SQLSTATE,
+                            __schema_name = SCHEMA_NAME,
+                            __table_name = TABLE_NAME,
+                            __column_name = COLUMN_NAME,
+                            __datatype = PG_DATATYPE_NAME,
+                            __constraint = CONSTRAINT_NAME;
+    RAISE NOTICE 'handled exception'
+       USING DETAIL = format('message:(%s), detail:(%s), hint: (%s), sqlstate: (%s), '
+                             'schema:(%s), table:(%s), column:(%s), datatype:(%s), constraint:(%s)',
+                             __message, __detail, __hint, __sqlstate, __schema_name,
+                             __table_name, __column_name, __datatype, __constraint);
+  END;
+END;
+$$;
+
+-- the displayed context is different between Python2 and Python3,
+-- but that's not important for this test
+\set SHOW_CONTEXT never
+
+do $$
+try:
+	plpy.execute("select raise_exception(_message => 'my message', _sqlstate => 'XX987', _hint => 'some hint', _table=> 'users_tab', _datatype => 'user_type')")
+except Exception, e:
+	plpy.info(e.spidata)
+	raise e
+$$ LANGUAGE plpythonu;
+
+do $$
+try:
+  plpy.error(message  = 'my message', sqlstate = 'XX987', hint = 'some hint', table = 'users_tab', datatype = 'user_type')
+except Exception, e:
+  plpy.info('sqlstate: %s, hint: %s, tablename: %s, datatype: %s' % (e.sqlstate, e.hint, e.table_name, e.datatype_name))
+  raise e
+$$ LANGUAGE plpythonu;
diff --git a/src/pl/plpython/sql/plpython_test.sql b/src/pl/plpython/sql/plpython_test.sql
index b74c68fe3e64da73f9ea846fc4e7a298ceef1e88..fa3c465ef86b79fe6bc16718406d5ff73182bb89 100644
--- a/src/pl/plpython/sql/plpython_test.sql
+++ b/src/pl/plpython/sql/plpython_test.sql
@@ -50,141 +50,3 @@ plpy.error('error')
 $$ LANGUAGE plpythonu;
 
 SELECT elog_test_basic();
-
-CREATE FUNCTION elog_test() RETURNS void
-AS $$
-plpy.debug('debug', detail = 'some detail')
-plpy.log('log', detail = 'some detail')
-plpy.info('info', detail = 'some detail')
-plpy.info()
-plpy.info('the question', detail = 42);
-plpy.info('This is message text.',
-                    detail = 'This is detail text',
-                    hint = 'This is hint text.',
-                    sqlstate = 'XX000',
-                    schema = 'any info about schema',
-                    table = 'any info about table',
-                    column = 'any info about column',
-                    datatype = 'any info about datatype',
-                    constraint = 'any info about constraint')
-plpy.notice('notice', detail = 'some detail')
-plpy.warning('warning', detail = 'some detail')
-plpy.error('stop on error', detail = 'some detail', hint = 'some hint')
-$$ LANGUAGE plpythonu;
-
-SELECT elog_test();
-
-do $$ plpy.info('other types', detail = (10,20)) $$ LANGUAGE plpythonu;
-
-do $$
-import time;
-from datetime import date
-plpy.info('other types', detail = date(2016,2,26))
-$$ LANGUAGE plpythonu;
-
-do $$
-basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
-plpy.info('other types', detail = basket)
-$$ LANGUAGE plpythonu;
-
--- should fail
-do $$ plpy.info('wrong sqlstate', sqlstate='54444A') $$ LANGUAGE plpythonu;
-do $$ plpy.info('unsupported argument', blabla='fooboo') $$ LANGUAGE plpythonu;
-do $$ plpy.info('first message', message='second message') $$ LANGUAGE plpythonu;
-do $$ plpy.info('first message', 'second message', message='third message') $$ LANGUAGE plpythonu;
-
--- raise exception in python, handle exception in plgsql
-CREATE OR REPLACE FUNCTION raise_exception(_message text, _detail text DEFAULT NULL, _hint text DEFAULT NULL,
-						_sqlstate text DEFAULT NULL,
-						_schema text DEFAULT NULL, _table text DEFAULT NULL, _column text DEFAULT NULL,
-						_datatype text DEFAULT NULL, _constraint text DEFAULT NULL)
-RETURNS void AS $$
-kwargs = { "message":_message, "detail":_detail, "hint":_hint,
-			"sqlstate":_sqlstate, "schema":_schema, "table":_table,
-			"column":_column, "datatype":_datatype, "constraint":_constraint }
-# ignore None values - should work on Python2.3
-dict = {}
-for k in kwargs:
-	if kwargs[k] is not None:
-		dict[k] = kwargs[k]
-plpy.error(**dict)
-$$ LANGUAGE plpythonu;
-
-SELECT raise_exception('hello', 'world');
-SELECT raise_exception('message text', 'detail text', _sqlstate => 'YY333');
-SELECT raise_exception(_message => 'message text',
-						_detail => 'detail text',
-						_hint => 'hint text',
-						_sqlstate => 'XX555',
-						_schema => 'schema text',
-						_table => 'table text',
-						_column => 'column text',
-						_datatype => 'datatype text',
-						_constraint => 'constraint text');
-
-SELECT raise_exception(_message => 'message text',
-						_hint => 'hint text',
-						_schema => 'schema text',
-						_column => 'column text',
-						_constraint => 'constraint text');
-
-DO $$
-DECLARE
-  __message text;
-  __detail text;
-  __hint text;
-  __sqlstate text;
-  __schema_name text;
-  __table_name text;
-  __column_name text;
-  __datatype text;
-  __constraint text;
-BEGIN
-  BEGIN
-    PERFORM raise_exception(_message => 'message text',
-                            _detail => 'detail text',
-                            _hint => 'hint text',
-                            _sqlstate => 'XX555',
-                            _schema => 'schema text',
-                            _table => 'table text',
-                            _column => 'column text',
-                            _datatype => 'datatype text',
-                            _constraint => 'constraint text');
-  EXCEPTION WHEN SQLSTATE 'XX555' THEN
-    GET STACKED DIAGNOSTICS __message = MESSAGE_TEXT,
-                            __detail = PG_EXCEPTION_DETAIL,
-                            __hint = PG_EXCEPTION_HINT,
-                            __sqlstate = RETURNED_SQLSTATE,
-                            __schema_name = SCHEMA_NAME,
-                            __table_name = TABLE_NAME,
-                            __column_name = COLUMN_NAME,
-                            __datatype = PG_DATATYPE_NAME,
-                            __constraint = CONSTRAINT_NAME;
-    RAISE NOTICE 'handled exception'
-       USING DETAIL = format('message:(%s), detail:(%s), hint: (%s), sqlstate: (%s), '
-                             'schema:(%s), table:(%s), column:(%s), datatype:(%s), constraint:(%s)',
-                             __message, __detail, __hint, __sqlstate, __schema_name,
-                             __table_name, __column_name, __datatype, __constraint);
-  END;
-END;
-$$;
-
--- the displayed context is different between Python2 and Python3,
--- but that's not important for this test
-\set SHOW_CONTEXT never
-
-do $$
-try:
-	plpy.execute("select raise_exception(_message => 'my message', _sqlstate => 'XX987', _hint => 'some hint', _table=> 'users_tab', _datatype => 'user_type')")
-except Exception, e:
-	plpy.info(e.spidata)
-	raise e
-$$ LANGUAGE plpythonu;
-
-do $$
-try:
-  plpy.error(message  = 'my message', sqlstate = 'XX987', hint = 'some hint', table = 'users_tab', datatype = 'user_type')
-except Exception, e:
-  plpy.info('sqlstate: %s, hint: %s, tablename: %s, datatype: %s' % (e.sqlstate, e.hint, e.table_name, e.datatype_name))
-  raise e
-$$ LANGUAGE plpythonu;