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

Method sql_select_to_rex

datafusion/sql/src/select.rs:807–882  ·  view source on GitHub ↗

Generate a relational expression from a select SQL expression

(
        &self,
        sql: SelectItem,
        plan: &LogicalPlan,
        empty_from: bool,
        planner_context: &mut PlannerContext,
    )

Source from the content-addressed store, hash-verified

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 }

Callers 2

prepare_select_exprsMethod · 0.80
plan_wildcard_optionsMethod · 0.80

Calls 10

WildcardClass · 0.85
using_columnsMethod · 0.80
plan_wildcard_optionsMethod · 0.80
sql_to_exprMethod · 0.45
schemaMethod · 0.45
normalizeMethod · 0.45
eqMethod · 0.45
aliasMethod · 0.45

Tested by

no test coverage detected