mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-14 12:34:20 +01:00
add defragment test after deletion of odd cells
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
This commit is contained in:
@@ -2427,7 +2427,6 @@ fn defragment_page(page: &PageContent, usable_space: u16) {
|
||||
// return SQLITE_CORRUPT_PAGE(pPage);
|
||||
// }
|
||||
assert!(cbrk >= first_cell);
|
||||
dbg!(cbrk, first_cell);
|
||||
let write_buf = page.as_ptr();
|
||||
|
||||
// set new first byte of cell content
|
||||
@@ -3521,6 +3520,51 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_drop_odd_with_defragment() {
|
||||
set_breakpoint_panic();
|
||||
let db = get_database();
|
||||
|
||||
let page = get_page(2);
|
||||
let page = page.get_contents();
|
||||
let header_size = 8;
|
||||
|
||||
let mut total_size = 0;
|
||||
let mut cells = Vec::new();
|
||||
let usable_space = 4096;
|
||||
let total_cells = 10;
|
||||
for i in 0..total_cells {
|
||||
let record = OwnedRecord::new([OwnedValue::Integer(i as i64)].to_vec());
|
||||
let payload = add_record(i, i, page, record, &db);
|
||||
assert_eq!(page.cell_count(), i + 1);
|
||||
let free = compute_free_space(page, usable_space);
|
||||
total_size += payload.len() as u16 + 2;
|
||||
assert_eq!(free, 4096 - total_size - header_size);
|
||||
cells.push(Cell { pos: i, payload });
|
||||
}
|
||||
|
||||
let mut removed = 0;
|
||||
let mut new_cells = Vec::new();
|
||||
for cell in cells {
|
||||
if cell.pos % 2 == 1 {
|
||||
drop_cell(page, cell.pos - removed, usable_space);
|
||||
removed += 1;
|
||||
} else {
|
||||
new_cells.push(cell);
|
||||
}
|
||||
}
|
||||
let cells = new_cells;
|
||||
for (i, cell) in cells.iter().enumerate() {
|
||||
ensure_cell(page, i, &cell.payload);
|
||||
}
|
||||
|
||||
defragment_page(page, usable_space);
|
||||
|
||||
for (i, cell) in cells.iter().enumerate() {
|
||||
ensure_cell(page, i, &cell.payload);
|
||||
}
|
||||
}
|
||||
|
||||
fn set_breakpoint_panic() {
|
||||
// Set custom panic hook at start of program
|
||||
panic::set_hook(Box::new(|panic_info| {
|
||||
|
||||
Reference in New Issue
Block a user