[Python-checkins] cpython (2.7): #15545: sort iterdump via SQL instead of in python code
r.david.murray
python-checkins at python.org
Thu Jan 10 17:31:36 CET 2013
http://hg.python.org/cpython/rev/bb4e4f0cec2e
changeset: 81370:bb4e4f0cec2e
branch: 2.7
parent: 81358:ae1d34142a2a
user: R David Murray <rdmurray at bitdance.com>
date: Thu Jan 10 11:30:51 2013 -0500
summary:
#15545: sort iterdump via SQL instead of in python code
Although there is not a regression in Python2, we make the same update here to
keep the code bases in sync.
(The fix for issue 9750 introduced a regression in Python 3 by sorting the row
objects returned by fetchall. But if a row_factory such as sqlite3.Row is
used, the rows may not be sortable (in Python3), which leads to an exception.
The sorting is still a nice idea, so the patch moves the sort into the sql.)
Fix and test by Peter Otten.
files:
Lib/sqlite3/dump.py | 3 ++-
Lib/sqlite3/test/dump.py | 21 +++++++++++++++++++++
Misc/NEWS | 4 ++++
3 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/Lib/sqlite3/dump.py b/Lib/sqlite3/dump.py
--- a/Lib/sqlite3/dump.py
+++ b/Lib/sqlite3/dump.py
@@ -25,9 +25,10 @@
FROM "sqlite_master"
WHERE "sql" NOT NULL AND
"type" == 'table'
+ ORDER BY "name"
"""
schema_res = cu.execute(q)
- for table_name, type, sql in sorted(schema_res.fetchall()):
+ for table_name, type, sql in schema_res.fetchall():
if table_name == 'sqlite_sequence':
yield('DELETE FROM "sqlite_sequence";')
elif table_name == 'sqlite_stat1':
diff --git a/Lib/sqlite3/test/dump.py b/Lib/sqlite3/test/dump.py
--- a/Lib/sqlite3/test/dump.py
+++ b/Lib/sqlite3/test/dump.py
@@ -49,6 +49,27 @@
[self.assertEqual(expected_sqls[i], actual_sqls[i])
for i in xrange(len(expected_sqls))]
+ def CheckUnorderableRow(self):
+ # iterdump() should be able to cope with unorderable row types (issue #15545)
+ class UnorderableRow:
+ def __init__(self, cursor, row):
+ self.row = row
+ def __getitem__(self, index):
+ return self.row[index]
+ self.cx.row_factory = UnorderableRow
+ CREATE_ALPHA = """CREATE TABLE "alpha" ("one");"""
+ CREATE_BETA = """CREATE TABLE "beta" ("two");"""
+ expected = [
+ "BEGIN TRANSACTION;",
+ CREATE_ALPHA,
+ CREATE_BETA,
+ "COMMIT;"
+ ]
+ self.cu.execute(CREATE_BETA)
+ self.cu.execute(CREATE_ALPHA)
+ got = list(self.cx.iterdump())
+ self.assertEqual(expected, got)
+
def suite():
return unittest.TestSuite(unittest.makeSuite(DumpTests, "Check"))
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -186,6 +186,10 @@
Library
-------
+- Issue #15545: Fix regression in sqlite3's iterdump method where it was
+ failing if the connection used a row factory (such as sqlite3.Row) that
+ produced unsortable objects. (Regression was introduced by fix for 9750).
+
- Issue #16828: Fix error incorrectly raised by bz2.compress(''). Patch by
Martin Packman.
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list