]> granicus.if.org Git - python/commitdiff
Issue #18519: Fix test_sqlite on old versions of libsqlite3
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 1 Aug 2013 23:48:10 +0000 (01:48 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 1 Aug 2013 23:48:10 +0000 (01:48 +0200)
With old SQLite versions, _sqlite3_result_error() sets a new Python exception,
so don't restore the previous exception.

Modules/_sqlite/connection.c

index b56ddac136ea6c4c65e608f9cffc1bb33e03f685..f5e0428edf3594070dc8bb3fd419183df2be5617 100644 (file)
@@ -698,6 +698,7 @@ void _pysqlite_final_callback(sqlite3_context* context)
     _Py_IDENTIFIER(finalize);
     int ok;
     PyObject *exception, *value, *tb;
+    int restore;
 
 #ifdef WITH_THREAD
     PyGILState_STATE threadstate;
@@ -715,6 +716,7 @@ void _pysqlite_final_callback(sqlite3_context* context)
 
     /* Keep the exception (if any) of the last call to step() */
     PyErr_Fetch(&exception, &value, &tb);
+    restore = 1;
 
     function_result = _PyObject_CallMethodId(*aggregate_instance, &PyId_finalize, "");
 
@@ -732,11 +734,18 @@ void _pysqlite_final_callback(sqlite3_context* context)
             PyErr_Clear();
         }
         _sqlite3_result_error(context, "user-defined aggregate's 'finalize' method raised error", -1);
+#if SQLITE_VERSION_NUMBER < 3003003
+        /* with old SQLite versions, _sqlite3_result_error() sets a new Python
+           exception, so don't restore the previous exception */
+        restore = 0;
+#endif
     }
 
-    /* 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);
+    if (restore) {
+        /* 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);
+    }
 
 error:
 #ifdef WITH_THREAD