diff --git a/datafusion/functions-aggregate/src/first_last.rs b/datafusion/functions-aggregate/src/first_last.rs index e2da7ec753aa..ea45e42e84f3 100644 --- a/datafusion/functions-aggregate/src/first_last.rs +++ b/datafusion/functions-aggregate/src/first_last.rs @@ -1193,7 +1193,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(()) @@ -1525,10 +1525,24 @@ 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(()) } + #[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![