mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	PL/Python: Move ereport wrapper test cases to separate file
In commit 5c3c3cd0a3, the new tests were
apparently just dumped into the first convenient file.  Move them to a
separate file dedicated to testing that functionality and leave the
plpython_test test to test basic functionality, as it did before.
			
			
This commit is contained in:
		@@ -84,6 +84,7 @@ REGRESS = \
 | 
				
			|||||||
	plpython_trigger \
 | 
						plpython_trigger \
 | 
				
			||||||
	plpython_types \
 | 
						plpython_types \
 | 
				
			||||||
	plpython_error \
 | 
						plpython_error \
 | 
				
			||||||
 | 
						plpython_ereport \
 | 
				
			||||||
	plpython_unicode \
 | 
						plpython_unicode \
 | 
				
			||||||
	plpython_quote \
 | 
						plpython_quote \
 | 
				
			||||||
	plpython_composite \
 | 
						plpython_composite \
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										191
									
								
								src/pl/plpython/expected/plpython_ereport.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								src/pl/plpython/expected/plpython_ereport.out
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
				
			||||||
@@ -72,194 +72,3 @@ CONTEXT:  Traceback (most recent call last):
 | 
				
			|||||||
  PL/Python function "elog_test_basic", line 10, in <module>
 | 
					  PL/Python function "elog_test_basic", line 10, in <module>
 | 
				
			||||||
    plpy.error('error')
 | 
					    plpy.error('error')
 | 
				
			||||||
PL/Python function "elog_test_basic"
 | 
					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
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										137
									
								
								src/pl/plpython/sql/plpython_ereport.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								src/pl/plpython/sql/plpython_ereport.sql
									
									
									
									
									
										Normal file
									
								
							@@ -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;
 | 
				
			||||||
@@ -50,141 +50,3 @@ plpy.error('error')
 | 
				
			|||||||
$$ LANGUAGE plpythonu;
 | 
					$$ LANGUAGE plpythonu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT elog_test_basic();
 | 
					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;
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user