#![cfg(feature = "std")]
use graphitesql::Connection;
fn run(setup: &[&str], sql: &str) -> String {
let mut c = Connection::open_memory().unwrap();
for s in setup {
c.execute(s).unwrap();
}
match c.execute(sql) {
Ok(_) => "<ok>".to_string(),
Err(e) => {
let m = e.to_string();
m.strip_prefix("error: ").unwrap_or(&m).to_string()
}
}
}
#[test]
fn wrong_qualifier_in_where_and_set_is_no_such_column() {
let setup = &["CREATE TABLE t(a, b)"];
assert_eq!(
run(setup, "UPDATE t SET a = 9 WHERE bad.t.a = 1"),
"no such column: bad.t.a"
);
assert_eq!(
run(setup, "UPDATE t SET a = 9 WHERE temp.t.a = 1"),
"no such column: temp.t.a"
);
assert_eq!(
run(setup, "UPDATE t SET b = bad.t.a"),
"no such column: bad.t.a"
);
assert_eq!(
run(setup, "DELETE FROM t WHERE bad.t.a = 1"),
"no such column: bad.t.a"
);
}
#[test]
fn correct_main_qualifier_resolves_like_the_bare_column() {
let setup = &["CREATE TABLE t(a, b)", "INSERT INTO t VALUES(1, 2)"];
assert_eq!(run(setup, "UPDATE t SET a = 9 WHERE main.t.a = 1"), "<ok>");
assert_eq!(run(setup, "UPDATE t SET b = main.t.a"), "<ok>");
assert_eq!(run(setup, "DELETE FROM t WHERE main.t.a = 1"), "<ok>");
assert_eq!(
run(setup, "UPDATE t SET a = 9 WHERE main.t.rowid = 1"),
"<ok>"
);
}
#[test]
fn unqualified_temp_target_validates_against_temp_not_main() {
let setup = &["CREATE TEMP TABLE t(a, b)", "INSERT INTO t VALUES(1, 2)"];
assert_eq!(run(setup, "UPDATE t SET a = 9 WHERE temp.t.a = 1"), "<ok>");
assert_eq!(run(setup, "UPDATE t SET b = temp.t.a"), "<ok>");
assert_eq!(run(setup, "DELETE FROM t WHERE temp.t.a = 1"), "<ok>");
assert_eq!(
run(setup, "UPDATE t SET a = 9 WHERE main.t.a = 1"),
"no such column: main.t.a"
);
assert_eq!(
run(setup, "DELETE FROM t WHERE main.t.a = 1"),
"no such column: main.t.a"
);
}
#[test]
fn returning_rejects_any_schema_qualified_column() {
let setup = &["CREATE TABLE t(a, b)", "INSERT INTO t VALUES(1, 2)"];
assert_eq!(
run(setup, "UPDATE t SET a = 5 RETURNING main.t.a"),
"no such column: main.t.a"
);
assert_eq!(run(setup, "UPDATE t SET a = 5 RETURNING t.a"), "<ok>");
assert_eq!(run(setup, "UPDATE t SET a = 5 RETURNING b"), "<ok>");
}