From 263213779adb48637aa20671e8f5ea57d8b9927f Mon Sep 17 00:00:00 2001 From: osipovartem Date: Fri, 4 Sep 2026 21:32:07 +0300 Subject: [PATCH] Deduplicate predicate subquery projection columns --- .../optimizer/src/decorrelate_predicate_subquery.rs | 11 ++++++----- .../sqllogictest/test_files/subquery_projection.slt | 5 +++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/datafusion/optimizer/src/decorrelate_predicate_subquery.rs b/datafusion/optimizer/src/decorrelate_predicate_subquery.rs index e68ff114543ad..7506eca44b9e7 100644 --- a/datafusion/optimizer/src/decorrelate_predicate_subquery.rs +++ b/datafusion/optimizer/src/decorrelate_predicate_subquery.rs @@ -512,16 +512,17 @@ fn build_join( // Keep only columns that actually belong to the RIGHT child, and sort by their // position in the right schema for deterministic order. - let mut right_cols_idx_and_col: Vec<(usize, Column)> = needed + let mut right_col_indices: Vec = needed .into_iter() - .filter_map(|c| right_schema.index_of_column(&c).ok().map(|idx| (idx, c))) + .filter_map(|column| right_schema.index_of_column(&column).ok()) .collect(); - right_cols_idx_and_col.sort_by_key(|(idx, _)| *idx); + right_col_indices.sort_unstable(); + right_col_indices.dedup(); - let right_proj_exprs: Vec = right_cols_idx_and_col + let right_proj_exprs: Vec = right_col_indices .into_iter() - .map(|(_, c)| Expr::Column(c)) + .map(|index| Expr::Column(Column::from(right_schema.qualified_field(index)))) .collect(); let right_projected = if !right_proj_exprs.is_empty() { diff --git a/datafusion/sqllogictest/test_files/subquery_projection.slt b/datafusion/sqllogictest/test_files/subquery_projection.slt index 3b361841faaaa..20de82531561a 100644 --- a/datafusion/sqllogictest/test_files/subquery_projection.slt +++ b/datafusion/sqllogictest/test_files/subquery_projection.slt @@ -9,6 +9,11 @@ FROM (SELECT 1) t; ---- false true +query B +SELECT 'a' IN (SELECT column1 FROM VALUES ('b'), ('c'), ('d')); +---- +false + query BBBB WITH vals AS (SELECT * FROM (VALUES (1), (2), (NULL)) AS t(x)) SELECT