#![cfg(feature = "std")]
use graphitesql::{Connection, Value};
fn setup() -> Connection {
let mut c = Connection::open_memory().unwrap();
c.execute("CREATE TABLE t(x)").unwrap();
c.execute("INSERT INTO t VALUES(1),(2),(3)").unwrap();
c
}
fn vdbe1(c: &Connection, sql: &str) -> Value {
c.query_vdbe(sql).unwrap().rows[0][0].clone()
}
#[test]
fn computed_in_select_runs_on_vdbe() {
let c = setup();
assert_eq!(
vdbe1(&c, "SELECT 2 IN (SELECT x+0 FROM t)"),
Value::Integer(1)
);
assert_eq!(
vdbe1(&c, "SELECT 9 IN (SELECT x+0 FROM t)"),
Value::Integer(0)
);
assert_eq!(
vdbe1(&c, "SELECT 5 NOT IN (SELECT x*10 FROM t)"),
Value::Integer(1)
);
assert_eq!(
vdbe1(&c, "SELECT 1 IN (SELECT x+0 FROM t WHERE 0)"),
Value::Integer(0)
);
assert_eq!(
vdbe1(&c, "SELECT 1 NOT IN (SELECT x+0 FROM t WHERE 0)"),
Value::Integer(1)
);
let rows = c
.query_vdbe("SELECT x FROM t WHERE x IN (SELECT x+0 FROM t WHERE x<>2) ORDER BY x")
.unwrap()
.rows;
assert_eq!(rows, vec![vec![Value::Integer(1)], vec![Value::Integer(3)]]);
}
#[test]
fn bare_column_in_select_runs_on_vdbe() {
let c = setup();
assert_eq!(
vdbe1(&c, "SELECT 2 IN (SELECT x FROM t)"),
Value::Integer(1)
);
assert_eq!(
vdbe1(&c, "SELECT 9 IN (SELECT x FROM t)"),
Value::Integer(0)
);
assert_eq!(
vdbe1(&c, "SELECT 9 NOT IN (SELECT x FROM t)"),
Value::Integer(1)
);
assert_eq!(
c.query("SELECT 2 IN (SELECT x FROM t)").unwrap().rows[0][0],
Value::Integer(1)
);
}
#[test]
fn bare_column_in_select_affinity_combos_match_tree_walker() {
let mut c = Connection::open_memory().unwrap();
for s in [
"CREATE TABLE li(x INTEGER)",
"INSERT INTO li VALUES(1)",
"CREATE TABLE lt(x TEXT)",
"INSERT INTO lt VALUES('1')",
"CREATE TABLE ln(x)",
"INSERT INTO ln VALUES(1)",
"CREATE TABLE lr(x REAL)",
"INSERT INTO lr VALUES(1)",
"CREATE TABLE ct(y TEXT)",
"INSERT INTO ct VALUES('1')",
"CREATE TABLE ci(y INTEGER)",
"INSERT INTO ci VALUES(1)",
"CREATE TABLE cn(y)",
"INSERT INTO cn VALUES(1)",
"CREATE TABLE cf(y TEXT)",
"INSERT INTO cf VALUES('1.0')",
] {
c.execute(s).unwrap();
}
let cases = [
("SELECT count(*) FROM ln WHERE x IN (SELECT y FROM ct)", 0), ("SELECT count(*) FROM lt WHERE x IN (SELECT y FROM cn)", 0), ("SELECT count(*) FROM li WHERE x IN (SELECT y FROM ct)", 1), ("SELECT count(*) FROM ln WHERE x IN (SELECT y FROM cn)", 1), ("SELECT count(*) FROM lt WHERE x IN (SELECT y FROM ci)", 1), ("SELECT count(*) FROM li WHERE x IN (SELECT y FROM ci)", 1), ("SELECT count(*) FROM lr WHERE x IN (SELECT y FROM ct)", 1), ("SELECT count(*) FROM li WHERE x IN (SELECT y FROM cf)", 1), (
"SELECT count(*) FROM li WHERE x NOT IN (SELECT y FROM ct)",
0,
), ];
for (q, want) in cases {
let v = c.query_vdbe(q).unwrap().rows[0][0].clone();
assert_eq!(v, Value::Integer(want), "VDBE result diverged: {q}");
assert_eq!(
c.query(q).unwrap().rows[0][0],
Value::Integer(want),
"tree-walker diverged: {q}"
);
}
}