diff --git a/core/storage/btree.rs b/core/storage/btree.rs index e09346936..41e024551 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -57,6 +57,7 @@ pub struct BTreeCursor { record: RefCell>, null_flag: bool, database_header: Rc>, + going_upwards: bool, } impl BTreeCursor { @@ -73,6 +74,7 @@ impl BTreeCursor { record: RefCell::new(None), null_flag: false, database_header, + going_upwards: false, } } @@ -110,6 +112,7 @@ impl BTreeCursor { } None => match parent { Some(ref parent) => { + self.going_upwards = true; self.page.replace(Some(parent.clone())); continue; } @@ -151,19 +154,31 @@ impl BTreeCursor { left_child_page, .. }) => { - 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))); - continue; + if self.going_upwards { + self.going_upwards = false; + mem_page.advance(); + let record = crate::storage::sqlite3_ondisk::read_record(payload)?; + let rowid = match record.values.last() { + Some(OwnedValue::Integer(rowid)) => *rowid as u64, + _ => unreachable!("index cells should have an integer rowid"), + }; + return Ok(CursorResult::Ok((Some(rowid), Some(record)))); + } else { + let mem_page = + MemPage::new(Some(mem_page.clone()), *left_child_page as usize, 0); + self.page.replace(Some(Rc::new(mem_page))); + continue; + } } BTreeCell::IndexLeafCell(IndexLeafCell { payload, .. }) => { + self.going_upwards = false; mem_page.advance(); let record = crate::storage::sqlite3_ondisk::read_record(payload)?; let rowid = match record.values.last() { Some(OwnedValue::Integer(rowid)) => *rowid as u64, _ => unreachable!("index cells should have an integer rowid"), }; + return Ok(CursorResult::Ok((Some(rowid), Some(record)))); } } @@ -375,7 +390,6 @@ impl BTreeCursor { let SeekKey::IndexKey(index_key) = key else { unreachable!("index seek key should be a record"); }; - mem_page.advance(); let record = crate::storage::sqlite3_ondisk::read_record(payload)?; let comparison = match cmp { SeekOp::GT => index_key < &record, @@ -388,6 +402,8 @@ impl BTreeCursor { self.page.replace(Some(Rc::new(mem_page))); found_cell = true; break; + } else { + mem_page.advance(); } } BTreeCell::IndexLeafCell(_) => {