summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/sqlite3/dump.py1
-rw-r--r--Lib/test/test_sqlite3/test_dump.py15
-rw-r--r--Misc/NEWS.d/next/Library/2024-04-24-12-29-33.gh-issue-118221.2k_bac.rst2
3 files changed, 18 insertions, 0 deletions
diff --git a/Lib/sqlite3/dump.py b/Lib/sqlite3/dump.py
index 9dcce7d..57e6a3b 100644
--- a/Lib/sqlite3/dump.py
+++ b/Lib/sqlite3/dump.py
@@ -26,6 +26,7 @@ def _iterdump(connection, *, filter=None):
writeable_schema = False
cu = connection.cursor()
+ cu.row_factory = None # Make sure we get predictable results.
# Disable foreign key constraints, if there is any foreign key violation.
violations = cu.execute("PRAGMA foreign_key_check").fetchall()
if violations:
diff --git a/Lib/test/test_sqlite3/test_dump.py b/Lib/test/test_sqlite3/test_dump.py
index 7261b7f..d508f23 100644
--- a/Lib/test/test_sqlite3/test_dump.py
+++ b/Lib/test/test_sqlite3/test_dump.py
@@ -190,6 +190,21 @@ class DumpTests(MemoryDatabaseMixin, unittest.TestCase):
got = list(self.cx.iterdump())
self.assertEqual(expected, got)
+ def test_dump_custom_row_factory(self):
+ # gh-118221: iterdump should be able to cope with custom row factories.
+ def dict_factory(cu, row):
+ fields = [col[0] for col in cu.description]
+ return dict(zip(fields, row))
+
+ self.cx.row_factory = dict_factory
+ CREATE_TABLE = "CREATE TABLE test(t);"
+ expected = ["BEGIN TRANSACTION;", CREATE_TABLE, "COMMIT;"]
+
+ self.cu.execute(CREATE_TABLE)
+ actual = list(self.cx.iterdump())
+ self.assertEqual(expected, actual)
+ self.assertEqual(self.cx.row_factory, dict_factory)
+
def test_dump_virtual_tables(self):
# gh-64662
expected = [
diff --git a/Misc/NEWS.d/next/Library/2024-04-24-12-29-33.gh-issue-118221.2k_bac.rst b/Misc/NEWS.d/next/Library/2024-04-24-12-29-33.gh-issue-118221.2k_bac.rst
new file mode 100644
index 0000000..9b0ea99
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-04-24-12-29-33.gh-issue-118221.2k_bac.rst
@@ -0,0 +1,2 @@
+Fix a bug where :func:`sqlite3.iterdump` could fail if a custom :attr:`row
+factory <sqlite3.Connection.row_factory>` was used. Patch by Erlend Aasland.