spg-engine 7.37.17

Execution engine for SPG: glues spg-sql parsing to spg-storage. Foreign keys, joins, vectors, cold tier.
Documentation
use spg_engine::Engine;
fn q(e: &mut Engine, sql: &str) {
    match e.execute(sql) {
        Ok(spg_engine::QueryResult::Rows { rows, .. }) => {
            println!("-- {sql}");
            for r in rows.iter().take(8) {
                println!("   {:?}", r.values);
            }
            if rows.is_empty() {
                println!("   (0 rows)");
            }
        }
        Ok(o) => println!("-- {sql} => {o:?}"),
        Err(x) => println!("-- {sql} => ERR {x}"),
    }
}
fn main() {
    let mut e = Engine::new();
    e.execute("CREATE TABLE t (id INT, v TEXT)").unwrap();
    e.execute("CREATE VIEW vv AS SELECT id FROM t").unwrap();
    e.execute("CREATE MATERIALIZED VIEW mv AS SELECT id FROM t")
        .unwrap();
    for s in [
        "SELECT relname, relkind FROM pg_class ORDER BY relname",
        "SELECT attname FROM pg_attribute WHERE attrelid = 'vv'::regclass",
        "SELECT count(*) FROM pg_attribute WHERE attrelid = 't'::regclass AND attnum > 0",
        "SELECT relname FROM pg_class WHERE relkind = 'm'",
        "SELECT 'mv'::regclass",
        "SELECT table_name, table_type FROM information_schema.tables ORDER BY table_name",
    ] {
        q(&mut e, s);
    }
}