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 } } };