use iridium_core::executor::database::Engine;
#[test]
fn test_new_keywords_lexing() {
let engine = Engine::new();
let sql = "SELECT ANY, SOME, USER, DATABASE, BACKUP, RESTORE, CHECKPOINT, KILL, AUTHORIZATION, BROWSE, SHUTDOWN";
let result = engine.query(sql);
assert!(result.is_err());
let err_msg = format!("{:?}", result.err().unwrap());
eprintln!("Error message: {}", err_msg);
assert!(err_msg.contains("ColumnNotFound"), "Expected ColumnNotFound, got: {}", err_msg);
}
#[test]
fn test_system_procedures_2025() {
let engine = Engine::new();
let res = engine.query("EXEC sp_who").unwrap();
assert_eq!(res.columns[0], "spid");
assert!(!res.rows.is_empty());
let res = engine.query("EXEC sp_databases").unwrap();
assert_eq!(res.columns[0], "DATABASE_NAME");
assert!(res.rows.iter().any(|r| r[0].to_string_value() == "master"));
let res = engine.query("EXEC sp_server_info").unwrap();
assert_eq!(res.columns[0], "ATTRIBUTE_ID");
assert!(res.rows.len() >= 6);
let res = engine.query("EXEC sp_monitor").unwrap();
assert_eq!(res.columns[0], "last_run");
assert_eq!(res.rows.len(), 1);
}
#[test]
fn test_identity_insert_and_col() {
let engine = Engine::new();
engine.exec("CREATE TABLE IdTest (Id INT IDENTITY(1,1), Val VARCHAR(10))").unwrap();
engine.exec("INSERT INTO IdTest (Val) VALUES ('a')").unwrap();
let res = engine.query("SELECT IDENTITYCOL, Val FROM IdTest").unwrap();
assert_eq!(res.rows[0][0].to_string_value(), "1");
assert_eq!(res.rows[0][1].to_string_value(), "a");
engine.exec("SET IDENTITY_INSERT IdTest ON").unwrap();
engine.exec("INSERT INTO IdTest (Id, Val) VALUES (10, 'b')").unwrap();
let res = engine.query("SELECT Id, Val FROM IdTest WHERE Id = 10").unwrap();
assert_eq!(res.rows[0][0].to_string_value(), "10");
let res = engine.query("SELECT T.IDENTITYCOL FROM IdTest T WHERE T.Id = 10").unwrap();
assert_eq!(res.rows[0][0].to_string_value(), "10");
engine.exec("SET IDENTITY_INSERT IdTest OFF").unwrap();
let res = engine.exec("INSERT INTO IdTest (Id, Val) VALUES (20, 'c')");
assert!(res.is_err());
}
#[test]
fn test_logic_functions_parity() {
let engine = Engine::new();
let res = engine.query("SELECT COALESCE(NULL, 1, 2), NULLIF(1, 1), NULLIF(1, 2)").unwrap();
assert_eq!(res.rows[0][0].to_string_value(), "1");
assert!(res.rows[0][1].is_null());
assert_eq!(res.rows[0][2].to_string_value(), "1");
}
#[test]
fn test_like_escape_parity() {
let engine = Engine::new();
engine.exec("CREATE TABLE LikeTest (Pat VARCHAR(10))").unwrap();
engine.exec("INSERT INTO LikeTest VALUES ('10%'), ('100')").unwrap();
let res = engine.query("SELECT Pat FROM LikeTest WHERE Pat LIKE '10!%' ESCAPE '!'").unwrap();
assert_eq!(res.rows.len(), 1);
assert_eq!(res.rows[0][0].to_string_value(), "10%");
}
#[test]
fn test_new_system_procedures_2025_extended() {
let engine = Engine::new();
let res = engine.query("EXEC sp_helpuser").unwrap();
assert_eq!(res.columns[0], "UserName");
assert!(res.rows.iter().any(|r| r[0].to_string_value() == "dbo"));
let res = engine.query("EXEC sp_helprole").unwrap();
assert_eq!(res.columns[0], "RoleName");
let res = engine.query("EXEC sp_helprolemember").unwrap();
assert_eq!(res.columns[0], "DbRole");
let res = engine.query("EXEC sp_helpsrvrole").unwrap();
assert_eq!(res.columns[0], "ServerRole");
assert!(res.rows.iter().any(|r| r[0].to_string_value() == "sysadmin"));
let res = engine.query("EXEC sp_helpsrvrolemember").unwrap();
assert_eq!(res.columns[0], "ServerRole");
assert!(res.rows.iter().any(|r| r[0].to_string_value() == "sysadmin" && r[1].to_string_value() == "sa"));
let res = engine.query("EXEC sp_helpfile").unwrap();
assert_eq!(res.columns[0], "name");
assert!(res.rows.iter().any(|r| r[0].to_string_value() == "iridium_sql"));
let res = engine.query("EXEC sp_helpfilegroup").unwrap();
assert_eq!(res.columns[0], "name");
assert!(res.rows.iter().any(|r| r[0].to_string_value() == "PRIMARY"));
}