diff --git a/datafusion/physical-expr/src/lib.rs b/datafusion/physical-expr/src/lib.rs index 46185712413ef..e7c2b4119c5ae 100644 --- a/datafusion/physical-expr/src/lib.rs +++ b/datafusion/physical-expr/src/lib.rs @@ -27,7 +27,6 @@ pub mod binary_map { pub mod equivalence; pub mod expressions; pub mod intervals; -pub mod math_expressions; mod partitioning; mod physical_expr; pub mod planner; diff --git a/datafusion/physical-expr/src/math_expressions.rs b/datafusion/physical-expr/src/math_expressions.rs deleted file mode 100644 index 503565b1e2613..0000000000000 --- a/datafusion/physical-expr/src/math_expressions.rs +++ /dev/null @@ -1,126 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -//! Math expressions - -use std::any::type_name; -use std::sync::Arc; - -use arrow::array::ArrayRef; -use arrow::array::{BooleanArray, Float32Array, Float64Array}; -use arrow::datatypes::DataType; -use arrow_array::Array; - -use datafusion_common::exec_err; -use datafusion_common::{DataFusionError, Result}; - -macro_rules! downcast_arg { - ($ARG:expr, $NAME:expr, $ARRAY_TYPE:ident) => {{ - $ARG.as_any().downcast_ref::<$ARRAY_TYPE>().ok_or_else(|| { - DataFusionError::Internal(format!( - "could not cast {} from {} to {}", - $NAME, - $ARG.data_type(), - type_name::<$ARRAY_TYPE>() - )) - })? - }}; -} - -macro_rules! make_function_scalar_inputs_return_type { - ($ARG: expr, $NAME:expr, $ARGS_TYPE:ident, $RETURN_TYPE:ident, $FUNC: block) => {{ - let arg = downcast_arg!($ARG, $NAME, $ARGS_TYPE); - - arg.iter() - .map(|a| match a { - Some(a) => Some($FUNC(a)), - _ => None, - }) - .collect::<$RETURN_TYPE>() - }}; -} - -/// Isnan SQL function -pub fn isnan(args: &[ArrayRef]) -> Result { - match args[0].data_type() { - DataType::Float64 => Ok(Arc::new(make_function_scalar_inputs_return_type!( - &args[0], - "x", - Float64Array, - BooleanArray, - { f64::is_nan } - )) as ArrayRef), - - DataType::Float32 => Ok(Arc::new(make_function_scalar_inputs_return_type!( - &args[0], - "x", - Float32Array, - BooleanArray, - { f32::is_nan } - )) as ArrayRef), - - other => exec_err!("Unsupported data type {other:?} for function isnan"), - } -} - -#[cfg(test)] -mod tests { - - use datafusion_common::cast::as_boolean_array; - - use super::*; - - #[test] - fn test_isnan_f64() { - let args: Vec = vec![Arc::new(Float64Array::from(vec![ - 1.0, - f64::NAN, - 3.0, - -f64::NAN, - ]))]; - - let result = isnan(&args).expect("failed to initialize function isnan"); - let booleans = - as_boolean_array(&result).expect("failed to initialize function isnan"); - - assert_eq!(booleans.len(), 4); - assert!(!booleans.value(0)); - assert!(booleans.value(1)); - assert!(!booleans.value(2)); - assert!(booleans.value(3)); - } - - #[test] - fn test_isnan_f32() { - let args: Vec = vec![Arc::new(Float32Array::from(vec![ - 1.0, - f32::NAN, - 3.0, - f32::NAN, - ]))]; - - let result = isnan(&args).expect("failed to initialize function isnan"); - let booleans = - as_boolean_array(&result).expect("failed to initialize function isnan"); - - assert_eq!(booleans.len(), 4); - assert!(!booleans.value(0)); - assert!(booleans.value(1)); - assert!(!booleans.value(2)); - assert!(booleans.value(3)); - } -} diff --git a/datafusion/sqllogictest/test_files/math.slt b/datafusion/sqllogictest/test_files/math.slt index eece569423177..1bc972a3e37da 100644 --- a/datafusion/sqllogictest/test_files/math.slt +++ b/datafusion/sqllogictest/test_files/math.slt @@ -102,7 +102,12 @@ SELECT nanvl(asin(10), 1.0), nanvl(1.0, 2.0), nanvl(asin(10), asin(10)) # isnan query BBBB -SELECT isnan(1.0), isnan('NaN'::DOUBLE), isnan(-'NaN'::DOUBLE), isnan(NULL) +SELECT isnan(1.0::DOUBLE), isnan('NaN'::DOUBLE), isnan(-'NaN'::DOUBLE), isnan(NULL) +---- +false true true NULL + +query BBBB +SELECT isnan(1.0::FLOAT), isnan('NaN'::FLOAT), isnan(-'NaN'::FLOAT), isnan(NULL::FLOAT) ---- false true true NULL