#![cfg(feature = "std")]
use std::process::Command;
fn sqlite3_available() -> bool {
Command::new("sqlite3").arg("--version").output().is_ok()
}
fn rows(bin: &str, sql: &str) -> String {
let o = Command::new(bin).arg(":memory:").arg(sql).output().unwrap();
let mut v: Vec<String> = String::from_utf8_lossy(&o.stdout)
.lines()
.map(String::from)
.collect();
v.sort();
v.join("\n")
}
#[test]
fn correlated_comparison_affinity_matches_sqlite() {
if !sqlite3_available() {
eprintln!("sqlite3 CLI not found; skipping");
return;
}
let g = env!("CARGO_BIN_EXE_graphitesql");
let cases: &[&str] = &[
"CREATE TABLE t(a);CREATE TABLE u(a TEXT);\
INSERT INTO t VALUES('x'),(2);INSERT INTO u VALUES('2'),('3');\
SELECT a FROM t WHERE EXISTS(SELECT 1 FROM u WHERE u.a=t.a)",
"CREATE TABLE t(a INTEGER);CREATE TABLE u(a);\
INSERT INTO t VALUES(2),(3);INSERT INTO u VALUES('2');\
SELECT a FROM t WHERE EXISTS(SELECT 1 FROM u WHERE u.a=t.a)",
"CREATE TABLE t(a);CREATE TABLE u(a TEXT);\
INSERT INTO t VALUES('x'),(2);INSERT INTO u VALUES('2');\
SELECT a FROM t WHERE a IN (SELECT a FROM u)",
"CREATE TABLE t(a);CREATE TABLE u(a TEXT,v);\
INSERT INTO t VALUES(2),('3');INSERT INTO u VALUES('2','p');\
SELECT a,(SELECT v FROM u WHERE u.a=t.a) FROM t ORDER BY a",
"CREATE TABLE t(a);CREATE TABLE u(a TEXT);CREATE INDEX iu ON u(a);\
INSERT INTO t VALUES('x'),(2),(3);INSERT INTO u VALUES('2'),('3');\
SELECT a FROM t WHERE EXISTS(SELECT 1 FROM u WHERE u.a=t.a)",
"CREATE TABLE t(a INTEGER);CREATE TABLE u(a INTEGER);\
INSERT INTO t VALUES(1),(2),(3);INSERT INTO u VALUES(2),(3);\
SELECT a FROM t WHERE EXISTS(SELECT 1 FROM u WHERE u.a=t.a)",
"CREATE TABLE t(a TEXT);CREATE TABLE u(a TEXT);\
INSERT INTO t VALUES('x'),('y');INSERT INTO u VALUES('x');\
SELECT a FROM t WHERE a IN (SELECT a FROM u)",
"CREATE TABLE t(a INTEGER);INSERT INTO t VALUES(1),(2);\
SELECT a FROM t WHERE a=(SELECT 2)",
];
for q in cases {
let sql = format!("{q};");
assert_eq!(rows("sqlite3", &sql), rows(g, &sql), "mismatch for `{q}`");
}
}