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

Method set_expr_to_plan

datafusion/sql/src/set_expr.rs:29–92  ·  view source on GitHub ↗
(
        &self,
        set_expr: SetExpr,
        planner_context: &mut PlannerContext,
    )

Source from the content-addressed store, hash-verified

27impl<S: ContextProvider> SqlToRel<'_, S> {
28 #[cfg_attr(feature = "recursive_protection", recursive::recursive)]
29 pub(super) fn set_expr_to_plan(
30 &self,
31 set_expr: SetExpr,
32 planner_context: &mut PlannerContext,
33 ) -> Result<LogicalPlan> {
34 let set_expr_span = Span::try_from_sqlparser_span(set_expr.span());
35 match set_expr {
36 SetExpr::Select(s) => self.select_to_plan(*s, None, planner_context),
37 SetExpr::Values(v) => self.sql_values_to_plan(v, planner_context),
38 SetExpr::SetOperation {
39 op,
40 left,
41 right,
42 set_quantifier,
43 } => {
44 let left_span = Span::try_from_sqlparser_span(left.span());
45 let right_span = Span::try_from_sqlparser_span(right.span());
46 let left_plan = self.set_expr_to_plan(*left, planner_context);
47 // Store the left plan's schema so that the right side can
48 // alias duplicate expressions to match. Skip for BY NAME
49 // operations since those match columns by name, not position.
50 if let Ok(plan) = &left_plan
51 && plan.schema().fields().len() > 1
52 && !matches!(
53 set_quantifier,
54 SetQuantifier::ByName
55 | SetQuantifier::AllByName
56 | SetQuantifier::DistinctByName
57 )
58 {
59 planner_context
60 .set_set_expr_left_schema(Some(Arc::clone(plan.schema())));
61 }
62 let right_plan = self.set_expr_to_plan(*right, planner_context);
63 planner_context.set_set_expr_left_schema(None);
64 let (left_plan, right_plan) = match (left_plan, right_plan) {
65 (Ok(left_plan), Ok(right_plan)) => (left_plan, right_plan),
66 (Err(left_err), Err(right_err)) => {
67 return Err(DataFusionError::Collection(vec![
68 left_err, right_err,
69 ]));
70 }
71 (Err(err), _) | (_, Err(err)) => {
72 return Err(err);
73 }
74 };
75 if !(set_quantifier == SetQuantifier::ByName
76 || set_quantifier == SetQuantifier::AllByName)
77 {
78 self.validate_set_expr_num_of_columns(
79 op,
80 left_span,
81 right_span,
82 &left_plan,
83 &right_plan,
84 set_expr_span,
85 )?;
86 }

Callers 2

recursive_cteMethod · 0.80
query_to_planMethod · 0.80

Calls 10

spanMethod · 0.80
select_to_planMethod · 0.80
sql_values_to_planMethod · 0.80
set_operation_to_planMethod · 0.80
query_to_planMethod · 0.80
lenMethod · 0.45
fieldsMethod · 0.45
schemaMethod · 0.45

Tested by

no test coverage detected