PL/Python: Move ereport wrapper test cases to separate file
In commit 5c3c3cd0a3046339597a03bc708cb5530dc07059, 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:
parent
f64340e743
commit
8359077124
@ -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;
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user