From 681df9b1eb574d8b2fca6a3c7e66d2cc1f16e494 Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Tue, 3 Jun 2025 20:00:19 +0200 Subject: [PATCH] fix get record --- core/storage/btree.rs | 18 +++++++++++++----- core/vdbe/execute.rs | 8 ++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/core/storage/btree.rs b/core/storage/btree.rs index 9affb2ed1..10349d56d 100644 --- a/core/storage/btree.rs +++ b/core/storage/btree.rs @@ -3973,7 +3973,10 @@ impl BTreeCursor { /// Return a reference to the record the cursor is currently pointing to. /// If record was not parsed yet, then we have to parse it and in case of I/O we yield control /// back. - pub fn record(&self) -> Result>>> { + pub fn record(&self) -> Result>>> { + if !self.has_record.get() { + return Ok(CursorResult::Ok(None)); + } let invalidated = self .reusable_immutable_record .borrow() @@ -3981,7 +3984,10 @@ impl BTreeCursor { .map_or(true, |record| record.is_invalidated()); if !invalidated { *self.parse_record_state.borrow_mut() = ParseRecordState::Init; - return Ok(CursorResult::Ok(self.reusable_immutable_record.borrow())); + let record_ref = + Ref::filter_map(self.reusable_immutable_record.borrow(), |opt| opt.as_ref()) + .unwrap(); + return Ok(CursorResult::Ok(Some(record_ref))); } if *self.parse_record_state.borrow() == ParseRecordState::Init { *self.parse_record_state.borrow_mut() = ParseRecordState::Parsing { @@ -4029,7 +4035,9 @@ impl BTreeCursor { }; *self.parse_record_state.borrow_mut() = ParseRecordState::Init; - Ok(CursorResult::Ok(self.reusable_immutable_record.borrow())) + let record_ref = + Ref::filter_map(self.reusable_immutable_record.borrow(), |opt| opt.as_ref()).unwrap(); + Ok(CursorResult::Ok(Some(record_ref))) } #[instrument(skip_all, level = Level::TRACE)] @@ -4291,7 +4299,7 @@ impl BTreeCursor { // FIXME(pere): cell index must be updated before calling `rowid` or // `record` let target_key = if page.is_index() { - let record = match &*return_if_io!(self.record()) { + let record = match return_if_io!(self.record()) { Some(record) => record.clone(), None => unreachable!("there should've been a record"), }; @@ -6689,7 +6697,7 @@ mod tests { for key in keys.iter() { tracing::trace!("seeking key: {:?}", key); run_until_done(|| cursor.next(), pager.deref()).unwrap(); - let record = cursor.record(); + let record = run_until_done(|| cursor.record(), &pager).unwrap(); let record = record.as_ref().unwrap(); let cursor_key = record.get_values(); assert_eq!( diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index bdf77b83d..c2180806b 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -2160,7 +2160,7 @@ pub fn op_idx_ge( let mut cursor = state.get_cursor(*cursor_id); let cursor = cursor.as_btree_mut(); let record_from_regs = make_record(&state.registers, start_reg, num_regs); - let pc = if let Some(ref idx_record) = *return_if_io!(cursor.record()) { + let pc = if let Some(idx_record) = return_if_io!(cursor.record()) { // Compare against the same number of values let idx_values = idx_record.get_values(); let idx_values = &idx_values[..record_from_regs.len()]; @@ -2224,7 +2224,7 @@ pub fn op_idx_le( let mut cursor = state.get_cursor(*cursor_id); let cursor = cursor.as_btree_mut(); let record_from_regs = make_record(&state.registers, start_reg, num_regs); - let pc = if let Some(ref idx_record) = *return_if_io!(cursor.record()) { + let pc = if let Some(ref idx_record) = return_if_io!(cursor.record()) { // Compare against the same number of values let idx_values = idx_record.get_values(); let idx_values = &idx_values[..record_from_regs.len()]; @@ -2270,7 +2270,7 @@ pub fn op_idx_gt( let mut cursor = state.get_cursor(*cursor_id); let cursor = cursor.as_btree_mut(); let record_from_regs = make_record(&state.registers, start_reg, num_regs); - let pc = if let Some(ref idx_record) = *return_if_io!(cursor.record()) { + let pc = if let Some(ref idx_record) = return_if_io!(cursor.record()) { // Compare against the same number of values let idx_values = idx_record.get_values(); let idx_values = &idx_values[..record_from_regs.len()]; @@ -2316,7 +2316,7 @@ pub fn op_idx_lt( let mut cursor = state.get_cursor(*cursor_id); let cursor = cursor.as_btree_mut(); let record_from_regs = make_record(&state.registers, start_reg, num_regs); - let pc = if let Some(ref idx_record) = *return_if_io!(cursor.record()) { + let pc = if let Some(ref idx_record) = return_if_io!(cursor.record()) { // Compare against the same number of values let idx_values = idx_record.get_values(); let idx_values = &idx_values[..record_from_regs.len()];