From c0f37b3a78181c4422b62edc87278417a9f49a38 Mon Sep 17 00:00:00 2001 From: Connor Tsui Date: Fri, 23 Oct 2026 12:05:57 -0400 Subject: [PATCH] Attach batch validity directly to canonical RowFn output Signed-off-by: Connor Tsui --- .../unstable/row/batch/execute/dense.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/vortex-array/src/scalar_fn/unstable/row/batch/execute/dense.rs b/vortex-array/src/scalar_fn/unstable/row/batch/execute/dense.rs index cd5ab2aeea1..1cd7fba843b 100644 --- a/vortex-array/src/scalar_fn/unstable/row/batch/execute/dense.rs +++ b/vortex-array/src/scalar_fn/unstable/row/batch/execute/dense.rs @@ -9,8 +9,12 @@ use vortex_mask::MaskValuesRef; use super::super::RowFnExecutionArgs; use super::super::args::BorrowedRowFnArgs; use crate::ArrayRef; +use crate::Canonical; use crate::ExecutionCtx; +use crate::IntoArray; +use crate::arrays::masked::mask_validity_canonical; use crate::builtins::ArrayBuiltins; +use crate::canonical::AnyCanonical; use crate::scalar_fn::unstable::row::execute::DenseAttempt; use crate::validity::Validity; @@ -107,7 +111,19 @@ impl RowFnExecutionArgs { Validity::NonNullable | Validity::AllValid => { self.finalize_output(values, self.row_count) } - Validity::Array(valid) => self.finalize_output(values.mask(valid)?, self.row_count), + Validity::Array(valid) => { + // Canonical output can carry validity directly, without a second mask execution. + let values = match values.as_opt::() { + Some(canonical) => mask_validity_canonical( + Canonical::from(canonical), + Validity::Array(valid), + ctx, + )? + .into_array(), + None => values.mask(valid)?, + }; + self.finalize_output(values, self.row_count) + } Validity::AllInvalid => { unreachable!("all-invalid validity is handled before dense row execution") }