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

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


The following commit(s) were added to refs/heads/main by this push:
     new 1d33828b chore: Disable abs and signum because they return incorrect 
results (#695)
1d33828b is described below

commit 1d33828b02937eb1a048e8b68a2bb063ec902d3d
Author: Andy Grove <[email protected]>
AuthorDate: Sat Jul 20 14:08:00 2024 -0600

    chore: Disable abs and signum because they return incorrect results (#695)
---
 native/Cargo.lock                                  |  1 -
 native/core/src/execution/datafusion/planner.rs    | 29 +++----
 native/spark-expr/Cargo.toml                       |  1 -
 native/spark-expr/src/abs.rs                       | 89 ----------------------
 native/spark-expr/src/lib.rs                       |  2 -
 .../org/apache/comet/serde/QueryPlanSerde.scala    | 38 ++++-----
 .../org/apache/comet/CometExpressionSuite.scala    |  9 ++-
 7 files changed, 42 insertions(+), 127 deletions(-)

diff --git a/native/Cargo.lock b/native/Cargo.lock
index c3aae93a..339d9ad8 100644
--- a/native/Cargo.lock
+++ b/native/Cargo.lock
@@ -920,7 +920,6 @@ dependencies = [
  "datafusion",
  "datafusion-common",
  "datafusion-expr",
- "datafusion-functions",
  "datafusion-physical-expr",
  "datafusion-physical-plan",
  "num",
diff --git a/native/core/src/execution/datafusion/planner.rs 
b/native/core/src/execution/datafusion/planner.rs
index 03635dd7..cd37e938 100644
--- a/native/core/src/execution/datafusion/planner.rs
+++ b/native/core/src/execution/datafusion/planner.rs
@@ -56,7 +56,7 @@ use datafusion_common::{
     JoinType as DFJoinType, ScalarValue,
 };
 use datafusion_expr::expr::find_df_window_func;
-use datafusion_expr::{ScalarUDF, WindowFrame, WindowFrameBound, 
WindowFrameUnits};
+use datafusion_expr::{WindowFrame, WindowFrameBound, WindowFrameUnits};
 use datafusion_physical_expr::window::WindowExpr;
 use datafusion_physical_expr_common::aggregate::create_aggregate_expr;
 use itertools::Itertools;
@@ -108,7 +108,7 @@ use datafusion_comet_proto::{
     spark_partitioning::{partitioning::PartitioningStruct, Partitioning as 
SparkPartitioning},
 };
 use datafusion_comet_spark_expr::{
-    Abs, Cast, DateTruncExpr, HourExpr, IfExpr, MinuteExpr, SecondExpr, 
TimestampTruncExpr,
+    Cast, DateTruncExpr, HourExpr, IfExpr, MinuteExpr, SecondExpr, 
TimestampTruncExpr,
 };
 
 // For clippy error on type_complexity.
@@ -505,18 +505,19 @@ impl PhysicalPlanner {
                 let op = DataFusionOperator::BitwiseShiftLeft;
                 Ok(Arc::new(BinaryExpr::new(left, op, right)))
             }
-            ExprStruct::Abs(expr) => {
-                let child = self.create_expr(expr.child.as_ref().unwrap(), 
input_schema.clone())?;
-                let return_type = child.data_type(&input_schema)?;
-                let args = vec![child];
-                let eval_mode = from_protobuf_eval_mode(expr.eval_mode)?;
-                let comet_abs = Arc::new(ScalarUDF::new_from_impl(Abs::new(
-                    eval_mode,
-                    return_type.to_string(),
-                )?));
-                let expr = ScalarFunctionExpr::new("abs", comet_abs, args, 
return_type);
-                Ok(Arc::new(expr))
-            }
+            // https://github.com/apache/datafusion-comet/issues/666
+            // ExprStruct::Abs(expr) => {
+            //     let child = self.create_expr(expr.child.as_ref().unwrap(), 
input_schema.clone())?;
+            //     let return_type = child.data_type(&input_schema)?;
+            //     let args = vec![child];
+            //     let eval_mode = from_protobuf_eval_mode(expr.eval_mode)?;
+            //     let comet_abs = Arc::new(ScalarUDF::new_from_impl(Abs::new(
+            //         eval_mode,
+            //         return_type.to_string(),
+            //     )?));
+            //     let expr = ScalarFunctionExpr::new("abs", comet_abs, args, 
return_type);
+            //     Ok(Arc::new(expr))
+            // }
             ExprStruct::CaseWhen(case_when) => {
                 let when_then_pairs = case_when
                     .when
diff --git a/native/spark-expr/Cargo.toml b/native/spark-expr/Cargo.toml
index 976a1f36..192ed102 100644
--- a/native/spark-expr/Cargo.toml
+++ b/native/spark-expr/Cargo.toml
@@ -33,7 +33,6 @@ arrow-schema = { workspace = true }
 chrono = { workspace = true }
 datafusion = { workspace = true }
 datafusion-common = { workspace = true }
-datafusion-functions = { workspace = true }
 datafusion-expr = { workspace = true }
 datafusion-physical-expr = { workspace = true }
 datafusion-physical-plan = { workspace = true }
diff --git a/native/spark-expr/src/abs.rs b/native/spark-expr/src/abs.rs
deleted file mode 100644
index fa25a777..00000000
--- a/native/spark-expr/src/abs.rs
+++ /dev/null
@@ -1,89 +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.
-
-//! Spark-compatible implementation of abs function
-
-use std::{any::Any, sync::Arc};
-
-use arrow::datatypes::DataType;
-use arrow_schema::ArrowError;
-
-use datafusion::logical_expr::{ColumnarValue, ScalarUDFImpl, Signature};
-use datafusion_common::DataFusionError;
-use datafusion_functions::math;
-
-use super::{EvalMode, SparkError};
-
-/// Spark-compatible ABS expression
-#[derive(Debug)]
-pub struct Abs {
-    inner_abs_func: Arc<dyn ScalarUDFImpl>,
-    eval_mode: EvalMode,
-    data_type_name: String,
-}
-
-impl Abs {
-    pub fn new(eval_mode: EvalMode, data_type_name: String) -> Result<Self, 
DataFusionError> {
-        if let EvalMode::Legacy | EvalMode::Ansi = eval_mode {
-            Ok(Self {
-                inner_abs_func: math::abs().inner().clone(),
-                eval_mode,
-                data_type_name,
-            })
-        } else {
-            Err(DataFusionError::Execution(format!(
-                "Invalid EvalMode: \"{:?}\"",
-                eval_mode
-            )))
-        }
-    }
-}
-
-impl ScalarUDFImpl for Abs {
-    fn as_any(&self) -> &dyn Any {
-        self
-    }
-    fn name(&self) -> &str {
-        "abs"
-    }
-
-    fn signature(&self) -> &Signature {
-        self.inner_abs_func.signature()
-    }
-
-    fn return_type(&self, arg_types: &[DataType]) -> Result<DataType, 
DataFusionError> {
-        self.inner_abs_func.return_type(arg_types)
-    }
-
-    fn invoke(&self, args: &[ColumnarValue]) -> Result<ColumnarValue, 
DataFusionError> {
-        match self.inner_abs_func.invoke(args) {
-            Err(DataFusionError::ArrowError(ArrowError::ComputeError(msg), _))
-                if msg.contains("overflow") =>
-            {
-                if self.eval_mode == EvalMode::Legacy {
-                    Ok(args[0].clone())
-                } else {
-                    Err(SparkError::ArithmeticOverflow {
-                        from_type: self.data_type_name.clone(),
-                    }
-                    .into())
-                }
-            }
-            other => other,
-        }
-    }
-}
diff --git a/native/spark-expr/src/lib.rs b/native/spark-expr/src/lib.rs
index 91d61f70..336201f4 100644
--- a/native/spark-expr/src/lib.rs
+++ b/native/spark-expr/src/lib.rs
@@ -15,7 +15,6 @@
 // specific language governing permissions and limitations
 // under the License.
 
-mod abs;
 mod cast;
 mod error;
 mod if_expr;
@@ -25,7 +24,6 @@ mod temporal;
 pub mod timezone;
 pub mod utils;
 
-pub use abs::Abs;
 pub use cast::Cast;
 pub use error::{SparkError, SparkResult};
 pub use if_expr::IfExpr;
diff --git a/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala 
b/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala
index b417239d..41a69f7a 100644
--- a/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala
+++ b/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala
@@ -1615,19 +1615,21 @@ object QueryPlanSerde extends Logging with 
ShimQueryPlanSerde with CometExprShim
             None
           }
 
-        case Abs(child, failOnErr) =>
-          val childExpr = exprToProtoInternal(child, inputs)
-          if (childExpr.isDefined) {
-            val evalModeStr =
-              if (failOnErr) ExprOuterClass.EvalMode.ANSI else 
ExprOuterClass.EvalMode.LEGACY
-            val absBuilder = ExprOuterClass.Abs.newBuilder()
-            absBuilder.setChild(childExpr.get)
-            absBuilder.setEvalMode(evalModeStr)
-            Some(Expr.newBuilder().setAbs(absBuilder).build())
-          } else {
-            withInfo(expr, child)
-            None
-          }
+        // abs implementation is not correct
+        // https://github.com/apache/datafusion-comet/issues/666
+//        case Abs(child, failOnErr) =>
+//          val childExpr = exprToProtoInternal(child, inputs)
+//          if (childExpr.isDefined) {
+//            val evalModeStr =
+//              if (failOnErr) ExprOuterClass.EvalMode.ANSI else 
ExprOuterClass.EvalMode.LEGACY
+//            val absBuilder = ExprOuterClass.Abs.newBuilder()
+//            absBuilder.setChild(childExpr.get)
+//            absBuilder.setEvalMode(evalModeStr)
+//            Some(Expr.newBuilder().setAbs(absBuilder).build())
+//          } else {
+//            withInfo(expr, child)
+//            None
+//          }
 
         case Acos(child) =>
           val childExpr = exprToProtoInternal(child, inputs)
@@ -1766,10 +1768,12 @@ object QueryPlanSerde extends Logging with 
ShimQueryPlanSerde with CometExprShim
               optExprWithInfo(optExpr, expr, r.child)
           }
 
