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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0bddfb7  support cast/try_cast for decimal: signed numeric to decimal 
(#1442)
0bddfb7 is described below

commit 0bddfb747ec7cf3cf3db39f6bb3e9dc31212b4fe
Author: Kun Liu <[email protected]>
AuthorDate: Sat Jan 15 01:09:40 2022 +0800

    support cast/try_cast for decimal: signed numeric to decimal (#1442)
    
    * support cast/try_cast for decimal: signed numeric to decimal
    
    * add test case
    
    * change test case
    
    * change dependency
    
    * remove useless code
    
    * restore dependency
---
 datafusion/src/physical_plan/expressions/cast.rs   | 128 ++++++++++++++++++++-
 .../src/physical_plan/expressions/try_cast.rs      | 123 +++++++++++++++++++-
 2 files changed, 248 insertions(+), 3 deletions(-)

diff --git a/datafusion/src/physical_plan/expressions/cast.rs 
b/datafusion/src/physical_plan/expressions/cast.rs
index bba125e..df687b4 100644
--- a/datafusion/src/physical_plan/expressions/cast.rs
+++ b/datafusion/src/physical_plan/expressions/cast.rs
@@ -162,7 +162,10 @@ mod tests {
     use crate::physical_plan::expressions::col;
     use arrow::array::{StringArray, Time64NanosecondArray};
     use arrow::{
-        array::{Array, Int32Array, Int64Array, TimestampNanosecondArray, 
UInt32Array},
+        array::{
+            Array, DecimalArray, Float32Array, Float64Array, Int16Array, 
Int32Array,
+            Int64Array, Int8Array, TimestampNanosecondArray, UInt32Array,
+        },
         datatypes::*,
     };
 
@@ -218,6 +221,129 @@ mod tests {
     }
 
     #[test]
+    fn test_cast_numeric_to_decimal() -> Result<()> {
+        // int8
+        generic_test_cast!(
+            Int8Array,
+            DataType::Int8,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(3, 0),
+            vec![
+                Some(1_i128),
+                Some(2_i128),
+                Some(3_i128),
+                Some(4_i128),
+                Some(5_i128),
+            ],
+            DEFAULT_DATAFUSION_CAST_OPTIONS
+        );
+
+        // int16
+        generic_test_cast!(
+            Int16Array,
+            DataType::Int16,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(5, 0),
+            vec![
+                Some(1_i128),
+                Some(2_i128),
+                Some(3_i128),
+                Some(4_i128),
+                Some(5_i128),
+            ],
+            DEFAULT_DATAFUSION_CAST_OPTIONS
+        );
+
+        // int32
+        generic_test_cast!(
+            Int32Array,
+            DataType::Int32,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(10, 0),
+            vec![
+                Some(1_i128),
+                Some(2_i128),
+                Some(3_i128),
+                Some(4_i128),
+                Some(5_i128),
+            ],
+            DEFAULT_DATAFUSION_CAST_OPTIONS
+        );
+
+        // int64
+        generic_test_cast!(
+            Int64Array,
+            DataType::Int64,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(20, 0),
+            vec![
+                Some(1_i128),
+                Some(2_i128),
+                Some(3_i128),
+                Some(4_i128),
+                Some(5_i128),
+            ],
+            DEFAULT_DATAFUSION_CAST_OPTIONS
+        );
+
+        // int64 to different scale
+        generic_test_cast!(
+            Int64Array,
+            DataType::Int64,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(20, 2),
+            vec![
+                Some(100_i128),
+                Some(200_i128),
+                Some(300_i128),
+                Some(400_i128),
+                Some(500_i128),
+            ],
+            DEFAULT_DATAFUSION_CAST_OPTIONS
+        );
+
+        // float32
+        generic_test_cast!(
+            Float32Array,
+            DataType::Float32,
+            vec![1.5, 2.5, 3.0, 1.123_456_8, 5.50],
+            DecimalArray,
+            DataType::Decimal(10, 2),
+            vec![
+                Some(150_i128),
+                Some(250_i128),
+                Some(300_i128),
+                Some(112_i128),
+                Some(550_i128),
+            ],
+            DEFAULT_DATAFUSION_CAST_OPTIONS
+        );
+
+        // float64
+        generic_test_cast!(
+            Float64Array,
+            DataType::Float64,
+            vec![1.5, 2.5, 3.0, 1.123_456_8, 5.50],
+            DecimalArray,
+            DataType::Decimal(20, 4),
+            vec![
+                Some(15000_i128),
+                Some(25000_i128),
+                Some(30000_i128),
+                Some(11234_i128),
+                Some(55000_i128),
+            ],
+            DEFAULT_DATAFUSION_CAST_OPTIONS
+        );
+        Ok(())
+    }
+
+    #[test]
     fn test_cast_i32_u32() -> Result<()> {
         generic_test_cast!(
             Int32Array,
diff --git a/datafusion/src/physical_plan/expressions/try_cast.rs 
b/datafusion/src/physical_plan/expressions/try_cast.rs
index 1ba4a50..d231ce2 100644
--- a/datafusion/src/physical_plan/expressions/try_cast.rs
+++ b/datafusion/src/physical_plan/expressions/try_cast.rs
@@ -119,9 +119,12 @@ mod tests {
     use super::*;
     use crate::error::Result;
     use crate::physical_plan::expressions::col;
-    use arrow::array::{StringArray, Time64NanosecondArray};
+    use arrow::array::{Float32Array, Float64Array, StringArray, 
Time64NanosecondArray};
     use arrow::{
-        array::{Array, Int32Array, Int64Array, TimestampNanosecondArray, 
UInt32Array},
+        array::{
+            Array, DecimalArray, Int16Array, Int32Array, Int64Array, Int8Array,
+            TimestampNanosecondArray, UInt32Array,
+        },
         datatypes::*,
     };
 
@@ -176,6 +179,122 @@ mod tests {
     }
 
     #[test]
+    fn test_try_cast_numeric_to_decimal() -> Result<()> {
+        // int8
+        generic_test_cast!(
+            Int8Array,
+            DataType::Int8,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(3, 0),
+            vec![
+                Some(1_i128),
+                Some(2_i128),
+                Some(3_i128),
+                Some(4_i128),
+                Some(5_i128),
+            ]
+        );
+
+        // int16
+        generic_test_cast!(
+            Int16Array,
+            DataType::Int16,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(5, 0),
+            vec![
+                Some(1_i128),
+                Some(2_i128),
+                Some(3_i128),
+                Some(4_i128),
+                Some(5_i128),
+            ]
+        );
+
+        // int32
+        generic_test_cast!(
+            Int32Array,
+            DataType::Int32,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(10, 0),
+            vec![
+                Some(1_i128),
+                Some(2_i128),
+                Some(3_i128),
+                Some(4_i128),
+                Some(5_i128),
+            ]
+        );
+
+        // int64
+        generic_test_cast!(
+            Int64Array,
+            DataType::Int64,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(20, 0),
+            vec![
+                Some(1_i128),
+                Some(2_i128),
+                Some(3_i128),
+                Some(4_i128),
+                Some(5_i128),
+            ]
+        );
+
+        // int64 to different scale
+        generic_test_cast!(
+            Int64Array,
+            DataType::Int64,
+            vec![1, 2, 3, 4, 5],
+            DecimalArray,
+            DataType::Decimal(20, 2),
+            vec![
+                Some(100_i128),
+                Some(200_i128),
+                Some(300_i128),
+                Some(400_i128),
+                Some(500_i128),
+            ]
+        );
+
+        // float32
+        generic_test_cast!(
+            Float32Array,
+            DataType::Float32,
+            vec![1.5, 2.5, 3.0, 1.123_456_8, 5.50],
+            DecimalArray,
+            DataType::Decimal(10, 2),
+            vec![
+                Some(150_i128),
+                Some(250_i128),
+                Some(300_i128),
+                Some(112_i128),
+                Some(550_i128),
+            ]
+        );
+
+        // float64
+        generic_test_cast!(
+            Float64Array,
+            DataType::Float64,
+            vec![1.5, 2.5, 3.0, 1.123_456_8, 5.50],
+            DecimalArray,
+            DataType::Decimal(20, 4),
+            vec![
+                Some(15000_i128),
+                Some(25000_i128),
+                Some(30000_i128),
+                Some(11234_i128),
+                Some(55000_i128),
+            ]
+        );
+        Ok(())
+    }
+
+    #[test]
     fn test_cast_i32_u32() -> Result<()> {
         generic_test_cast!(
             Int32Array,

Reply via email to