use stoolap::Database;
fn setup_db(name: &str) -> Database {
let db = Database::open(&format!("memory://{}", name)).unwrap();
db.execute("CREATE TABLE t (id INTEGER PRIMARY KEY, val TEXT)", ())
.unwrap();
db.execute("INSERT INTO t VALUES (1, 'hello%world')", ())
.unwrap();
db.execute("INSERT INTO t VALUES (2, 'helloXworld')", ())
.unwrap();
db.execute("INSERT INTO t VALUES (3, '100% done')", ())
.unwrap();
db.execute("INSERT INTO t VALUES (4, '100X done')", ())
.unwrap();
db.execute("INSERT INTO t VALUES (5, 'under_score')", ())
.unwrap();
db.execute("INSERT INTO t VALUES (6, 'underXscore')", ())
.unwrap();
db.execute(r"INSERT INTO t VALUES (7, 'back\slash')", ())
.unwrap();
db.execute("INSERT INTO t VALUES (8, 'backXslash')", ())
.unwrap();
db
}
fn query_ids(db: &Database, sql: &str) -> Vec<i64> {
let mut rows = db.query(sql, ()).unwrap();
let mut ids = Vec::new();
while let Some(Ok(row)) = rows.next() {
ids.push(row.get::<i64>(0).unwrap());
}
ids.sort();
ids
}
#[test]
fn test_like_escape_literal_percent() {
let db = setup_db("like_escape_pct");
let ids = query_ids(&db, r"SELECT id FROM t WHERE val LIKE '%\%%'");
assert_eq!(ids, vec![1, 3], "Should match rows with literal '%'");
}
#[test]
fn test_like_escape_literal_underscore() {
let db = setup_db("like_escape_us");
let ids = query_ids(&db, r"SELECT id FROM t WHERE val LIKE '%\_%'");
assert_eq!(ids, vec![5], "Should match rows with literal '_'");
}
#[test]
fn test_like_escape_literal_backslash() {
let db = setup_db("like_escape_bs");
let ids = query_ids(&db, r"SELECT id FROM t WHERE val LIKE '%\\\\%'");
assert_eq!(ids, vec![7], "Should match rows with literal backslash");
}
#[test]
fn test_like_escape_no_false_positives() {
let db = setup_db("like_escape_nfp");
let ids = query_ids(&db, "SELECT id FROM t WHERE val LIKE '%world'");
assert_eq!(ids, vec![1, 2], "Without escape, % matches anything");
}
#[test]
fn test_like_escape_combined() {
let db = setup_db("like_escape_comb");
let ids = query_ids(&db, r"SELECT id FROM t WHERE val LIKE '%\%%'");
assert_eq!(ids, vec![1, 3]);
}
#[test]
fn test_like_escape_with_explicit_escape_clause() {
let db = setup_db("like_escape_clause");
let ids = query_ids(&db, "SELECT id FROM t WHERE val LIKE '%!%%' ESCAPE '!'");
assert_eq!(ids, vec![1, 3], "ESCAPE '!' should treat !% as literal '%'");
}
#[test]
fn test_like_escape_underscore_with_escape_clause() {
let db = setup_db("like_escape_us_clause");
let ids = query_ids(&db, "SELECT id FROM t WHERE val LIKE '%!_%' ESCAPE '!'");
assert_eq!(ids, vec![5], "ESCAPE '!' should treat !_ as literal '_'");
}