MCPcopy Create free account
hub / github.com/apache/datafusion / sql_substring_to_expr

Method sql_substring_to_expr

datafusion/sql/src/expr/substring.rs:26–86  ·  view source on GitHub ↗
(
        &self,
        expr: Box<SQLExpr>,
        substring_from: Option<Box<SQLExpr>>,
        substring_for: Option<Box<SQLExpr>>,
        schema: &DFSchema,
        planner_context: &mut Planner

Source from the content-addressed store, hash-verified

24
25impl<S: ContextProvider> SqlToRel<'_, S> {
26 pub(super) fn sql_substring_to_expr(
27 &self,
28 expr: Box<SQLExpr>,
29 substring_from: Option<Box<SQLExpr>>,
30 substring_for: Option<Box<SQLExpr>>,
31 schema: &DFSchema,
32 planner_context: &mut PlannerContext,
33 ) -> Result<Expr> {
34 let mut substring_args = match (substring_from, substring_for) {
35 (Some(from_expr), Some(for_expr)) => {
36 let arg =
37 self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
38 let from_logic =
39 self.sql_expr_to_logical_expr(*from_expr, schema, planner_context)?;
40 let for_logic =
41 self.sql_expr_to_logical_expr(*for_expr, schema, planner_context)?;
42 vec![arg, from_logic, for_logic]
43 }
44 (Some(from_expr), None) => {
45 let arg =
46 self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
47 let from_logic =
48 self.sql_expr_to_logical_expr(*from_expr, schema, planner_context)?;
49 vec![arg, from_logic]
50 }
51 (None, Some(for_expr)) => {
52 let arg =
53 self.sql_expr_to_logical_expr(*expr, schema, planner_context)?;
54 let from_logic = Expr::Literal(ScalarValue::Int64(Some(1)), None);
55 let for_logic =
56 self.sql_expr_to_logical_expr(*for_expr, schema, planner_context)?;
57 vec![arg, from_logic, for_logic]
58 }
59 (None, None) => {
60 let orig_sql = SQLExpr::Substring {
61 expr,
62 substring_from: None,
63 substring_for: None,
64 special: false,
65 shorthand: false,
66 };
67
68 return plan_err!("Substring without for/from is not valid {orig_sql:?}");
69 }
70 };
71
72 // Try to plan the substring expression using one of the registered planners
73 for planner in self.context_provider.get_expr_planners() {
74 match planner.plan_substring(substring_args)? {
75 PlannerResult::Planned(expr) => return Ok(expr),
76 PlannerResult::Original(args) => {
77 substring_args = args;
78 }
79 }
80 }
81
82 not_impl_err!(
83 "Substring could not be planned by registered expr planner. \

Callers 1

Calls 4

LiteralInterface · 0.50
get_expr_plannersMethod · 0.45
plan_substringMethod · 0.45

Tested by

no test coverage detected