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

viirya pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new 9e8c1bffe Support casting `NULL` to/from `Decimal` (#1922)
9e8c1bffe is described below

commit 9e8c1bffebc4f04835b60b3aa0bda38fd3fb469d
Author: Kun Liu <[email protected]>
AuthorDate: Fri Jun 24 15:00:16 2022 +0800

    Support casting `NULL` to/from `Decimal` (#1922)
    
    * support NULL type values to decimal
    
    * support NULL type values to decimal
    
    * Update arrow/src/compute/kernels/cast.rs
    
    * Update arrow/src/compute/kernels/cast.rs
    
    Co-authored-by: Liang-Chi Hsieh <[email protected]>
---
 arrow/src/compute/kernels/cast.rs | 36 +++++++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 7 deletions(-)

diff --git a/arrow/src/compute/kernels/cast.rs 
b/arrow/src/compute/kernels/cast.rs
index fa92179b7..7e9d1a147 100644
--- a/arrow/src/compute/kernels/cast.rs
+++ b/arrow/src/compute/kernels/cast.rs
@@ -72,9 +72,9 @@ pub fn can_cast_types(from_type: &DataType, to_type: 
&DataType) -> bool {
         // cast one decimal type to another decimal type
         (Decimal(_, _), Decimal(_, _)) => true,
         // signed numeric to decimal
-        (Int8 | Int16 | Int32 | Int64 | Float32 | Float64, Decimal(_, _)) |
+        (Null | Int8 | Int16 | Int32 | Int64 | Float32 | Float64, Decimal(_, 
_)) |
         // decimal to signed numeric
-        (Decimal(_, _), Int8 | Int16 | Int32 | Int64 | Float32 | Float64)
+        (Decimal(_, _), Null | Int8 | Int16 | Int32 | Int64 | Float32 | 
Float64)
         | (
             Null,
             Boolean
@@ -251,21 +251,21 @@ pub fn can_cast_types(from_type: &DataType, to_type: 
&DataType) -> bool {
         (Int64, Duration(_)) => true,
         (Duration(_), Int64) => true,
         (Interval(from_type), Int64) => {
-            match from_type{
+            match from_type {
                 IntervalUnit::YearMonth => true,
                 IntervalUnit::DayTime => true,
                 IntervalUnit::MonthDayNano => false, // Native type is i128
             }
-        },
+        }
         (Int32, Interval(to_type)) => {
-            match to_type{
+            match to_type {
                 IntervalUnit::YearMonth => true,
                 IntervalUnit::DayTime => false,
                 IntervalUnit::MonthDayNano => false,
             }
-        },
+        }
         (Int64, Interval(to_type)) => {
-            match to_type{
+            match to_type {
                 IntervalUnit::YearMonth => false,
                 IntervalUnit::DayTime => true,
                 IntervalUnit::MonthDayNano => false,
@@ -447,6 +447,7 @@ pub fn cast_with_options(
                 Float64 => {
                     cast_decimal_to_float!(array, scale, Float64Builder, f64)
                 }
+                Null => Ok(new_null_array(to_type, array.len())),
                 _ => Err(ArrowError::CastError(format!(
                     "Casting from {:?} to {:?} not supported",
                     from_type, to_type
@@ -475,6 +476,7 @@ pub fn cast_with_options(
                 Float64 => {
                     cast_floating_point_to_decimal!(array, Float64Array, 
precision, scale)
                 }
+                Null => Ok(new_null_array(to_type, array.len())),
                 _ => Err(ArrowError::CastError(format!(
                     "Casting from {:?} to {:?} not supported",
                     from_type, to_type
@@ -4312,6 +4314,26 @@ mod tests {
         assert_eq!(array_to_strings(&cast_array), expected);
     }
 
+    #[test]
+    fn test_cast_null_array_to_from_decimal_array() {
+        let data_type = DataType::Decimal(12, 4);
+        let array = new_null_array(&DataType::Null, 4);
+        assert_eq!(array.data_type(), &DataType::Null);
+        let cast_array = cast(&array, &data_type).expect("cast failed");
+        assert_eq!(cast_array.data_type(), &data_type);
+        for i in 0..4 {
+            assert!(cast_array.is_null(i));
+        }
+
+        let array = new_null_array(&data_type, 4);
+        assert_eq!(array.data_type(), &data_type);
+        let cast_array = cast(&array, &DataType::Null).expect("cast failed");
+        assert_eq!(cast_array.data_type(), &DataType::Null);
+        for i in 0..4 {
+            assert!(cast_array.is_null(i));
+        }
+    }
+
     #[test]
     fn test_cast_null_array_from_and_to_primitive_array() {
         macro_rules! typed_test {

Reply via email to