(
&self,
set_expr: SetExpr,
planner_context: &mut PlannerContext,
)
| 27 | impl<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 | } |
no test coverage detected