[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