diff options
author | R David Murray <rdmurray@bitdance.com> | 2013-01-10 16:13:34 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2013-01-10 16:13:34 (GMT) |
commit | 7bd04867e53d78ddb0f5e8f78b9256298d41fadd (patch) | |
tree | c6d529a2ceb6a8ec7335f74d53f8d20af6629e4f | |
parent | 8eee081d4041a59b3c8088cba8dcaafc22a88c00 (diff) | |
parent | b52312923bee35b86fc072ec546cc3e588ae64c9 (diff) | |
download | cpython-7bd04867e53d78ddb0f5e8f78b9256298d41fadd.zip cpython-7bd04867e53d78ddb0f5e8f78b9256298d41fadd.tar.gz cpython-7bd04867e53d78ddb0f5e8f78b9256298d41fadd.tar.bz2 |
merge #15545: fix sqlite3.iterdump regression on unsortable row_factory objects.
The fix for issue 9750 introduced a regression 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.
-rw-r--r-- | Lib/sqlite3/dump.py | 3 | ||||
-rw-r--r-- | Lib/sqlite3/test/dump.py | 21 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
3 files changed, 27 insertions, 1 deletions
diff --git a/Lib/sqlite3/dump.py b/Lib/sqlite3/dump.py index da6be68..de9c368 100644 --- a/Lib/sqlite3/dump.py +++ b/Lib/sqlite3/dump.py @@ -25,9 +25,10 @@ def _iterdump(connection): 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 index b200333..a1f45a4 100644 --- a/Lib/sqlite3/test/dump.py +++ b/Lib/sqlite3/test/dump.py @@ -49,6 +49,27 @@ class DumpTests(unittest.TestCase): [self.assertEqual(expected_sqls[i], actual_sqls[i]) for i in range(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")) @@ -142,6 +142,10 @@ Core and Builtins 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 #16491: IDLE now prints chained exception tracebacks. - Issue #15972: Fix error messages when os functions expecting a file name or |