diff --git a/core/storage/btree.rs b/core/storage/btree.rs index 305963a0e..cabfa903b 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 @@ -4003,8 +4007,20 @@ mod tests { let mut rng = ChaCha8Rng::seed_from_u64(seed); for insert_id in 0..inserts { let size = size(&mut rng); - let key = (rng.next_u64() % (1 << 30)) as i64; - assert!(seen.insert(key)); + let key = { + let result; + loop { + let key = (rng.next_u64() % (1 << 30)) as i64; + if seen.contains(&key) { + continue; + } else { + seen.insert(key); + } + result = key; + break; + } + result + }; keys.push(key); tracing::info!( "INSERT INTO t VALUES ({}, randomblob({})); -- {}",