mod test_helpers {
include!("../common/test_helpers.rs");
}
use test_helpers::run_with_both_backends;
use tegdb::{Database, SqlValue, StringFunctionsExtension};
#[test]
fn test_upper_function() {
let _ = run_with_both_backends("test_upper_function", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
let sql = "SELECT UPPER('hello')";
let result = db.query(sql).unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("HELLO".to_string()));
let result = db.query("SELECT UPPER('')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("".to_string()));
let result = db.query("SELECT UPPER('WORLD')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("WORLD".to_string()));
let result = db.query("SELECT UPPER('Hello World')").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("HELLO WORLD".to_string())
);
let result = db.query("SELECT UPPER('café')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("CAFÉ".to_string()));
let result = db.query("SELECT UPPER(NULL)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Null);
Ok(())
});
}
#[test]
fn test_lower_function() {
let _ = run_with_both_backends("test_lower_function", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
let result = db.query("SELECT LOWER('HELLO')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
let result = db.query("SELECT LOWER('')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("".to_string()));
let result = db.query("SELECT LOWER('world')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("world".to_string()));
let result = db.query("SELECT LOWER('Hello World')").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("hello world".to_string())
);
let result = db.query("SELECT LOWER('CAFÉ')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("café".to_string()));
let result = db.query("SELECT LOWER(NULL)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Null);
Ok(())
});
}
#[test]
fn test_length_function() {
let _ = run_with_both_backends("test_length_function", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
let result = db.query("SELECT LENGTH('hello')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Integer(5));
let result = db.query("SELECT LENGTH('')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Integer(0));
let result = db.query("SELECT LENGTH('café')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Integer(4));
let result = db.query("SELECT LENGTH('🚀')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Integer(1));
let result = db.query("SELECT LENGTH(NULL)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Null);
Ok(())
});
}
#[test]
fn test_trim_functions() {
let _ = run_with_both_backends("test_trim_functions", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
let result = db.query("SELECT TRIM(' hello ')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
let result = db.query("SELECT LTRIM(' hello ')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello ".to_string()));
let result = db.query("SELECT RTRIM(' hello ')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text(" hello".to_string()));
let result = db.query("SELECT TRIM('\thello\t')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
let result = db.query("SELECT TRIM('\nhello\n')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
let result = db.query("SELECT TRIM('hello')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
let result = db.query("SELECT TRIM(' ')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("".to_string()));
let result = db.query("SELECT TRIM(NULL)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Null);
Ok(())
});
}
#[test]
fn test_substr_function() {
let _ = run_with_both_backends("test_substr_function", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
let result = db.query("SELECT SUBSTR('hello world', 1, 5)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
let result = db.query("SELECT SUBSTR('hello world', 7, 5)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("world".to_string()));
let result = db.query("SELECT SUBSTR('hello', 1, 100)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
let result = db.query("SELECT SUBSTR('hello', 10, 5)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("".to_string()));
let result = db.query("SELECT SUBSTR('hello', 1, 0)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("".to_string()));
let result = db.query("SELECT SUBSTR('café', 1, 3)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("caf".to_string()));
let result = db.query("SELECT SUBSTR(NULL, 1, 5)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Null);
Ok(())
});
}
#[test]
fn test_replace_function() {
let _ = run_with_both_backends("test_replace_function", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
let result = db.query("SELECT REPLACE('hello world', 'world', 'TegDB')").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("hello TegDB".to_string())
);
let result = db.query("SELECT REPLACE('hello hello', 'hello', 'hi')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hi hi".to_string()));
let result = db.query("SELECT REPLACE('hello', 'xyz', 'abc')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
let result = db.query("SELECT REPLACE('hello world', 'world', '')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello ".to_string()));
let result = db.query("SELECT REPLACE('hello', '', 'x')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("xhellox".to_string()));
let result = db.query("SELECT REPLACE(NULL, 'a', 'b')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Null);
Ok(())
});
}
#[test]
fn test_concat_function() {
let _ = run_with_both_backends("test_concat_function", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
let result = db.query("SELECT CONCAT('hello', ' world')").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("hello world".to_string())
);
let result = db.query("SELECT CONCAT('hello', ' ', 'world')").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("hello world".to_string())
);
let result = db.query("SELECT CONCAT('a', 'b', 'c', 'd')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("abcd".to_string()));
let result = db.query("SELECT CONCAT('hello', NULL, 'world')").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("helloworld".to_string())
);
let result = db.query("SELECT CONCAT('Number: ', 42)").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("Number: 42".to_string())
);
let result = db.query("SELECT CONCAT('Value: ', 3.14)").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("Value: 3.14".to_string())
);
let result = db.query("SELECT CONCAT('', 'hello', '')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("hello".to_string()));
Ok(())
});
}
#[test]
fn test_reverse_function() {
let _ = run_with_both_backends("test_reverse_function", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
let result = db.query("SELECT REVERSE('hello')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("olleh".to_string()));
let result = db.query("SELECT REVERSE('')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("".to_string()));
let result = db.query("SELECT REVERSE('a')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("a".to_string()));
let result = db.query("SELECT REVERSE('café')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("éfac".to_string()));
let result = db.query("SELECT REVERSE('🚀🌍')").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("🌍🚀".to_string()));
let result = db.query("SELECT REVERSE(NULL)").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Null);
Ok(())
});
}
#[test]
fn test_string_functions_in_table_queries() {
let _ = run_with_both_backends("test_string_functions_in_table_queries", |db_path| {
let mut db = Database::open(db_path).unwrap();
db.register_extension(Box::new(StringFunctionsExtension)).unwrap();
db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT(50), email TEXT(50))").unwrap();
db.execute("INSERT INTO users (id, name, email) VALUES (1, 'Alice', 'ALICE@EXAMPLE.COM'), (2, 'Bob', 'bob@example.com')").unwrap();
let result = db.query("SELECT UPPER(name), LOWER(email) FROM users WHERE id = 1").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Text("ALICE".to_string()));
assert_eq!(
result.rows()[0][1],
SqlValue::Text("alice@example.com".to_string())
);
let result = db.query("SELECT name FROM users WHERE UPPER(name) = 'ALICE'").unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result.rows()[0][0], SqlValue::Text("Alice".to_string()));
let result = db.query("SELECT LENGTH(name) FROM users WHERE id = 1").unwrap();
assert_eq!(result.rows()[0][0], SqlValue::Integer(5));
let result = db.query("SELECT CONCAT(name, ' (', email, ')') FROM users WHERE id = 1").unwrap();
assert_eq!(
result.rows()[0][0],
SqlValue::Text("Alice (ALICE@EXAMPLE.COM)".to_string())
);
Ok(())
});
}