You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by vi...@apache.org on 2023/06/21 15:37:47 UTC

[arrow-datafusion] branch main updated: Return null for date_trunc(null) instead of panic (#6723)

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

viirya 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 c42f5efc99 Return null for date_trunc(null) instead of panic (#6723)
c42f5efc99 is described below

commit c42f5efc9957103bc3da4881d84581853a666230
Author: BryanEmond <70...@users.noreply.github.com>
AuthorDate: Wed Jun 21 11:37:41 2023 -0400

    Return null for date_trunc(null) instead of panic (#6723)
    
    * date_trunc(null) results in a panic
---
 .../tests/sqllogictests/test_files/timestamps.slt  | 80 ++++++++++++++++++++++
 .../physical-expr/src/datetime_expressions.rs      |  8 +++
 2 files changed, 88 insertions(+)

diff --git a/datafusion/core/tests/sqllogictests/test_files/timestamps.slt b/datafusion/core/tests/sqllogictests/test_files/timestamps.slt
index 8ccb863f31..5eae354401 100644
--- a/datafusion/core/tests/sqllogictests/test_files/timestamps.slt
+++ b/datafusion/core/tests/sqllogictests/test_files/timestamps.slt
@@ -837,6 +837,16 @@ SELECT DATE_TRUNC('YEAR', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
 2022-01-01T00:00:00
 
+query P
+SELECT DATE_TRUNC('year', NULL);
+----
+NULL
+
+query P
+SELECT DATE_TRUNC('YEAR', NULL);
+----
+NULL
+
 query P
 SELECT DATE_TRUNC('quarter', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
@@ -847,6 +857,16 @@ SELECT DATE_TRUNC('QUARTER', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
 2022-07-01T00:00:00
 
+query P
+SELECT DATE_TRUNC('quarter', NULL);
+----
+NULL
+
+query P
+SELECT DATE_TRUNC('QUARTER', NULL);
+----
+NULL
+
 query P
 SELECT DATE_TRUNC('month', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
@@ -857,6 +877,16 @@ SELECT DATE_TRUNC('MONTH', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
 2022-08-01T00:00:00
 
+query P
+SELECT DATE_TRUNC('month', NULL);
+----
+NULL
+
+query P
+SELECT DATE_TRUNC('MONTH', NULL);
+----
+NULL
+
 query P
 SELECT DATE_TRUNC('week', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
@@ -867,6 +897,16 @@ SELECT DATE_TRUNC('WEEK', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
 2022-08-01T00:00:00
 
+query P
+SELECT DATE_TRUNC('week', NULL);
+----
+NULL
+
+query P
+SELECT DATE_TRUNC('WEEK', NULL);
+----
+NULL
+
 query P
 SELECT DATE_TRUNC('day', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
@@ -877,6 +917,16 @@ SELECT DATE_TRUNC('DAY', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
 2022-08-03T00:00:00
 
+query P
+SELECT DATE_TRUNC('day', NULL);
+----
+NULL
+
+query P
+SELECT DATE_TRUNC('DAY', NULL);
+----
+NULL
+
 query P
 SELECT DATE_TRUNC('hour', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
@@ -887,6 +937,16 @@ SELECT DATE_TRUNC('HOUR', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
 2022-08-03T14:00:00
 
+query P
+SELECT DATE_TRUNC('hour', NULL);
+----
+NULL
+
+query P
+SELECT DATE_TRUNC('HOUR', NULL);
+----
+NULL
+
 query P
 SELECT DATE_TRUNC('minute', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
@@ -897,6 +957,16 @@ SELECT DATE_TRUNC('MINUTE', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
 2022-08-03T14:38:00
 
+query P
+SELECT DATE_TRUNC('minute', NULL);
+----
+NULL
+
+query P
+SELECT DATE_TRUNC('MINUTE', NULL);
+----
+NULL
+
 query P
 SELECT DATE_TRUNC('second', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
@@ -907,6 +977,16 @@ SELECT DATE_TRUNC('SECOND', TIMESTAMP '2022-08-03 14:38:50Z');
 ----
 2022-08-03T14:38:50
 
+query P
+SELECT DATE_TRUNC('second', NULL);
+----
+NULL
+
+query P
+SELECT DATE_TRUNC('SECOND', NULL);
+----
+NULL
+
 # Test date trunc on different timestamp types and ensure types are consistent
 query TP rowsort
 SELECT 'ts_data_nanos', DATE_TRUNC('day', ts) FROM ts_data_nanos
diff --git a/datafusion/physical-expr/src/datetime_expressions.rs b/datafusion/physical-expr/src/datetime_expressions.rs
index bae704d150..349ed76fe9 100644
--- a/datafusion/physical-expr/src/datetime_expressions.rs
+++ b/datafusion/physical-expr/src/datetime_expressions.rs
@@ -283,6 +283,14 @@ pub fn date_trunc(args: &[ColumnarValue]) -> Result<ColumnarValue> {
     Ok(match array {
         ColumnarValue::Scalar(ScalarValue::TimestampNanosecond(v, tz_opt)) => {
             let nano = (f)(*v)?;
+
+            if nano.is_none() {
+                return Ok(ColumnarValue::Scalar(ScalarValue::TimestampNanosecond(
+                    None,
+                    tz_opt.clone(),
+                )));
+            }
+
             match granularity.as_str() {
                 "minute" => {
                     // trunc to minute