From 0449ac5c1f5220571bf8aaf0ab560d40bf603fc8 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Fri, 17 May 2024 19:58:02 -0600 Subject: [PATCH] fix: sqlite pragma order for auto_vacuum (#3230) * fix: sqlite pragma order for auto_vacuum Setting the auto_vacuum pragma must come before setting the journal mode otherwise it won't apply. * fix: better documentation for auto_vacuum Co-authored-by: Austin Bonander --------- Co-authored-by: Austin Bonander --- sqlx-sqlite/src/options/mod.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sqlx-sqlite/src/options/mod.rs b/sqlx-sqlite/src/options/mod.rs index 0815d887..b0093f3d 100644 --- a/sqlx-sqlite/src/options/mod.rs +++ b/sqlx-sqlite/src/options/mod.rs @@ -162,6 +162,12 @@ impl SqliteConnectOptions { // https://www.sqlite.org/wal.html#use_of_wal_without_shared_memory pragmas.insert("locking_mode".into(), None); + // `auto_vacuum` needs to be executed before `journal_mode`, if set. + // + // Otherwise, a change in the `journal_mode` setting appears to mark even an empty database as dirty, + // requiring a `vacuum` command to be executed to actually apply the new `auto_vacuum` setting. + pragmas.insert("auto_vacuum".into(), None); + // Don't set `journal_mode` unless the user requested it. // WAL mode is a permanent setting for created databases and changing into or out of it // requires an exclusive lock that can't be waited on with `sqlite3_busy_timeout()`. @@ -176,8 +182,6 @@ impl SqliteConnectOptions { // https://www.sqlite.org/compile.html#default_synchronous. pragmas.insert("synchronous".into(), None); - pragmas.insert("auto_vacuum".into(), None); - // Soft limit on the number of rows that `ANALYZE` touches per index. pragmas.insert("analysis_limit".into(), None);