From e2cecbee350401adeacc7cd5f7835b79891bfd39 Mon Sep 17 00:00:00 2001 From: Shehab <11789402+shehabgamin@users.noreply.github.com> Date: Sun, 25 Oct 2026 04:28:22 -0700 Subject: [PATCH] fix: Compact scalars during merge --- .../functions-aggregate/src/first_last.rs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/datafusion/functions-aggregate/src/first_last.rs b/datafusion/functions-aggregate/src/first_last.rs index fba4aa697778e..bf19e112da223 100644 --- a/datafusion/functions-aggregate/src/first_last.rs +++ b/datafusion/functions-aggregate/src/first_last.rs @@ -977,6 +977,7 @@ impl Accumulator for TrivialFirstValueAccumulator { && !first.is_empty() { self.first = ScalarValue::try_from_array(first, 0)?; + self.first.compact(); self.is_set = true; } } @@ -2972,4 +2973,26 @@ mod tests { assert_eq!(int64_values(&out), vec![Some(500)]); Ok(()) } + + #[test] + fn test_first_value_merge_compacts_list_state() -> Result<()> { + let values: ArrayRef = + Arc::new(ListArray::from_iter_primitive::( + repeat_with(|| Some(vec![Some(1)])).take(10_000), + )); + + let mut updated = + TrivialFirstValueAccumulator::try_new(values.data_type(), false)?; + let mut merged = + TrivialFirstValueAccumulator::try_new(values.data_type(), false)?; + + updated.update_batch(&[Arc::clone(&values)])?; + + let flags: ArrayRef = Arc::new(BooleanArray::from(vec![true; values.len()])); + merged.merge_batch(&[values, flags])?; + + assert_eq!(merged.evaluate()?, updated.evaluate()?); + assert_eq!(merged.size(), updated.size()); + Ok(()) + } }