Generate a relational expression from a select SQL expression
(
&self,
sql: SelectItem,
plan: &LogicalPlan,
empty_from: bool,
planner_context: &mut PlannerContext,
)
| 805 | |
| 806 | /// Generate a relational expression from a select SQL expression |
| 807 | fn sql_select_to_rex( |
| 808 | &self, |
| 809 | sql: SelectItem, |
| 810 | plan: &LogicalPlan, |
| 811 | empty_from: bool, |
| 812 | planner_context: &mut PlannerContext, |
| 813 | ) -> Result<SelectExpr> { |
| 814 | match sql { |
| 815 | SelectItem::UnnamedExpr(expr) => { |
| 816 | let expr = self.sql_to_expr(expr, plan.schema(), planner_context)?; |
| 817 | let col = normalize_col_with_schemas_and_ambiguity_check( |
| 818 | expr, |
| 819 | &[&[plan.schema()]], |
| 820 | &plan.using_columns()?, |
| 821 | )?; |
| 822 | |
| 823 | Ok(SelectExpr::Expression(col)) |
| 824 | } |
| 825 | SelectItem::ExprWithAlias { expr, alias } => { |
| 826 | let select_expr = |
| 827 | self.sql_to_expr(expr, plan.schema(), planner_context)?; |
| 828 | let col = normalize_col_with_schemas_and_ambiguity_check( |
| 829 | select_expr, |
| 830 | &[&[plan.schema()]], |
| 831 | &plan.using_columns()?, |
| 832 | )?; |
| 833 | let name = self.ident_normalizer.normalize(alias); |
| 834 | // avoiding adding an alias if the column name is the same. |
| 835 | let expr = match &col { |
| 836 | Expr::Column(column) if column.name.eq(&name) => col, |
| 837 | _ => col.alias(name), |
| 838 | }; |
| 839 | |
| 840 | Ok(SelectExpr::Expression(expr)) |
| 841 | } |
| 842 | SelectItem::ExprWithAliases { .. } => { |
| 843 | not_impl_err!("SELECT item with multiple aliases is not supported") |
| 844 | } |
| 845 | SelectItem::Wildcard(options) => { |
| 846 | Self::check_wildcard_options(&options)?; |
| 847 | if empty_from { |
| 848 | return plan_err!("SELECT * with no tables specified is not valid"); |
| 849 | } |
| 850 | let planned_options = self.plan_wildcard_options( |
| 851 | plan, |
| 852 | empty_from, |
| 853 | planner_context, |
| 854 | options, |
| 855 | )?; |
| 856 | |
| 857 | Ok(SelectExpr::Wildcard(planned_options)) |
| 858 | } |
| 859 | SelectItem::QualifiedWildcard(object_name, options) => { |
| 860 | Self::check_wildcard_options(&options)?; |
| 861 | let object_name = match object_name { |
| 862 | SelectItemQualifiedWildcardKind::ObjectName(object_name) => { |
| 863 | object_name |
| 864 | } |
no test coverage detected