From c7a67a1bf43bd8680bc9a52875e7100fb50b4a39 Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Fri, 5 Jul 2024 18:13:06 +0300 Subject: [PATCH] Fix ResultRow operands Fix ResultRow operands to follow SQLite bytecode format for consistency. --- core/translate.rs | 16 ++++++++-------- core/vdbe.rs | 32 +++++++++++--------------------- 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/core/translate.rs b/core/translate.rs index ded0f98ea..06b64d741 100644 --- a/core/translate.rs +++ b/core/translate.rs @@ -152,14 +152,14 @@ fn translate_select(select: Select) -> Result { } // only one result row program.emit_insn(Insn::ResultRow { - register_start, - register_end, + start_reg: register_start, + count: register_end - register_start, }); limit_reg.map(|_| program.emit_placeholder()) } else { program.emit_insn(Insn::ResultRow { - register_start, - register_end, + start_reg: register_start, + count: register_end - register_start, }); let limit_decr_insn = limit_reg.map(|_| program.emit_placeholder()); program.emit_insn(Insn::NextAsync { cursor_id }); @@ -182,8 +182,8 @@ fn translate_select(select: Select) -> Result { assert!(!select.exist_aggregation); let (register_start, register_end) = translate_columns(&mut program, None, &select); program.emit_insn(Insn::ResultRow { - register_start, - register_end, + start_reg: register_start, + count: register_end - register_start, }); limit_reg.map(|_| program.emit_placeholder()) } @@ -481,8 +481,8 @@ fn translate_pragma( let pragma_result_end = program.next_free_register(); program.emit_insn(Insn::ResultRow { - register_start: pragma_result, - register_end: pragma_result_end, + start_reg: pragma_result, + count: pragma_result_end - pragma_result, }); } Some(ast::PragmaBody::Equals(value)) => { diff --git a/core/vdbe.rs b/core/vdbe.rs index c59f89be1..76ac2aa78 100644 --- a/core/vdbe.rs +++ b/core/vdbe.rs @@ -50,8 +50,8 @@ pub enum Insn { // Emit a row of results. ResultRow { - register_start: usize, - register_end: usize, + start_reg: usize, // P1 + count: usize, // P2 }, // Advance the cursor to the next row. @@ -289,11 +289,8 @@ impl Program { } state.pc += 1; } - Insn::ResultRow { - register_start, - register_end, - } => { - let record = make_record(&state.registers, register_end, register_start); + Insn::ResultRow { start_reg, count } => { + let record = make_record(&state.registers, start_reg, count); state.pc += 1; return Ok(StepResult::Row(record)); } @@ -431,13 +428,9 @@ impl Program { } } -fn make_record<'a>( - registers: &'a [OwnedValue], - register_end: &usize, - register_start: &usize, -) -> Record<'a> { - let mut values = Vec::with_capacity(*register_end - *register_start); - for i in *register_start..*register_end { +fn make_record<'a>(registers: &'a [OwnedValue], start_reg: &usize, count: &usize) -> Record<'a> { + let mut values = Vec::with_capacity(*count); + for i in *start_reg..*start_reg + count { values.push(crate::types::to_value(®isters[i])); } Record::new(values) @@ -522,17 +515,14 @@ fn insn_to_str(addr: BranchOffset, insn: &Insn) -> String { 0, format!("r[{}]= cursor {} column {}", dest, cursor_id, column), ), - Insn::ResultRow { - register_start, - register_end, - } => ( + Insn::ResultRow { start_reg, count } => ( "ResultRow", - *register_start as i32, - *register_end as i32, + *start_reg as i32, + *count as i32, 0, OwnedValue::Text(Rc::new("".to_string())), 0, - format!("output=r[{}..{}]", register_start, register_end), + format!("output=r[{}..{}]", start_reg, start_reg + count), ), Insn::NextAsync { cursor_id } => ( "NextAsync",