From 6608cc166f58b4412d8bcdba2888a92fef6ec3de Mon Sep 17 00:00:00 2001 From: Odonno Date: Tue, 7 May 2024 18:46:17 +0200 Subject: [PATCH] Add `type::is::nil` function --- core/src/fnc/mod.rs | 1 + .../modules/surrealdb/functions/type/is.rs | 1 + core/src/fnc/type.rs | 5 ++++ core/src/syn/parser/builtin.rs | 1 + lib/fuzz/fuzz_targets/fuzz_executor.dict | 1 + lib/fuzz/fuzz_targets/fuzz_sql_parser.dict | 1 + lib/tests/function.rs | 27 +++++++++++++++++++ 7 files changed, 37 insertions(+) diff --git a/core/src/fnc/mod.rs b/core/src/fnc/mod.rs index 79dcf267aa1..f2f75d107b9 100644 --- a/core/src/fnc/mod.rs +++ b/core/src/fnc/mod.rs @@ -335,6 +335,7 @@ pub fn synchronous(ctx: &Context<'_>, name: &str, args: Vec) -> Result r#type::is::geometry, "type::is::int" => r#type::is::int, "type::is::line" => r#type::is::line, + "type::is::nil" => r#type::is::nil, "type::is::none" => r#type::is::none, "type::is::null" => r#type::is::null, "type::is::multiline" => r#type::is::multiline, diff --git a/core/src/fnc/script/modules/surrealdb/functions/type/is.rs b/core/src/fnc/script/modules/surrealdb/functions/type/is.rs index 16f9aed0c04..fb75e0fb00e 100644 --- a/core/src/fnc/script/modules/surrealdb/functions/type/is.rs +++ b/core/src/fnc/script/modules/surrealdb/functions/type/is.rs @@ -18,6 +18,7 @@ impl_module_def!( "geometry" => run, "int" => run, "line" => run, + "nil" => run, "none" => run, "null" => run, "multiline" => run, diff --git a/core/src/fnc/type.rs b/core/src/fnc/type.rs index f97e3081895..1ad2ad291fa 100644 --- a/core/src/fnc/type.rs +++ b/core/src/fnc/type.rs @@ -271,6 +271,11 @@ pub mod is { Ok(matches!(arg, Value::Geometry(Geometry::Line(_))).into()) } + pub fn nil((arg,): (Value,)) -> Result { + let result = arg.is_none() || arg.is_null(); + Ok(result.into()) + } + pub fn none((arg,): (Value,)) -> Result { Ok(arg.is_none().into()) } diff --git a/core/src/syn/parser/builtin.rs b/core/src/syn/parser/builtin.rs index 625aa710d62..da94eafd0ed 100644 --- a/core/src/syn/parser/builtin.rs +++ b/core/src/syn/parser/builtin.rs @@ -326,6 +326,7 @@ pub(crate) static PATHS: phf::Map, PathKind> = phf_map! { UniCase::ascii("type::is::geometry") => PathKind::Function, UniCase::ascii("type::is::int") => PathKind::Function, UniCase::ascii("type::is::line") => PathKind::Function, + UniCase::ascii("type::is::nil") => PathKind::Function, UniCase::ascii("type::is::null") => PathKind::Function, UniCase::ascii("type::is::none") => PathKind::Function, UniCase::ascii("type::is::multiline") => PathKind::Function, diff --git a/lib/fuzz/fuzz_targets/fuzz_executor.dict b/lib/fuzz/fuzz_targets/fuzz_executor.dict index 6b9116c9812..69adfe348ac 100644 --- a/lib/fuzz/fuzz_targets/fuzz_executor.dict +++ b/lib/fuzz/fuzz_targets/fuzz_executor.dict @@ -377,6 +377,7 @@ "type::is::geometry(" "type::is::int(" "type::is::line(" +"type::is::nil(" "type::is::none(" "type::is::null(" "type::is::multiline(" diff --git a/lib/fuzz/fuzz_targets/fuzz_sql_parser.dict b/lib/fuzz/fuzz_targets/fuzz_sql_parser.dict index f3aee565315..89d8e3bd37c 100644 --- a/lib/fuzz/fuzz_targets/fuzz_sql_parser.dict +++ b/lib/fuzz/fuzz_targets/fuzz_sql_parser.dict @@ -375,6 +375,7 @@ "type::is::geometry(" "type::is::int(" "type::is::line(" +"type::is::nil(" "type::is::none(" "type::is::null(" "type::is::multiline(" diff --git a/lib/tests/function.rs b/lib/tests/function.rs index 12af72e84c9..801490b2adf 100644 --- a/lib/tests/function.rs +++ b/lib/tests/function.rs @@ -5222,6 +5222,33 @@ async fn function_type_is_line() -> Result<(), Error> { Ok(()) } +#[tokio::test] +async fn function_type_is_nil() -> Result<(), Error> { + let sql = r#" + RETURN type::is::nil(none); + RETURN type::is::nil(null); + RETURN type::is::nil("123"); + "#; + let dbs = new_ds().await?; + let ses = Session::owner().with_ns("test").with_db("test"); + let res = &mut dbs.execute(sql, &ses, None).await?; + assert_eq!(res.len(), 3); + // + let tmp = res.remove(0).result?; + let val = Value::from(true); + assert_eq!(tmp, val); + // + let tmp = res.remove(0).result?; + let val = Value::from(true); + assert_eq!(tmp, val); + // + let tmp = res.remove(0).result?; + let val = Value::from(false); + assert_eq!(tmp, val); + // + Ok(()) +} + #[tokio::test] async fn function_type_is_none() -> Result<(), Error> { let sql = r#"