use stoolap::Database;
#[test]
fn test_select_string_comparison() {
let db = Database::open("memory://select_str").expect("Failed to create database");
db.execute("CREATE TABLE str_select (id INTEGER, name TEXT)", ())
.expect("Failed to create table");
let data = [
(1, "Apple"),
(2, "Banana"),
(3, "Cherry"),
(4, "Date"),
(5, "Elderberry"),
];
for (id, name) in &data {
db.execute(
&format!("INSERT INTO str_select VALUES ({}, '{}')", id, name),
(),
)
.expect("Failed to insert data");
}
let count: i64 = db
.query_one("SELECT COUNT(*) FROM str_select WHERE name = 'Cherry'", ())
.expect("Failed to query");
assert_eq!(count, 1, "Expected 1 row with name='Cherry'");
let name: String = db
.query_one("SELECT name FROM str_select WHERE id = 3", ())
.expect("Failed to query");
assert_eq!(name, "Cherry", "Expected 'Cherry' for id=3");
}
#[test]
fn test_select_and_condition() {
let db = Database::open("memory://select_and").expect("Failed to create database");
db.execute(
"CREATE TABLE and_select (id INTEGER, category TEXT, value FLOAT)",
(),
)
.expect("Failed to create table");
let data = [
(1, "A", 10.5),
(2, "A", 20.0),
(3, "B", 15.5),
(4, "B", 25.0),
(5, "C", 30.5),
(6, "C", 40.0),
];
for (id, category, value) in &data {
db.execute(
&format!(
"INSERT INTO and_select VALUES ({}, '{}', {:.1})",
id, category, value
),
(),
)
.expect("Failed to insert data");
}
let count: i64 = db
.query_one("SELECT COUNT(*) FROM and_select WHERE category = 'B'", ())
.expect("Failed to query");
assert_eq!(count, 2, "Expected 2 rows with category='B'");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM and_select WHERE value > 20.0", ())
.expect("Failed to query");
assert_eq!(count, 3, "Expected 3 rows with value > 20.0");
let count: i64 = db
.query_one(
"SELECT COUNT(*) FROM and_select WHERE category = 'B' AND value > 20.0",
(),
)
.expect("Failed to query");
assert_eq!(
count, 1,
"Expected 1 row with category='B' AND value > 20.0"
);
let id: i64 = db
.query_one(
"SELECT id FROM and_select WHERE category = 'B' AND value > 20.0",
(),
)
.expect("Failed to query");
assert_eq!(id, 4, "Expected id=4 for category='B' AND value > 20.0");
}
#[test]
fn test_select_or_condition() {
let db = Database::open("memory://select_or").expect("Failed to create database");
db.execute(
"CREATE TABLE or_select (id INTEGER, category TEXT, value FLOAT)",
(),
)
.expect("Failed to create table");
let data = [
(1, "A", 10.5),
(2, "A", 20.0),
(3, "B", 15.5),
(4, "B", 25.0),
(5, "C", 30.5),
(6, "C", 40.0),
];
for (id, category, value) in &data {
db.execute(
&format!(
"INSERT INTO or_select VALUES ({}, '{}', {:.1})",
id, category, value
),
(),
)
.expect("Failed to insert data");
}
let count: i64 = db
.query_one(
"SELECT COUNT(*) FROM or_select WHERE category = 'A' OR value > 30.0",
(),
)
.expect("Failed to query");
assert_eq!(
count, 4,
"Expected 4 rows with category='A' OR value > 30.0"
);
}
#[test]
fn test_select_between_condition() {
let db = Database::open("memory://select_between").expect("Failed to create database");
db.execute("CREATE TABLE between_select (id INTEGER, value FLOAT)", ())
.expect("Failed to create table");
for i in 1..=10 {
let value = (i * 10) as f64;
db.execute(
&format!("INSERT INTO between_select VALUES ({}, {:.1})", i, value),
(),
)
.expect("Failed to insert data");
}
let count: i64 = db
.query_one(
"SELECT COUNT(*) FROM between_select WHERE value BETWEEN 30 AND 70",
(),
)
.expect("Failed to query");
assert_eq!(count, 5, "Expected 5 rows with value BETWEEN 30 AND 70");
}
#[test]
fn test_select_in_condition() {
let db = Database::open("memory://select_in").expect("Failed to create database");
db.execute("CREATE TABLE in_select (id INTEGER, category TEXT)", ())
.expect("Failed to create table");
let categories = ["A", "B", "C", "D", "E"];
for (i, category) in categories.iter().enumerate() {
db.execute(
&format!("INSERT INTO in_select VALUES ({}, '{}')", i + 1, category),
(),
)
.expect("Failed to insert data");
}
let count: i64 = db
.query_one(
"SELECT COUNT(*) FROM in_select WHERE category IN ('A', 'C', 'E')",
(),
)
.expect("Failed to query");
assert_eq!(count, 3, "Expected 3 rows with category IN ('A', 'C', 'E')");
}
#[test]
fn test_select_not_in_condition() {
let db = Database::open("memory://select_not_in").expect("Failed to create database");
db.execute("CREATE TABLE not_in_select (id INTEGER, category TEXT)", ())
.expect("Failed to create table");
let categories = ["A", "B", "C", "D", "E"];
for (i, category) in categories.iter().enumerate() {
db.execute(
&format!(
"INSERT INTO not_in_select VALUES ({}, '{}')",
i + 1,
category
),
(),
)
.expect("Failed to insert data");
}
let count: i64 = db
.query_one(
"SELECT COUNT(*) FROM not_in_select WHERE category NOT IN ('A', 'C', 'E')",
(),
)
.expect("Failed to query");
assert_eq!(
count, 2,
"Expected 2 rows with category NOT IN ('A', 'C', 'E')"
);
}
#[test]
fn test_select_multiple_columns() {
let db = Database::open("memory://select_multi_col").expect("Failed to create database");
db.execute(
"CREATE TABLE multi_col (id INTEGER, name TEXT, value FLOAT)",
(),
)
.expect("Failed to create table");
db.execute("INSERT INTO multi_col VALUES (1, 'first', 10.5)", ())
.expect("Failed to insert");
db.execute("INSERT INTO multi_col VALUES (2, 'second', 20.5)", ())
.expect("Failed to insert");
let result = db
.query("SELECT id, name FROM multi_col WHERE id = 1", ())
.expect("Failed to query");
let mut found = false;
for row in result {
let row = row.expect("Failed to get row");
let id: i64 = row.get(0).unwrap();
let name: String = row.get(1).unwrap();
assert_eq!(id, 1);
assert_eq!(name, "first");
found = true;
}
assert!(found, "Expected to find row with id=1");
}
#[test]
fn test_select_star() {
let db = Database::open("memory://select_star").expect("Failed to create database");
db.execute(
"CREATE TABLE star_test (id INTEGER, name TEXT, active BOOLEAN)",
(),
)
.expect("Failed to create table");
db.execute("INSERT INTO star_test VALUES (1, 'test', true)", ())
.expect("Failed to insert");
let result = db
.query("SELECT * FROM star_test", ())
.expect("Failed to query");
let mut count = 0;
for row in result {
let row = row.expect("Failed to get row");
let id: i64 = row.get(0).unwrap();
let name: String = row.get(1).unwrap();
let active: bool = row.get(2).unwrap();
assert_eq!(id, 1);
assert_eq!(name, "test");
assert!(active);
count += 1;
}
assert_eq!(count, 1, "Expected 1 row");
}
#[test]
fn test_select_order_by() {
let db = Database::open("memory://select_order").expect("Failed to create database");
db.execute("CREATE TABLE order_test (id INTEGER, value INTEGER)", ())
.expect("Failed to create table");
db.execute("INSERT INTO order_test VALUES (1, 30)", ())
.unwrap();
db.execute("INSERT INTO order_test VALUES (2, 10)", ())
.unwrap();
db.execute("INSERT INTO order_test VALUES (3, 20)", ())
.unwrap();
let result = db
.query("SELECT id FROM order_test ORDER BY value ASC", ())
.expect("Failed to query");
let mut ids: Vec<i64> = Vec::new();
for row in result {
let row = row.expect("Failed to get row");
ids.push(row.get(0).unwrap());
}
assert_eq!(ids, vec![2, 3, 1], "Expected order 2, 3, 1 for ASC");
let result = db
.query("SELECT id FROM order_test ORDER BY value DESC", ())
.expect("Failed to query");
let mut ids: Vec<i64> = Vec::new();
for row in result {
let row = row.expect("Failed to get row");
ids.push(row.get(0).unwrap());
}
assert_eq!(ids, vec![1, 3, 2], "Expected order 1, 3, 2 for DESC");
}
#[test]
fn test_select_limit() {
let db = Database::open("memory://select_limit").expect("Failed to create database");
db.execute("CREATE TABLE limit_test (id INTEGER)", ())
.expect("Failed to create table");
for i in 1..=10 {
db.execute(&format!("INSERT INTO limit_test VALUES ({})", i), ())
.expect("Failed to insert");
}
let _count: i64 = db
.query_one(
"SELECT COUNT(*) FROM (SELECT * FROM limit_test LIMIT 5)",
(),
)
.unwrap_or_else(|_| {
let result = db
.query("SELECT * FROM limit_test LIMIT 5", ())
.expect("Failed to query");
let mut c = 0i64;
for _ in result {
c += 1;
}
c
});
let result = db
.query("SELECT * FROM limit_test LIMIT 5", ())
.expect("Failed to query");
let mut count = 0;
for _ in result {
count += 1;
}
assert_eq!(count, 5, "Expected 5 rows with LIMIT 5");
}
#[test]
fn test_select_offset() {
let db = Database::open("memory://select_offset").expect("Failed to create database");
db.execute("CREATE TABLE offset_test (id INTEGER)", ())
.expect("Failed to create table");
for i in 1..=10 {
db.execute(&format!("INSERT INTO offset_test VALUES ({})", i), ())
.expect("Failed to insert");
}
let result = db
.query(
"SELECT id FROM offset_test ORDER BY id LIMIT 3 OFFSET 2",
(),
)
.expect("Failed to query");
let mut ids: Vec<i64> = Vec::new();
for row in result {
let row = row.expect("Failed to get row");
ids.push(row.get(0).unwrap());
}
assert_eq!(ids, vec![3, 4, 5], "Expected ids 3, 4, 5 with OFFSET 2");
}