summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErlend E. Aasland <erlend@python.org>2023-08-27 22:18:32 (GMT)
committerGitHub <noreply@github.com>2023-08-27 22:18:32 (GMT)
commitd0160c7c22c8dff0a61c49b5304244df6e36465e (patch)
tree6604b133b8365249d7a768d133b86ee6c8bdf411
parentfecb9faf0b2df6a219696502a34b918c5d2bfe9d (diff)
downloadcpython-d0160c7c22c8dff0a61c49b5304244df6e36465e.zip
cpython-d0160c7c22c8dff0a61c49b5304244df6e36465e.tar.gz
cpython-d0160c7c22c8dff0a61c49b5304244df6e36465e.tar.bz2
gh-64662: Add virtual table support to sqlite3.Connection.iterdump (#108340)
Co-authored-by: Aviv Palivoda <palaviv@gmail.com>
-rw-r--r--Doc/whatsnew/3.13.rst3
-rw-r--r--Lib/sqlite3/dump.py20
-rw-r--r--Lib/test/test_sqlite3/test_dump.py20
-rw-r--r--Misc/NEWS.d/next/Library/2023-08-22-22-29-42.gh-issue-64662.jHl_Bt.rst2
4 files changed, 38 insertions, 7 deletions
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 4ff12b1..2770207 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -165,6 +165,9 @@ sqlite3
object is not :meth:`closed <sqlite3.Connection.close>` explicitly.
(Contributed by Erlend E. Aasland in :gh:`105539`.)
+* Add support for virtual tables to :meth:`sqlite3.Connection.iterdump`.
+ (Contributed by Aviv Palivoda in :gh:`64662`.)
+
tkinter
-------
diff --git a/Lib/sqlite3/dump.py b/Lib/sqlite3/dump.py
index cf73cc3..ead3360 100644
--- a/Lib/sqlite3/dump.py
+++ b/Lib/sqlite3/dump.py
@@ -24,6 +24,7 @@ def _iterdump(connection):
directly but instead called from the Connection method, iterdump().
"""
+ writeable_schema = False
cu = connection.cursor()
yield('BEGIN TRANSACTION;')
@@ -50,13 +51,15 @@ def _iterdump(connection):
yield('ANALYZE "sqlite_master";')
elif table_name.startswith('sqlite_'):
continue
- # NOTE: Virtual table support not implemented
- #elif sql.startswith('CREATE VIRTUAL TABLE'):
- # qtable = table_name.replace("'", "''")
- # yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"\
- # "VALUES('table','{0}','{0}',0,'{1}');".format(
- # qtable,
- # sql.replace("''")))
+ elif sql.startswith('CREATE VIRTUAL TABLE'):
+ if not writeable_schema:
+ writeable_schema = True
+ yield('PRAGMA writable_schema=ON;')
+ yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
+ "VALUES('table',{0},{0},0,{1});".format(
+ _quote_value(table_name),
+ _quote_value(sql),
+ ))
else:
yield('{0};'.format(sql))
@@ -85,6 +88,9 @@ def _iterdump(connection):
for name, type, sql in schema_res.fetchall():
yield('{0};'.format(sql))
+ if writeable_schema:
+ yield('PRAGMA writable_schema=OFF;')
+
# gh-79009: Yield statements concerning the sqlite_sequence table at the
# end of the transaction.
for row in sqlite_sequence:
diff --git a/Lib/test/test_sqlite3/test_dump.py b/Lib/test/test_sqlite3/test_dump.py
index 5f6811f..3107e1b 100644
--- a/Lib/test/test_sqlite3/test_dump.py
+++ b/Lib/test/test_sqlite3/test_dump.py
@@ -113,6 +113,26 @@ class DumpTests(MemoryDatabaseMixin, unittest.TestCase):
got = list(self.cx.iterdump())
self.assertEqual(expected, got)
+ def test_dump_virtual_tables(self):
+ # gh-64662
+ expected = [
+ "BEGIN TRANSACTION;",
+ "PRAGMA writable_schema=ON;",
+ ("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
+ "VALUES('table','test','test',0,'CREATE VIRTUAL TABLE test USING fts4(example)');"),
+ "CREATE TABLE 'test_content'(docid INTEGER PRIMARY KEY, 'c0example');",
+ "CREATE TABLE 'test_docsize'(docid INTEGER PRIMARY KEY, size BLOB);",
+ ("CREATE TABLE 'test_segdir'(level INTEGER,idx INTEGER,start_block INTEGER,"
+ "leaves_end_block INTEGER,end_block INTEGER,root BLOB,PRIMARY KEY(level, idx));"),
+ "CREATE TABLE 'test_segments'(blockid INTEGER PRIMARY KEY, block BLOB);",
+ "CREATE TABLE 'test_stat'(id INTEGER PRIMARY KEY, value BLOB);",
+ "PRAGMA writable_schema=OFF;",
+ "COMMIT;"
+ ]
+ self.cu.execute("CREATE VIRTUAL TABLE test USING fts4(example)")
+ actual = list(self.cx.iterdump())
+ self.assertEqual(expected, actual)
+
if __name__ == "__main__":
unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2023-08-22-22-29-42.gh-issue-64662.jHl_Bt.rst b/Misc/NEWS.d/next/Library/2023-08-22-22-29-42.gh-issue-64662.jHl_Bt.rst
new file mode 100644
index 0000000..3fddc8c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-08-22-22-29-42.gh-issue-64662.jHl_Bt.rst
@@ -0,0 +1,2 @@
+Add support for virtual tables to :meth:`sqlite3.Connection.iterdump`. Patch
+by Aviv Palivoda.