use stoolap::parser::parse_sql;
#[test]
fn test_multi_statement_transaction() {
let sql = "
BEGIN TRANSACTION;
INSERT INTO users (id, name) VALUES (1, 'Alice');
COMMIT;
";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Multi-statement parsing should succeed: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(
statements.len(),
3,
"Expected 3 statements, got {}",
statements.len()
);
}
#[test]
fn test_multi_statement_create_insert() {
let sql = "
CREATE TABLE test (id INTEGER, name TEXT);
INSERT INTO test VALUES (1, 'one');
INSERT INTO test VALUES (2, 'two');
";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Multi-statement parsing should succeed: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(statements.len(), 3, "Expected 3 statements");
}
#[test]
fn test_multi_statement_select() {
let sql = "
SELECT * FROM table1;
SELECT * FROM table2;
SELECT COUNT(*) FROM table3;
";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Multi-statement parsing should succeed: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(statements.len(), 3, "Expected 3 SELECT statements");
}
#[test]
fn test_single_statement_no_semicolon() {
let sql = "SELECT * FROM users";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Single statement should parse: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(statements.len(), 1, "Expected 1 statement");
}
#[test]
fn test_single_statement_with_semicolon() {
let sql = "SELECT * FROM users;";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Single statement should parse: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(statements.len(), 1, "Expected 1 statement");
}
#[test]
fn test_multi_statement_update_delete() {
let sql = "
UPDATE users SET name = 'Bob' WHERE id = 1;
DELETE FROM users WHERE id = 2;
";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Multi-statement parsing should succeed: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(statements.len(), 2, "Expected 2 statements");
}
#[test]
fn test_multi_statement_with_index() {
let sql = "
CREATE TABLE items (id INTEGER, name TEXT);
CREATE INDEX idx_name ON items (name);
";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Multi-statement parsing should succeed: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(statements.len(), 2, "Expected 2 statements");
}
#[test]
fn test_multi_statement_with_drop() {
let sql = "
DROP INDEX IF EXISTS idx_old;
DROP TABLE IF EXISTS old_table;
";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Multi-statement parsing should succeed: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(statements.len(), 2, "Expected 2 statements");
}
#[test]
fn test_empty_statements() {
let sql = ";;;";
let result = parse_sql(sql);
if let Ok(statements) = result {
assert!(
statements.is_empty() || statements.len() <= 3,
"Empty statements should not produce multiple real statements"
);
}
}
#[test]
fn test_mixed_ddl_dml() {
let sql = "
CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price FLOAT);
INSERT INTO products VALUES (1, 'Widget', 9.99);
SELECT * FROM products WHERE price > 5;
UPDATE products SET price = 10.99 WHERE id = 1;
";
let result = parse_sql(sql);
assert!(
result.is_ok(),
"Mixed DDL/DML should parse: {:?}",
result.err()
);
let statements = result.unwrap();
assert_eq!(statements.len(), 4, "Expected 4 statements");
}