changeset: 102917:81f614dd8136 branch: 3.5 parent: 102915:579360b1c8fe user: Berker Peksag date: Fri Aug 26 22:07:51 2016 +0300 files: Lib/sqlite3/test/regression.py Misc/NEWS Modules/_sqlite/connection.c description: Issue #10513: Fix a regression in Connection.commit() Statements should not be reset after a commit. Backported from https://github.com/ghaering/pysqlite/commit/029050896b1e6058573abeef5a8970384c0c7faa diff -r 579360b1c8fe -r 81f614dd8136 Lib/sqlite3/test/regression.py --- a/Lib/sqlite3/test/regression.py Thu Aug 25 21:11:50 2016 -0700 +++ b/Lib/sqlite3/test/regression.py Fri Aug 26 22:07:51 2016 +0300 @@ -322,6 +322,37 @@ self.assertRaises(ValueError, cur.execute, " \0select 2") self.assertRaises(ValueError, cur.execute, "select 2\0") + def CheckCommitCursorReset(self): + """ + Connection.commit() did reset cursors, which made sqlite3 + to return rows multiple times when fetched from cursors + after commit. See issues 10513 and 23129 for details. + """ + con = sqlite.connect(":memory:") + con.executescript(""" + create table t(c); + create table t2(c); + insert into t values(0); + insert into t values(1); + insert into t values(2); + """) + + self.assertEqual(con.isolation_level, "") + + counter = 0 + for i, row in enumerate(con.execute("select c from t")): + with self.subTest(i=i, row=row): + con.execute("insert into t2(c) values (?)", (i,)) + con.commit() + if counter == 0: + self.assertEqual(row[0], 0) + elif counter == 1: + self.assertEqual(row[0], 1) + elif counter == 2: + self.assertEqual(row[0], 2) + counter += 1 + self.assertEqual(counter, 3, "should have returned exactly three rows") + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") diff -r 579360b1c8fe -r 81f614dd8136 Misc/NEWS --- a/Misc/NEWS Thu Aug 25 21:11:50 2016 -0700 +++ b/Misc/NEWS Fri Aug 26 22:07:51 2016 +0300 @@ -50,6 +50,9 @@ Library ------- +- Issue #10513: Fix a regression in Connection.commit(). Statements should + not be reset after a commit. + - A new version of typing.py from https://github.com/python/typing: - Collection (only for 3.6) (Issue #27598) - Add FrozenSet to __all__ (upstream #261) diff -r 579360b1c8fe -r 81f614dd8136 Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c Thu Aug 25 21:11:50 2016 -0700 +++ b/Modules/_sqlite/connection.c Fri Aug 26 22:07:51 2016 +0300 @@ -426,7 +426,6 @@ } if (self->inTransaction) { - pysqlite_do_all_statements(self, ACTION_RESET, 0); Py_BEGIN_ALLOW_THREADS rc = sqlite3_prepare(self->db, "COMMIT", -1, &statement, &tail);