Skip to content

Commit 5d34ec4

Browse files
committed
Add basic support for flatten join
1 parent 6218c31 commit 5d34ec4

2 files changed

Lines changed: 46 additions & 0 deletions

File tree

datafusion/physical-expr/src/planner.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ pub fn create_physical_expr(
118118
let idx = input_dfschema.index_of_column(c)?;
119119
Ok(Arc::new(Column::new(&c.name, idx)))
120120
}
121+
Expr::OuterReferenceColumn(_datatype, c) => {
122+
let idx = input_dfschema.index_of_column(c)?;
123+
Ok(Arc::new(Column::new(&c.name, idx)))
124+
}
121125
Expr::Literal(value) => Ok(Arc::new(Literal::new(value.clone()))),
122126
Expr::ScalarVariable(_, variable_names) => {
123127
if is_system_variables(variable_names) {

datafusion/sql/src/relation/mod.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,48 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
400400

401401
(unpivot_plan, alias)
402402
}
403+
TableFactor::Function {
404+
name, args, alias, ..
405+
} => {
406+
let tbl_func_name = self.object_name_to_table_reference(name)?;
407+
let schema = planner_context
408+
.outer_query_schema()
409+
.cloned()
410+
.unwrap_or_else(DFSchema::empty);
411+
let func_args = args
412+
.into_iter()
413+
.map(|arg| match arg {
414+
FunctionArg::Unnamed(FunctionArgExpr::Expr(expr)) => {
415+
let expr = self.sql_expr_to_logical_expr(
416+
expr,
417+
&schema,
418+
planner_context,
419+
)?;
420+
Ok((expr, None))
421+
}
422+
FunctionArg::Named {
423+
name,
424+
arg: FunctionArgExpr::Expr(expr),
425+
..
426+
} => {
427+
let expr = self.sql_expr_to_logical_expr(
428+
expr,
429+
&schema,
430+
planner_context,
431+
)?;
432+
Ok((expr, Some(name.value.clone())))
433+
}
434+
_ => plan_err!("Unsupported function argument: {arg:?}"),
435+
})
436+
.collect::<Result<Vec<(Expr, Option<String>)>>>()?;
437+
438+
let provider = self
439+
.context_provider
440+
.get_table_function_source(tbl_func_name.table(), func_args)?;
441+
let plan =
442+
LogicalPlanBuilder::scan(tbl_func_name, provider, None)?.build()?;
443+
(plan, alias)
444+
}
403445
// @todo: Support TableFactory::TableFunction
404446
_ => {
405447
return not_impl_err!(

0 commit comments

Comments
 (0)