From ff236c7781e0f05804948eb8abb5fccb0aea4a17 Mon Sep 17 00:00:00 2001 From: jussisaurio Date: Sat, 5 Oct 2024 14:10:06 +0300 Subject: [PATCH] Fix not advancing the cell index of pages --- core/storage/btree.rs | 19 ++++++++++--------- testing/where.test | 17 +++++++++-------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/core/storage/btree.rs b/core/storage/btree.rs index ef9837418..348839803 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -29,6 +29,7 @@ pub enum SeekOp { GE, } +#[derive(Debug)] pub struct MemPage { parent: Option>, page_idx: usize, @@ -249,17 +250,18 @@ impl BTreeCursor { let page = page.as_ref().unwrap(); for cell_idx in 0..page.cell_count() { - match &page.cell_get( + let cell = page.cell_get( cell_idx, self.pager.clone(), self.max_local(page.page_type()), self.min_local(page.page_type()), self.usable_space(), - )? { + )?; + match &cell { BTreeCell::TableLeafCell(TableLeafCell { _rowid: cell_rowid, _payload: payload, - first_overflow_page: _, + first_overflow_page: fop, }) => { mem_page.advance(); let comparison = match op { @@ -346,23 +348,24 @@ impl BTreeCursor { let mut found_cell = false; for cell_idx in 0..page.cell_count() { - match &page.cell_get( + let cell = page.cell_get( cell_idx, self.pager.clone(), self.max_local(page.page_type()), self.min_local(page.page_type()), self.usable_space(), - )? { + )?; + match &cell { BTreeCell::TableInteriorCell(TableInteriorCell { _left_child_page, _rowid, }) => { + mem_page.advance(); let comparison = match cmp { SeekOp::GT => *_rowid > rowid, SeekOp::GE => *_rowid >= rowid, }; if comparison { - mem_page.advance(); let mem_page = MemPage::new(Some(mem_page.clone()), *_left_child_page as usize, 0); self.page.replace(Some(Rc::new(mem_page))); @@ -571,15 +574,13 @@ impl BTreeCursor { payload, .. }) => { - // get the logic for this from btree_index_seek - + mem_page.advance(); let record = crate::storage::sqlite3_ondisk::read_record(payload)?; let comparison = match cmp { SeekOp::GT => record > *key, SeekOp::GE => record >= *key, }; if comparison { - mem_page.advance(); let mem_page = MemPage::new(Some(mem_page.clone()), *left_child_page as usize, 0); self.page.replace(Some(Rc::new(mem_page))); diff --git a/testing/where.test b/testing/where.test index 4cb5d1978..fb4e2c10f 100755 --- a/testing/where.test +++ b/testing/where.test @@ -92,24 +92,25 @@ do_execsql_test where-clause-no-table-constant-condition-false-7 { select 1 where 'hamburger'; } {} +# this test functions as an assertion that the index on users.age is being used, since the results are ordered by age without an order by. do_execsql_test select-where-and { select first_name, age from users where first_name = 'Jamie' and age > 80 -} {Jamie|94 +} {Jamie|87 +Jamie|88 Jamie|88 -Jamie|99 Jamie|92 -Jamie|87 -Jamie|88 +Jamie|94 +Jamie|99 } do_execsql_test select-where-or { select first_name, age from users where first_name = 'Jamie' and age > 80 -} {Jamie|94 +} {Jamie|87 +Jamie|88 Jamie|88 -Jamie|99 Jamie|92 -Jamie|87 -Jamie|88 +Jamie|94 +Jamie|99 } do_execsql_test select-where-and-or {