use stoolap::Database;
#[test]
fn test_json_create_table() {
let db = Database::open("memory://json_create").expect("Failed to create database");
db.execute(
"CREATE TABLE json_test (
id INTEGER NOT NULL,
data JSON,
required_json JSON NOT NULL
)",
(),
)
.expect("Failed to create table with JSON columns");
}
#[test]
fn test_json_insert() {
let db = Database::open("memory://json_insert").expect("Failed to create database");
db.execute(
"CREATE TABLE json_test (
id INTEGER NOT NULL,
data JSON,
required_json JSON NOT NULL
)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO json_test (id, data, required_json) VALUES (?, ?, ?)",
(1, r#"{"name":"John","age":30}"#, r#"{"type":"required"}"#),
)
.expect("Failed to insert simple object");
db.execute(
"INSERT INTO json_test (id, data, required_json) VALUES (?, ?, ?)",
(2, "[1,2,3,4]", r#"{"type":"array"}"#),
)
.expect("Failed to insert array");
db.execute(
"INSERT INTO json_test (id, data, required_json) VALUES (?, ?, ?)",
(
3,
r#"{"user":{"name":"Jane","age":25,"roles":["admin","user"]}}"#,
r#"{"type":"nested"}"#,
),
)
.expect("Failed to insert nested object");
db.execute(
"INSERT INTO json_test (id, data, required_json) VALUES (4, NULL, '{\"type\":\"null_test\"}')", ())
.expect("Failed to insert NULL value");
db.execute(
"INSERT INTO json_test (id, data, required_json) VALUES (?, ?, ?)",
(5, "{}", r#"{"type":"empty"}"#),
)
.expect("Failed to insert empty object");
db.execute(
"INSERT INTO json_test (id, data, required_json) VALUES (?, ?, ?)",
(6, "[]", r#"{"type":"empty_array"}"#),
)
.expect("Failed to insert empty array");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM json_test", ())
.expect("Failed to count");
assert_eq!(count, 6, "Expected 6 rows inserted");
}
#[test]
fn test_json_select() {
let db = Database::open("memory://json_select").expect("Failed to create database");
db.execute(
"CREATE TABLE json_test (
id INTEGER NOT NULL,
data JSON
)",
(),
)
.expect("Failed to create table");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (1, '{"name":"John","age":30}')"#,
(),
)
.expect("Failed to insert");
let result = db
.query("SELECT id, data FROM json_test 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 data: String = row.get(1).unwrap();
assert_eq!(id, 1);
assert!(data.contains("John"), "Expected data to contain 'John'");
found = true;
}
assert!(found, "Expected to find row with id=1");
}
#[test]
fn test_json_update() {
let db = Database::open("memory://json_update").expect("Failed to create database");
db.execute(
"CREATE TABLE json_test (
id INTEGER NOT NULL,
data JSON
)",
(),
)
.expect("Failed to create table");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (1, '{"name":"John","age":30}')"#,
(),
)
.expect("Failed to insert");
db.execute(
"UPDATE json_test SET data = ? WHERE id = ?",
(r#"{"updated":true,"name":"UpdatedValue"}"#, 1),
)
.expect("Failed to update");
let result = db
.query("SELECT data FROM json_test WHERE id = 1", ())
.expect("Failed to query");
for row in result {
let row = row.expect("Failed to get row");
let data: String = row.get(0).unwrap();
assert!(
data.contains("updated") || data.contains("Updated"),
"Expected updated data, got: {}",
data
);
}
}
#[test]
fn test_json_literal_insert() {
let db = Database::open("memory://json_literal").expect("Failed to create database");
db.execute(
"CREATE TABLE json_test (
id INTEGER NOT NULL,
data JSON
)",
(),
)
.expect("Failed to create table");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (100, '{"literal":true}')"#,
(),
)
.expect("Failed to insert with literal");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM json_test WHERE id = 100", ())
.expect("Failed to count");
assert_eq!(count, 1, "Expected 1 row with id=100");
}
#[test]
fn test_json_nested_param() {
let db = Database::open("memory://json_nested").expect("Failed to create database");
db.execute(
"CREATE TABLE json_test (
id INTEGER NOT NULL,
data JSON
)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO json_test (id, data) VALUES (?, ?)",
(101, r#"{"deep":{"nested":{"value":42}}}"#),
)
.expect("Failed to insert nested");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM json_test WHERE id = 101", ())
.expect("Failed to count");
assert_eq!(count, 1, "Expected 1 row with id=101");
}
#[test]
fn test_json_various_types() {
let db = Database::open("memory://json_types").expect("Failed to create database");
db.execute(
"CREATE TABLE json_test (
id INTEGER NOT NULL,
data JSON
)",
(),
)
.expect("Failed to create table");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (1, '{"active":true,"deleted":false}')"#,
(),
)
.expect("Failed to insert boolean");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (2, '{"integer":42,"float":3.14,"negative":-100}')"#, ())
.expect("Failed to insert numeric");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (3, '{"value":null}')"#,
(),
)
.expect("Failed to insert null value");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (4, '{"text":"Hello \"World\""}')"#,
(),
)
.expect("Failed to insert special chars");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM json_test", ())
.expect("Failed to count");
assert_eq!(count, 4, "Expected 4 rows");
}
#[test]
fn test_json_arrays() {
let db = Database::open("memory://json_arrays").expect("Failed to create database");
db.execute(
"CREATE TABLE json_test (
id INTEGER NOT NULL,
data JSON
)",
(),
)
.expect("Failed to create table");
db.execute("INSERT INTO json_test (id, data) VALUES (1, '[]')", ())
.expect("Failed to insert empty array");
db.execute(
"INSERT INTO json_test (id, data) VALUES (2, '[1,2,3,4,5]')",
(),
)
.expect("Failed to insert number array");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (3, '["a","b","c"]')"#,
(),
)
.expect("Failed to insert string array");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (4, '[1,"two",true,null]')"#,
(),
)
.expect("Failed to insert mixed array");
db.execute(
"INSERT INTO json_test (id, data) VALUES (5, '[[1,2],[3,4]]')",
(),
)
.expect("Failed to insert nested arrays");
db.execute(
r#"INSERT INTO json_test (id, data) VALUES (6, '[{"name":"John"},{"name":"Jane"}]')"#,
(),
)
.expect("Failed to insert array of objects");
let count: i64 = db
.query_one("SELECT COUNT(*) FROM json_test", ())
.expect("Failed to count");
assert_eq!(count, 6, "Expected 6 rows");
}
#[test]
fn test_json_type_function() {
let db = Database::open("memory://json_type").expect("Failed to create database");
let result: String = db
.query_one("SELECT JSON_TYPE('\"hello\"')", ())
.expect("Failed to get JSON_TYPE for string");
assert_eq!(result, "string");
let result: String = db
.query_one("SELECT JSON_TYPE('123')", ())
.expect("Failed to get JSON_TYPE for number");
assert_eq!(result, "number");
let result: String = db
.query_one("SELECT JSON_TYPE('3.14')", ())
.expect("Failed to get JSON_TYPE for float");
assert_eq!(result, "number");
let result: String = db
.query_one("SELECT JSON_TYPE('true')", ())
.expect("Failed to get JSON_TYPE for boolean");
assert_eq!(result, "boolean");
let result: String = db
.query_one("SELECT JSON_TYPE('false')", ())
.expect("Failed to get JSON_TYPE for boolean false");
assert_eq!(result, "boolean");
let result: String = db
.query_one("SELECT JSON_TYPE('null')", ())
.expect("Failed to get JSON_TYPE for null");
assert_eq!(result, "null");
let result: String = db
.query_one("SELECT JSON_TYPE('{\"a\":1}')", ())
.expect("Failed to get JSON_TYPE for object");
assert_eq!(result, "object");
let result: String = db
.query_one("SELECT JSON_TYPE('[1,2,3]')", ())
.expect("Failed to get JSON_TYPE for array");
assert_eq!(result, "array");
let result: String = db
.query_one("SELECT JSON_TYPE('{}')", ())
.expect("Failed to get JSON_TYPE for empty object");
assert_eq!(result, "object");
let result: String = db
.query_one("SELECT JSON_TYPE('[]')", ())
.expect("Failed to get JSON_TYPE for empty array");
assert_eq!(result, "array");
}
#[test]
fn test_json_typeof_function() {
let db = Database::open("memory://json_typeof").expect("Failed to create database");
let result: String = db
.query_one("SELECT JSON_TYPEOF('{\"key\":\"value\"}')", ())
.expect("Failed to get JSON_TYPEOF for object");
assert_eq!(result, "object");
let result: String = db
.query_one("SELECT JSON_TYPEOF('[1,2,3]')", ())
.expect("Failed to get JSON_TYPEOF for array");
assert_eq!(result, "array");
let result: String = db
.query_one("SELECT JSON_TYPEOF('\"string\"')", ())
.expect("Failed to get JSON_TYPEOF for string");
assert_eq!(result, "string");
let result: String = db
.query_one("SELECT JSON_TYPEOF('42')", ())
.expect("Failed to get JSON_TYPEOF for number");
assert_eq!(result, "number");
}
#[test]
fn test_json_valid_function() {
let db = Database::open("memory://json_valid").expect("Failed to create database");
let result: i64 = db
.query_one("SELECT JSON_VALID('{\"a\":1}')", ())
.expect("Failed to get JSON_VALID for valid object");
assert_eq!(result, 1);
let result: i64 = db
.query_one("SELECT JSON_VALID('[1,2,3]')", ())
.expect("Failed to get JSON_VALID for valid array");
assert_eq!(result, 1);
let result: i64 = db
.query_one("SELECT JSON_VALID('\"hello\"')", ())
.expect("Failed to get JSON_VALID for valid string");
assert_eq!(result, 1);
let result: i64 = db
.query_one("SELECT JSON_VALID('123')", ())
.expect("Failed to get JSON_VALID for valid number");
assert_eq!(result, 1);
let result: i64 = db
.query_one("SELECT JSON_VALID('true')", ())
.expect("Failed to get JSON_VALID for valid boolean");
assert_eq!(result, 1);
let result: i64 = db
.query_one("SELECT JSON_VALID('null')", ())
.expect("Failed to get JSON_VALID for valid null");
assert_eq!(result, 1);
let result: i64 = db
.query_one("SELECT JSON_VALID('invalid')", ())
.expect("Failed to get JSON_VALID for invalid");
assert_eq!(result, 0);
let result: i64 = db
.query_one("SELECT JSON_VALID('{incomplete')", ())
.expect("Failed to get JSON_VALID for incomplete object");
assert_eq!(result, 0);
let result: i64 = db
.query_one("SELECT JSON_VALID('[1,2,3,]')", ())
.expect("Failed to get JSON_VALID for trailing comma");
assert_eq!(result, 0);
let result: i64 = db
.query_one("SELECT JSON_VALID('{''key'':''value''}')", ())
.expect("Failed to get JSON_VALID for single quotes");
assert_eq!(result, 0);
let result: i64 = db
.query_one("SELECT JSON_VALID('')", ())
.expect("Failed to get JSON_VALID for empty string");
assert_eq!(result, 0);
}
#[test]
fn test_json_keys_function() {
let db = Database::open("memory://json_keys").expect("Failed to create database");
let result: String = db
.query_one("SELECT JSON_KEYS('{\"name\":\"John\",\"age\":30}')", ())
.expect("Failed to get JSON_KEYS for object");
assert!(result.contains("\"name\""));
assert!(result.contains("\"age\""));
let result: String = db
.query_one(
"SELECT JSON_KEYS('{\"user\":{\"name\":\"John\"},\"active\":true}')",
(),
)
.expect("Failed to get JSON_KEYS for nested object");
assert!(result.contains("\"user\""));
assert!(result.contains("\"active\""));
assert!(!result.contains("\"name\""));
let result: String = db
.query_one("SELECT JSON_KEYS('{}')", ())
.expect("Failed to get JSON_KEYS for empty object");
assert_eq!(result, "[]");
let result: String = db
.query_one("SELECT JSON_KEYS('{\"key\":\"value\"}')", ())
.expect("Failed to get JSON_KEYS for single key");
assert!(result.contains("\"key\""));
}
#[test]
fn test_json_keys_non_object() {
let db = Database::open("memory://json_keys_null").expect("Failed to create database");
let result = db
.query("SELECT JSON_KEYS('[1,2,3]')", ())
.expect("Failed to query JSON_KEYS for array");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 1);
let row = rows[0].as_ref().expect("Failed to get row");
assert!(row.is_null(0), "JSON_KEYS on array should return NULL");
let result = db
.query("SELECT JSON_KEYS('\"hello\"')", ())
.expect("Failed to query JSON_KEYS for string");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 1);
let row = rows[0].as_ref().expect("Failed to get row");
assert!(row.is_null(0), "JSON_KEYS on string should return NULL");
let result = db
.query("SELECT JSON_KEYS('123')", ())
.expect("Failed to query JSON_KEYS for number");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 1);
let row = rows[0].as_ref().expect("Failed to get row");
assert!(row.is_null(0), "JSON_KEYS on number should return NULL");
}
#[test]
fn test_json_functions_with_null() {
let db = Database::open("memory://json_null_input").expect("Failed to create database");
let result = db
.query("SELECT JSON_TYPE(NULL)", ())
.expect("Failed to query JSON_TYPE with NULL");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 1);
let row = rows[0].as_ref().expect("Failed to get row");
assert!(row.is_null(0), "JSON_TYPE(NULL) should return NULL");
let result = db
.query("SELECT JSON_VALID(NULL)", ())
.expect("Failed to query JSON_VALID with NULL");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 1);
let row = rows[0].as_ref().expect("Failed to get row");
assert!(row.is_null(0), "JSON_VALID(NULL) should return NULL");
let result = db
.query("SELECT JSON_KEYS(NULL)", ())
.expect("Failed to query JSON_KEYS with NULL");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 1);
let row = rows[0].as_ref().expect("Failed to get row");
assert!(row.is_null(0), "JSON_KEYS(NULL) should return NULL");
}
#[test]
fn test_json_functions_with_table() {
let db = Database::open("memory://json_func_table").expect("Failed to create database");
db.execute(
"CREATE TABLE json_data (
id INTEGER NOT NULL,
data JSON
)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO json_data (id, data) VALUES (1, '{\"name\":\"John\",\"age\":30}')",
(),
)
.expect("Failed to insert object");
db.execute("INSERT INTO json_data (id, data) VALUES (2, '[1,2,3]')", ())
.expect("Failed to insert array");
db.execute(
"INSERT INTO json_data (id, data) VALUES (3, '\"string\"')",
(),
)
.expect("Failed to insert string");
db.execute("INSERT INTO json_data (id, data) VALUES (4, '42')", ())
.expect("Failed to insert number");
db.execute("INSERT INTO json_data (id, data) VALUES (5, NULL)", ())
.expect("Failed to insert null");
let result = db
.query(
"SELECT id, JSON_TYPE(data) as type FROM json_data ORDER BY id",
(),
)
.expect("Failed to query");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 5);
let row = rows[0].as_ref().expect("Failed to get row 1");
let id: i64 = row.get(0).unwrap();
let json_type: String = row.get(1).unwrap();
assert_eq!(id, 1);
assert_eq!(json_type, "object");
let row = rows[1].as_ref().expect("Failed to get row 2");
let id: i64 = row.get(0).unwrap();
let json_type: String = row.get(1).unwrap();
assert_eq!(id, 2);
assert_eq!(json_type, "array");
let row = rows[2].as_ref().expect("Failed to get row 3");
let id: i64 = row.get(0).unwrap();
let json_type: String = row.get(1).unwrap();
assert_eq!(id, 3);
assert_eq!(json_type, "string");
let row = rows[3].as_ref().expect("Failed to get row 4");
let id: i64 = row.get(0).unwrap();
let json_type: String = row.get(1).unwrap();
assert_eq!(id, 4);
assert_eq!(json_type, "number");
let row = rows[4].as_ref().expect("Failed to get row 5");
let id: i64 = row.get(0).unwrap();
assert_eq!(id, 5);
assert!(row.is_null(1), "JSON_TYPE of NULL should be NULL");
}
#[test]
fn test_json_valid_in_where() {
let db = Database::open("memory://json_valid_where").expect("Failed to create database");
db.execute(
"CREATE TABLE json_strings (
id INTEGER NOT NULL,
content TEXT
)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO json_strings (id, content) VALUES (1, '{\"valid\":true}')",
(),
)
.expect("Failed to insert valid JSON");
db.execute(
"INSERT INTO json_strings (id, content) VALUES (2, 'invalid json')",
(),
)
.expect("Failed to insert invalid JSON");
db.execute(
"INSERT INTO json_strings (id, content) VALUES (3, '[1,2,3]')",
(),
)
.expect("Failed to insert valid array");
db.execute(
"INSERT INTO json_strings (id, content) VALUES (4, '{broken')",
(),
)
.expect("Failed to insert broken JSON");
let count: i64 = db
.query_one(
"SELECT COUNT(*) FROM json_strings WHERE JSON_VALID(content) = 1",
(),
)
.expect("Failed to count valid JSON");
assert_eq!(count, 2, "Expected 2 valid JSON rows");
let count: i64 = db
.query_one(
"SELECT COUNT(*) FROM json_strings WHERE JSON_VALID(content) = 0",
(),
)
.expect("Failed to count invalid JSON");
assert_eq!(count, 2, "Expected 2 invalid JSON rows");
}
#[test]
fn test_json_type_with_path() {
let db = Database::open("memory://json_type_path").expect("Failed to create database");
let result: String = db
.query_one(
"SELECT JSON_TYPE('{\"name\":\"John\",\"age\":30}', '$.age')",
(),
)
.expect("Failed to get JSON_TYPE with path for number");
assert_eq!(result, "number");
let result: String = db
.query_one(
"SELECT JSON_TYPE('{\"name\":\"John\",\"age\":30}', '$.name')",
(),
)
.expect("Failed to get JSON_TYPE with path for string");
assert_eq!(result, "string");
let result: String = db
.query_one("SELECT JSON_TYPE('{\"user\":{\"id\":1}}', '$.user')", ())
.expect("Failed to get JSON_TYPE with path for object");
assert_eq!(result, "object");
let result: String = db
.query_one("SELECT JSON_TYPE('{\"tags\":[\"a\",\"b\"]}', '$.tags')", ())
.expect("Failed to get JSON_TYPE with path for array");
assert_eq!(result, "array");
let result: String = db
.query_one("SELECT JSON_TYPE('{\"active\":true}', '$.active')", ())
.expect("Failed to get JSON_TYPE with path for boolean");
assert_eq!(result, "boolean");
let result: String = db
.query_one("SELECT JSON_TYPE('{\"value\":null}', '$.value')", ())
.expect("Failed to get JSON_TYPE with path for null");
assert_eq!(result, "null");
let result = db
.query("SELECT JSON_TYPE('{\"a\":1}', '$.nonexistent')", ())
.expect("Failed to query JSON_TYPE with non-existent path");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 1);
let row = rows[0].as_ref().expect("Failed to get row");
assert!(
row.is_null(0),
"JSON_TYPE with non-existent path should return NULL"
);
let result: String = db
.query_one(
"SELECT JSON_TYPE('{\"user\":{\"profile\":{\"age\":25}}}', '$.user.profile.age')",
(),
)
.expect("Failed to get JSON_TYPE with nested path");
assert_eq!(result, "number");
}
#[test]
fn test_json_type_path_with_table() {
let db = Database::open("memory://json_type_path_table").expect("Failed to create database");
db.execute(
"CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT,
metadata JSON
)",
(),
)
.expect("Failed to create table");
db.execute(
"INSERT INTO products (id, name, metadata) VALUES (1, 'Laptop', '{\"price\":999.99,\"specs\":{\"cpu\":\"i7\",\"ram\":16},\"tags\":[\"electronics\"]}')",
(),
)
.expect("Failed to insert product");
let result: String = db
.query_one(
"SELECT JSON_TYPE(metadata, '$.price') FROM products WHERE id = 1",
(),
)
.expect("Failed to get JSON_TYPE with path on column");
assert_eq!(result, "number");
let result: String = db
.query_one(
"SELECT JSON_TYPE(metadata, '$.specs') FROM products WHERE id = 1",
(),
)
.expect("Failed to get JSON_TYPE with path on column for object");
assert_eq!(result, "object");
let result: String = db
.query_one(
"SELECT JSON_TYPE(metadata, '$.tags') FROM products WHERE id = 1",
(),
)
.expect("Failed to get JSON_TYPE with path on column for array");
assert_eq!(result, "array");
let result: String = db
.query_one(
"SELECT JSON_TYPE(metadata, '$.specs.cpu') FROM products WHERE id = 1",
(),
)
.expect("Failed to get JSON_TYPE with nested path on column");
assert_eq!(result, "string");
}
#[test]
fn test_json_typeof_with_path() {
let db = Database::open("memory://json_typeof_path").expect("Failed to create database");
let result: String = db
.query_one("SELECT JSON_TYPEOF('{\"count\":42}', '$.count')", ())
.expect("Failed to get JSON_TYPEOF with path");
assert_eq!(result, "number");
let result: String = db
.query_one("SELECT JSON_TYPEOF('{\"items\":[1,2,3]}', '$.items')", ())
.expect("Failed to get JSON_TYPEOF with path for array");
assert_eq!(result, "array");
}
#[test]
fn test_json_type_null_path() {
let db = Database::open("memory://json_type_null_path").expect("Failed to create database");
let result = db
.query("SELECT JSON_TYPE('{\"a\":1}', NULL)", ())
.expect("Failed to query JSON_TYPE with NULL path");
let rows: Vec<_> = result.collect();
assert_eq!(rows.len(), 1);
let row = rows[0].as_ref().expect("Failed to get row");
assert!(
row.is_null(0),
"JSON_TYPE with NULL path should return NULL"
);
}
#[test]
fn test_json_object_function() {
let db = Database::open("memory://json_object").expect("Failed to create database");
let result: String = db
.query_one("SELECT JSON_OBJECT('name', 'Alice', 'age', 30)", ())
.expect("Failed to create JSON object");
assert!(result.contains("\"name\""));
assert!(result.contains("\"Alice\""));
assert!(result.contains("\"age\""));
assert!(result.contains("30"));
let result: String = db
.query_one("SELECT JSON_OBJECT()", ())
.expect("Failed to create empty JSON object");
assert_eq!(result, "{}");
let result: String = db
.query_one("SELECT JSON_OBJECT('key', 'value')", ())
.expect("Failed to create single-pair JSON object");
assert!(result.contains("\"key\""));
assert!(result.contains("\"value\""));
let result: String = db
.query_one(
"SELECT JSON_OBJECT('str', 'text', 'num', 42, 'bool', true)",
(),
)
.expect("Failed to create mixed-type JSON object");
assert!(result.contains("\"text\""));
assert!(result.contains("42"));
assert!(result.contains("true"));
}
#[test]
fn test_json_array_function() {
let db = Database::open("memory://json_array").expect("Failed to create database");
let result: String = db
.query_one("SELECT JSON_ARRAY(1, 2, 3)", ())
.expect("Failed to create number array");
assert_eq!(result, "[1,2,3]");
let result: String = db
.query_one("SELECT JSON_ARRAY('a', 'b', 'c')", ())
.expect("Failed to create string array");
assert!(result.contains("\"a\""));
assert!(result.contains("\"b\""));
assert!(result.contains("\"c\""));
let result: String = db
.query_one("SELECT JSON_ARRAY()", ())
.expect("Failed to create empty array");
assert_eq!(result, "[]");
let result: String = db
.query_one("SELECT JSON_ARRAY(1, 'two', true, null)", ())
.expect("Failed to create mixed array");
assert!(result.contains("1"));
assert!(result.contains("\"two\""));
assert!(result.contains("true"));
assert!(result.contains("null"));
}
#[test]
fn test_json_array_length_function() {
let db = Database::open("memory://json_array_length").expect("Failed to create database");
let result: i64 = db
.query_one("SELECT JSON_ARRAY_LENGTH('[1,2,3,4,5]')", ())
.expect("Failed to get array length");
assert_eq!(result, 5);
let result: i64 = db
.query_one("SELECT JSON_ARRAY_LENGTH('[]')", ())
.expect("Failed to get empty array length");
assert_eq!(result, 0);
let result: i64 = db
.query_one("SELECT JSON_ARRAY_LENGTH('[42]')", ())
.expect("Failed to get single element array length");
assert_eq!(result, 1);
}
#[test]
fn test_json_array_length_with_path() {
let db = Database::open("memory://json_array_length_path").expect("Failed to create database");
let result: i64 = db
.query_one(
"SELECT JSON_ARRAY_LENGTH('{\"items\":[1,2,3]}', '$.items')",
(),
)
.expect("Failed to get array length at path");
assert_eq!(result, 3);
let result: i64 = db
.query_one(
"SELECT JSON_ARRAY_LENGTH('{\"data\":{\"values\":[1,2,3,4]}}', '$.data.values')",
(),
)
.expect("Failed to get nested array length");
assert_eq!(result, 4);
let result: i64 = db
.query_one("SELECT JSON_ARRAY_LENGTH('{\"empty\":[]}', '$.empty')", ())
.expect("Failed to get empty array length at path");
assert_eq!(result, 0);
}