From 7aa91d7c248a066b4ac18ef852ba8010e22f5b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Francoeur?= Date: Thu, 9 Oct 2025 17:28:48 +0300 Subject: [PATCH 1/9] add pragma autovacuum_mode to simulator --- simulator/generation/plan.rs | 3 +++ simulator/generation/property.rs | 7 ++++++- simulator/generation/query.rs | 23 ++++++++++++++++++++--- simulator/model/mod.rs | 23 +++++++++++++++++------ simulator/profiles/query.rs | 3 +++ sql_generation/model/query/mod.rs | 1 + sql_generation/model/query/pragma.rs | 28 ++++++++++++++++++++++++++++ 7 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 sql_generation/model/query/pragma.rs diff --git a/simulator/generation/plan.rs b/simulator/generation/plan.rs index c8925cd59..d0c09cd8a 100644 --- a/simulator/generation/plan.rs +++ b/simulator/generation/plan.rs @@ -181,6 +181,7 @@ impl InteractionPlan { begin_count: 0, commit_count: 0, rollback_count: 0, + pragma_count: 0, }; fn query_stat(q: &Query, stats: &mut InteractionStats) { @@ -196,6 +197,7 @@ impl InteractionPlan { Query::Commit(_) => stats.commit_count += 1, Query::Rollback(_) => stats.rollback_count += 1, Query::Placeholder => {} + Query::Pragma(_) => stats.pragma_count += 1, } } for interactions in &self.plan { @@ -724,6 +726,7 @@ pub(crate) struct InteractionStats { pub(crate) begin_count: u32, pub(crate) commit_count: u32, pub(crate) rollback_count: u32, + pub(crate) pragma_count: u32, } impl InteractionStats { diff --git a/simulator/generation/property.rs b/simulator/generation/property.rs index 47b352406..26448d471 100644 --- a/simulator/generation/property.rs +++ b/simulator/generation/property.rs @@ -326,7 +326,6 @@ impl Property { let rows = insert.rows(); let row = &rows[*row_index]; - match &query { Query::Delete(Delete { table: t, @@ -1385,6 +1384,7 @@ pub(crate) struct Remaining { pub(crate) delete: u32, pub(crate) update: u32, pub(crate) drop: u32, + pub(crate) pragma: u32, } pub(crate) fn remaining( @@ -1408,6 +1408,7 @@ pub(crate) fn remaining( let total_delete = (max_interactions * opts.delete_weight) / total_weight; let total_update = (max_interactions * opts.update_weight) / total_weight; let total_drop = (max_interactions * opts.drop_table_weight) / total_weight; + let total_pragma = (max_interactions * opts.pragma_weight) / total_weight; let remaining_select = total_select .checked_sub(stats.select_count) @@ -1428,6 +1429,9 @@ pub(crate) fn remaining( .checked_sub(stats.update_count) .unwrap_or_default(); let remaining_drop = total_drop.checked_sub(stats.drop_count).unwrap_or_default(); + let remaining_pragma = total_pragma + .checked_sub(stats.pragma_count) + .unwrap_or_default(); if mvcc { // TODO: index not supported yet for mvcc @@ -1442,6 +1446,7 @@ pub(crate) fn remaining( delete: remaining_delete, drop: remaining_drop, update: remaining_update, + pragma: remaining_pragma, } } diff --git a/simulator/generation/query.rs b/simulator/generation/query.rs index 914b44b35..3c8f148dd 100644 --- a/simulator/generation/query.rs +++ b/simulator/generation/query.rs @@ -5,11 +5,16 @@ use crate::{ use rand::{ Rng, distr::{Distribution, weighted::WeightedIndex}, + seq::IndexedRandom, }; use sql_generation::{ generation::{Arbitrary, ArbitraryFrom, GenerationContext, query::SelectFree}, model::{ - query::{Create, CreateIndex, Delete, Insert, Select, update::Update}, + query::{ + Create, CreateIndex, Delete, Insert, Select, + pragma::{Pragma, VacuumMode}, + update::Update, + }, table::Table, }, }; @@ -79,6 +84,18 @@ fn random_create_index( Query::CreateIndex(create_index) } +fn random_pragma(rng: &mut R, _conn_ctx: &impl GenerationContext) -> Query { + const ALL_MODES: [VacuumMode; 2] = [ + VacuumMode::None, + // VacuumMode::Incremental, not implemented yer + VacuumMode::Full, + ]; + + let mode = ALL_MODES.choose(rng).unwrap(); + + Query::Pragma(Pragma::AutoVacuumMode(mode.clone())) +} + /// Possible queries that can be generated given the table state /// /// Does not take into account transactional statements @@ -114,14 +131,13 @@ impl QueryDiscriminants { QueryDiscriminants::Placeholder => { unreachable!("Query Placeholders should not be generated") } + QueryDiscriminants::Pragma => random_pragma, } } pub fn weight(&self, remaining: &Remaining) -> u32 { match self { QueryDiscriminants::Create => remaining.create, - // remaining.select / 3 is for the random_expr generation - // have a max of 1 so that we always generate at least a non zero weight for `QueryDistribution` QueryDiscriminants::Select => (remaining.select + remaining.select / 3).max(1), QueryDiscriminants::Insert => remaining.insert, QueryDiscriminants::Delete => remaining.delete, @@ -136,6 +152,7 @@ impl QueryDiscriminants { QueryDiscriminants::Placeholder => { unreachable!("Query Placeholders should not be generated") } + QueryDiscriminants::Pragma => remaining.pragma, } } } diff --git a/simulator/model/mod.rs b/simulator/model/mod.rs index 9e3d29db2..d6871623a 100644 --- a/simulator/model/mod.rs +++ b/simulator/model/mod.rs @@ -8,6 +8,7 @@ use serde::{Deserialize, Serialize}; use sql_generation::model::{ query::{ Create, CreateIndex, Delete, Drop, Insert, Select, + pragma::Pragma, select::{CompoundOperator, FromClause, ResultColumn, SelectInner}, transaction::{Begin, Commit, Rollback}, update::Update, @@ -32,6 +33,7 @@ pub enum Query { Begin(Begin), Commit(Commit), Rollback(Rollback), + Pragma(Pragma), /// Placeholder query that still needs to be generated Placeholder, } @@ -71,8 +73,11 @@ impl Query { Query::CreateIndex(CreateIndex { table_name, .. }) => { IndexSet::from_iter([table_name.clone()]) } - Query::Begin(_) | Query::Commit(_) | Query::Rollback(_) => IndexSet::new(), - Query::Placeholder => IndexSet::new(), + Query::Begin(_) + | Query::Commit(_) + | Query::Rollback(_) + | Query::Placeholder + | Query::Pragma(_) => IndexSet::new(), } } pub fn uses(&self) -> Vec { @@ -80,13 +85,14 @@ impl Query { Query::Create(Create { table }) => vec![table.name.clone()], Query::Select(select) => select.dependencies().into_iter().collect(), Query::Insert(Insert::Select { table, .. }) - | Query::Insert(Insert::Values { table, .. }) - | Query::Delete(Delete { table, .. }) - | Query::Update(Update { table, .. }) - | Query::Drop(Drop { table, .. }) => vec![table.clone()], + | Query::Insert(Insert::Values { table, .. }) + | Query::Delete(Delete { table, .. }) + | Query::Update(Update { table, .. }) + | Query::Drop(Drop { table, .. }) => vec![table.clone()], Query::CreateIndex(CreateIndex { table_name, .. }) => vec![table_name.clone()], Query::Begin(..) | Query::Commit(..) | Query::Rollback(..) => vec![], Query::Placeholder => vec![], + Query::Pragma(_) => vec![], } } @@ -121,6 +127,7 @@ impl Display for Query { Self::Commit(commit) => write!(f, "{commit}"), Self::Rollback(rollback) => write!(f, "{rollback}"), Self::Placeholder => Ok(()), + Query::Pragma(pragma) => write!(f, "{pragma}"), } } } @@ -141,12 +148,14 @@ impl Shadow for Query { Query::Commit(commit) => Ok(commit.shadow(env)), Query::Rollback(rollback) => Ok(rollback.shadow(env)), Query::Placeholder => Ok(vec![]), + Query::Pragma(Pragma::AutoVacuumMode(_)) => Ok(vec![]), } } } bitflags! { pub struct QueryCapabilities: u32 { + const NONE = 0; const CREATE = 1 << 0; const SELECT = 1 << 1; const INSERT = 1 << 2; @@ -190,6 +199,7 @@ impl From for QueryCapabilities { QueryDiscriminants::Placeholder => { unreachable!("QueryCapabilities do not apply to query Placeholder") } + QueryDiscriminants::Pragma => QueryCapabilities::NONE, } } } @@ -203,6 +213,7 @@ impl QueryDiscriminants { QueryDiscriminants::Delete, QueryDiscriminants::Drop, QueryDiscriminants::CreateIndex, + QueryDiscriminants::Pragma, ]; #[inline] diff --git a/simulator/profiles/query.rs b/simulator/profiles/query.rs index a58c983e0..81f433a02 100644 --- a/simulator/profiles/query.rs +++ b/simulator/profiles/query.rs @@ -22,6 +22,8 @@ pub struct QueryProfile { pub delete_weight: u32, #[garde(skip)] pub drop_table_weight: u32, + #[garde(skip)] + pub pragma_weight: u32, } impl Default for QueryProfile { @@ -35,6 +37,7 @@ impl Default for QueryProfile { update_weight: 20, delete_weight: 20, drop_table_weight: 2, + pragma_weight: 100,//TODO change this back to 2 } } } diff --git a/sql_generation/model/query/mod.rs b/sql_generation/model/query/mod.rs index 98ec2bdfd..26aedb6a3 100644 --- a/sql_generation/model/query/mod.rs +++ b/sql_generation/model/query/mod.rs @@ -16,3 +16,4 @@ pub mod predicate; pub mod select; pub mod transaction; pub mod update; +pub mod pragma; diff --git a/sql_generation/model/query/pragma.rs b/sql_generation/model/query/pragma.rs new file mode 100644 index 000000000..2bf8fca2a --- /dev/null +++ b/sql_generation/model/query/pragma.rs @@ -0,0 +1,28 @@ +use std::fmt::Display; + +pub enum Pragma { + AutoVacuumMode(VacuumMode), +} + +pub enum VacuumMode { + None, + Incremental, + Full, +} + +impl Display for Pragma { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Pragma::AutoVacuumMode(vacuum_mode) => { + let mode = match vacuum_mode { + VacuumMode::None => "none", + VacuumMode::Incremental => "incremental", + VacuumMode::Full => "full", + }; + + write!(f, "PRAGMA auto_vacuum={mode} ")?; + Ok(()) + } + } + } +} From 87a630ca12ca773a423789574ee9c741f7634ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Francoeur?= Date: Sun, 12 Oct 2025 19:57:23 +0300 Subject: [PATCH 2/9] missing file --- sql_generation/model/query/pragma.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sql_generation/model/query/pragma.rs b/sql_generation/model/query/pragma.rs index 2bf8fca2a..351f36f9c 100644 --- a/sql_generation/model/query/pragma.rs +++ b/sql_generation/model/query/pragma.rs @@ -1,9 +1,13 @@ use std::fmt::Display; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] pub enum Pragma { AutoVacuumMode(VacuumMode), } +#[derive(Debug, Clone, Serialize, Deserialize)] pub enum VacuumMode { None, Incremental, From 73cabf49f23a1ca94229964ce0f186b86caab023 Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Sat, 18 Oct 2025 18:46:20 +0530 Subject: [PATCH 3/9] fmt sim --- simulator/generation/plan.rs | 2 +- simulator/generation/query.rs | 3 ++- simulator/model/mod.rs | 3 +-- simulator/profiles/query.rs | 2 +- sql_generation/model/query/mod.rs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/simulator/generation/plan.rs b/simulator/generation/plan.rs index 39247a029..42aab9df6 100644 --- a/simulator/generation/plan.rs +++ b/simulator/generation/plan.rs @@ -772,7 +772,7 @@ pub(crate) struct InteractionStats { pub rollback_count: u32, pub alter_table_count: u32, pub drop_index_count: u32, - pub pragma_count:u32, + pub pragma_count: u32, } impl Display for InteractionStats { diff --git a/simulator/generation/query.rs b/simulator/generation/query.rs index 9706ba4ca..443a67231 100644 --- a/simulator/generation/query.rs +++ b/simulator/generation/query.rs @@ -11,7 +11,8 @@ use sql_generation::{ generation::{Arbitrary, ArbitraryFrom, GenerationContext, query::SelectFree}, model::{ query::{ - Create, CreateIndex, Delete, DropIndex, Insert, Select, alter_table::AlterTable, + Create, CreateIndex, Delete, DropIndex, Insert, Select, + alter_table::AlterTable, pragma::{Pragma, VacuumMode}, update::Update, }, diff --git a/simulator/model/mod.rs b/simulator/model/mod.rs index 60ddbd2f3..1ffa5a161 100644 --- a/simulator/model/mod.rs +++ b/simulator/model/mod.rs @@ -83,7 +83,7 @@ impl Query { | Query::DropIndex(DropIndex { table_name: table, .. }) => IndexSet::from_iter([table.clone()]), -Query::Begin(_) + Query::Begin(_) | Query::Commit(_) | Query::Rollback(_) | Query::Placeholder @@ -248,7 +248,6 @@ impl QueryDiscriminants { QueryDiscriminants::AlterTable, QueryDiscriminants::DropIndex, QueryDiscriminants::Pragma, - ]; } diff --git a/simulator/profiles/query.rs b/simulator/profiles/query.rs index d9eb7bb86..46d8f23b5 100644 --- a/simulator/profiles/query.rs +++ b/simulator/profiles/query.rs @@ -43,7 +43,7 @@ impl Default for QueryProfile { drop_table_weight: 2, alter_table_weight: 2, drop_index: 2, - pragma_weight: 100,//TODO change this back to 2 + pragma_weight: 100, //TODO change this back to 2 } } } diff --git a/sql_generation/model/query/mod.rs b/sql_generation/model/query/mod.rs index 72de42497..f6aa57abe 100644 --- a/sql_generation/model/query/mod.rs +++ b/sql_generation/model/query/mod.rs @@ -13,8 +13,8 @@ pub mod delete; pub mod drop; pub mod drop_index; pub mod insert; +pub mod pragma; pub mod predicate; pub mod select; pub mod transaction; pub mod update; -pub mod pragma; From 1a058a15316689f22de8ee4f966df2c76ad20cce Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Sat, 18 Oct 2025 18:46:40 +0530 Subject: [PATCH 4/9] get autovacuum mode from db header on existing dbs if autovaccum on, look for ptrmap pages --- core/lib.rs | 24 ++++++++++++++++++++++++ core/storage/btree.rs | 1 + core/storage/pager.rs | 2 +- core/vdbe/execute.rs | 25 +++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/core/lib.rs b/core/lib.rs index 637e91c92..18b721790 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -40,6 +40,7 @@ pub mod numeric; mod numeric; use crate::storage::checksum::CHECKSUM_REQUIRED_RESERVED_BYTES; +use crate::storage::pager::{AutoVacuumMode, HeaderRef}; use crate::translate::display::PlanContext; use crate::translate::pragma::TURSO_CDC_DEFAULT_TABLE_NAME; #[cfg(all(feature = "fs", feature = "conn_raw_api"))] @@ -549,6 +550,29 @@ impl Database { pager.enable_encryption(self.opts.enable_encryption); let pager = Arc::new(pager); + if self.db_state.is_initialized() { + let header_ref = pager.io.block(|| HeaderRef::from_pager(&pager))?; + + let header = header_ref.borrow(); + + let mode = if header.vacuum_mode_largest_root_page.get() > 0 { + if header.incremental_vacuum_enabled.get() > 0 { + AutoVacuumMode::Incremental + } else { + AutoVacuumMode::Full + } + } else { + AutoVacuumMode::None + }; + + pager.set_auto_vacuum_mode(mode); + + tracing::debug!( + "Opened existing database. Detected auto_vacuum_mode from header: {:?}", + mode + ); + } + let page_size = pager.get_page_size_unchecked(); let default_cache_size = pager diff --git a/core/storage/btree.rs b/core/storage/btree.rs index 31e89b01f..1a9f7bbd4 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -5887,6 +5887,7 @@ pub(crate) enum PageCategory { Overflow, FreeListTrunk, FreePage, + PointerMap, } #[derive(Clone)] diff --git a/core/storage/pager.rs b/core/storage/pager.rs index 2e6b50920..5b1d9c685 100644 --- a/core/storage/pager.rs +++ b/core/storage/pager.rs @@ -2591,7 +2591,7 @@ impl CreateBTreeFlags { ** identifies the parent page in the btree. */ #[cfg(not(feature = "omit_autovacuum"))] -mod ptrmap { +pub(crate) mod ptrmap { use crate::{storage::sqlite3_ondisk::PageSize, LimboError, Result}; // Constants diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 962f1b3bc..a500b1f39 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -7974,6 +7974,31 @@ pub fn op_integrity_check( expected_count: integrity_check_state.freelist_count.expected_count, }); } + + let auto_vacuum_mode = pager.get_auto_vacuum_mode(); + if !matches!( + auto_vacuum_mode, + crate::storage::pager::AutoVacuumMode::None + ) { + tracing::debug!("Integrity check: auto-vacuum mode detected ({:?}). Scanning for pointer-map pages.", auto_vacuum_mode); + let page_size = pager.get_page_size_unchecked().get() as usize; + + for page_number in 2..=integrity_check_state.db_size { + if crate::storage::pager::ptrmap::is_ptrmap_page( + page_number as u32, + page_size, + ) { + tracing::debug!("Integrity check: Found and marking pointer-map page as visited: page_id={}", page_number); + + integrity_check_state.start( + page_number as i64, + PageCategory::PointerMap, + errors, + ); + } + } + } + for page_number in 2..=integrity_check_state.db_size { if !integrity_check_state .page_reference From 9841f487a62615a58d76b2ad1fecc50e48b695f6 Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Sat, 18 Oct 2025 19:01:21 +0530 Subject: [PATCH 5/9] dont allow autovacuum on nonempty dbs adds a is_db_empty fn --- core/storage/pager.rs | 15 +++++++++++++++ core/translate/pragma.rs | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/core/storage/pager.rs b/core/storage/pager.rs index 5b1d9c685..ac224f2fc 100644 --- a/core/storage/pager.rs +++ b/core/storage/pager.rs @@ -983,6 +983,21 @@ impl Pager { BtreePageAllocMode::Exact(root_page_num), )); let allocated_page_id = page.get().id as u32; + + return_if_io!(self.with_header_mut(|header| { + if allocated_page_id + > header.vacuum_mode_largest_root_page.get() + { + tracing::debug!( + "Updating largest root page in header from {} to {}", + header.vacuum_mode_largest_root_page.get(), + allocated_page_id + ); + header.vacuum_mode_largest_root_page = + allocated_page_id.into(); + } + })); + if allocated_page_id != root_page_num { // TODO(Zaid): Handle swapping the allocated page with the desired root page } diff --git a/core/translate/pragma.rs b/core/translate/pragma.rs index 8e996bae9..8d1db5ae3 100644 --- a/core/translate/pragma.rs +++ b/core/translate/pragma.rs @@ -241,6 +241,18 @@ fn update_pragma( Ok((program, TransactionMode::None)) } PragmaName::AutoVacuum => { + let is_empty = is_database_empty(resolver.schema, &pager)?; + tracing::debug!( + "Checking if database is empty for auto_vacuum pragma: {}", + is_empty + ); + + if !is_empty { + // SQLite's behavior is to silently ignore this pragma if the database is not empty. + tracing::debug!("Attempted to set auto_vacuum, database is not empty so we are ignoring pragma."); + return Ok((program, TransactionMode::None)); + } + let auto_vacuum_mode = match value { Expr::Name(name) => { let name = name.as_str().as_bytes(); @@ -894,3 +906,30 @@ fn update_page_size(connection: Arc, page_size: u32) -> crate connection.reset_page_size(page_size)?; Ok(()) } + +fn is_database_empty(schema: &Schema, pager: &Arc) -> crate::Result { + if schema.tables.len() > 1 { + return Ok(false); + } + if let Some(table_arc) = schema.tables.values().next() { + let table_name = match table_arc.as_ref() { + crate::schema::Table::BTree(tbl) => &tbl.name, + crate::schema::Table::Virtual(tbl) => &tbl.name, + crate::schema::Table::FromClauseSubquery(tbl) => &tbl.name, + }; + + if table_name != "sqlite_schema" { + return Ok(false); + } + } + + let db_size_result = pager + .io + .block(|| pager.with_header(|header| header.database_size.get())); + + match db_size_result { + Err(_) => Ok(true), + Ok(0 | 1) => Ok(true), + Ok(_) => Ok(false), + } +} From dbd8b1b01d5a1cdd512107aabff004de735d4108 Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Fri, 24 Oct 2025 18:10:10 +0530 Subject: [PATCH 6/9] change weight and add pragma_weight to querytypes --- simulator/profiles/query.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/simulator/profiles/query.rs b/simulator/profiles/query.rs index 46d8f23b5..867ea29e7 100644 --- a/simulator/profiles/query.rs +++ b/simulator/profiles/query.rs @@ -43,7 +43,7 @@ impl Default for QueryProfile { drop_table_weight: 2, alter_table_weight: 2, drop_index: 2, - pragma_weight: 100, //TODO change this back to 2 + pragma_weight: 2 } } } @@ -59,6 +59,7 @@ impl QueryProfile { + self.delete_weight + self.drop_table_weight + self.alter_table_weight + + self.pragma_weight } } @@ -70,4 +71,5 @@ pub enum QueryTypes { Update, Delete, DropTable, + pragma_weight, } From cf93360b9c174c19f148c015272efdfe6586e7e3 Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Fri, 24 Oct 2025 19:02:27 +0530 Subject: [PATCH 7/9] cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mikaël Francoeur cleanup Co-authored-by: Mikaël Francoeur --- simulator/generation/query.rs | 4 +++- simulator/profiles/query.rs | 1 - sql_generation/model/query/pragma.rs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/simulator/generation/query.rs b/simulator/generation/query.rs index 443a67231..02d82c17f 100644 --- a/simulator/generation/query.rs +++ b/simulator/generation/query.rs @@ -88,7 +88,7 @@ fn random_create_index( fn random_pragma(rng: &mut R, _conn_ctx: &impl GenerationContext) -> Query { const ALL_MODES: [VacuumMode; 2] = [ VacuumMode::None, - // VacuumMode::Incremental, not implemented yer + // VacuumMode::Incremental, not implemented yet VacuumMode::Full, ]; @@ -162,6 +162,8 @@ impl QueryDiscriminants { fn weight(&self, remaining: &Remaining) -> u32 { match self { QueryDiscriminants::Create => remaining.create, + // remaining.select / 3 is for the random_expr generation + // have a max of 1 so that we always generate at least a non zero weight for `QueryDistribution` QueryDiscriminants::Select => (remaining.select + remaining.select / 3).max(1), QueryDiscriminants::Insert => remaining.insert, QueryDiscriminants::Delete => remaining.delete, diff --git a/simulator/profiles/query.rs b/simulator/profiles/query.rs index 0992303d2..3f0de4bd9 100644 --- a/simulator/profiles/query.rs +++ b/simulator/profiles/query.rs @@ -71,5 +71,4 @@ pub enum QueryTypes { Update, Delete, DropTable, - pragma_weight, } diff --git a/sql_generation/model/query/pragma.rs b/sql_generation/model/query/pragma.rs index 351f36f9c..0bee9cbff 100644 --- a/sql_generation/model/query/pragma.rs +++ b/sql_generation/model/query/pragma.rs @@ -24,7 +24,7 @@ impl Display for Pragma { VacuumMode::Full => "full", }; - write!(f, "PRAGMA auto_vacuum={mode} ")?; + write!(f, "PRAGMA auto_vacuum={mode}")?; Ok(()) } } From 7dda783006b97b861e23ee5b0ec3f7097232f61c Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Fri, 24 Oct 2025 21:30:34 +0530 Subject: [PATCH 8/9] clippy - gotta feature autovaccuum n ptrmaps --- core/storage/btree.rs | 1 + core/vdbe/execute.rs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/storage/btree.rs b/core/storage/btree.rs index 3fefe5c65..d6fee2b8c 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -5784,6 +5784,7 @@ pub(crate) enum PageCategory { Overflow, FreeListTrunk, FreePage, + #[cfg(not(feature = "omit_autovacuum"))] PointerMap, } diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 01eee5db1..6e8e7799f 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -8121,6 +8121,7 @@ pub fn op_integrity_check( }); } + #[cfg(not(feature = "omit_autovacuum"))]{ let auto_vacuum_mode = pager.get_auto_vacuum_mode(); if !matches!( auto_vacuum_mode, @@ -8144,7 +8145,7 @@ pub fn op_integrity_check( } } } - + } for page_number in 2..=integrity_check_state.db_size { if !integrity_check_state .page_reference From 277a989a71063dead5fdab73c5de5b3c311f8453 Mon Sep 17 00:00:00 2001 From: Pavan-Nambi Date: Fri, 24 Oct 2025 21:34:17 +0530 Subject: [PATCH 9/9] fmt --- core/storage/btree.rs | 2 +- core/vdbe/execute.rs | 41 +++++++++++++++++++++-------------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/core/storage/btree.rs b/core/storage/btree.rs index d6fee2b8c..edd43be0b 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -5784,7 +5784,7 @@ pub(crate) enum PageCategory { Overflow, FreeListTrunk, FreePage, - #[cfg(not(feature = "omit_autovacuum"))] + #[cfg(not(feature = "omit_autovacuum"))] PointerMap, } diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 6e8e7799f..23579f6be 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -8121,31 +8121,32 @@ pub fn op_integrity_check( }); } - #[cfg(not(feature = "omit_autovacuum"))]{ - let auto_vacuum_mode = pager.get_auto_vacuum_mode(); - if !matches!( - auto_vacuum_mode, - crate::storage::pager::AutoVacuumMode::None - ) { - tracing::debug!("Integrity check: auto-vacuum mode detected ({:?}). Scanning for pointer-map pages.", auto_vacuum_mode); - let page_size = pager.get_page_size_unchecked().get() as usize; + #[cfg(not(feature = "omit_autovacuum"))] + { + let auto_vacuum_mode = pager.get_auto_vacuum_mode(); + if !matches!( + auto_vacuum_mode, + crate::storage::pager::AutoVacuumMode::None + ) { + tracing::debug!("Integrity check: auto-vacuum mode detected ({:?}). Scanning for pointer-map pages.", auto_vacuum_mode); + let page_size = pager.get_page_size_unchecked().get() as usize; - for page_number in 2..=integrity_check_state.db_size { - if crate::storage::pager::ptrmap::is_ptrmap_page( - page_number as u32, - page_size, - ) { - tracing::debug!("Integrity check: Found and marking pointer-map page as visited: page_id={}", page_number); + for page_number in 2..=integrity_check_state.db_size { + if crate::storage::pager::ptrmap::is_ptrmap_page( + page_number as u32, + page_size, + ) { + tracing::debug!("Integrity check: Found and marking pointer-map page as visited: page_id={}", page_number); - integrity_check_state.start( - page_number as i64, - PageCategory::PointerMap, - errors, - ); + integrity_check_state.start( + page_number as i64, + PageCategory::PointerMap, + errors, + ); + } } } } - } for page_number in 2..=integrity_check_state.db_size { if !integrity_check_state .page_reference