This is an automated email from the ASF dual-hosted git repository. jakevin pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push: new e77b93a513 refactor: encapsulate Alias as a struct (#6795) e77b93a513 is described below commit e77b93a513563241a4c0da42df4c8b4f67fc1285 Author: jakevin <jakevin...@gmail.com> AuthorDate: Fri Jun 30 15:49:03 2023 +0800 refactor: encapsulate Alias as a struct (#6795) --- datafusion/core/src/datasource/listing/helpers.rs | 2 +- datafusion/core/src/physical_planner.rs | 12 ++++---- datafusion/expr/src/expr.rs | 26 +++++++++++++---- datafusion/expr/src/expr_rewriter/mod.rs | 9 +++--- datafusion/expr/src/expr_rewriter/order_by.rs | 10 +++---- datafusion/expr/src/expr_schema.rs | 6 ++-- datafusion/expr/src/logical_plan/builder.rs | 5 ++-- datafusion/expr/src/logical_plan/plan.rs | 6 ++-- datafusion/expr/src/tree_node/expr.rs | 12 ++++---- datafusion/expr/src/utils.rs | 10 +++---- .../optimizer/src/analyzer/count_wildcard_rule.rs | 18 ++++++------ .../optimizer/src/common_subexpr_eliminate.rs | 3 +- datafusion/optimizer/src/decorrelate.rs | 9 +++--- datafusion/optimizer/src/push_down_filter.rs | 5 ++-- datafusion/optimizer/src/push_down_projection.rs | 4 +-- datafusion/optimizer/src/utils.rs | 10 ++++--- datafusion/physical-expr/src/planner.rs | 4 +-- datafusion/proto/src/logical_plan/from_proto.rs | 12 +++----- datafusion/proto/src/logical_plan/to_proto.rs | 6 ++-- datafusion/sql/src/select.rs | 4 +-- datafusion/sql/src/utils.rs | 33 +++++++++------------- datafusion/substrait/src/logical_plan/producer.rs | 6 ++-- 22 files changed, 114 insertions(+), 98 deletions(-) diff --git a/datafusion/core/src/datasource/listing/helpers.rs b/datafusion/core/src/datasource/listing/helpers.rs index efe1f7b59a..370bc43319 100644 --- a/datafusion/core/src/datasource/listing/helpers.rs +++ b/datafusion/core/src/datasource/listing/helpers.rs @@ -63,7 +63,7 @@ pub fn expr_applicable_for_cols(col_names: &[String], expr: &Expr) -> bool { } } Expr::Literal(_) - | Expr::Alias(_, _) + | Expr::Alias(_) | Expr::OuterReferenceColumn(_, _) | Expr::ScalarVariable(_, _) | Expr::Not(_) diff --git a/datafusion/core/src/physical_planner.rs b/datafusion/core/src/physical_planner.rs index da2f396e8e..a4aab95635 100644 --- a/datafusion/core/src/physical_planner.rs +++ b/datafusion/core/src/physical_planner.rs @@ -64,8 +64,8 @@ use arrow::datatypes::{Schema, SchemaRef}; use async_trait::async_trait; use datafusion_common::{DFSchema, ScalarValue}; use datafusion_expr::expr::{ - self, AggregateFunction, AggregateUDF, Between, BinaryExpr, Cast, GetIndexedField, - GroupingSet, InList, Like, ScalarUDF, TryCast, WindowFunction, + self, AggregateFunction, AggregateUDF, Alias, Between, BinaryExpr, Cast, + GetIndexedField, GroupingSet, InList, Like, ScalarUDF, TryCast, WindowFunction, }; use datafusion_expr::expr_rewriter::{unalias, unnormalize_cols}; use datafusion_expr::logical_plan::builder::wrap_projection_for_join_if_necessary; @@ -111,7 +111,7 @@ fn create_physical_name(e: &Expr, is_first_expr: bool) -> Result<String> { Ok(c.flat_name()) } } - Expr::Alias(_, name) => Ok(name.clone()), + Expr::Alias(Alias { name, .. }) => Ok(name.clone()), Expr::ScalarVariable(_, variable_names) => Ok(variable_names.join(".")), Expr::Literal(value) => Ok(format!("{value:?}")), Expr::BinaryExpr(BinaryExpr { left, op, right }) => { @@ -629,7 +629,7 @@ impl DefaultPhysicalPlanner { ref order_by, .. }) => generate_sort_key(partition_by, order_by), - Expr::Alias(expr, _) => { + Expr::Alias(Alias{expr,..}) => { // Convert &Box<T> to &T match &**expr { Expr::WindowFunction(WindowFunction{ @@ -1596,7 +1596,7 @@ pub fn create_window_expr( ) -> Result<Arc<dyn WindowExpr>> { // unpack aliased logical expressions, e.g. "sum(col) over () as total" let (name, e) = match e { - Expr::Alias(sub_expr, alias) => (alias.clone(), sub_expr.as_ref()), + Expr::Alias(Alias { expr, name, .. }) => (name.clone(), expr.as_ref()), _ => (physical_name(e)?, e), }; create_window_expr_with_name( @@ -1740,7 +1740,7 @@ pub fn create_aggregate_expr_and_maybe_filter( ) -> Result<AggregateExprWithOptionalArgs> { // unpack (nested) aliased logical expressions, e.g. "sum(col) as total" let (name, e) = match e { - Expr::Alias(sub_expr, alias) => (alias.clone(), sub_expr.as_ref()), + Expr::Alias(Alias { expr, name, .. }) => (name.clone(), expr.as_ref()), _ => (physical_name(e)?, e), }; diff --git a/datafusion/expr/src/expr.rs b/datafusion/expr/src/expr.rs index 9c3b53906a..9e1a0aae4c 100644 --- a/datafusion/expr/src/expr.rs +++ b/datafusion/expr/src/expr.rs @@ -82,7 +82,7 @@ use std::sync::Arc; #[derive(Clone, PartialEq, Eq, Hash, Debug)] pub enum Expr { /// An expression with a specific name. - Alias(Box<Expr>, String), + Alias(Alias), /// A named reference to a qualified filed in a schema. Column(Column), /// A named reference to a variable in a registry. @@ -180,6 +180,22 @@ pub enum Expr { OuterReferenceColumn(DataType, Column), } +/// Alias expression +#[derive(Clone, PartialEq, Eq, Hash, Debug)] +pub struct Alias { + pub expr: Box<Expr>, + pub name: String, +} + +impl Alias { + pub fn new(expr: Expr, name: impl Into<String>) -> Self { + Self { + expr: Box::new(expr), + name: name.into(), + } + } +} + /// Binary expression #[derive(Clone, PartialEq, Eq, Hash, Debug)] pub struct BinaryExpr { @@ -789,14 +805,14 @@ impl Expr { asc, nulls_first, }) => Expr::Sort(Sort::new(Box::new(expr.alias(name)), asc, nulls_first)), - _ => Expr::Alias(Box::new(self), name.into()), + _ => Expr::Alias(Alias::new(self, name.into())), } } /// Remove an alias from an expression if one exists. pub fn unalias(self) -> Expr { match self { - Expr::Alias(expr, _) => expr.as_ref().clone(), + Expr::Alias(alias) => alias.expr.as_ref().clone(), _ => self, } } @@ -914,7 +930,7 @@ macro_rules! expr_vec_fmt { impl fmt::Display for Expr { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { - Expr::Alias(expr, alias) => write!(f, "{expr} AS {alias}"), + Expr::Alias(Alias { expr, name, .. }) => write!(f, "{expr} AS {name}"), Expr::Column(c) => write!(f, "{c}"), Expr::OuterReferenceColumn(_, c) => write!(f, "outer_ref({c})"), Expr::ScalarVariable(_, var_names) => write!(f, "{}", var_names.join(".")), @@ -1180,7 +1196,7 @@ fn create_function_name(fun: &str, distinct: bool, args: &[Expr]) -> Result<Stri /// This function recursively transverses the expression for names such as "CAST(a > 2)". fn create_name(e: &Expr) -> Result<String> { match e { - Expr::Alias(_, name) => Ok(name.clone()), + Expr::Alias(Alias { name, .. }) => Ok(name.clone()), Expr::Column(c) => Ok(c.flat_name()), Expr::OuterReferenceColumn(_, c) => Ok(format!("outer_ref({})", c.flat_name())), Expr::ScalarVariable(_, variable_names) => Ok(variable_names.join(".")), diff --git a/datafusion/expr/src/expr_rewriter/mod.rs b/datafusion/expr/src/expr_rewriter/mod.rs index cbd336d934..acb8d23c0d 100644 --- a/datafusion/expr/src/expr_rewriter/mod.rs +++ b/datafusion/expr/src/expr_rewriter/mod.rs @@ -17,6 +17,7 @@ //! Expression rewriter +use crate::expr::Alias; use crate::logical_plan::Projection; use crate::{Expr, ExprSchemable, LogicalPlan, LogicalPlanBuilder}; use datafusion_common::tree_node::{Transformed, TreeNode, TreeNodeRewriter}; @@ -143,7 +144,7 @@ pub fn create_col_from_scalar_expr( subqry_alias: String, ) -> Result<Column> { match scalar_expr { - Expr::Alias(_, alias) => Ok(Column::new(Some(subqry_alias), alias)), + Expr::Alias(Alias { name, .. }) => Ok(Column::new(Some(subqry_alias), name)), Expr::Column(Column { relation: _, name }) => { Ok(Column::new(Some(subqry_alias), name)) } @@ -221,8 +222,8 @@ fn coerce_exprs_for_schema( let new_type = dst_schema.field(idx).data_type(); if new_type != &expr.get_type(src_schema)? { match expr { - Expr::Alias(e, alias) => { - Ok(e.cast_to(new_type, src_schema)?.alias(alias)) + Expr::Alias(Alias { expr, name, .. }) => { + Ok(expr.cast_to(new_type, src_schema)?.alias(name)) } _ => expr.cast_to(new_type, src_schema), } @@ -237,7 +238,7 @@ fn coerce_exprs_for_schema( #[inline] pub fn unalias(expr: Expr) -> Expr { match expr { - Expr::Alias(sub_expr, _) => unalias(*sub_expr), + Expr::Alias(Alias { expr, .. }) => unalias(*expr), _ => expr, } } diff --git a/datafusion/expr/src/expr_rewriter/order_by.rs b/datafusion/expr/src/expr_rewriter/order_by.rs index ce832d11fd..c87a724d56 100644 --- a/datafusion/expr/src/expr_rewriter/order_by.rs +++ b/datafusion/expr/src/expr_rewriter/order_by.rs @@ -17,7 +17,7 @@ //! Rewrite for order by expressions -use crate::expr::Sort; +use crate::expr::{Alias, Sort}; use crate::expr_rewriter::normalize_col; use crate::{Cast, Expr, ExprSchemable, LogicalPlan, TryCast}; use datafusion_common::tree_node::{Transformed, TreeNode}; @@ -137,12 +137,12 @@ fn rewrite_in_terms_of_projection( /// Does the underlying expr match e? /// so avg(c) as average will match avgc -fn expr_match(needle: &Expr, haystack: &Expr) -> bool { +fn expr_match(needle: &Expr, expr: &Expr) -> bool { // check inside aliases - if let Expr::Alias(haystack, _) = &haystack { - haystack.as_ref() == needle + if let Expr::Alias(Alias { expr, .. }) = &expr { + expr.as_ref() == needle } else { - haystack == needle + expr == needle } } diff --git a/datafusion/expr/src/expr_schema.rs b/datafusion/expr/src/expr_schema.rs index 5c57a8acef..83ccc8c596 100644 --- a/datafusion/expr/src/expr_schema.rs +++ b/datafusion/expr/src/expr_schema.rs @@ -17,7 +17,7 @@ use super::{Between, Expr, Like}; use crate::expr::{ - AggregateFunction, AggregateUDF, BinaryExpr, Cast, GetIndexedField, InList, + AggregateFunction, AggregateUDF, Alias, BinaryExpr, Cast, GetIndexedField, InList, InSubquery, Placeholder, ScalarFunction, ScalarUDF, Sort, TryCast, WindowFunction, }; use crate::field_util::get_indexed_field; @@ -58,7 +58,7 @@ impl ExprSchemable for Expr { /// (e.g. `[utf8] + [bool]`). fn get_type<S: ExprSchema>(&self, schema: &S) -> Result<DataType> { match self { - Expr::Alias(expr, name) => match &**expr { + Expr::Alias(Alias { expr, name, .. }) => match &**expr { Expr::Placeholder(Placeholder { data_type, .. }) => match &data_type { None => schema.data_type(&Column::from_name(name)).cloned(), Some(dt) => Ok(dt.clone()), @@ -170,7 +170,7 @@ impl ExprSchemable for Expr { /// column that does not exist in the schema. fn nullable<S: ExprSchema>(&self, input_schema: &S) -> Result<bool> { match self { - Expr::Alias(expr, _) + Expr::Alias(Alias { expr, .. }) | Expr::Not(expr) | Expr::Negative(expr) | Expr::Sort(Sort { expr, .. }) diff --git a/datafusion/expr/src/logical_plan/builder.rs b/datafusion/expr/src/logical_plan/builder.rs index 3d34c087ac..61d540049c 100644 --- a/datafusion/expr/src/logical_plan/builder.rs +++ b/datafusion/expr/src/logical_plan/builder.rs @@ -17,6 +17,7 @@ //! This module provides a builder for creating LogicalPlans +use crate::expr::Alias; use crate::expr_rewriter::{ coerce_plan_expr_for_schema, normalize_col, normalize_col_with_schemas_and_ambiguity_check, normalize_cols, @@ -476,7 +477,7 @@ impl LogicalPlanBuilder { // As described in https://github.com/apache/arrow-datafusion/issues/5293 let all_aliases = missing_exprs.iter().all(|e| { projection_exprs.iter().any(|proj_expr| { - if let Expr::Alias(expr, _) = proj_expr { + if let Expr::Alias(Alias { expr, .. }) = proj_expr { e == expr.as_ref() } else { false @@ -1131,7 +1132,7 @@ pub fn project_with_column_index( .into_iter() .enumerate() .map(|(i, e)| match e { - Expr::Alias(_, ref name) if name != schema.field(i).name() => { + Expr::Alias(Alias { ref name, .. }) if name != schema.field(i).name() => { e.unalias().alias(schema.field(i).name()) } Expr::Column(Column { diff --git a/datafusion/expr/src/logical_plan/plan.rs b/datafusion/expr/src/logical_plan/plan.rs index ab45047acf..cf94052252 100644 --- a/datafusion/expr/src/logical_plan/plan.rs +++ b/datafusion/expr/src/logical_plan/plan.rs @@ -17,7 +17,7 @@ //! Logical plan types -use crate::expr::{Exists, InSubquery, Placeholder}; +use crate::expr::{Alias, Exists, InSubquery, Placeholder}; use crate::expr_rewriter::create_col_from_scalar_expr; use crate::expr_vec_fmt; use crate::logical_plan::display::{GraphvizVisitor, IndentVisitor}; @@ -1370,10 +1370,10 @@ impl Filter { } // filter predicates should not be aliased - if let Expr::Alias(expr, alias) = predicate { + if let Expr::Alias(Alias { expr, name, .. }) = predicate { return Err(DataFusionError::Plan(format!( "Attempted to create Filter predicate with \ - expression `{expr}` aliased as '{alias}'. Filter predicates should not be \ + expression `{expr}` aliased as '{name}'. Filter predicates should not be \ aliased." ))); } diff --git a/datafusion/expr/src/tree_node/expr.rs b/datafusion/expr/src/tree_node/expr.rs index 3ecf54c9ce..095a0f4e27 100644 --- a/datafusion/expr/src/tree_node/expr.rs +++ b/datafusion/expr/src/tree_node/expr.rs @@ -18,9 +18,9 @@ //! Tree node implementation for logical expr use crate::expr::{ - AggregateFunction, AggregateUDF, Between, BinaryExpr, Case, Cast, GetIndexedField, - GroupingSet, InList, InSubquery, Like, Placeholder, ScalarFunction, ScalarUDF, Sort, - TryCast, WindowFunction, + AggregateFunction, AggregateUDF, Alias, Between, BinaryExpr, Case, Cast, + GetIndexedField, GroupingSet, InList, InSubquery, Like, Placeholder, ScalarFunction, + ScalarUDF, Sort, TryCast, WindowFunction, }; use crate::Expr; use datafusion_common::tree_node::VisitRecursion; @@ -32,7 +32,7 @@ impl TreeNode for Expr { F: FnMut(&Self) -> Result<VisitRecursion>, { let children = match self { - Expr::Alias(expr, _) + Expr::Alias(Alias{expr,..}) | Expr::Not(expr) | Expr::IsNotNull(expr) | Expr::IsTrue(expr) @@ -147,8 +147,8 @@ impl TreeNode for Expr { let mut transform = transform; Ok(match self { - Expr::Alias(expr, name) => { - Expr::Alias(transform_boxed(expr, &mut transform)?, name) + Expr::Alias(Alias { expr, name, .. }) => { + Expr::Alias(Alias::new(transform(*expr)?, name)) } Expr::Column(_) => self, Expr::OuterReferenceColumn(_, _) => self, diff --git a/datafusion/expr/src/utils.rs b/datafusion/expr/src/utils.rs index 2b6fc5793a..61b0db53fb 100644 --- a/datafusion/expr/src/utils.rs +++ b/datafusion/expr/src/utils.rs @@ -17,7 +17,7 @@ //! Expression utilities -use crate::expr::{Sort, WindowFunction}; +use crate::expr::{Alias, Sort, WindowFunction}; use crate::logical_plan::builder::build_join_schema; use crate::logical_plan::{ Aggregate, Analyze, Distinct, Extension, Filter, Join, Limit, Partitioning, Prepare, @@ -275,7 +275,7 @@ pub fn expr_to_columns(expr: &Expr, accum: &mut HashSet<Column>) -> Result<()> { // implementation, so that in the future if someone adds // new Expr types, they will check here as well Expr::ScalarVariable(_, _) - | Expr::Alias(_, _) + | Expr::Alias(_) | Expr::Literal(_) | Expr::BinaryExpr { .. } | Expr::Like { .. } @@ -781,7 +781,7 @@ pub fn from_plan( // subqueries could contain aliases so we don't recurse into those Ok(RewriteRecursion::Stop) } - Expr::Alias(_, _) => Ok(RewriteRecursion::Mutate), + Expr::Alias(_) => Ok(RewriteRecursion::Mutate), _ => Ok(RewriteRecursion::Continue), } } @@ -1103,8 +1103,8 @@ pub fn columnize_expr(e: Expr, input_schema: &DFSchema) -> Expr { match e { Expr::Column(_) => e, Expr::OuterReferenceColumn(_, _) => e, - Expr::Alias(inner_expr, name) => { - columnize_expr(*inner_expr, input_schema).alias(name) + Expr::Alias(Alias { expr, name, .. }) => { + columnize_expr(*expr, input_schema).alias(name) } Expr::Cast(Cast { expr, data_type }) => Expr::Cast(Cast { expr: Box::new(columnize_expr(*expr, input_schema)), diff --git a/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs b/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs index 51354cb666..f4a5147813 100644 --- a/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs +++ b/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs @@ -18,7 +18,7 @@ use datafusion_common::config::ConfigOptions; use datafusion_common::tree_node::{Transformed, TreeNode, TreeNodeRewriter}; use datafusion_common::{Column, DFField, DFSchema, DFSchemaRef, Result}; -use datafusion_expr::expr::{AggregateFunction, InSubquery}; +use datafusion_expr::expr::{AggregateFunction, Alias, InSubquery}; use datafusion_expr::utils::COUNT_STAR_EXPANSION; use datafusion_expr::Expr::ScalarSubquery; use datafusion_expr::{ @@ -132,13 +132,15 @@ impl TreeNodeRewriter for CountWildcardRewriter { fn mutate(&mut self, old_expr: Expr) -> Result<Expr> { let new_expr = match old_expr.clone() { - Expr::Alias(expr, alias) if alias.contains(COUNT_STAR) => Expr::Alias( - expr, - alias.replace( - COUNT_STAR, - count(lit(COUNT_STAR_EXPANSION)).to_string().as_str(), - ), - ), + Expr::Alias(Alias { expr, name, .. }) if name.contains(COUNT_STAR) => { + Expr::Alias(Alias::new( + *expr, + name.replace( + COUNT_STAR, + count(lit(COUNT_STAR_EXPANSION)).to_string().as_str(), + ), + )) + } Expr::Column(Column { name, relation }) if name.contains(COUNT_STAR) => { Expr::Column(Column { name: name.replace( diff --git a/datafusion/optimizer/src/common_subexpr_eliminate.rs b/datafusion/optimizer/src/common_subexpr_eliminate.rs index c0b47fbb02..74c4b1d36f 100644 --- a/datafusion/optimizer/src/common_subexpr_eliminate.rs +++ b/datafusion/optimizer/src/common_subexpr_eliminate.rs @@ -27,6 +27,7 @@ use datafusion_common::tree_node::{ use datafusion_common::{ Column, DFField, DFSchema, DFSchemaRef, DataFusionError, Result, }; +use datafusion_expr::expr::Alias; use datafusion_expr::{ col, logical_plan::{Aggregate, Filter, LogicalPlan, Projection, Sort, Window}, @@ -277,7 +278,7 @@ impl CommonSubexprEliminate { } for (expr_rewritten, expr_orig) in rewritten.into_iter().zip(new_aggr_expr) { if expr_rewritten == expr_orig { - if let Expr::Alias(expr, name) = expr_rewritten { + if let Expr::Alias(Alias { expr, name, .. }) = expr_rewritten { agg_exprs.push(expr.alias(&name)); proj_exprs.push(Expr::Column(Column::from_name(name))); } else { diff --git a/datafusion/optimizer/src/decorrelate.rs b/datafusion/optimizer/src/decorrelate.rs index fa96ede3c8..f335592eb3 100644 --- a/datafusion/optimizer/src/decorrelate.rs +++ b/datafusion/optimizer/src/decorrelate.rs @@ -24,6 +24,7 @@ use datafusion_common::tree_node::{ }; use datafusion_common::Result; use datafusion_common::{Column, DFSchemaRef, DataFusionError, ScalarValue}; +use datafusion_expr::expr::Alias; use datafusion_expr::{expr, EmptyRelation, Expr, LogicalPlan, LogicalPlanBuilder}; use datafusion_physical_expr::execution_props::ExecutionProps; use std::collections::{BTreeSet, HashMap}; @@ -228,10 +229,10 @@ impl TreeNodeRewriter for PullUpCorrelatedExpr { )?; if !expr_result_map_for_count_bug.is_empty() { // has count bug - let un_matched_row = Expr::Alias( - Box::new(Expr::Literal(ScalarValue::Boolean(Some(true)))), + let un_matched_row = Expr::Alias(Alias::new( + Expr::Literal(ScalarValue::Boolean(Some(true))), UN_MATCHED_ROW_INDICATOR.to_string(), - ); + )); // add the unmatched rows indicator to the Aggregation's group expressions missing_exprs.push(un_matched_row); } @@ -428,7 +429,7 @@ fn proj_exprs_evaluation_result_on_empty_batch( let simplifier = ExprSimplifier::new(info); let result_expr = simplifier.simplify(result_expr)?; let expr_name = match expr { - Expr::Alias(_, alias) => alias.to_string(), + Expr::Alias(Alias { name, .. }) => name.to_string(), Expr::Column(Column { relation: _, name }) => name.to_string(), _ => expr.display_name()?, }; diff --git a/datafusion/optimizer/src/push_down_filter.rs b/datafusion/optimizer/src/push_down_filter.rs index 6492b95f36..92fa2d895b 100644 --- a/datafusion/optimizer/src/push_down_filter.rs +++ b/datafusion/optimizer/src/push_down_filter.rs @@ -19,6 +19,7 @@ use crate::utils::{conjunction, split_conjunction}; use crate::{utils, OptimizerConfig, OptimizerRule}; use datafusion_common::tree_node::{Transformed, TreeNode, VisitRecursion}; use datafusion_common::{Column, DFSchema, DataFusionError, Result}; +use datafusion_expr::expr::Alias; use datafusion_expr::{ and, expr_rewriter::replace_col, @@ -164,7 +165,7 @@ fn can_evaluate_as_join_condition(predicate: &Expr) -> Result<bool> { is_evaluate = false; Ok(VisitRecursion::Stop) } - Expr::Alias(_, _) + Expr::Alias(_) | Expr::BinaryExpr(_) | Expr::Like(_) | Expr::ILike(_) @@ -668,7 +669,7 @@ impl OptimizerRule for PushDownFilter { .map(|(i, field)| { // strip alias, as they should not be part of filters let expr = match &projection.expr[i] { - Expr::Alias(expr, _) => expr.as_ref().clone(), + Expr::Alias(Alias { expr, .. }) => expr.as_ref().clone(), expr => expr.clone(), }; diff --git a/datafusion/optimizer/src/push_down_projection.rs b/datafusion/optimizer/src/push_down_projection.rs index 4773a944f4..eb9ae3c981 100644 --- a/datafusion/optimizer/src/push_down_projection.rs +++ b/datafusion/optimizer/src/push_down_projection.rs @@ -28,7 +28,7 @@ use datafusion_common::ScalarValue::UInt8; use datafusion_common::{ Column, DFField, DFSchema, DFSchemaRef, DataFusionError, Result, ToDFSchema, }; -use datafusion_expr::expr::AggregateFunction; +use datafusion_expr::expr::{AggregateFunction, Alias}; use datafusion_expr::utils::exprlist_to_fields; use datafusion_expr::{ logical_plan::{Aggregate, LogicalPlan, Projection, TableScan, Union}, @@ -414,7 +414,7 @@ pub fn collect_projection_expr(projection: &Projection) -> HashMap<String, Expr> .flat_map(|(i, field)| { // strip alias, as they should not be part of filters let expr = match &projection.expr[i] { - Expr::Alias(expr, _) => expr.as_ref().clone(), + Expr::Alias(Alias { expr, .. }) => expr.as_ref().clone(), expr => expr.clone(), }; diff --git a/datafusion/optimizer/src/utils.rs b/datafusion/optimizer/src/utils.rs index bdef56f61b..adb3bf6302 100644 --- a/datafusion/optimizer/src/utils.rs +++ b/datafusion/optimizer/src/utils.rs @@ -20,7 +20,7 @@ use crate::{OptimizerConfig, OptimizerRule}; use datafusion_common::{plan_err, Column, DFSchemaRef}; use datafusion_common::{DFSchema, Result}; -use datafusion_expr::expr::BinaryExpr; +use datafusion_expr::expr::{Alias, BinaryExpr}; use datafusion_expr::expr_rewriter::{replace_col, strip_outer_reference}; use datafusion_expr::{ and, @@ -74,7 +74,7 @@ fn split_conjunction_impl<'a>(expr: &'a Expr, mut exprs: Vec<&'a Expr>) -> Vec<& let exprs = split_conjunction_impl(left, exprs); split_conjunction_impl(right, exprs) } - Expr::Alias(expr, _) => split_conjunction_impl(expr, exprs), + Expr::Alias(Alias { expr, .. }) => split_conjunction_impl(expr, exprs), other => { exprs.push(other); exprs @@ -143,7 +143,9 @@ fn split_binary_owned_impl( let exprs = split_binary_owned_impl(*left, operator, exprs); split_binary_owned_impl(*right, operator, exprs) } - Expr::Alias(expr, _) => split_binary_owned_impl(*expr, operator, exprs), + Expr::Alias(Alias { expr, .. }) => { + split_binary_owned_impl(*expr, operator, exprs) + } other => { exprs.push(other); exprs @@ -168,7 +170,7 @@ fn split_binary_impl<'a>( let exprs = split_binary_impl(left, operator, exprs); split_binary_impl(right, operator, exprs) } - Expr::Alias(expr, _) => split_binary_impl(expr, operator, exprs), + Expr::Alias(Alias { expr, .. }) => split_binary_impl(expr, operator, exprs), other => { exprs.push(other); exprs diff --git a/datafusion/physical-expr/src/planner.rs b/datafusion/physical-expr/src/planner.rs index 40241a459e..d3eb6d1db9 100644 --- a/datafusion/physical-expr/src/planner.rs +++ b/datafusion/physical-expr/src/planner.rs @@ -27,7 +27,7 @@ use crate::{ }; use arrow::datatypes::{DataType, Schema}; use datafusion_common::{DFSchema, DataFusionError, Result, ScalarValue}; -use datafusion_expr::expr::{Cast, InList, ScalarFunction, ScalarUDF}; +use datafusion_expr::expr::{Alias, Cast, InList, ScalarFunction, ScalarUDF}; use datafusion_expr::{ binary_expr, Between, BinaryExpr, Expr, GetIndexedField, Like, Operator, TryCast, }; @@ -57,7 +57,7 @@ pub fn create_physical_expr( ))); } match e { - Expr::Alias(expr, ..) => Ok(create_physical_expr( + Expr::Alias(Alias { expr, .. }) => Ok(create_physical_expr( expr, input_dfschema, input_schema, diff --git a/datafusion/proto/src/logical_plan/from_proto.rs b/datafusion/proto/src/logical_plan/from_proto.rs index 5fabf17e32..785f18d07f 100644 --- a/datafusion/proto/src/logical_plan/from_proto.rs +++ b/datafusion/proto/src/logical_plan/from_proto.rs @@ -34,7 +34,7 @@ use datafusion_common::{ Column, DFField, DFSchema, DFSchemaRef, DataFusionError, OwnedTableReference, Result, ScalarValue, }; -use datafusion_expr::expr::Placeholder; +use datafusion_expr::expr::{Alias, Placeholder}; use datafusion_expr::{ abs, acos, acosh, array, array_append, array_concat, array_contains, array_dims, array_fill, array_length, array_ndims, array_position, array_positions, @@ -1014,14 +1014,10 @@ pub fn parse_expr( parse_vec_expr(&expr.order_by, registry)?, ))) } - ExprType::Alias(alias) => Ok(Expr::Alias( - Box::new(parse_required_expr( - alias.expr.as_deref(), - registry, - "expr", - )?), + ExprType::Alias(alias) => Ok(Expr::Alias(Alias::new( + parse_required_expr(alias.expr.as_deref(), registry, "expr")?, alias.alias.clone(), - )), + ))), ExprType::IsNullExpr(is_null) => Ok(Expr::IsNull(Box::new(parse_required_expr( is_null.expr.as_deref(), registry, diff --git a/datafusion/proto/src/logical_plan/to_proto.rs b/datafusion/proto/src/logical_plan/to_proto.rs index bf233c229f..c832faa5f7 100644 --- a/datafusion/proto/src/logical_plan/to_proto.rs +++ b/datafusion/proto/src/logical_plan/to_proto.rs @@ -36,7 +36,7 @@ use arrow::datatypes::{ }; use datafusion_common::{Column, DFField, DFSchemaRef, OwnedTableReference, ScalarValue}; use datafusion_expr::expr::{ - self, Between, BinaryExpr, Cast, GetIndexedField, GroupingSet, InList, Like, + self, Alias, Between, BinaryExpr, Cast, GetIndexedField, GroupingSet, InList, Like, Placeholder, ScalarFunction, ScalarUDF, Sort, }; use datafusion_expr::{ @@ -468,10 +468,10 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode { Expr::Column(c) => Self { expr_type: Some(ExprType::Column(c.into())), }, - Expr::Alias(expr, alias) => { + Expr::Alias(Alias { expr, name, .. }) => { let alias = Box::new(protobuf::AliasNode { expr: Some(Box::new(expr.as_ref().try_into()?)), - alias: alias.to_owned(), + alias: name.to_owned(), }); Self { expr_type: Some(ExprType::Alias(alias)), diff --git a/datafusion/sql/src/select.rs b/datafusion/sql/src/select.rs index f12830df42..7841858bac 100644 --- a/datafusion/sql/src/select.rs +++ b/datafusion/sql/src/select.rs @@ -29,11 +29,11 @@ use datafusion_expr::utils::{ expand_qualified_wildcard, expand_wildcard, expr_as_column_expr, expr_to_columns, find_aggregate_exprs, find_window_exprs, }; -use datafusion_expr::Expr::Alias; use datafusion_expr::{ Expr, Filter, GroupingSet, LogicalPlan, LogicalPlanBuilder, Partitioning, }; +use datafusion_expr::expr::Alias; use sqlparser::ast::{Distinct, Expr as SQLExpr, WildcardAdditionalOptions, WindowType}; use sqlparser::ast::{NamedWindowDefinition, Select, SelectItem, TableWithJoins}; use std::collections::HashSet; @@ -348,7 +348,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> { &[&[plan.schema()]], &plan.using_columns()?, )?; - let expr = Alias(Box::new(col), self.normalizer.normalize(alias)); + let expr = Expr::Alias(Alias::new(col, self.normalizer.normalize(alias))); Ok(vec![expr]) } SelectItem::Wildcard(options) => { diff --git a/datafusion/sql/src/utils.rs b/datafusion/sql/src/utils.rs index e37830d0ba..1cf4138773 100644 --- a/datafusion/sql/src/utils.rs +++ b/datafusion/sql/src/utils.rs @@ -22,7 +22,7 @@ use sqlparser::ast::Ident; use datafusion_common::{DataFusionError, Result, ScalarValue}; use datafusion_expr::expr::{ - AggregateFunction, AggregateUDF, Between, BinaryExpr, Case, GetIndexedField, + AggregateFunction, AggregateUDF, Alias, Between, BinaryExpr, Case, GetIndexedField, GroupingSet, InList, InSubquery, Like, Placeholder, ScalarFunction, ScalarUDF, WindowFunction, }; @@ -210,10 +210,10 @@ where filter.clone(), order_by.clone(), ))), - Expr::Alias(nested_expr, alias_name) => Ok(Expr::Alias( - Box::new(clone_with_replacement(nested_expr, replacement_fn)?), - alias_name.clone(), - )), + Expr::Alias(Alias { expr, name, .. }) => Ok(Expr::Alias(Alias::new( + clone_with_replacement(expr, replacement_fn)?, + name.clone(), + ))), Expr::Between(Between { expr, negated, @@ -430,9 +430,7 @@ pub(crate) fn extract_aliases(exprs: &[Expr]) -> HashMap<String, Expr> { exprs .iter() .filter_map(|expr| match expr { - Expr::Alias(nested_expr, alias_name) => { - Some((alias_name.clone(), *nested_expr.clone())) - } + Expr::Alias(Alias { expr, name, .. }) => Some((name.clone(), *expr.clone())), _ => None, }) .collect::<HashMap<String, Expr>>() @@ -454,7 +452,7 @@ pub(crate) fn resolve_positions_to_exprs( let index = (position - 1) as usize; let select_expr = &select_exprs[index]; Some(match select_expr { - Expr::Alias(nested_expr, _alias_name) => *nested_expr.clone(), + Expr::Alias(Alias { expr, .. }) => *expr.clone(), _ => select_expr.clone(), }) } @@ -487,17 +485,14 @@ pub fn window_expr_common_partition_keys(window_exprs: &[Expr]) -> Result<&[Expr .iter() .map(|expr| match expr { Expr::WindowFunction(WindowFunction { partition_by, .. }) => Ok(partition_by), - Expr::Alias(expr, _) => { - // convert &Box<T> to &T - match &**expr { - Expr::WindowFunction(WindowFunction { partition_by, .. }) => { - Ok(partition_by) - } - expr => Err(DataFusionError::Execution(format!( - "Impossibly got non-window expr {expr:?}" - ))), + Expr::Alias(Alias { expr, .. }) => match expr.as_ref() { + Expr::WindowFunction(WindowFunction { partition_by, .. }) => { + Ok(partition_by) } - } + expr => Err(DataFusionError::Execution(format!( + "Impossibly got non-window expr {expr:?}" + ))), + }, expr => Err(DataFusionError::Execution(format!( "Impossibly got non-window expr {expr:?}" ))), diff --git a/datafusion/substrait/src/logical_plan/producer.rs b/datafusion/substrait/src/logical_plan/producer.rs index c3d169aaab..6cc9eec75b 100644 --- a/datafusion/substrait/src/logical_plan/producer.rs +++ b/datafusion/substrait/src/logical_plan/producer.rs @@ -30,7 +30,7 @@ use datafusion::common::DFSchemaRef; #[allow(unused_imports)] use datafusion::logical_expr::aggregate_function; use datafusion::logical_expr::expr::{ - BinaryExpr, Case, Cast, InList, ScalarFunction as DFScalarFunction, Sort, + Alias, BinaryExpr, Case, Cast, InList, ScalarFunction as DFScalarFunction, Sort, WindowFunction, }; use datafusion::logical_expr::{expr, Between, JoinConstraint, LogicalPlan, Operator}; @@ -504,7 +504,7 @@ pub fn to_substrait_agg_measure( } }) } - Expr::Alias(expr, _name) => { + Expr::Alias(Alias{expr,..})=> { to_substrait_agg_measure(expr, schema, extension_info) } _ => Err(DataFusionError::Internal(format!( @@ -858,7 +858,7 @@ pub fn to_substrait_rex( }) } Expr::Literal(value) => to_substrait_literal(value), - Expr::Alias(expr, _alias) => { + Expr::Alias(Alias { expr, .. }) => { to_substrait_rex(expr, schema, col_ref_offset, extension_info) } Expr::WindowFunction(WindowFunction {