Staleenhancementgood first issuehelp wanted
Repository metrics
- Stars
- (19,103 stars)
- PR merge metrics
- (Avg merge 2d 11h) (147 merged PRs in 30d)
Description
We currently have SQLite VDBE opcodes defined in multiple places.
For example, for the If opcode, we have this in core/vdbe/mod.rs:
pub enum Insn {
/// Jump to target_pc if r\[reg\] != 0 or (r\[reg\] == NULL && r\[null_reg\] != 0)
If {
reg: usize, // P1
target_pc: BranchOffset, // P2
/// P3. If r\[reg\] is null, jump iff r\[null_reg\] != 0
null_reg: usize,
},
}
The following in core/vdbe/explain.rs:
Insn::Goto { target_pc } => (
"Goto",
0,
*target_pc as i32,
0,
OwnedValue::Text(Rc::new("".to_string())),
0,
"".to_string(),
),
and the following in cli/opcodes_dictionary.rs:
Let's implement some macro magic where we can do something like:
pub enum Insn {
/// Jump to target_pc if r\[reg\] != 0 or (r\[reg\] == NULL && r\[null_reg\] != 0)
#[description = "Jump to P2 if the value in register P1 is true. The value is considered true if it is numeric and non-zero. If the value in P1 is NULL then take the jump if and only if P3 is non-zero."]
If {
#[p1] reg: usize,
#[p2] target_pc: BranchOffset,
/// If r\[reg\] is null, jump iff r\[null_reg\] != 0
#[p3] null_reg: usize,
},
}