mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-25 12:04:21 +01:00
Fix ResultRow operands
Fix ResultRow operands to follow SQLite bytecode format for consistency.
This commit is contained in:
@@ -152,14 +152,14 @@ fn translate_select(select: Select) -> Result<Program> {
|
||||
}
|
||||
// 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<Program> {
|
||||
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)) => {
|
||||
|
||||
32
core/vdbe.rs
32
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",
|
||||
|
||||
Reference in New Issue
Block a user