mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-08 14:37:35 +08:00
Get rid of the global variable holding the error state
Global error handling led to confusion and was hard to manage. With this change, errors from PostgreSQL are immediately reported to Python as exceptions. This requires setting a Python exception after reporting the caught PostgreSQL error as a warning, because PLy_elog destroys the Python exception state. Ideally, all places where PostgreSQL errors need to be reported back to Python should be wrapped in subtransactions, to make going back to Python from a longjmp safe. This will be handled in a separate patch. Jan Urbański
This commit is contained in:
@ -10,7 +10,7 @@ CREATE FUNCTION sql_syntax_error() RETURNS text
|
||||
SELECT sql_syntax_error();
|
||||
WARNING: PL/Python: plpy.SPIError: unrecognized error in PLy_spi_execute_query
|
||||
CONTEXT: PL/Python function "sql_syntax_error"
|
||||
ERROR: syntax error at or near "syntax"
|
||||
ERROR: PL/Python: plpy.SPIError: syntax error at or near "syntax"
|
||||
LINE 1: syntax error
|
||||
^
|
||||
QUERY: syntax error
|
||||
@ -34,7 +34,7 @@ return rv[0]'
|
||||
SELECT exception_index_invalid_nested();
|
||||
WARNING: PL/Python: plpy.SPIError: unrecognized error in PLy_spi_execute_query
|
||||
CONTEXT: PL/Python function "exception_index_invalid_nested"
|
||||
ERROR: function test5(unknown) does not exist
|
||||
ERROR: PL/Python: plpy.SPIError: function test5(unknown) does not exist
|
||||
LINE 1: SELECT test5('foo')
|
||||
^
|
||||
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
|
||||
@ -56,7 +56,7 @@ return None
|
||||
SELECT invalid_type_uncaught('rick');
|
||||
WARNING: PL/Python: plpy.SPIError: unrecognized error in PLy_spi_prepare
|
||||
CONTEXT: PL/Python function "invalid_type_uncaught"
|
||||
ERROR: type "test" does not exist
|
||||
ERROR: PL/Python: plpy.SPIError: type "test" does not exist
|
||||
CONTEXT: PL/Python function "invalid_type_uncaught"
|
||||
/* for what it's worth catch the exception generated by
|
||||
* the typo, and return None
|
||||
@ -79,8 +79,13 @@ return None
|
||||
SELECT invalid_type_caught('rick');
|
||||
WARNING: PL/Python: plpy.SPIError: unrecognized error in PLy_spi_prepare
|
||||
CONTEXT: PL/Python function "invalid_type_caught"
|
||||
ERROR: type "test" does not exist
|
||||
NOTICE: type "test" does not exist
|
||||
CONTEXT: PL/Python function "invalid_type_caught"
|
||||
invalid_type_caught
|
||||
---------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
/* for what it's worth catch the exception generated by
|
||||
* the typo, and reraise it as a plain error
|
||||
*/
|
||||
@ -101,7 +106,7 @@ return None
|
||||
SELECT invalid_type_reraised('rick');
|
||||
WARNING: PL/Python: plpy.SPIError: unrecognized error in PLy_spi_prepare
|
||||
CONTEXT: PL/Python function "invalid_type_reraised"
|
||||
ERROR: type "test" does not exist
|
||||
ERROR: PL/Python: plpy.Error: type "test" does not exist
|
||||
CONTEXT: PL/Python function "invalid_type_reraised"
|
||||
/* no typo no messing about
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user