From 4308f8c73a8ee8813f80d0afd9ca75da325f7c98 Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Tue, 1 Apr 2025 00:43:22 +0200 Subject: [PATCH 1/3] 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 From d2642dfe0cc130de04f1344a793bffe474af91bb Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Tue, 1 Apr 2025 00:58:01 +0200 Subject: [PATCH 2/3] skip repeated keys --- core/storage/btree.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/storage/btree.rs b/core/storage/btree.rs index d475e384f..21c74574a 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -4007,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 mut result = None; + loop { + let key = (rng.next_u64() % (1 << 30)) as i64; + if seen.contains(&key) { + continue; + } else { + seen.insert(key); + } + result = Some(key); + break; + } + result.unwrap() + }; keys.push(key); tracing::info!( "INSERT INTO t VALUES ({}, randomblob({})); -- {}", From bab748e538ec5aae317c31d99ba0ddc7d268535f Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Tue, 1 Apr 2025 01:05:07 +0200 Subject: [PATCH 3/3] fix key generation --- core/storage/btree.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/storage/btree.rs b/core/storage/btree.rs index 21c74574a..cabfa903b 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -4008,7 +4008,7 @@ mod tests { for insert_id in 0..inserts { let size = size(&mut rng); let key = { - let mut result = None; + let result; loop { let key = (rng.next_u64() % (1 << 30)) as i64; if seen.contains(&key) { @@ -4016,10 +4016,10 @@ mod tests { } else { seen.insert(key); } - result = Some(key); + result = key; break; } - result.unwrap() + result }; keys.push(key); tracing::info!(