From c42fe77c2f1ef4d791706a4c23c38760d2d0a6f2 Mon Sep 17 00:00:00 2001 From: peterxcli Date: Sun, 26 Jul 2026 16:47:50 +0800 Subject: [PATCH 1/2] Fix last value accumulator merge indexing --- datafusion/functions-aggregate/src/first_last.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datafusion/functions-aggregate/src/first_last.rs b/datafusion/functions-aggregate/src/first_last.rs index cecb277cb844a..a522193a655de 100644 --- a/datafusion/functions-aggregate/src/first_last.rs +++ b/datafusion/functions-aggregate/src/first_last.rs @@ -1191,7 +1191,7 @@ impl Accumulator for TrivialLastValueAccumulator { if let Some(last) = filtered_states.last() && !last.is_empty() { - self.last = ScalarValue::try_from_array(last, 0)?; + self.last = ScalarValue::try_from_array(last, last.len() - 1)?; self.is_set = true; } Ok(()) @@ -1522,6 +1522,7 @@ mod tests { let merged_state = last_accumulator.state()?; assert_eq!(merged_state.len(), state1.len()); + assert_eq!(last_accumulator.evaluate()?, ScalarValue::Int64(Some(10))); Ok(()) } From 217e8e5443922255b94be26c104cefc92a97200c Mon Sep 17 00:00:00 2001 From: peterxcli Date: Tue, 28 Jul 2026 00:37:04 +0800 Subject: [PATCH 2/2] test: cover last value merge with unset states --- datafusion/functions-aggregate/src/first_last.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/datafusion/functions-aggregate/src/first_last.rs b/datafusion/functions-aggregate/src/first_last.rs index 2b3ab9b28f73f..ea45e42e84f33 100644 --- a/datafusion/functions-aggregate/src/first_last.rs +++ b/datafusion/functions-aggregate/src/first_last.rs @@ -1530,6 +1530,19 @@ mod tests { Ok(()) } + #[test] + fn test_trivial_last_value_merge_all_flags_false() -> Result<()> { + let mut acc = TrivialLastValueAccumulator::try_new(&DataType::Int64, false)?; + let states: Vec = vec![ + Arc::new(Int64Array::from(vec![None, None])), + Arc::new(BooleanArray::from(vec![false, false])), + ]; + + acc.merge_batch(&states)?; + assert_eq!(acc.evaluate()?, ScalarValue::Int64(None)); + Ok(()) + } + #[test] fn test_first_group_acc() -> Result<()> { let schema = Arc::new(Schema::new(vec![