#![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();
String::from_utf8_lossy(&o.stdout).into_owned()
}
#[test]
fn order_by_alias_shadowing_base_column_matches_sqlite() {
if !sqlite3_available() {
eprintln!("sqlite3 CLI not found; skipping");
return;
}
let g = env!("CARGO_BIN_EXE_graphitesql");
let d = "CREATE TABLE t(a TEXT COLLATE NOCASE, b TEXT);\
INSERT INTO t VALUES('B','y'),('a','x'),('C','z'),('A','w');";
let d2 = "CREATE TABLE t(a TEXT, b TEXT);\
INSERT INTO t VALUES('B','y'),('a','x'),('C','z'),('A','w');";
let n = "CREATE TABLE n(x INT, y INT);INSERT INTO n VALUES(3,1),(1,2),(2,3);";
let cases: &[String] = &[
format!("{d}SELECT b AS a FROM t ORDER BY a;"),
format!("{d}SELECT b||'' AS a FROM t ORDER BY a;"),
format!("{d}SELECT b AS a, a AS realA FROM t ORDER BY a;"),
format!("{d2}SELECT b AS a FROM t ORDER BY a;"),
format!("{d2}SELECT a AS b, b AS a FROM t ORDER BY a;"),
format!("{n}SELECT y AS x FROM n ORDER BY x;"),
format!("{d}SELECT b AS a FROM t ORDER BY a DESC;"),
format!("{d}SELECT b AS a FROM t ORDER BY a COLLATE NOCASE;"),
format!("{d}SELECT a FROM t ORDER BY a;"),
format!("{d}SELECT a, b FROM t ORDER BY a;"),
format!("{d}SELECT b FROM t ORDER BY a;"),
format!("{d}SELECT a AS x FROM t ORDER BY x;"),
format!("{d}SELECT b AS zz FROM t ORDER BY zz;"),
format!("{d}SELECT upper(a) AS a FROM t ORDER BY a;"),
format!("{n}SELECT x, y FROM n ORDER BY x;"),
];
for q in cases {
assert_eq!(rows("sqlite3", q), rows(g, q), "mismatch for `{q}`");
}
}