spg-engine 7.38.21

Execution engine for SPG: glues spg-sql parsing to spg-storage. Foreign keys, joins, vectors, cold tier.
Documentation
use spg_engine::{Engine, QueryResult};
fn n(e: &mut Engine, sql: &str) -> String {
    match e.execute(sql) {
        Ok(QueryResult::Rows { rows, .. }) => format!("{}", rows.len()),
        Ok(o) => format!("{o:?}"),
        Err(x) => format!("ERR {x:?}"),
    }
}
fn main() {
    for (label, decl, want_equi, want_non) in [
        ("implicit CI ", "VARCHAR(20)", 2, 2),
        ("explicit bin", "VARCHAR(20) COLLATE utf8mb4_bin", 1, 1),
    ] {
        let mut e = Engine::new();
        e.execute("SET sql_mode = 'STRICT_TRANS_TABLES'").unwrap();
        e.execute(&format!("CREATE TABLE l (id INT, s {decl})"))
            .unwrap();
        e.execute(&format!("CREATE TABLE r (id INT, s {decl})"))
            .unwrap();
        e.execute("INSERT INTO l VALUES (1,'a'),(2,'b')").unwrap();
        e.execute("INSERT INTO r VALUES (1,'A'),(2,'b')").unwrap();
        let equi = n(&mut e, "SELECT l.id FROM l JOIN r ON l.s = r.s");
        let non = n(&mut e, "SELECT l.id FROM l JOIN r ON (l.s = r.s OR FALSE)");
        let ok = equi == want_equi.to_string() && non == want_non.to_string();
        println!(
            "{label}  equi={equi:<4} non-equi={non:<4}  MySQL wants {want_equi}/{want_non}  {}",
            if ok { "OK" } else { "!! MISMATCH" }
        );
    }
}