From 4308f8c73a8ee8813f80d0afd9ca75da325f7c98 Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Tue, 1 Apr 2025 00:43:22 +0200 Subject: [PATCH] Fix propagation of divider cell balancing interior page Newly added divider cells to parent of an interior page must point to the page in question. Moreover rightmost pointer of the page will point to previous divider cell pointer. --- core/storage/btree.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/storage/btree.rs b/core/storage/btree.rs index 305963a0e..d475e384f 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -2,7 +2,7 @@ use tracing::debug; use crate::storage::pager::Pager; use crate::storage::sqlite3_ondisk::{ - read_varint, BTreeCell, PageContent, PageType, TableInteriorCell, TableLeafCell, + read_u32, read_varint, BTreeCell, PageContent, PageType, TableInteriorCell, TableLeafCell, }; use crate::MvCursor; @@ -1697,8 +1697,12 @@ impl BTreeCursor { let mut new_divider_cell = Vec::new(); if !is_leaf_page { // Interior + // Make this page's rightmost pointer point to pointer of divider cell before modification + let previous_pointer_divider = read_u32(÷r_cell, 0); page.get_contents() - .write_u32(PAGE_HEADER_OFFSET_RIGHTMOST_PTR, page.get().id as u32); + .write_u32(PAGE_HEADER_OFFSET_RIGHTMOST_PTR, previous_pointer_divider); + // divider cell now points to this page + divider_cell[0..4].copy_from_slice(&(page.get().id as u32).to_be_bytes()); new_divider_cell.extend_from_slice(divider_cell); } else if leaf_data { // Leaf table