From f0fd009afa74a220350b00cd87df4d87b6b0de69 Mon Sep 17 00:00:00 2001
From: Cyprien Huet <chuet@palantir.com>
Date: Sun, 12 Jan 2025 11:42:50 +0400
Subject: [PATCH] fix null dates in range

---
 datafusion/functions-nested/src/range.rs     | 16 ++++++++++++++--
 datafusion/sqllogictest/test_files/array.slt | 15 +++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/datafusion/functions-nested/src/range.rs b/datafusion/functions-nested/src/range.rs
index 27cf53041859..4f8132f59e85 100644
--- a/datafusion/functions-nested/src/range.rs
+++ b/datafusion/functions-nested/src/range.rs
@@ -448,10 +448,18 @@ fn gen_range_date(args: &[ArrayRef], include_upper_bound: bool) -> Result<ArrayR
     let values_builder = Date32Builder::new();
     let mut list_builder = ListBuilder::new(values_builder);
 
-    for (idx, stop) in stop_array.iter().enumerate() {
-        let mut stop = stop.unwrap_or(0);
+    for idx in 0..stop_array.len() {
+        if stop_array.is_null(idx) {
+            list_builder.append_null();
+            continue;
+        }
+        let mut stop = stop_array.value(idx);
 
         let start = if let Some(start_array_values) = start_array {
+            if start_array_values.is_null(idx) {
+                list_builder.append_null();
+                continue;
+            }
             start_array_values.value(idx)
         } else {
             list_builder.append_null();
@@ -459,6 +467,10 @@ fn gen_range_date(args: &[ArrayRef], include_upper_bound: bool) -> Result<ArrayR
         };
 
         let step = if let Some(step) = step_array {
+            if step.is_null(idx) {
+                list_builder.append_null();
+                continue;
+            }
             step.value(idx)
         } else {
             list_builder.append_null();
diff --git a/datafusion/sqllogictest/test_files/array.slt b/datafusion/sqllogictest/test_files/array.slt
index 57b1b0fc19d2..a618b26f0abd 100644
--- a/datafusion/sqllogictest/test_files/array.slt
+++ b/datafusion/sqllogictest/test_files/array.slt
@@ -6201,6 +6201,21 @@ select generate_series(NULL, DATE '1993-03-01', INTERVAL '1' YEAR);
 ----
 NULL
 
+query ?
+select generate_series(NULL::Date, DATE '1993-03-01', INTERVAL '1' YEAR);
+----
+NULL
+
+query ?
+select generate_series(DATE '1993-03-01', NULL::Date, INTERVAL '1' YEAR);
+----
+NULL
+
+query ?
+select generate_series(DATE '1993-02-01', DATE '1993-03-01', NULL::Interval);
+----
+NULL
+
 query ?
 select generate_series(NULL, TIMESTAMP '1993-03-01', INTERVAL '1' YEAR);
 ----