sqlite-opcode 0.1.0

SQLite opcodes and query planning
Documentation
mod constant;
pub use constant::Opcode;

#[derive(Debug)]
pub struct Explanation {
    pub table: Option<sqlite_table::Table>,
}

#[derive(Debug)]
pub struct Instr {
    pub addr: i32,
    pub comment: Option<String>,
    pub opcode: Opcode,
    pub p1: serde_json::Value,
    pub p2: serde_json::Value,
    pub p3: serde_json::Value,
    pub p4: serde_json::Value,
    pub p5: serde_json::Value,
}

pub fn explain(program: Vec<Instr>, schemas: &sqlite_table::Schemas) -> Explanation {
    let mut table = None;

    for instr in program {
        if matches!(
            instr.opcode,
            Opcode::OpenRead | Opcode::OpenWrite | Opcode::ReopenIdx
        ) {
            let id = match instr.p2 {
                serde_json::value::Value::Number(n) => n.as_u64().unwrap_or_default() as usize,
                _ => unreachable!(),
            };

            table = sqlite_table::find_table_by_root(id, schemas);
        }
    }

    Explanation { table }
}