spg-engine 7.40.6

Execution engine for SPG: glues spg-sql parsing to spg-storage. Foreign keys, joins, vectors, cold tier.
Documentation
use spg_engine::{Engine, QueryResult};
fn g(e: &mut Engine, s: &str) -> String {
    match e.execute(s) {
        Ok(QueryResult::Rows { rows, .. }) => {
            if rows.is_empty() {
                "(empty)".into()
            } else {
                rows.iter()
                    .map(|r| format!("{:?}", r.values))
                    .collect::<Vec<_>>()
                    .join(" ")
            }
        }
        Ok(_) => "cmd".into(),
        Err(e) => format!(
            "ERR {}",
            format!("{e:?}").chars().take(46).collect::<String>()
        ),
    }
}
fn main() {
    let mut e = Engine::new();
    e.execute("CREATE TABLE t (k INT, c8 CHAR(8), v5 VARCHAR(5), n NUMERIC(10,3), b BIT(4), tv TSVECTOR, u UUID, by BYTEA, ts TIMESTAMP, d DATE, iv INTERVAL)").unwrap();
    e.execute("INSERT INTO t VALUES (1,'alpha','abc',12.345,B'1011',to_tsvector('a b'),'11111111-2222-3333-4444-555555555555','\\x0102','2026-01-02 03:04:05','2026-01-02', INTERVAL '1 day')").unwrap();
    for col in ["c8", "v5", "n", "b", "tv", "u", "by", "ts", "d", "iv"] {
        let direct = g(&mut e, &format!("SELECT {col} FROM t"));
        let subq = g(&mut e, &format!("SELECT (SELECT {col} FROM t WHERE k=1)"));
        let mark = if direct == subq { "ok " } else { "BAD" };
        println!("{mark} {col:<3} 直接 {direct:<46} 子查询 {subq}");
    }
}