Skip to content

Commit b687ce4

Browse files
authored
Support ExprNamed arguments to Scalar UDFs (#104)
* support ExprNamed until 17379 ships * add same exprnamed lifting to udtf
1 parent 912eebe commit b687ce4

File tree

2 files changed

+50
-8
lines changed

2 files changed

+50
-8
lines changed

datafusion/sql/src/expr/function.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616
// under the License.
1717

1818
use crate::planner::{ContextProvider, PlannerContext, SqlToRel};
19+
use std::collections::BTreeMap;
1920

2021
use arrow::datatypes::DataType;
2122
use datafusion_common::{
2223
internal_datafusion_err, internal_err, not_impl_err, plan_datafusion_err, plan_err,
2324
DFSchema, Dependency, Diagnostic, Result, Span,
2425
};
25-
use datafusion_expr::expr::{ScalarFunction, Unnest, WildcardOptions};
26+
use datafusion_expr::expr::{FieldMetadata, ScalarFunction, Unnest, WildcardOptions};
2627
use datafusion_expr::planner::{PlannerResult, RawAggregateExpr, RawWindowExpr};
2728
use datafusion_expr::{
2829
expr, Expr, ExprFunctionExt, ExprSchemable, WindowFrame, WindowFunctionDefinition,
@@ -558,6 +559,22 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
558559
arg: FunctionArgExpr::Expr(arg),
559560
operator: _,
560561
} => self.sql_expr_to_logical_expr(arg, schema, planner_context),
562+
FunctionArg::ExprNamed {
563+
name: SQLExpr::Identifier(ident),
564+
arg: FunctionArgExpr::Expr(arg),
565+
operator: _,
566+
} => match self.sql_expr_to_logical_expr(arg, schema, planner_context) {
567+
Ok(Expr::Literal(scalar, meta)) => {
568+
let spice_metadata = FieldMetadata::new(BTreeMap::from([(
569+
"spice.parameter_name".to_string(),
570+
ident.value,
571+
)]));
572+
let mut meta = meta.unwrap_or(FieldMetadata::default());
573+
meta.extend(spice_metadata);
574+
Ok(Expr::Literal(scalar, Some(meta)))
575+
}
576+
other => other,
577+
},
561578
FunctionArg::Named {
562579
name: _,
563580
arg: FunctionArgExpr::Wildcard,

datafusion/sql/src/relation/mod.rs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
use std::collections::BTreeMap;
1819
use std::sync::Arc;
1920

2021
use crate::planner::{ContextProvider, PlannerContext, SqlToRel};
@@ -24,9 +25,12 @@ use datafusion_common::{
2425
not_impl_err, plan_err, DFSchema, Diagnostic, Result, Span, Spans, TableReference,
2526
};
2627
use datafusion_expr::builder::subquery_alias;
28+
use datafusion_expr::expr::FieldMetadata;
2729
use datafusion_expr::{expr::Unnest, Expr, LogicalPlan, LogicalPlanBuilder};
2830
use datafusion_expr::{Subquery, SubqueryAlias};
29-
use sqlparser::ast::{FunctionArg, FunctionArgExpr, Spanned, TableFactor};
31+
use sqlparser::ast::{
32+
Expr as SQLExpr, FunctionArg, FunctionArgExpr, Spanned, TableFactor,
33+
};
3034

3135
mod join;
3236

@@ -48,15 +52,36 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
4852
let args = func_args
4953
.args
5054
.into_iter()
51-
.flat_map(|arg| {
52-
if let FunctionArg::Unnamed(FunctionArgExpr::Expr(expr)) = arg
53-
{
54-
self.sql_expr_to_logical_expr(
55+
.flat_map(|arg| match arg {
56+
FunctionArg::Unnamed(FunctionArgExpr::Expr(expr)) => self
57+
.sql_expr_to_logical_expr(
5558
expr,
5659
&DFSchema::empty(),
5760
planner_context,
58-
)
59-
} else {
61+
),
62+
FunctionArg::ExprNamed {
63+
name: SQLExpr::Identifier(ident),
64+
arg: FunctionArgExpr::Expr(arg),
65+
operator: _,
66+
} => match self.sql_expr_to_logical_expr(
67+
arg,
68+
&DFSchema::empty(),
69+
planner_context,
70+
) {
71+
Ok(Expr::Literal(scalar, meta)) => {
72+
let spice_metadata =
73+
FieldMetadata::new(BTreeMap::from([(
74+
"spice.parameter_name".to_string(),
75+
ident.value,
76+
)]));
77+
let mut meta =
78+
meta.unwrap_or(FieldMetadata::default());
79+
meta.extend(spice_metadata);
80+
Ok(Expr::Literal(scalar, Some(meta)))
81+
}
82+
other => other,
83+
},
84+
_ => {
6085
plan_err!("Unsupported function argument type: {:?}", arg)
6186
}
6287
})

0 commit comments

Comments
 (0)