use scythe_codegen::{generate_with_backend, get_backend};
use scythe_core::analyzer::AnalyzedQuery;
use scythe_core::parser::QueryCommand;
fn zero_param_exec_query(sql: &str) -> AnalyzedQuery {
AnalyzedQuery::build(|q| {
q.name = "TouchRow".to_string();
q.command = QueryCommand::Exec;
q.sql = sql.to_string();
q.columns = vec![];
q.params = vec![];
})
}
fn query_fn(engine: &str, query: &AnalyzedQuery) -> String {
let backend =
get_backend("java-jdbc", engine).unwrap_or_else(|error| panic!("java-jdbc must support {engine}: {error}"));
let generated = generate_with_backend(query, &*backend).unwrap_or_else(|error| panic!("codegen failed: {error}"));
generated.query_fn.unwrap_or_else(|| panic!("produced no query fn"))
}
#[test]
fn java_jdbc_mysql_preserves_a_backtick_identifier_containing_double_dash() {
let query = zero_param_exec_query("SELECT `a -- b` FROM t");
let code = query_fn("mysql", &query);
assert!(
code.contains("prepareStatement(\"SELECT `a -- b` FROM t\")"),
"backtick identifier must survive intact; got:\n{code}"
);
}
#[test]
fn java_jdbc_mssql_preserves_a_bracket_identifier_containing_double_dash() {
let query = zero_param_exec_query("SELECT [a -- b] FROM t");
let code = query_fn("mssql", &query);
assert!(
code.contains("prepareStatement(\"SELECT [a -- b] FROM t\")"),
"bracket identifier must survive intact; got:\n{code}"
);
}
#[test]
fn java_jdbc_mysql_strips_a_hash_comment() {
let query = zero_param_exec_query("SELECT 1 # do not leak this comment\nFROM t");
let code = query_fn("mysql", &query);
assert!(
!code.contains("do not leak this comment"),
"# comment must be stripped under MySQL; got:\n{code}"
);
assert!(code.contains("SELECT 1"), "got:\n{code}");
assert!(code.contains("FROM t"), "got:\n{code}");
}
#[test]
fn java_jdbc_postgresql_zero_param_jsonb_query_emits_no_binds() {
let query = zero_param_exec_query("SELECT * FROM docs WHERE data ? 'active'");
let code = query_fn("postgresql", &query);
assert!(
code.contains("prepareStatement(\"SELECT * FROM docs WHERE data ? 'active'\")"),
"got:\n{code}"
);
assert_eq!(
code.matches("ps.set").count(),
0,
"a zero-parameter query must emit no bind statements; got:\n{code}"
);
}