Fix VACUUM with an open transaction

Database.vacuum() passed VACUUM directly to SQLite, which rejects it while a transaction is open. Commit first so the maintenance operation can run, and cover the reported transaction path with a regression test.

Fixes #479
This commit is contained in:
Sanjay Santhanam 2026-07-13 00:54:42 -07:00
commit 4af18681ca
2 changed files with 12 additions and 0 deletions

View file

@ -1897,6 +1897,7 @@ class Database:
def vacuum(self) -> None:
"Run a SQLite ``VACUUM`` against the database."
self.commit()
self.execute("VACUUM;")
def analyze(self, name: Optional[str] = None) -> None:

View file

@ -1170,6 +1170,17 @@ def test_vacuum(fresh_db):
fresh_db.vacuum()
def test_vacuum_commits_open_transaction(fresh_db):
fresh_db["data"].insert({"foo": "foo"})
fresh_db.begin()
fresh_db.execute("insert into data (foo) values ('bar')")
fresh_db.vacuum()
assert not fresh_db.conn.in_transaction
assert [row["foo"] for row in fresh_db["data"].rows] == ["foo", "bar"]
def test_works_with_pathlib_path(tmpdir):
path = pathlib.Path(tmpdir / "test.db")
db = Database(path)