fix get record

This commit is contained in:
Pere Diaz Bou
2025-06-03 20:00:19 +02:00
committed by Jussi Saurio
parent b46852a366
commit 681df9b1eb
2 changed files with 17 additions and 9 deletions

View File

@@ -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<CursorResult<Ref<Option<ImmutableRecord>>>> {
pub fn record(&self) -> Result<CursorResult<Option<Ref<ImmutableRecord>>>> {
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!(

View File

@@ -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()];