[pypy-commit] pypy default: test and fix for _sqlite3 'on conflict rollback' in executemany

bdkearns noreply at buildbot.pypy.org
Wed Mar 6 08:17:20 CET 2013


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r62120:da02a02dadeb
Date: 2013-03-06 02:15 -0500
http://bitbucket.org/pypy/pypy/changeset/da02a02dadeb/

Log:	test and fix for _sqlite3 'on conflict rollback' in executemany

diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py
--- a/lib_pypy/_sqlite3.py
+++ b/lib_pypy/_sqlite3.py
@@ -867,8 +867,12 @@
                 self.__statement.set_params(params)
                 ret = sqlite.sqlite3_step(self.__statement.statement)
                 if ret != SQLITE_DONE:
+                    self.__statement.reset()
+                    self.__connection._in_transaction = \
+                            not sqlite.sqlite3_get_autocommit(self.__connection._db)
                     raise self.__connection._get_exception(ret)
                 self.__rowcount += sqlite.sqlite3_changes(self.__connection._db)
+            self.__statement.reset()
 
         return self
 
diff --git a/pypy/module/test_lib_pypy/test_sqlite3.py b/pypy/module/test_lib_pypy/test_sqlite3.py
--- a/pypy/module/test_lib_pypy/test_sqlite3.py
+++ b/pypy/module/test_lib_pypy/test_sqlite3.py
@@ -106,3 +106,20 @@
         open_many(True)
     finally:
         resource.setrlimit(resource.RLIMIT_NOFILE, limit)
+
+def test_on_conflict_rollback_executemany():
+    major, minor, micro = _sqlite3.sqlite_version.split('.')
+    if (int(major), int(minor), int(micro)) < (3, 2, 2):
+        pytest.skip("requires sqlite3 version >= 3.2.2")
+    con = _sqlite3.connect(":memory:")
+    con.execute("create table foo(x, unique(x) on conflict rollback)")
+    con.execute("insert into foo(x) values (1)")
+    try:
+        con.executemany("insert into foo(x) values (?)", [[1]])
+    except _sqlite3.DatabaseError:
+        pass
+    con.execute("insert into foo(x) values (2)")
+    try:
+        con.commit()
+    except _sqlite3.OperationalError:
+        pytest.fail("_sqlite3 knew nothing about the implicit ROLLBACK")


More information about the pypy-commit mailing list