This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 8d428c386c feat: BuiltinScalarFunction::Cbrt (#5839)
8d428c386c is described below

commit 8d428c386cf113a4f0c2ac4f9b997ac549e49485
Author: Igor Izvekov <[email protected]>
AuthorDate: Wed Apr 5 15:50:28 2023 +0300

    feat: BuiltinScalarFunction::Cbrt (#5839)
    
    * feat: BuiltinScalarFunction::Cbrt
    
    * fix: "ScalarFunction::Cbrt" covered in "datafusion.proto" and "pbjson.rs"
    
    * feat: add documentation for "cbrt" function
    
    * fix: use prettier
    
    * fix: use regen.sh
    
    * fix: remove useless docstring
---
 datafusion/core/tests/sql/expr.rs                | 13 +++++++++++++
 datafusion/expr/src/built_in_function.rs         |  4 ++++
 datafusion/expr/src/expr_fn.rs                   |  2 ++
 datafusion/expr/src/function.rs                  |  1 +
 datafusion/physical-expr/src/functions.rs        |  1 +
 datafusion/physical-expr/src/math_expressions.rs |  1 +
 datafusion/proto/proto/datafusion.proto          |  1 +
 datafusion/proto/src/generated/pbjson.rs         |  3 +++
 datafusion/proto/src/generated/prost.rs          |  3 +++
 datafusion/proto/src/logical_plan/from_proto.rs  |  4 +++-
 datafusion/proto/src/logical_plan/to_proto.rs    |  1 +
 docs/source/user-guide/expressions.md            |  1 +
 docs/source/user-guide/sql/scalar_functions.md   | 14 ++++++++++++++
 13 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/datafusion/core/tests/sql/expr.rs 
b/datafusion/core/tests/sql/expr.rs
index aceb09c299..d4930d631d 100644
--- a/datafusion/core/tests/sql/expr.rs
+++ b/datafusion/core/tests/sql/expr.rs
@@ -676,6 +676,7 @@ async fn test_boolean_expressions() -> Result<()> {
 #[tokio::test]
 async fn test_mathematical_expressions_with_null() -> Result<()> {
     test_expression!("sqrt(NULL)", "NULL");
+    test_expression!("cbrt(NULL)", "NULL");
     test_expression!("sin(NULL)", "NULL");
     test_expression!("cos(NULL)", "NULL");
     test_expression!("tan(NULL)", "NULL");
@@ -1629,6 +1630,18 @@ async fn csv_query_sqrt_sqrt() -> Result<()> {
     Ok(())
 }
 
+#[tokio::test]
+async fn csv_query_cbrt_cbrt() -> Result<()> {
+    let ctx = create_ctx();
+    register_aggregate_csv(&ctx).await?;
+    let sql = "SELECT cbrt(cbrt(c12)) FROM aggregate_test_100 LIMIT 1";
+    let actual = execute(&ctx, sql).await;
+    // cbrt(cbrt(c12=0.9294097332465232)) = 0.9918990366780552
+    let expected = vec![vec!["0.9918990366780552"]];
+    assert_float_eq(&expected, &actual);
+    Ok(())
+}
+
 #[tokio::test]
 async fn nested_subquery() -> Result<()> {
     let ctx = SessionContext::new();
diff --git a/datafusion/expr/src/built_in_function.rs 
b/datafusion/expr/src/built_in_function.rs
index 8ea96f185c..8280309087 100644
--- a/datafusion/expr/src/built_in_function.rs
+++ b/datafusion/expr/src/built_in_function.rs
@@ -66,6 +66,8 @@ pub enum BuiltinScalarFunction {
     Sin,
     /// sqrt
     Sqrt,
+    /// cbrt
+    Cbrt,
     /// tan
     Tan,
     /// trunc
@@ -212,6 +214,7 @@ impl BuiltinScalarFunction {
             BuiltinScalarFunction::Signum => Volatility::Immutable,
             BuiltinScalarFunction::Sin => Volatility::Immutable,
             BuiltinScalarFunction::Sqrt => Volatility::Immutable,
+            BuiltinScalarFunction::Cbrt => Volatility::Immutable,
             BuiltinScalarFunction::Tan => Volatility::Immutable,
             BuiltinScalarFunction::Trunc => Volatility::Immutable,
             BuiltinScalarFunction::MakeArray => Volatility::Immutable,
@@ -304,6 +307,7 @@ impl FromStr for BuiltinScalarFunction {
             "signum" => BuiltinScalarFunction::Signum,
             "sin" => BuiltinScalarFunction::Sin,
             "sqrt" => BuiltinScalarFunction::Sqrt,
+            "cbrt" => BuiltinScalarFunction::Cbrt,
             "tan" => BuiltinScalarFunction::Tan,
             "trunc" => BuiltinScalarFunction::Trunc,
 
diff --git a/datafusion/expr/src/expr_fn.rs b/datafusion/expr/src/expr_fn.rs
index abf0e1be98..9912cecde1 100644
--- a/datafusion/expr/src/expr_fn.rs
+++ b/datafusion/expr/src/expr_fn.rs
@@ -446,6 +446,7 @@ macro_rules! nary_scalar_expr {
 
 // math functions
 scalar_expr!(Sqrt, sqrt, num, "square root of a number");
+scalar_expr!(Cbrt, cbrt, num, "cube root of a number");
 scalar_expr!(Sin, sin, num, "sine");
 scalar_expr!(Cos, cos, num, "cosine");
 scalar_expr!(Tan, tan, num, "tangent");
@@ -758,6 +759,7 @@ mod test {
     #[test]
     fn scalar_function_definitions() {
         test_unary_scalar_expr!(Sqrt, sqrt);
+        test_unary_scalar_expr!(Cbrt, cbrt);
         test_unary_scalar_expr!(Sin, sin);
         test_unary_scalar_expr!(Cos, cos);
         test_unary_scalar_expr!(Tan, tan);
diff --git a/datafusion/expr/src/function.rs b/datafusion/expr/src/function.rs
index 03932ccc4d..81740f10ff 100644
--- a/datafusion/expr/src/function.rs
+++ b/datafusion/expr/src/function.rs
@@ -277,6 +277,7 @@ pub fn return_type(
         | BuiltinScalarFunction::Signum
         | BuiltinScalarFunction::Sin
         | BuiltinScalarFunction::Sqrt
+        | BuiltinScalarFunction::Cbrt
         | BuiltinScalarFunction::Tan
         | BuiltinScalarFunction::Trunc => match input_expr_types[0] {
             DataType::Float32 => Ok(DataType::Float32),
diff --git a/datafusion/physical-expr/src/functions.rs 
b/datafusion/physical-expr/src/functions.rs
index 035e72136f..f04b192bf0 100644
--- a/datafusion/physical-expr/src/functions.rs
+++ b/datafusion/physical-expr/src/functions.rs
@@ -353,6 +353,7 @@ pub fn create_physical_fun(
         BuiltinScalarFunction::Signum => Arc::new(math_expressions::signum),
         BuiltinScalarFunction::Sin => Arc::new(math_expressions::sin),
         BuiltinScalarFunction::Sqrt => Arc::new(math_expressions::sqrt),
+        BuiltinScalarFunction::Cbrt => Arc::new(math_expressions::cbrt),
         BuiltinScalarFunction::Tan => Arc::new(math_expressions::tan),
         BuiltinScalarFunction::Trunc => Arc::new(math_expressions::trunc),
         BuiltinScalarFunction::Power => {
diff --git a/datafusion/physical-expr/src/math_expressions.rs 
b/datafusion/physical-expr/src/math_expressions.rs
index ea89c2cd4b..2527e858e2 100644
--- a/datafusion/physical-expr/src/math_expressions.rs
+++ b/datafusion/physical-expr/src/math_expressions.rs
@@ -128,6 +128,7 @@ macro_rules! make_function_inputs2 {
 }
 
 math_unary_function!("sqrt", sqrt);
+math_unary_function!("cbrt", cbrt);
 math_unary_function!("sin", sin);
 math_unary_function!("cos", cos);
 math_unary_function!("tan", tan);
diff --git a/datafusion/proto/proto/datafusion.proto 
b/datafusion/proto/proto/datafusion.proto
index 76ec5b0017..4abee6d900 100644
--- a/datafusion/proto/proto/datafusion.proto
+++ b/datafusion/proto/proto/datafusion.proto
@@ -523,6 +523,7 @@ enum ScalarFunction {
   CurrentDate = 70;
   CurrentTime = 71;
   Uuid = 72;
+  Cbrt = 73;
 }
 
 message ScalarFunctionNode {
diff --git a/datafusion/proto/src/generated/pbjson.rs 
b/datafusion/proto/src/generated/pbjson.rs
index 406d9ee27a..97375681c3 100644
--- a/datafusion/proto/src/generated/pbjson.rs
+++ b/datafusion/proto/src/generated/pbjson.rs
@@ -17083,6 +17083,7 @@ impl serde::Serialize for ScalarFunction {
             Self::CurrentDate => "CurrentDate",
             Self::CurrentTime => "CurrentTime",
             Self::Uuid => "Uuid",
+            Self::Cbrt => "Cbrt",
         };
         serializer.serialize_str(variant)
     }
@@ -17167,6 +17168,7 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction {
             "CurrentDate",
             "CurrentTime",
             "Uuid",
+            "Cbrt",
         ];
 
         struct GeneratedVisitor;
@@ -17282,6 +17284,7 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction {
                     "CurrentDate" => Ok(ScalarFunction::CurrentDate),
                     "CurrentTime" => Ok(ScalarFunction::CurrentTime),
                     "Uuid" => Ok(ScalarFunction::Uuid),
+                    "Cbrt" => Ok(ScalarFunction::Cbrt),
                     _ => Err(serde::de::Error::unknown_variant(value, FIELDS)),
                 }
             }
diff --git a/datafusion/proto/src/generated/prost.rs 
b/datafusion/proto/src/generated/prost.rs
index e5b4534f60..f4f48dfe41 100644
--- a/datafusion/proto/src/generated/prost.rs
+++ b/datafusion/proto/src/generated/prost.rs
@@ -2126,6 +2126,7 @@ pub enum ScalarFunction {
     CurrentDate = 70,
     CurrentTime = 71,
     Uuid = 72,
+    Cbrt = 73,
 }
 impl ScalarFunction {
     /// String value of the enum field names used in the ProtoBuf definition.
@@ -2207,6 +2208,7 @@ impl ScalarFunction {
             ScalarFunction::CurrentDate => "CurrentDate",
             ScalarFunction::CurrentTime => "CurrentTime",
             ScalarFunction::Uuid => "Uuid",
+            ScalarFunction::Cbrt => "Cbrt",
         }
     }
     /// Creates an enum from field names used in the ProtoBuf definition.
@@ -2285,6 +2287,7 @@ impl ScalarFunction {
             "CurrentDate" => Some(Self::CurrentDate),
             "CurrentTime" => Some(Self::CurrentTime),
             "Uuid" => Some(Self::Uuid),
+            "Cbrt" => Some(Self::Cbrt),
             _ => None,
         }
     }
diff --git a/datafusion/proto/src/logical_plan/from_proto.rs 
b/datafusion/proto/src/logical_plan/from_proto.rs
index 755b942e43..5d198d47a6 100644
--- a/datafusion/proto/src/logical_plan/from_proto.rs
+++ b/datafusion/proto/src/logical_plan/from_proto.rs
@@ -33,7 +33,7 @@ use datafusion_common::{
     ScalarValue,
 };
 use datafusion_expr::{
-    abs, acos, array, ascii, asin, atan, atan2, bit_length, btrim, ceil,
+    abs, acos, array, ascii, asin, atan, atan2, bit_length, btrim, cbrt, ceil,
     character_length, chr, coalesce, concat_expr, concat_ws_expr, cos, 
date_bin,
     date_part, date_trunc, digest, exp,
     expr::{self, Sort, WindowFunction},
@@ -400,6 +400,7 @@ impl From<&protobuf::ScalarFunction> for 
BuiltinScalarFunction {
         use protobuf::ScalarFunction;
         match f {
             ScalarFunction::Sqrt => Self::Sqrt,
+            ScalarFunction::Cbrt => Self::Cbrt,
             ScalarFunction::Sin => Self::Sin,
             ScalarFunction::Cos => Self::Cos,
             ScalarFunction::Tan => Self::Tan,
@@ -1129,6 +1130,7 @@ pub fn parse_expr(
                         .collect::<Result<Vec<_>, _>>()?,
                 )),
                 ScalarFunction::Sqrt => Ok(sqrt(parse_expr(&args[0], 
registry)?)),
+                ScalarFunction::Cbrt => Ok(cbrt(parse_expr(&args[0], 
registry)?)),
                 ScalarFunction::Sin => Ok(sin(parse_expr(&args[0], 
registry)?)),
                 ScalarFunction::Cos => Ok(cos(parse_expr(&args[0], 
registry)?)),
                 ScalarFunction::Tan => Ok(tan(parse_expr(&args[0], 
registry)?)),
diff --git a/datafusion/proto/src/logical_plan/to_proto.rs 
b/datafusion/proto/src/logical_plan/to_proto.rs
index e8570cf3c7..c53fdf8aab 100644
--- a/datafusion/proto/src/logical_plan/to_proto.rs
+++ b/datafusion/proto/src/logical_plan/to_proto.rs
@@ -1251,6 +1251,7 @@ impl TryFrom<&BuiltinScalarFunction> for 
protobuf::ScalarFunction {
     fn try_from(scalar: &BuiltinScalarFunction) -> Result<Self, Self::Error> {
         let scalar_function = match scalar {
             BuiltinScalarFunction::Sqrt => Self::Sqrt,
+            BuiltinScalarFunction::Cbrt => Self::Cbrt,
             BuiltinScalarFunction::Sin => Self::Sin,
             BuiltinScalarFunction::Cos => Self::Cos,
             BuiltinScalarFunction::Tan => Self::Tan,
diff --git a/docs/source/user-guide/expressions.md 
b/docs/source/user-guide/expressions.md
index 7717366d25..85918a4518 100644
--- a/docs/source/user-guide/expressions.md
+++ b/docs/source/user-guide/expressions.md
@@ -85,6 +85,7 @@ expressions such as `col("a") + col("b")` to be used.
 | signum(x)             | sign of the argument (-1, 0, +1)                  |
 | sin(x)                | sine                                              |
 | sqrt(x)               | square root                                       |
+| cbrt(x)               | cube root                                         |
 | tan(x)                | tangent                                           |
 | trunc(x)              | truncate toward zero                              |
 
diff --git a/docs/source/user-guide/sql/scalar_functions.md 
b/docs/source/user-guide/sql/scalar_functions.md
index 89fb567146..ea109664c5 100644
--- a/docs/source/user-guide/sql/scalar_functions.md
+++ b/docs/source/user-guide/sql/scalar_functions.md
@@ -39,6 +39,7 @@
 - [signum](#signum)
 - [sin](#sin)
 - [sqrt](#sqrt)
+- [cbrt](#cbrt)
 - [tan](#tan)
 - [trunc](#trunc)
 
@@ -275,6 +276,19 @@ sqrt(numeric_expression)
 
 #### Arguments
 
+- **numeric_expression**: Numeric expression to operate on.
+  Can be a constant, column, or function, and any combination of arithmetic 
operators.
+
+### `cbrt`
+
+Returns the cube root of a number.
+
+```
+cbrt(numeric_expression)
+```
+
+#### Arguments
+
 - **numeric_expression**: Numeric expression to operate on.
   Can be a constant, column, or function, and any combination of arithmetic 
operators.
 

Reply via email to