From 04575456a947614e60005b0ed7eaeb9eb341464c Mon Sep 17 00:00:00 2001 From: meteorgan Date: Sun, 6 Jul 2025 17:15:15 +0800 Subject: [PATCH] fix Minimum cell size must not be less than 4 --- core/storage/btree.rs | 6 +++++- core/storage/sqlite3_ondisk.rs | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/core/storage/btree.rs b/core/storage/btree.rs index 7b2419cee..8b11c344b 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -6364,7 +6364,11 @@ fn compute_free_space(page: &PageContent, usable_space: u16) -> u16 { /// Allocate space for a cell on a page. fn allocate_cell_space(page_ref: &PageContent, amount: u16, usable_space: u16) -> Result { - let amount = amount as usize; + let mut amount = amount as usize; + // the minimum cell size is 4 bytes, so we need to ensure that we allocate at least that much space. + if amount < 4 { + amount = 4; + } let (cell_offset, _) = page_ref.cell_pointer_array_offset_and_size(); let gap = cell_offset + 2 * page_ref.cell_count(); diff --git a/core/storage/sqlite3_ondisk.rs b/core/storage/sqlite3_ondisk.rs index f9fcacb77..5c3bd5773 100644 --- a/core/storage/sqlite3_ondisk.rs +++ b/core/storage/sqlite3_ondisk.rs @@ -668,7 +668,11 @@ impl PageContent { if overflows { to_read + n_payload } else { - len_payload as usize + n_payload + let mut size = len_payload as usize + n_payload; + if size < 4 { + size = 4; + } + size } } PageType::TableLeaf => { @@ -683,7 +687,11 @@ impl PageContent { if overflows { to_read + n_payload + n_rowid } else { - len_payload as usize + n_payload + n_rowid + let mut size = len_payload as usize + n_payload + n_rowid; + if size < 4 { + size = 4; + } + size } } };