]> granicus.if.org Git - python/commitdiff
Issue #18488: _pysqlite_final_callback() should not clear the exception set by
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 17 Jul 2013 23:42:04 +0000 (01:42 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 17 Jul 2013 23:42:04 +0000 (01:42 +0200)
the last call to the step() method of a user function

Modules/_sqlite/connection.c

index 04bcdf2ce5c074030666aad2fa122c5cb97e2cb2..6a58431aa6c8cb9e5ea728b6e1164a5dca3698cd 100644 (file)
@@ -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;