Omega359 commented on code in PR #9181:
URL: https://github.com/apache/arrow-datafusion/pull/9181#discussion_r1486408246


##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -2820,4 +2993,247 @@ mod tests {
             "Arrow error: Cast error: Can't cast value 4294967295 to type 
Int32"
         );
     }
+
+    #[test]
+    fn test_to_char() {
+        let date = "2020-01-02T03:04:05"
+            .parse::<NaiveDateTime>()
+            .unwrap()
+            .with_nanosecond(12345)
+            .unwrap();
+        let date2 = "2026-07-08T09:10:11"
+            .parse::<NaiveDateTime>()
+            .unwrap()
+            .with_nanosecond(56789)
+            .unwrap();
+
+        let scalar_data = vec![
+            (
+                ScalarValue::Date32(Some(18506)),
+                ScalarValue::Utf8(Some("%Y::%m::%d".to_string())),
+                "2020::09::01".to_string(),
+            ),
+            (
+                ScalarValue::Date64(Some(date.timestamp_millis())),
+                ScalarValue::Utf8(Some("%Y::%m::%d".to_string())),
+                "2020::01::02".to_string(),
+            ),
+            (
+                ScalarValue::Time32Second(Some(31851)),
+                ScalarValue::Utf8(Some("%H-%M-%S".to_string())),
+                "08-50-51".to_string(),
+            ),
+            (
+                ScalarValue::Time32Millisecond(Some(18506000)),
+                ScalarValue::Utf8(Some("%H-%M-%S".to_string())),
+                "05-08-26".to_string(),
+            ),
+            (
+                ScalarValue::Time64Microsecond(Some(12344567000)),
+                ScalarValue::Utf8(Some("%H-%M-%S %f".to_string())),
+                "03-25-44 567000000".to_string(),
+            ),
+            (
+                ScalarValue::Time64Nanosecond(Some(12344567890000)),
+                ScalarValue::Utf8(Some("%H-%M-%S %f".to_string())),
+                "03-25-44 567890000".to_string(),
+            ),
+            (
+                ScalarValue::TimestampSecond(Some(date.timestamp()), None),
+                ScalarValue::Utf8(Some("%Y::%m::%d %S::%M::%H".to_string())),
+                "2020::01::02 05::04::03".to_string(),
+            ),
+            (
+                
ScalarValue::TimestampMillisecond(Some(date.timestamp_millis()), None),
+                ScalarValue::Utf8(Some("%Y::%m::%d %S::%M::%H".to_string())),
+                "2020::01::02 05::04::03".to_string(),
+            ),
+            (
+                
ScalarValue::TimestampMicrosecond(Some(date.timestamp_micros()), None),
+                ScalarValue::Utf8(Some("%Y::%m::%d %S::%M::%H 
%f".to_string())),
+                "2020::01::02 05::04::03 000012000".to_string(),
+            ),
+            (
+                ScalarValue::TimestampNanosecond(
+                    Some(date.timestamp_nanos_opt().unwrap()),
+                    None,
+                ),
+                ScalarValue::Utf8(Some("%Y::%m::%d %S::%M::%H 
%f".to_string())),
+                "2020::01::02 05::04::03 000012345".to_string(),
+            ),
+        ];
+
+        for (value, format, expected) in scalar_data {
+            let result =
+                to_char(&[ColumnarValue::Scalar(value), 
ColumnarValue::Scalar(format)])
+                    .expect("that to_char parsed values without error");
+
+            if let ColumnarValue::Scalar(ScalarValue::Utf8(date)) = result {
+                assert_eq!(expected, date.unwrap());
+            } else {
+                panic!("Expected a scalar value")
+            }
+        }
+
+        let array_scalar_data = vec![
+            (
+                Arc::new(Date32Array::from(vec![18506, 18507])) as ArrayRef,
+                ScalarValue::Utf8(Some("%Y::%m::%d".to_string())),
+                StringArray::from(vec!["2020::09::01", "2020::09::02"]),
+            ),
+            (
+                Arc::new(Date64Array::from(vec![
+                    date.timestamp_millis(),
+                    date2.timestamp_millis(),
+                ])) as ArrayRef,
+                ScalarValue::Utf8(Some("%Y::%m::%d".to_string())),
+                StringArray::from(vec!["2020::01::02", "2026::07::08"]),
+            ),
+        ];
+
+        let array_array_data = vec![
+            (
+                Arc::new(Date32Array::from(vec![18506, 18507])) as ArrayRef,
+                StringArray::from(vec!["%Y::%m::%d", "%d::%m::%Y"]),
+                StringArray::from(vec!["2020::09::01", "02::09::2020"]),
+            ),
+            (
+                Arc::new(Date64Array::from(vec![
+                    date.timestamp_millis(),
+                    date2.timestamp_millis(),
+                ])) as ArrayRef,
+                StringArray::from(vec!["%Y::%m::%d", "%d::%m::%Y"]),
+                StringArray::from(vec!["2020::01::02", "08::07::2026"]),
+            ),
+            (
+                Arc::new(Time32MillisecondArray::from(vec![1850600, 1860700]))
+                    as ArrayRef,
+                StringArray::from(vec!["%H:%M:%S", "%H::%M::%S"]),
+                StringArray::from(vec!["00:30:50", "00::31::00"]),
+            ),
+            (
+                Arc::new(Time32SecondArray::from(vec![18506, 18507])) as 
ArrayRef,
+                StringArray::from(vec!["%H:%M:%S", "%H::%M::%S"]),
+                StringArray::from(vec!["05:08:26", "05::08::27"]),
+            ),
+            (
+                Arc::new(Time64MicrosecondArray::from(vec![12344567000, 
22244567000]))
+                    as ArrayRef,
+                StringArray::from(vec!["%H:%M:%S", "%H::%M::%S"]),
+                StringArray::from(vec!["03:25:44", "06::10::44"]),
+            ),
+            (
+                Arc::new(Time64NanosecondArray::from(vec![
+                    1234456789000,
+                    2224456789000,
+                ])) as ArrayRef,
+                StringArray::from(vec!["%H:%M:%S", "%H::%M::%S"]),
+                StringArray::from(vec!["00:20:34", "00::37::04"]),
+            ),
+            (
+                Arc::new(TimestampSecondArray::from(vec![
+                    date.timestamp(),
+                    date2.timestamp(),
+                ])) as ArrayRef,
+                StringArray::from(vec!["%Y::%m::%d %S::%M::%H", "%d::%m::%Y 
%S-%M-%H"]),
+                StringArray::from(vec![
+                    "2020::01::02 05::04::03",
+                    "08::07::2026 11-10-09",
+                ]),
+            ),
+            (
+                Arc::new(TimestampMillisecondArray::from(vec![
+                    date.timestamp_millis(),
+                    date2.timestamp_millis(),
+                ])) as ArrayRef,
+                StringArray::from(vec![
+                    "%Y::%m::%d %S::%M::%H %f",
+                    "%d::%m::%Y %S-%M-%H %f",
+                ]),
+                StringArray::from(vec![
+                    "2020::01::02 05::04::03 000000000",
+                    "08::07::2026 11-10-09 000000000",
+                ]),
+            ),
+            (
+                Arc::new(TimestampMicrosecondArray::from(vec![
+                    date.timestamp_micros(),
+                    date2.timestamp_micros(),
+                ])) as ArrayRef,
+                StringArray::from(vec![
+                    "%Y::%m::%d %S::%M::%H %f",
+                    "%d::%m::%Y %S-%M-%H %f",
+                ]),
+                StringArray::from(vec![
+                    "2020::01::02 05::04::03 000012000",
+                    "08::07::2026 11-10-09 000056000",
+                ]),
+            ),
+            (
+                Arc::new(TimestampNanosecondArray::from(vec![
+                    date.timestamp_nanos_opt().unwrap(),
+                    date2.timestamp_nanos_opt().unwrap(),
+                ])) as ArrayRef,
+                StringArray::from(vec![
+                    "%Y::%m::%d %S::%M::%H %f",
+                    "%d::%m::%Y %S-%M-%H %f",
+                ]),
+                StringArray::from(vec![
+                    "2020::01::02 05::04::03 000012345",
+                    "08::07::2026 11-10-09 000056789",
+                ]),
+            ),
+        ];
+
+        for (value, format, expected) in array_scalar_data {
+            let result = to_char(&[

Review Comment:
   The test_to_char covers scalar/scalar, array/scalar (single test) and 
array/array currently. I'll add a test for scalar/array



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to