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 9fbea3c97d Handle invalid types for negation (#9066)
9fbea3c97d is described below

commit 9fbea3c97d41df282aa0f6a2fbb7863a86850190
Author: Trung Dinh <[email protected]>
AuthorDate: Wed Jan 31 08:36:53 2024 -0800

    Handle invalid types for negation (#9066)
    
    * handle invalid types for negation
    
    * Update datafusion/physical-expr/src/expressions/negative.rs
    
    Use `plan_err!(..)`
    
    Co-authored-by: Andrew Lamb <[email protected]>
    
    * github auto commit fallout
    
    ---------
    
    Co-authored-by: Andrew Lamb <[email protected]>
---
 .../physical-expr/src/expressions/negative.rs      | 28 ++++++++++++++++++----
 datafusion/sqllogictest/test_files/scalar.slt      |  3 +++
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/datafusion/physical-expr/src/expressions/negative.rs 
b/datafusion/physical-expr/src/expressions/negative.rs
index b64b4a0c86..6b5c208bae 100644
--- a/datafusion/physical-expr/src/expressions/negative.rs
+++ b/datafusion/physical-expr/src/expressions/negative.rs
@@ -30,7 +30,7 @@ use arrow::{
     datatypes::{DataType, Schema},
     record_batch::RecordBatch,
 };
-use datafusion_common::{internal_err, DataFusionError, Result};
+use datafusion_common::{plan_err, DataFusionError, Result};
 use datafusion_expr::interval_arithmetic::Interval;
 use datafusion_expr::{
     type_coercion::{is_interval, is_null, is_signed_numeric, is_timestamp},
@@ -164,9 +164,7 @@ pub fn negative(
         && !is_interval(&data_type)
         && !is_timestamp(&data_type)
     {
-        internal_err!(
-            "Can't create negative physical expr for (- '{arg:?}'), the type 
of child expr is {data_type}, not signed numeric"
-        )
+        plan_err!("Negation only supports numeric, interval and timestamp 
types")
     } else {
         Ok(Arc::new(NegativeExpr::new(arg)))
     }
@@ -252,4 +250,26 @@ mod tests {
         );
         Ok(())
     }
+
+    #[test]
+    fn test_negation_valid_types() -> Result<()> {
+        let negatable_types = [
+            DataType::Int8,
+            DataType::Timestamp(TimeUnit::Second, None),
+            DataType::Interval(IntervalUnit::YearMonth),
+        ];
+        for negatable_type in negatable_types {
+            let schema = Schema::new(vec![Field::new("a", negatable_type, 
true)]);
+            let _expr = negative(col("a", &schema)?, &schema)?;
+        }
+        Ok(())
+    }
+
+    #[test]
+    fn test_negation_invalid_types() -> Result<()> {
+        let schema = Schema::new(vec![Field::new("a", DataType::Utf8, true)]);
+        let expr = negative(col("a", &schema)?, &schema).unwrap_err();
+        matches!(expr, DataFusionError::Plan(_));
+        Ok(())
+    }
 }
diff --git a/datafusion/sqllogictest/test_files/scalar.slt 
b/datafusion/sqllogictest/test_files/scalar.slt
index 0f76c722e9..ca313820ab 100644
--- a/datafusion/sqllogictest/test_files/scalar.slt
+++ b/datafusion/sqllogictest/test_files/scalar.slt
@@ -1546,6 +1546,9 @@ SELECT null, -null
 ----
 NULL NULL
 
+query error DataFusion error: Error during planning: Negation only supports 
numeric, interval and timestamp types
+SELECT -'100'
+
 statement ok
 drop table test_boolean
 

Reply via email to