use crate::timon_engine::sql_query_parser::extract_table_names_and_ctes;
#[test]
fn test_simple_select() {
let sql = "SELECT * FROM users";
let (tables, ctes) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(ctes.is_empty());
}
#[test]
fn test_multiple_tables() {
let sql = "SELECT * FROM users, orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_qualified_table_names() {
let sql = "SELECT * FROM db.users";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(!tables.contains("db"));
}
#[test]
fn test_cte_extraction() {
let sql = "WITH cte1 AS (SELECT * FROM table1) SELECT * FROM cte1";
let (tables, ctes) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("table1"));
assert!(ctes.contains("cte1"));
}
#[test]
fn test_multiple_ctes() {
let sql = "WITH cte1 AS (SELECT * FROM t1), cte2 AS (SELECT * FROM t2) SELECT * FROM cte1";
let (tables, ctes) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("t1"));
assert!(tables.contains("t2"));
assert!(ctes.contains("cte1"));
assert!(ctes.contains("cte2"));
}
#[test]
fn test_nested_ctes() {
let sql = "WITH cte1 AS (WITH cte2 AS (SELECT * FROM t1) SELECT * FROM cte2) SELECT * FROM cte1";
let (tables, ctes) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("t1"));
assert!(ctes.contains("cte1"));
assert!(ctes.contains("cte2"));
}
#[test]
fn test_joins() {
let sql = "SELECT * FROM users JOIN orders ON users.id = orders.user_id";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_left_join() {
let sql = "SELECT * FROM users LEFT OUTER JOIN orders ON users.id = orders.user_id";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_right_join() {
let sql = "SELECT * FROM users RIGHT OUTER JOIN orders ON users.id = orders.user_id";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_full_outer_join() {
let sql = "SELECT * FROM users FULL OUTER JOIN orders ON users.id = orders.user_id";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_subquery_in_select() {
let sql = "SELECT (SELECT COUNT(*) FROM orders) as order_count FROM users";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_subquery_in_where() {
let sql = "SELECT * FROM users WHERE id IN (SELECT user_id FROM orders)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_exists_subquery() {
let sql = "SELECT * FROM users WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_derived_table() {
let sql = "SELECT * FROM (SELECT * FROM users) AS derived";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
}
#[test]
fn test_union() {
let sql = "SELECT * FROM users UNION SELECT * FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_intersect() {
let sql = "SELECT * FROM users INTERSECT SELECT * FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_except() {
let sql = "SELECT * FROM users EXCEPT SELECT * FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_group_by() {
let sql = "SELECT user_id, COUNT(*) FROM orders GROUP BY user_id";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("orders"));
}
#[test]
fn test_group_by_with_subquery() {
let sql = "SELECT user_id, (SELECT name FROM users WHERE id = orders.user_id) FROM orders GROUP BY user_id";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_having() {
let sql = "SELECT user_id, COUNT(*) FROM orders GROUP BY user_id HAVING COUNT(*) > 10";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("orders"));
}
#[test]
fn test_having_with_subquery() {
let sql = "SELECT user_id FROM orders GROUP BY user_id HAVING COUNT(*) > (SELECT AVG(cnt) FROM (SELECT COUNT(*) as cnt FROM orders GROUP BY user_id) AS stats)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("orders"));
}
#[test]
fn test_case_expression() {
let sql = "SELECT CASE WHEN user_id IN (SELECT id FROM users) THEN 'valid' ELSE 'invalid' END FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_binary_operators() {
let sql = "SELECT * FROM users WHERE id = (SELECT MAX(id) FROM orders)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_in_list() {
let sql = "SELECT * FROM users WHERE id IN ((SELECT id FROM orders), (SELECT id FROM products))";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
assert!(tables.contains("products"));
}
#[test]
fn test_between() {
let sql = "SELECT * FROM users WHERE id BETWEEN (SELECT MIN(id) FROM orders) AND (SELECT MAX(id) FROM orders)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_function_with_subquery() {
let sql = "SELECT COUNT((SELECT id FROM users)) FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_nested_expression() {
let sql = "SELECT * FROM users WHERE ((id IN (SELECT user_id FROM orders)))";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_update_statement() {
let sql = "UPDATE users SET name = 'test' WHERE id IN (SELECT user_id FROM orders)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_delete_statement() {
let sql = "DELETE FROM users WHERE id IN (SELECT user_id FROM orders)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.len() >= 1);
}
#[test]
fn test_insert_with_subquery() {
let sql = "INSERT INTO users SELECT * FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("orders"));
}
#[test]
fn test_nested_join() {
let sql = "SELECT * FROM users JOIN (orders JOIN products ON orders.product_id = products.id) ON users.id = orders.user_id";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
assert!(tables.contains("products"));
}
#[test]
fn test_invalid_sql() {
let sql = "INVALID SQL QUERY";
let result = extract_table_names_and_ctes(sql);
assert!(result.is_err());
}
#[test]
fn test_empty_query() {
let sql = "";
let result = extract_table_names_and_ctes(sql);
let _ = result;
}
#[test]
fn test_table_name_case_insensitive() {
let sql = "SELECT * FROM USERS";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(!tables.contains("USERS"));
}
#[test]
fn test_complex_query() {
let sql = "WITH recent_orders AS (
SELECT * FROM orders WHERE created_at > '2024-01-01'
),
user_stats AS (
SELECT user_id, COUNT(*) as order_count
FROM recent_orders
GROUP BY user_id
)
SELECT u.name, us.order_count
FROM users u
JOIN user_stats us ON u.id = us.user_id
WHERE u.id IN (SELECT id FROM users WHERE active = true)
HAVING us.order_count > (SELECT AVG(order_count) FROM user_stats)";
let (tables, ctes) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
assert!(ctes.contains("recent_orders"));
assert!(ctes.contains("user_stats"));
}
#[test]
fn test_delete_multiple_tables() {
let sql = "DELETE t1, t2 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id";
let result = extract_table_names_and_ctes(sql);
if let Ok((tables, _)) = result {
assert!(tables.len() >= 1);
}
}
#[test]
fn test_function_with_named_args() {
let sql = "SELECT func(arg1 => (SELECT id FROM users), arg2 => (SELECT name FROM orders))";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_function_with_expr_named_args() {
let sql = "SELECT func(arg := (SELECT id FROM users))";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
}
#[test]
fn test_case_with_operand() {
let sql = "SELECT CASE user_id WHEN (SELECT id FROM users) THEN 'valid' ELSE 'invalid' END FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_unary_operators_comprehensive() {
let sql = "SELECT -value, +value, NOT EXISTS (SELECT 1 FROM users) FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_cast_expressions() {
let sql = "SELECT CAST((SELECT COUNT(*) FROM users) AS INTEGER) FROM orders";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_function_args_comprehensive() {
let sql = "SELECT func(
(SELECT id FROM users),
arg1 => (SELECT name FROM orders),
arg2 := (SELECT price FROM products)
)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
assert!(tables.contains("products"));
}
#[test]
fn test_case_without_operand() {
let sql = "SELECT CASE WHEN id IN (SELECT user_id FROM orders) THEN 'valid' ELSE 'invalid' END FROM users";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
assert!(tables.contains("orders"));
}
#[test]
fn test_setexpr_values() {
let sql = "SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.len() >= 0);
}
#[test]
fn test_setexpr_insert() {
let sql = "SELECT * FROM (INSERT INTO users VALUES (1, 'test'))";
let _ = extract_table_names_and_ctes(sql);
}
#[test]
fn test_setexpr_update() {
let sql = "SELECT * FROM (UPDATE users SET name = 'test' WHERE id = 1)";
let _ = extract_table_names_and_ctes(sql);
}
#[test]
fn test_delete_with_table_name_extraction() {
let sql = "DELETE FROM table1, table2 WHERE id = 1";
let result = extract_table_names_and_ctes(sql);
if let Ok((tables, _)) = result {
assert!(tables.len() >= 1);
}
}
#[test]
fn test_delete_table_name_extraction() {
let sql = "DELETE table1, table2 FROM table1 WHERE id = 1";
let result = extract_table_names_and_ctes(sql);
if let Ok((tables, _)) = result {
assert!(tables.len() >= 1);
}
}
#[test]
fn test_setexpr_query_path() {
let sql = "SELECT * FROM (SELECT id FROM users) AS subquery";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
}
#[test]
fn test_setexpr_table_path() {
let sql = "SELECT * FROM my_table";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("my_table"));
}
#[test]
fn test_delete_with_from_keyword_lines44_45() {
let sql = "DELETE FROM users WHERE id = 1";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("users"));
let sql = "DELETE FROM table1, table2 WHERE id = 1";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("table1"));
assert!(tables.contains("table2"));
}
#[test]
fn test_setexpr_query_lines90_91() {
let sql = "SELECT * FROM t1 UNION (SELECT * FROM t2)";
let (tables, _) = extract_table_names_and_ctes(sql).unwrap();
assert!(tables.contains("t1"));
assert!(tables.contains("t2"));
}