use sqlite_vdbe::{Connection, Insn, StepResult};
fn main() -> sqlite_vdbe::Result<()> {
let mut conn = Connection::open_in_memory()?;
let mut builder = conn.new_program()?;
let r1 = builder.alloc_register(); let r2 = builder.alloc_register(); let r3 = builder.alloc_register();
builder.add_with_comment(
Insn::Integer { value: 1, dest: r1 },
&format!("r[{}]=1", r1),
);
builder.add_with_comment(
Insn::Integer { value: 1, dest: r2 },
&format!("r[{}]=1", r2),
);
builder.add_with_comment(
Insn::Add {
lhs: r1,
rhs: r2,
dest: r3,
},
&format!("r[{}]=r[{}]+r[{}]", r3, r1, r2),
);
builder.add_with_comment(
Insn::ResultRow {
start: r3,
count: 1,
},
&format!("output=r[{}]", r3),
);
builder.add(Insn::Halt);
let mut program = builder.finish(1)?;
println!("Program bytecode (EXPLAIN format):\n");
println!("{}", program);
println!("Executing...");
loop {
match program.step()? {
StepResult::Row => {
println!("Result: 1 + 1 = {}", program.column_int(0));
}
StepResult::Done => break,
}
}
println!("\nProgrammatic access to instructions:");
for (addr, insn) in program.instructions().iter().enumerate() {
if !insn.comment.is_empty() {
println!(" @{}: {} -- {}", addr, insn.opcode, insn.comment);
} else {
println!(" @{}: {}", addr, insn.opcode);
}
}
Ok(())
}