Skip to content

Commit df5bebe

Browse files
committed
Improve
1 parent 28c72d7 commit df5bebe

9 files changed

Lines changed: 574 additions & 0 deletions

datafusion-federation/src/analyzer/mod.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,25 @@ fn get_plan_provider_recursively(
499499
let mut providers: HashMap<TableReference, Arc<dyn FederationProvider>> = HashMap::new();
500500

501501
plan.apply_with_subqueries(&mut |p: &LogicalPlan| -> Result<TreeNodeRecursion> {
502+
// Register SubqueryAlias names (e.g. `lineitem l1`) so that OuterReferenceColumn resolved
503+
// against the alias (e.g. `l1.l_orderkey`) can find the correct provider. Without this,
504+
// correlated subqueries that reference an aliased outer table mark the scan as Ambiguous,
505+
// breaking same-provider federation.
506+
if let LogicalPlan::SubqueryAlias(subquery_alias) = p {
507+
let alias_ref = TableReference::bare(subquery_alias.alias.table().to_string());
508+
subquery_alias
509+
.input
510+
.apply(&mut |child| -> Result<TreeNodeRecursion> {
511+
if let (Some(provider), Some(table_reference)) = get_leaf_provider(child)? {
512+
providers.insert(alias_ref.clone(), Arc::clone(&provider));
513+
providers.insert(table_reference, provider);
514+
return Ok(TreeNodeRecursion::Stop);
515+
}
516+
Ok(TreeNodeRecursion::Continue)
517+
})?;
518+
return Ok(TreeNodeRecursion::Continue);
519+
}
520+
502521
if let (Some(federation_provider), Some(table_reference)) = get_leaf_provider(p)? {
503522
providers.insert(table_reference, federation_provider);
504523
}

0 commit comments

Comments
 (0)