From: Victor Stinner Date: Wed, 17 Jul 2013 23:42:04 +0000 (+0200) Subject: Issue #18488: _pysqlite_final_callback() should not clear the exception set by X-Git-Tag: v3.4.0a1~156 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9af4cfaced93ea9ec37bb448dd57b8c2014bdaf;p=python Issue #18488: _pysqlite_final_callback() should not clear the exception set by the last call to the step() method of a user function --- diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 04bcdf2ce5..6a58431aa6 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -697,6 +697,7 @@ void _pysqlite_final_callback(sqlite3_context* context) PyObject** aggregate_instance; _Py_IDENTIFIER(finalize); int ok; + PyObject *exception, *value, *tb; #ifdef WITH_THREAD PyGILState_STATE threadstate; @@ -712,7 +713,15 @@ void _pysqlite_final_callback(sqlite3_context* context) goto error; } + /* Keep the exception (if any) of the last call to step() */ + PyErr_Fetch(&exception, &value, &tb); + function_result = _PyObject_CallMethodId(*aggregate_instance, &PyId_finalize, ""); + + /* Restore the exception (if any) of the last call to step(), + but clear also the current exception if finalize() failed */ + PyErr_Restore(exception, value, tb); + Py_DECREF(*aggregate_instance); ok = 0;