This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 4402a1a9dd Move `overlay` planning to`ExprPlanner` (#11398)
4402a1a9dd is described below
commit 4402a1a9dd8ebec1640b2fa807781a2701407672
Author: Dharan Aditya <[email protected]>
AuthorDate: Thu Jul 11 21:52:06 2024 +0530
Move `overlay` planning to`ExprPlanner` (#11398)
* move overlay to expr planner
* typo
---
datafusion/expr/src/planner.rs | 7 +++++++
datafusion/functions/src/core/planner.rs | 6 ++++++
datafusion/functions/src/string/mod.rs | 1 -
datafusion/sql/src/expr/mod.rs | 28 ++++++++++++++--------------
4 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/datafusion/expr/src/planner.rs b/datafusion/expr/src/planner.rs
index aeb8ed8372..2f13923b1f 100644
--- a/datafusion/expr/src/planner.rs
+++ b/datafusion/expr/src/planner.rs
@@ -161,6 +161,13 @@ pub trait ExprPlanner: Send + Sync {
) -> Result<PlannerResult<Vec<Expr>>> {
Ok(PlannerResult::Original(args))
}
+
+ /// Plans an overlay expression eg `overlay(str PLACING substr FROM pos
[FOR count])`
+ ///
+ /// Returns origin expression arguments if not possible
+ fn plan_overlay(&self, args: Vec<Expr>) ->
Result<PlannerResult<Vec<Expr>>> {
+ Ok(PlannerResult::Original(args))
+ }
}
/// An operator with two arguments to plan
diff --git a/datafusion/functions/src/core/planner.rs
b/datafusion/functions/src/core/planner.rs
index 748b598d29..63eaa9874c 100644
--- a/datafusion/functions/src/core/planner.rs
+++ b/datafusion/functions/src/core/planner.rs
@@ -56,4 +56,10 @@ impl ExprPlanner for CoreFunctionPlanner {
),
)))
}
+
+ fn plan_overlay(&self, args: Vec<Expr>) ->
Result<PlannerResult<Vec<Expr>>> {
+ Ok(PlannerResult::Planned(Expr::ScalarFunction(
+ ScalarFunction::new_udf(crate::string::overlay(), args),
+ )))
+ }
}
diff --git a/datafusion/functions/src/string/mod.rs
b/datafusion/functions/src/string/mod.rs
index 5bf372c29f..9a19151a85 100644
--- a/datafusion/functions/src/string/mod.rs
+++ b/datafusion/functions/src/string/mod.rs
@@ -182,7 +182,6 @@ pub fn functions() -> Vec<Arc<ScalarUDF>> {
lower(),
ltrim(),
octet_length(),
- overlay(),
repeat(),
replace(),
rtrim(),
diff --git a/datafusion/sql/src/expr/mod.rs b/datafusion/sql/src/expr/mod.rs
index 859842e212..062ef805fd 100644
--- a/datafusion/sql/src/expr/mod.rs
+++ b/datafusion/sql/src/expr/mod.rs
@@ -193,7 +193,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
}
}
- not_impl_err!("Extract not supported by
UserDefinedExtensionPlanners: {extract_args:?}")
+ not_impl_err!("Extract not supported by ExprPlanner:
{extract_args:?}")
}
SQLExpr::Array(arr) => self.sql_array_literal(arr.elem, schema),
@@ -292,7 +292,9 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
}
}
- not_impl_err!("GetFieldAccess not supported by
UserDefinedExtensionPlanners: {field_access_expr:?}")
+ not_impl_err!(
+ "GetFieldAccess not supported by ExprPlanner:
{field_access_expr:?}"
+ )
}
SQLExpr::CompoundIdentifier(ids) => {
@@ -657,7 +659,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
PlannerResult::Original(args) => create_struct_args = args,
}
}
- not_impl_err!("Struct not supported by UserDefinedExtensionPlanners:
{create_struct_args:?}")
+ not_impl_err!("Struct not supported by ExprPlanner:
{create_struct_args:?}")
}
fn sql_position_to_expr(
@@ -680,9 +682,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
}
}
- not_impl_err!(
- "Position not supported by UserDefinedExtensionPlanners:
{position_args:?}"
- )
+ not_impl_err!("Position not supported by ExprPlanner:
{position_args:?}")
}
fn try_plan_dictionary_literal(
@@ -914,18 +914,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
schema: &DFSchema,
planner_context: &mut PlannerContext,
) -> Result<Expr> {
- let fun = self
- .context_provider
- .get_function_meta("overlay")
- .ok_or_else(|| {
- internal_datafusion_err!("Unable to find expected 'overlay'
function")
- })?;
let arg = self.sql_expr_to_logical_expr(expr, schema,
planner_context)?;
let what_arg =
self.sql_expr_to_logical_expr(overlay_what, schema,
planner_context)?;
let from_arg =
self.sql_expr_to_logical_expr(overlay_from, schema,
planner_context)?;
- let args = match overlay_for {
+ let mut overlay_args = match overlay_for {
Some(for_expr) => {
let for_expr =
self.sql_expr_to_logical_expr(*for_expr, schema,
planner_context)?;
@@ -933,7 +927,13 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
}
None => vec![arg, what_arg, from_arg],
};
- Ok(Expr::ScalarFunction(ScalarFunction::new_udf(fun, args)))
+ for planner in self.planners.iter() {
+ match planner.plan_overlay(overlay_args)? {
+ PlannerResult::Planned(expr) => return Ok(expr),
+ PlannerResult::Original(args) => overlay_args = args,
+ }
+ }
+ not_impl_err!("Overlay not supported by ExprPlanner: {overlay_args:?}")
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]