use stoolap::Database;
fn setup_base_table(db: &Database) {
db.execute(
"CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT,
salary FLOAT
)",
(),
)
.expect("Failed to create employees table");
db.execute(
"INSERT INTO employees (id, name, department, salary) VALUES
(1, 'Alice', 'Engineering', 100000.0),
(2, 'Bob', 'Engineering', 90000.0),
(3, 'Charlie', 'Sales', 80000.0),
(4, 'David', 'Sales', 75000.0),
(5, 'Eve', 'HR', 70000.0)",
(),
)
.expect("Failed to insert employees");
}
#[test]
fn test_create_view_basic() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE VIEW engineering_employees AS SELECT * FROM employees WHERE department = 'Engineering'",
(),
)
.expect("Failed to create view");
let rows = db
.query("SELECT * FROM engineering_employees ORDER BY id", ())
.expect("Failed to query view");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice");
assert_eq!(results[1].get_by_name::<String>("name").unwrap(), "Bob");
}
#[test]
fn test_create_view_if_not_exists() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW my_view AS SELECT * FROM employees", ())
.expect("Failed to create view");
db.execute(
"CREATE VIEW IF NOT EXISTS my_view AS SELECT id FROM employees",
(),
)
.expect("CREATE VIEW IF NOT EXISTS should not fail");
let rows = db
.query("SELECT * FROM my_view LIMIT 1", ())
.expect("Failed to query view");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
}
#[test]
fn test_drop_view_basic() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW temp_view AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query("SELECT * FROM temp_view", ())
.expect("Failed to query view");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 5);
db.execute("DROP VIEW temp_view", ())
.expect("Failed to drop view");
let result = db.query("SELECT * FROM temp_view", ());
assert!(result.is_err());
}
#[test]
fn test_drop_view_if_exists() {
let db = Database::open_in_memory().expect("Failed to open database");
db.execute("DROP VIEW IF EXISTS non_existent_view", ())
.expect("DROP VIEW IF EXISTS should not fail");
}
#[test]
fn test_view_column_selection() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE VIEW employee_names AS SELECT id, name FROM employees",
(),
)
.expect("Failed to create view");
let rows = db
.query("SELECT name FROM employee_names WHERE id = 1", ())
.expect("Failed to query view");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice");
}
#[test]
fn test_view_with_aggregation() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE VIEW dept_stats AS SELECT department, COUNT(*) as emp_count, AVG(salary) as avg_salary FROM employees GROUP BY department",
(),
)
.expect("Failed to create view");
let rows = db
.query("SELECT * FROM dept_stats ORDER BY department", ())
.expect("Failed to query view");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 3);
let eng = results
.iter()
.find(|r| r.get_by_name::<String>("department").unwrap() == "Engineering")
.unwrap();
assert_eq!(eng.get_by_name::<i64>("emp_count").unwrap(), 2);
}
#[test]
fn test_view_with_outer_where() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query("SELECT * FROM all_employees WHERE salary > 80000", ())
.expect("Failed to query view with WHERE");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2); }
#[test]
fn test_view_table_name_conflict() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
let result = db.execute("CREATE VIEW employees AS SELECT 1", ());
assert!(result.is_err());
}
#[test]
fn test_view_case_insensitive() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW MyView AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query("SELECT * FROM myview", ())
.expect("Failed to query view with different case");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 5);
db.execute("DROP VIEW MYVIEW", ())
.expect("Failed to drop view with different case");
}
#[test]
fn test_view_with_order_by() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query("SELECT * FROM all_employees ORDER BY salary", ())
.expect("Failed to query view with ORDER BY");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 5);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Eve"); assert_eq!(results[4].get_by_name::<String>("name").unwrap(), "Alice");
let rows = db
.query("SELECT * FROM all_employees ORDER BY salary DESC", ())
.expect("Failed to query view with ORDER BY DESC");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice"); assert_eq!(results[4].get_by_name::<String>("name").unwrap(), "Eve"); }
#[test]
fn test_view_with_limit() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query("SELECT * FROM all_employees ORDER BY id LIMIT 3", ())
.expect("Failed to query view with LIMIT");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 3);
assert_eq!(results[0].get_by_name::<i64>("id").unwrap(), 1);
assert_eq!(results[2].get_by_name::<i64>("id").unwrap(), 3);
}
#[test]
fn test_view_with_offset() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT * FROM all_employees ORDER BY id LIMIT 2 OFFSET 2",
(),
)
.expect("Failed to query view with LIMIT OFFSET");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2);
assert_eq!(results[0].get_by_name::<i64>("id").unwrap(), 3); assert_eq!(results[1].get_by_name::<i64>("id").unwrap(), 4); }
#[test]
fn test_view_with_distinct() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE VIEW departments AS SELECT department FROM employees",
(),
)
.expect("Failed to create view");
let rows = db
.query("SELECT DISTINCT * FROM departments ORDER BY department", ())
.expect("Failed to query view with DISTINCT");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 3); }
#[test]
fn test_view_in_join_with_table() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE TABLE projects (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
)",
(),
)
.expect("Failed to create projects table");
db.execute(
"INSERT INTO projects (id, name, department) VALUES
(1, 'Project Alpha', 'Engineering'),
(2, 'Project Beta', 'Sales')",
(),
)
.expect("Failed to insert projects");
db.execute(
"CREATE VIEW eng_employees AS SELECT id, name, department FROM employees WHERE department = 'Engineering'",
(),
)
.expect("Failed to create view");
let rows = db
.query(
"SELECT e.name, p.name FROM eng_employees e JOIN projects p ON e.department = p.department ORDER BY e.name",
(),
)
.expect("Failed to query view in JOIN");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2); }
#[test]
fn test_view_join_with_view() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE VIEW high_salary AS SELECT * FROM employees WHERE salary >= 90000",
(),
)
.expect("Failed to create high_salary view");
db.execute(
"CREATE VIEW eng_dept AS SELECT * FROM employees WHERE department = 'Engineering'",
(),
)
.expect("Failed to create eng_dept view");
let rows = db
.query(
"SELECT h.name FROM high_salary h JOIN eng_dept e ON h.id = e.id ORDER BY h.name",
(),
)
.expect("Failed to join two views");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2); assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice");
assert_eq!(results[1].get_by_name::<String>("name").unwrap(), "Bob");
}
#[test]
fn test_nested_views() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE VIEW high_salary AS SELECT * FROM employees WHERE salary >= 80000",
(),
)
.expect("Failed to create first view");
db.execute(
"CREATE VIEW high_salary_eng AS SELECT * FROM high_salary WHERE department = 'Engineering'",
(),
)
.expect("Failed to create nested view");
let rows = db
.query("SELECT * FROM high_salary_eng ORDER BY salary DESC", ())
.expect("Failed to query nested view");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2); assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice");
assert_eq!(results[1].get_by_name::<String>("name").unwrap(), "Bob");
}
#[test]
fn test_view_with_join_definition() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE TABLE departments (
id INTEGER PRIMARY KEY,
name TEXT,
budget FLOAT
)",
(),
)
.expect("Failed to create departments table");
db.execute(
"INSERT INTO departments (id, name, budget) VALUES
(1, 'Engineering', 500000.0),
(2, 'Sales', 300000.0),
(3, 'HR', 200000.0)",
(),
)
.expect("Failed to insert departments");
db.execute(
"CREATE VIEW employee_with_budget AS
SELECT e.name, e.salary, d.budget
FROM employees e
JOIN departments d ON e.department = d.name",
(),
)
.expect("Failed to create view with JOIN");
let rows = db
.query(
"SELECT * FROM employee_with_budget ORDER BY salary DESC LIMIT 3",
(),
)
.expect("Failed to query view with JOIN definition");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 3);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice");
assert_eq!(results[0].get_by_name::<f64>("budget").unwrap(), 500000.0);
}
#[test]
fn test_create_table_conflicts_with_view() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW my_view AS SELECT * FROM employees", ())
.expect("Failed to create view");
let result = db.execute("CREATE TABLE my_view (id INTEGER PRIMARY KEY)", ());
assert!(result.is_err());
}
#[test]
fn test_view_with_multiple_order_by() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT * FROM all_employees ORDER BY department ASC, salary DESC",
(),
)
.expect("Failed to query view with multiple ORDER BY");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 5);
assert_eq!(
results[0].get_by_name::<String>("department").unwrap(),
"Engineering"
);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice");
assert_eq!(
results[1].get_by_name::<String>("department").unwrap(),
"Engineering"
);
assert_eq!(results[1].get_by_name::<String>("name").unwrap(), "Bob");
}
#[test]
fn test_view_with_combined_clauses() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT * FROM all_employees WHERE salary > 70000 ORDER BY salary DESC LIMIT 2",
(),
)
.expect("Failed to query view with combined clauses");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice"); assert_eq!(results[1].get_by_name::<String>("name").unwrap(), "Bob"); }
#[test]
fn test_view_select_columns_with_order_by() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT name, salary FROM all_employees ORDER BY salary DESC LIMIT 3",
(),
)
.expect("Failed to query view with column selection and ORDER BY");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 3);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice");
assert_eq!(results[0].get_by_name::<f64>("salary").unwrap(), 100000.0);
}
#[test]
fn test_view_reflects_table_changes() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query("SELECT * FROM all_employees", ())
.expect("Failed to query view");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 5);
db.execute(
"INSERT INTO employees (id, name, department, salary) VALUES (6, 'Frank', 'Engineering', 85000.0)",
(),
)
.expect("Failed to insert employee");
let rows = db
.query("SELECT * FROM all_employees", ())
.expect("Failed to query view after insert");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 6);
db.execute("DELETE FROM employees WHERE id = 1", ())
.expect("Failed to delete employee");
let rows = db
.query("SELECT * FROM all_employees", ())
.expect("Failed to query view after delete");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 5);
}
#[test]
fn test_query_nonexistent_view() {
let db = Database::open_in_memory().expect("Failed to open database");
let result = db.query("SELECT * FROM nonexistent_view", ());
assert!(result.is_err());
}
#[test]
fn test_drop_view_preserves_table() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW temp AS SELECT * FROM employees", ())
.expect("Failed to create view");
db.execute("DROP VIEW temp", ())
.expect("Failed to drop view");
let rows = db
.query("SELECT * FROM employees", ())
.expect("Failed to query table after dropping view");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 5);
}
#[test]
fn test_view_depth_limit() {
let db = Database::open_in_memory().expect("Failed to open database");
db.execute("CREATE TABLE t (id INTEGER PRIMARY KEY, value INTEGER)", ())
.expect("Failed to create table");
db.execute("INSERT INTO t VALUES (1, 100)", ())
.expect("Failed to insert");
db.execute("CREATE VIEW v0 AS SELECT * FROM t", ())
.expect("Failed to create v0");
for i in 1..35 {
let sql = format!("CREATE VIEW v{} AS SELECT * FROM v{}", i, i - 1);
db.execute(&sql, ())
.unwrap_or_else(|_| panic!("Failed to create v{}", i));
}
let result = db.query("SELECT * FROM v34", ());
match result {
Err(e) => {
let err_msg = e.to_string();
assert!(
err_msg.contains("depth") || err_msg.contains("nesting"),
"Error message should mention depth/nesting: {}",
err_msg
);
}
Ok(_) => panic!("Expected error due to view depth limit exceeded"),
}
let rows = db
.query("SELECT * FROM v30", ())
.expect("Failed to query v30");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(results[0].get::<i64>(0).unwrap(), 1);
}
#[test]
fn test_show_views() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
let rows = db
.query("SHOW VIEWS", ())
.expect("Failed to execute SHOW VIEWS");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 0);
db.execute("CREATE VIEW view_a AS SELECT * FROM employees", ())
.expect("Failed to create view_a");
db.execute(
"CREATE VIEW view_b AS SELECT name, salary FROM employees WHERE salary > 80000",
(),
)
.expect("Failed to create view_b");
let rows = db
.query("SHOW VIEWS", ())
.expect("Failed to execute SHOW VIEWS");
let column_names = rows.columns().to_vec();
assert!(!column_names.is_empty() && column_names[0] == "view_name");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2);
let view_names: Vec<String> = results
.iter()
.map(|r| r.get_by_name::<String>("view_name").unwrap())
.collect();
assert!(view_names.contains(&"view_a".to_string()));
assert!(view_names.contains(&"view_b".to_string()));
db.execute("DROP VIEW view_a", ())
.expect("Failed to drop view_a");
let rows = db
.query("SHOW VIEWS", ())
.expect("Failed to execute SHOW VIEWS");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(
results[0].get_by_name::<String>("view_name").unwrap(),
"view_b"
);
}
#[test]
fn test_view_with_function_expression() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT UPPER(name) AS upper_name FROM all_employees ORDER BY name LIMIT 3",
(),
)
.expect("Failed to query view with function");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 3);
assert_eq!(
results[0].get_by_name::<String>("upper_name").unwrap(),
"ALICE"
);
assert_eq!(
results[1].get_by_name::<String>("upper_name").unwrap(),
"BOB"
);
assert_eq!(
results[2].get_by_name::<String>("upper_name").unwrap(),
"CHARLIE"
);
}
#[test]
fn test_view_with_arithmetic_expression() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT name, salary * 1.1 AS raised_salary FROM all_employees WHERE name = 'Alice'",
(),
)
.expect("Failed to query view with arithmetic");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Alice");
let raised: f64 = results[0].get_by_name::<f64>("raised_salary").unwrap();
assert!((raised - 110000.0).abs() < 0.01);
}
#[test]
fn test_view_with_concat_expression() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT CONCAT(name, ' - ', department) AS full_info FROM all_employees WHERE id = 1",
(),
)
.expect("Failed to query view with CONCAT");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(
results[0].get_by_name::<String>("full_info").unwrap(),
"Alice - Engineering"
);
}
#[test]
fn test_view_with_coalesce_expression() {
let db = Database::open_in_memory().expect("Failed to open database");
db.execute(
"CREATE TABLE test_null (id INTEGER PRIMARY KEY, value TEXT)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO test_null (id, value) VALUES (1, 'hello'), (2, NULL)",
(),
)
.expect("Failed to insert");
db.execute("CREATE VIEW test_view AS SELECT * FROM test_null", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT id, COALESCE(value, 'default') AS safe_value FROM test_view ORDER BY id",
(),
)
.expect("Failed to query view with COALESCE");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2);
assert_eq!(
results[0].get_by_name::<String>("safe_value").unwrap(),
"hello"
);
assert_eq!(
results[1].get_by_name::<String>("safe_value").unwrap(),
"default"
);
}
#[test]
fn test_view_with_multiple_complex_expressions() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT UPPER(name) AS upper_name, salary * 0.3 AS bonus, department FROM all_employees WHERE salary >= 90000 ORDER BY salary DESC",
(),
)
.expect("Failed to query view with multiple expressions");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 2);
assert_eq!(
results[0].get_by_name::<String>("upper_name").unwrap(),
"ALICE"
);
let bonus1: f64 = results[0].get_by_name::<f64>("bonus").unwrap();
assert!((bonus1 - 30000.0).abs() < 0.01);
assert_eq!(
results[1].get_by_name::<String>("upper_name").unwrap(),
"BOB"
);
let bonus2: f64 = results[1].get_by_name::<f64>("bonus").unwrap();
assert!((bonus2 - 27000.0).abs() < 0.01);
}
#[test]
fn test_view_with_length_function() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW all_employees AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query(
"SELECT name, LENGTH(name) AS name_len FROM all_employees WHERE name = 'Charlie'",
(),
)
.expect("Failed to query view with LENGTH");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Charlie");
assert_eq!(results[0].get_by_name::<i64>("name_len").unwrap(), 7);
let rows = db
.query(
"SELECT name, LENGTH(name) AS name_len FROM all_employees WHERE name = 'Bob'",
(),
)
.expect("Failed to query view with LENGTH");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(results[0].get_by_name::<String>("name").unwrap(), "Bob");
assert_eq!(results[0].get_by_name::<i64>("name_len").unwrap(), 3);
}
#[test]
fn test_show_create_view() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE VIEW high_earners AS SELECT name, salary FROM employees WHERE salary > 80000",
(),
)
.expect("Failed to create view");
let rows = db
.query("SHOW CREATE VIEW high_earners", ())
.expect("Failed to execute SHOW CREATE VIEW");
let column_names = rows.columns().to_vec();
assert_eq!(column_names.len(), 2);
assert_eq!(column_names[0], "View");
assert_eq!(column_names[1], "Create View");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(
results[0].get_by_name::<String>("View").unwrap(),
"high_earners"
);
let create_stmt = results[0].get_by_name::<String>("Create View").unwrap();
assert!(create_stmt.contains("CREATE VIEW"));
assert!(create_stmt.contains("high_earners"));
assert!(create_stmt.contains("SELECT"));
assert!(create_stmt.contains("salary"));
assert!(create_stmt.contains("80000"));
}
#[test]
fn test_show_create_view_case_insensitive() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute("CREATE VIEW MyTestView AS SELECT * FROM employees", ())
.expect("Failed to create view");
let rows = db
.query("SHOW CREATE VIEW mytestview", ())
.expect("Failed to execute SHOW CREATE VIEW");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
assert_eq!(
results[0].get_by_name::<String>("View").unwrap(),
"MyTestView"
);
}
#[test]
fn test_show_create_view_not_exists() {
let db = Database::open_in_memory().expect("Failed to open database");
let result = db.query("SHOW CREATE VIEW nonexistent_view", ());
assert!(result.is_err());
}
#[test]
fn test_show_create_view_complex() {
let db = Database::open_in_memory().expect("Failed to open database");
setup_base_table(&db);
db.execute(
"CREATE VIEW dept_summary AS SELECT department, COUNT(*) AS cnt, AVG(salary) AS avg_sal FROM employees GROUP BY department",
(),
)
.expect("Failed to create view");
let rows = db
.query("SHOW CREATE VIEW dept_summary", ())
.expect("Failed to execute SHOW CREATE VIEW");
let results: Vec<_> = rows.collect_vec().expect("Failed to collect rows");
assert_eq!(results.len(), 1);
let create_stmt = results[0].get_by_name::<String>("Create View").unwrap();
assert!(create_stmt.contains("GROUP BY"));
assert!(create_stmt.contains("COUNT"));
assert!(create_stmt.contains("AVG"));
}