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