From 2fd4407a038b68073990313bea65ca4326f52029 Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Wed, 5 Nov 2025 13:07:17 +0100 Subject: [PATCH] core/execute: map negative root page to positive if we can --- core/mvcc/database/mod.rs | 9 +++++++++ core/vdbe/execute.rs | 24 +++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/core/mvcc/database/mod.rs b/core/mvcc/database/mod.rs index cb911db19..77e6412b5 100644 --- a/core/mvcc/database/mod.rs +++ b/core/mvcc/database/mod.rs @@ -1925,6 +1925,15 @@ impl MvStore { pub fn checkpoint_threshold(&self) -> i64 { self.storage.checkpoint_threshold() } + + pub fn get_real_table_id(&self, table_id: i64) -> i64 { + let entry = self.table_id_to_rootpage.get(&MVTableId::from(table_id)); + if let Some(entry) = entry { + entry.value().map_or(table_id, |value| value as i64) + } else { + table_id + } + } } /// A write-write conflict happens when transaction T_current attempts to update a diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index e61aa7040..2c2abbc77 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -960,7 +960,7 @@ pub fn op_open_read( let btree_cursor = Box::new(BTreeCursor::new_table( pager.clone(), - *root_page, + maybe_transform_root_page_to_positive(mv_store, *root_page), num_columns, )); let cursor = maybe_promote_to_mvcc_cursor(btree_cursor)?; @@ -989,7 +989,7 @@ pub fn op_open_read( // Regular table let btree_cursor = Box::new(BTreeCursor::new_table( pager.clone(), - *root_page, + maybe_transform_root_page_to_positive(mv_store, *root_page), num_columns, )); let cursor = maybe_promote_to_mvcc_cursor(btree_cursor)?; @@ -7134,7 +7134,7 @@ pub fn op_open_write( let num_columns = index.columns.len(); let btree_cursor = Box::new(BTreeCursor::new_index( pager.clone(), - root_page, + maybe_transform_root_page_to_positive(mv_store, root_page), index.as_ref(), num_columns, )); @@ -7154,7 +7154,7 @@ pub fn op_open_write( let btree_cursor = Box::new(BTreeCursor::new_table( pager.clone(), - root_page, + maybe_transform_root_page_to_positive(mv_store, root_page), num_columns, )); let cursor = maybe_promote_to_mvcc_cursor(btree_cursor)?; @@ -8106,7 +8106,7 @@ pub fn op_open_dup( CursorType::BTreeTable(table) => { let cursor = Box::new(BTreeCursor::new_table( pager.clone(), - root_page, + maybe_transform_root_page_to_positive(mv_store, root_page), table.columns.len(), )); let cursor: Box = @@ -9222,6 +9222,20 @@ fn get_schema_cookie( } } +/// A root page in MVCC might still be marked as negative in schema. On restart it is automatically transformed to positive but in other cases +/// we need to map it to positive if we can in case checkpoint happened. +fn maybe_transform_root_page_to_positive(mvcc_store: Option<&Arc>, root_page: i64) -> i64 { + if let Some(mvcc_store) = mvcc_store { + if root_page < 0 { + mvcc_store.get_real_table_id(root_page) + } else { + root_page + } + } else { + root_page + } +} + #[cfg(test)] mod tests { use super::*;