diff --git a/datafusion/sql/src/relation/mod.rs b/datafusion/sql/src/relation/mod.rs index cf9812e1af83..2dbc1c920c65 100644 --- a/datafusion/sql/src/relation/mod.rs +++ b/datafusion/sql/src/relation/mod.rs @@ -400,6 +400,48 @@ impl SqlToRel<'_, S> { (unpivot_plan, alias) } + TableFactor::Function { + name, args, alias, .. + } => { + let tbl_func_ref = self.object_name_to_table_reference(name)?; + let schema = planner_context + .outer_query_schema() + .cloned() + .unwrap_or_else(DFSchema::empty); + let func_args = args + .into_iter() + .map(|arg| match arg { + FunctionArg::Unnamed(FunctionArgExpr::Expr(expr)) => { + let expr = self.sql_expr_to_logical_expr( + expr, + &schema, + planner_context, + )?; + Ok((expr, None)) + } + FunctionArg::Named { + name, + arg: FunctionArgExpr::Expr(expr), + .. + } => { + let expr = self.sql_expr_to_logical_expr( + expr, + &schema, + planner_context, + )?; + Ok((expr, Some(name.value.clone()))) + } + _ => plan_err!("Unsupported function argument: {arg:?}"), + }) + .collect::)>>>()?; + let tbl_func_name = tbl_func_ref.table().to_ascii_lowercase(); + let provider = self + .context_provider + .get_table_function_source(&tbl_func_name, func_args)?; + let plan = + LogicalPlanBuilder::scan(tbl_func_name, provider, None)?.build()?; + (plan, alias) + } // @todo: Support TableFactory::TableFunction _ => { return not_impl_err!(