-        case Signum(child) =>
-          val childExpr = exprToProtoInternal(child, inputs)
-          val optExpr = scalarExprToProto("signum", childExpr)
-          optExprWithInfo(optExpr, expr, child)
+        // TODO enable once https://github.com/apache/datafusion/issues/11557 
is fixed or
+        // when we have a Spark-compatible version implemented in Comet
+//        case Signum(child) =>
+//          val childExpr = exprToProtoInternal(child, inputs)
+//          val optExpr = scalarExprToProto("signum", childExpr)
+//          optExprWithInfo(optExpr, expr, child)
 
         case Sin(child) =>
           val childExpr = exprToProtoInternal(child, inputs)
diff --git a/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala 
b/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
index 65217767..c22c6b06 100644
--- a/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
+++ b/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
@@ -835,7 +835,8 @@ class CometExpressionSuite extends CometTestBase with 
AdaptiveSparkPlanHelper {
     }
   }
 
-  test("abs") {
+  // https://github.com/apache/datafusion-comet/issues/666
+  ignore("abs") {
     Seq(true, false).foreach { dictionaryEnabled =>
       withTempDir { dir =>
         val path = new Path(dir.toURI.toString, "test.parquet")
@@ -849,7 +850,8 @@ class CometExpressionSuite extends CometTestBase with 
AdaptiveSparkPlanHelper {
     }
   }
 
-  test("abs Overflow ansi mode") {
+  // https://github.com/apache/datafusion-comet/issues/666
+  ignore("abs Overflow ansi mode") {
 
     def testAbsAnsiOverflow[T <: Product: ClassTag: TypeTag](data: Seq[T]): 
Unit = {
       withParquetTable(data, "tbl") {
@@ -882,7 +884,8 @@ class CometExpressionSuite extends CometTestBase with 
AdaptiveSparkPlanHelper {
     }
   }
 
-  test("abs Overflow legacy mode") {
+  // https://github.com/apache/datafusion-comet/issues/666
+  ignore("abs Overflow legacy mode") {
 
     def testAbsLegacyOverflow[T <: Product: ClassTag: TypeTag](data: Seq[T]): 
Unit = {
       withSQLConf(SQLConf.ANSI_ENABLED.key -> "false") {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to