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); ----