core/execute: map negative root page to positive if we can

This commit is contained in:
Pere Diaz Bou
2025-11-05 13:07:17 +01:00
parent 9004d4f3f1
commit 2fd4407a03
2 changed files with 28 additions and 5 deletions

View File

@@ -1925,6 +1925,15 @@ impl<Clock: LogicalClock> MvStore<Clock> {
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

View File

@@ -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<dyn CursorTrait> =
@@ -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<MvStore>>, 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::*;