From: Benjamin Peterson Date: Mon, 16 Jan 2017 08:07:27 +0000 (-0800) Subject: revert dd13098a5dc2 (#29006, #10513) X-Git-Tag: v2.7.14rc1~297 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9ce1564cd91049730c542def380a5cca200a6390;p=python revert dd13098a5dc2 (#29006, #10513) --- diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 6ac40167de..36fec59f11 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -328,6 +328,36 @@ class RegressionTests(unittest.TestCase): 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")): + 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 --git a/Misc/NEWS b/Misc/NEWS index b1d35670db..155ec8e066 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,9 +29,6 @@ Library - Issue #29082: Fixed loading libraries in ctypes by unicode names on Windows. Original patch by Chi Hsuan Yen. -- Issue #29006: Revert change from issue #10513 for making sqlite more liable to - emit "database table is locked" errors. - - Issue #29188: Support glibc 2.24 on Linux: don't use getentropy() function but read from /dev/urandom to get random bytes, for example in os.urandom(). On Linux, getentropy() is implemented which getrandom() is blocking mode, @@ -257,6 +254,9 @@ Library - Issue #19884: Avoid spurious output on OS X with Gnu Readline. +- Issue #10513: Fix a regression in Connection.commit(). Statements should + not be reset after a commit. + - Issue #2466: posixpath.ismount now correctly recognizes mount points which the user does not have permission to access. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 4e28289125..237d6e419a 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -467,7 +467,6 @@ PyObject* pysqlite_connection_commit(pysqlite_Connection* self, PyObject* args) } if (self->inTransaction) { - pysqlite_do_all_statements(self, ACTION_RESET, 0); Py_BEGIN_ALLOW_THREADS rc = sqlite3_prepare(self->db, "COMMIT", -1, &statement, &tail);