You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by al...@apache.org on 2023/01/02 15:09:14 UTC
[arrow-datafusion] branch master updated: Minor: Extract more functions out of parse_sql_expr (#4785)
This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/master by this push:
new 00a22cb1b Minor: Extract more functions out of parse_sql_expr (#4785)
00a22cb1b is described below
commit 00a22cb1bd83508cbf3231a996b1711308c64601
Author: Andrew Lamb <an...@nerdnetworks.org>
AuthorDate: Mon Jan 2 10:09:08 2023 -0500
Minor: Extract more functions out of parse_sql_expr (#4785)
---
datafusion/sql/src/planner.rs | 118 +++++++++++++++++++++++-------------------
1 file changed, 66 insertions(+), 52 deletions(-)
diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs
index 7b06790a8..4d1b2c310 100644
--- a/datafusion/sql/src/planner.rs
+++ b/datafusion/sql/src/planner.rs
@@ -2020,48 +2020,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
expr,
substring_from,
substring_for,
- } => {
- let args = match (substring_from, substring_for) {
- (Some(from_expr), Some(for_expr)) => {
- let arg = self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
- let from_logic =
- self.sql_expr_to_logical_expr(*from_expr, schema, planner_context)?;
- let for_logic =
- self.sql_expr_to_logical_expr(*for_expr, schema, planner_context)?;
- vec![arg, from_logic, for_logic]
- }
- (Some(from_expr), None) => {
- let arg = self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
- let from_logic =
- self.sql_expr_to_logical_expr(*from_expr, schema, planner_context)?;
- vec![arg, from_logic]
- }
- (None, Some(for_expr)) => {
- let arg = self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
- let from_logic = Expr::Literal(ScalarValue::Int64(Some(1)));
- let for_logic =
- self.sql_expr_to_logical_expr(*for_expr, schema, planner_context)?;
- vec![arg, from_logic, for_logic]
- }
- (None, None) => {
- let orig_sql = SQLExpr::Substring {
- expr,
- substring_from: None,
- substring_for: None,
- };
-
- return Err(DataFusionError::Plan(format!(
- "Substring without for/from is not valid {orig_sql:?}"
- )));
- }
- };
-
-
- Ok(Expr::ScalarFunction {
- fun: BuiltinScalarFunction::Substr,
- args,
- })
- }
+ } => self.sql_substring_to_expr(expr, substring_from, substring_for, schema, planner_context),
#[cfg(not(feature = "unicode_expressions"))]
SQLExpr::Substring {
@@ -2082,17 +2041,9 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
SQLExpr::Cube(exprs) => self.sql_cube_to_expr(exprs,schema, planner_context),
SQLExpr::GroupingSets(exprs) => self.sql_grouping_sets_to_expr(exprs, schema, planner_context),
- SQLExpr::Floor { expr, field: _field } => {
- let fun = BuiltinScalarFunction::Floor;
- let args = vec![self.sql_expr_to_logical_expr(*expr, schema, planner_context)?];
- Ok(Expr::ScalarFunction { fun, args })
- }
+ SQLExpr::Floor { expr, field: _field } => self.sql_named_function_to_expr(*expr, BuiltinScalarFunction::Floor, schema, planner_context),
- SQLExpr::Ceil { expr, field: _field } => {
- let fun = BuiltinScalarFunction::Ceil;
- let args = vec![self.sql_expr_to_logical_expr(*expr, schema, planner_context)?];
- Ok(Expr::ScalarFunction { fun, args })
- }
+ SQLExpr::Ceil { expr, field: _field } => self.sql_named_function_to_expr(*expr, BuiltinScalarFunction::Ceil, schema, planner_context),
SQLExpr::Nested(e) => self.sql_expr_to_logical_expr(*e, schema, planner_context),
@@ -2217,6 +2168,69 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
}
}
+ fn sql_named_function_to_expr(
+ &self,
+ expr: SQLExpr,
+ fun: BuiltinScalarFunction,
+ schema: &DFSchema,
+ planner_context: &mut PlannerContext,
+ ) -> Result<Expr> {
+ let args = vec![self.sql_expr_to_logical_expr(expr, schema, planner_context)?];
+ Ok(Expr::ScalarFunction { fun, args })
+ }
+
+ fn sql_substring_to_expr(
+ &self,
+ expr: Box<SQLExpr>,
+ substring_from: Option<Box<SQLExpr>>,
+ substring_for: Option<Box<SQLExpr>>,
+ schema: &DFSchema,
+ planner_context: &mut PlannerContext,
+ ) -> Result<Expr> {
+ let args = match (substring_from, substring_for) {
+ (Some(from_expr), Some(for_expr)) => {
+ let arg =
+ self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
+ let from_logic =
+ self.sql_expr_to_logical_expr(*from_expr, schema, planner_context)?;
+ let for_logic =
+ self.sql_expr_to_logical_expr(*for_expr, schema, planner_context)?;
+ vec![arg, from_logic, for_logic]
+ }
+ (Some(from_expr), None) => {
+ let arg =
+ self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
+ let from_logic =
+ self.sql_expr_to_logical_expr(*from_expr, schema, planner_context)?;
+ vec![arg, from_logic]
+ }
+ (None, Some(for_expr)) => {
+ let arg =
+ self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
+ let from_logic = Expr::Literal(ScalarValue::Int64(Some(1)));
+ let for_logic =
+ self.sql_expr_to_logical_expr(*for_expr, schema, planner_context)?;
+ vec![arg, from_logic, for_logic]
+ }
+ (None, None) => {
+ let orig_sql = SQLExpr::Substring {
+ expr,
+ substring_from: None,
+ substring_for: None,
+ };
+
+ return Err(DataFusionError::Plan(format!(
+ "Substring without for/from is not valid {orig_sql:?}"
+ )));
+ }
+ };
+
+ Ok(Expr::ScalarFunction {
+ fun: BuiltinScalarFunction::Substr,
+ args,
+ })
+ }
+
fn sql_in_list_to_expr(
&self,
expr: SQLExpr,