This is an automated email from the ASF dual-hosted git repository.

agrove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/master by this push:
     new b5c23c2c2 Refactor Expr::Cast to use a struct. (#3931)
b5c23c2c2 is described below

commit b5c23c2c29f0e8ffc0f7021c78274176cf2cacb0
Author: jakevin <[email protected]>
AuthorDate: Mon Oct 24 21:01:56 2022 +0800

    Refactor Expr::Cast to use a struct. (#3931)
    
    * Refactor Expr::Cast to use a struct.
    
    * fix
    
    * fix fmt
    
    * fix review
---
 benchmarks/src/bin/tpch.rs                         | 40 +++++++--------
 datafusion/core/src/physical_optimizer/pruning.rs  | 13 +++--
 datafusion/core/src/physical_plan/planner.rs       | 51 ++++++++++---------
 datafusion/core/tests/provider_filter_pushdown.rs  | 10 ++--
 datafusion/expr/src/expr.rs                        | 32 ++++++++----
 datafusion/expr/src/expr_fn.rs                     |  7 +--
 datafusion/expr/src/expr_rewriter.rs               | 11 ++--
 datafusion/expr/src/expr_schema.rs                 | 11 ++--
 datafusion/expr/src/expr_visitor.rs                |  3 +-
 datafusion/optimizer/src/projection_push_down.rs   | 16 +++---
 datafusion/optimizer/src/reduce_outer_join.rs      | 18 +++----
 datafusion/optimizer/src/simplify_expressions.rs   | 27 ++++------
 .../optimizer/src/unwrap_cast_in_comparison.rs     | 10 ++--
 datafusion/optimizer/src/utils.rs                  | 18 ++-----
 datafusion/physical-expr/src/planner.rs            |  3 +-
 datafusion/proto/src/from_proto.rs                 |  4 +-
 datafusion/proto/src/lib.rs                        |  7 +--
 datafusion/proto/src/to_proto.rs                   | 59 +++++++++++-----------
 datafusion/sql/src/planner.rs                      | 57 +++++++++++----------
 datafusion/sql/src/utils.rs                        | 12 ++---
 20 files changed, 200 insertions(+), 209 deletions(-)

diff --git a/benchmarks/src/bin/tpch.rs b/benchmarks/src/bin/tpch.rs
index b2f2bf181..7a914b19b 100644
--- a/benchmarks/src/bin/tpch.rs
+++ b/benchmarks/src/bin/tpch.rs
@@ -614,8 +614,8 @@ mod tests {
 
     use datafusion::arrow::array::*;
     use datafusion::arrow::util::display::array_value_to_string;
+    use datafusion::logical_expr::expr::Cast;
     use datafusion::logical_expr::Expr;
-    use datafusion::logical_expr::Expr::Cast;
     use datafusion::logical_expr::Expr::ScalarFunction;
     use datafusion::sql::TableReference;
 
@@ -798,9 +798,9 @@ mod tests {
             let path = Path::new(&path);
             if let Ok(expected) = read_text_file(path) {
                 assert_eq!(expected, actual,
-                           // generate output that is easier to 
copy/paste/update
-                           "\n\nMismatch of expected content in: 
{:?}\nExpected:\n\n{}\n\nActual:\n\n{}\n\n",
-                           path, expected, actual);
+                    // generate output that is easier to copy/paste/update
+                    "\n\nMismatch of expected content in: 
{:?}\nExpected:\n\n{}\n\nActual:\n\n{}\n\n",
+                    path, expected, actual);
                 found = true;
                 break;
             }
@@ -1264,10 +1264,10 @@ mod tests {
                                     args: 
vec![col(Field::name(field)).mul(lit(100))],
                                 }.div(lit(100)));
                                 Expr::Alias(
-                                    Box::new(Cast {
-                                        expr: round,
-                                        data_type: DataType::Decimal128(38, 2),
-                                    }),
+                                    Box::new(Expr::Cast(Cast::new(
+                                        round,
+                                        DataType::Decimal128(38, 2),
+                                    ))),
                                     Field::name(field).to_string(),
                                 )
                             }
@@ -1343,23 +1343,23 @@ mod tests {
                             DataType::Decimal128(_, _) => {
                                 // there's no support for casting from Utf8 to 
Decimal, so
                                 // we'll cast from Utf8 to Float64 to Decimal 
for Decimal types
-                                let inner_cast = Box::new(Cast {
-                                    expr: 
Box::new(trim(col(Field::name(field)))),
-                                    data_type: DataType::Float64,
-                                });
+                                let inner_cast = Box::new(Expr::Cast(Cast::new(
+                                    Box::new(trim(col(Field::name(field)))),
+                                    DataType::Float64,
+                                )));
                                 Expr::Alias(
-                                    Box::new(Cast {
-                                        expr: inner_cast,
-                                        data_type: 
Field::data_type(field).to_owned(),
-                                    }),
+                                    Box::new(Expr::Cast(Cast::new(
+                                        inner_cast,
+                                        Field::data_type(field).to_owned(),
+                                    ))),
                                     Field::name(field).to_string(),
                                 )
                             }
                             _ => Expr::Alias(
-                                Box::new(Cast {
-                                    expr: 
Box::new(trim(col(Field::name(field)))),
-                                    data_type: 
Field::data_type(field).to_owned(),
-                                }),
+                                Box::new(Expr::Cast(Cast::new(
+                                    Box::new(trim(col(Field::name(field)))),
+                                    Field::data_type(field).to_owned(),
+                                ))),
                                 Field::name(field).to_string(),
                             ),
                         }
diff --git a/datafusion/core/src/physical_optimizer/pruning.rs 
b/datafusion/core/src/physical_optimizer/pruning.rs
index 0b309412c..59ecdaba3 100644
--- a/datafusion/core/src/physical_optimizer/pruning.rs
+++ b/datafusion/core/src/physical_optimizer/pruning.rs
@@ -46,7 +46,7 @@ use arrow::{
     record_batch::RecordBatch,
 };
 use datafusion_common::{downcast_value, ScalarValue};
-use datafusion_expr::expr::BinaryExpr;
+use datafusion_expr::expr::{BinaryExpr, Cast};
 use datafusion_expr::expr_rewriter::{ExprRewritable, ExprRewriter};
 use datafusion_expr::utils::expr_to_columns;
 use datafusion_expr::{binary_expr, cast, try_cast, ExprSchemable};
@@ -190,11 +190,10 @@ impl PruningPredicate {
                 let predicate_array = downcast_value!(array, BooleanArray);
 
                 Ok(predicate_array
-                   .into_iter()
-                   .map(|x| x.unwrap_or(true)) // None -> true per comments 
above
-                   .collect::<Vec<_>>())
-
-            },
+                    .into_iter()
+                    .map(|x| x.unwrap_or(true)) // None -> true per comments 
above
+                    .collect::<Vec<_>>())
+            }
             // result was a column
             ColumnarValue::Scalar(ScalarValue::Boolean(v)) => {
                 let v = v.unwrap_or(true); // None -> true per comments above
@@ -530,7 +529,7 @@ fn rewrite_expr_to_prunable(
         // `col op lit()`
         Expr::Column(_) => Ok((column_expr.clone(), op, scalar_expr.clone())),
         // `cast(col) op lit()`
-        Expr::Cast { expr, data_type } => {
+        Expr::Cast(Cast { expr, data_type }) => {
             let from_type = expr.get_type(&schema)?;
             verify_support_type_for_prune(&from_type, data_type)?;
             let (left, op, right) =
diff --git a/datafusion/core/src/physical_plan/planner.rs 
b/datafusion/core/src/physical_plan/planner.rs
index 1995a6196..4a8399af9 100644
--- a/datafusion/core/src/physical_plan/planner.rs
+++ b/datafusion/core/src/physical_plan/planner.rs
@@ -59,7 +59,9 @@ use arrow::compute::SortOptions;
 use arrow::datatypes::{Schema, SchemaRef};
 use async_trait::async_trait;
 use datafusion_common::{DFSchema, ScalarValue};
-use datafusion_expr::expr::{Between, BinaryExpr, GetIndexedField, GroupingSet, 
Like};
+use datafusion_expr::expr::{
+    Between, BinaryExpr, Cast, GetIndexedField, GroupingSet, Like,
+};
 use datafusion_expr::expr_rewriter::unnormalize_cols;
 use datafusion_expr::utils::{expand_wildcard, expr_to_columns};
 use datafusion_expr::WindowFrameUnits;
@@ -126,7 +128,7 @@ fn create_physical_name(e: &Expr, is_first_expr: bool) -> 
Result<String> {
             name += "END";
             Ok(name)
         }
-        Expr::Cast { expr, .. } => {
+        Expr::Cast(Cast { expr, .. }) => {
             // CAST does not change the expression name
             create_physical_name(expr, false)
         }
@@ -462,7 +464,7 @@ impl DefaultPhysicalPlanner {
     ) -> BoxFuture<'a, Result<Arc<dyn ExecutionPlan>>> {
         async move {
             let exec_plan: Result<Arc<dyn ExecutionPlan>> = match logical_plan 
{
-                LogicalPlan::TableScan (TableScan {
+                LogicalPlan::TableScan(TableScan {
                     source,
                     projection,
                     filters,
@@ -484,7 +486,7 @@ impl DefaultPhysicalPlanner {
                     let exec_schema = schema.as_ref().to_owned().into();
                     let exprs = values.iter()
                         .map(|row| {
-                            row.iter().map(|expr|{
+                            row.iter().map(|expr| {
                                 self.create_physical_expr(
                                     expr,
                                     schema,
@@ -497,7 +499,7 @@ impl DefaultPhysicalPlanner {
                         .collect::<Result<Vec<_>>>()?;
                     let value_exec = ValuesExec::try_new(
                         SchemaRef::new(exec_schema),
-                        exprs
+                        exprs,
                     )?;
                     Ok(Arc::new(value_exec))
                 }
@@ -612,7 +614,7 @@ impl DefaultPhysicalPlanner {
                         window_expr,
                         input_exec,
                         physical_input_schema,
-                    )?) )
+                    )?))
                 }
                 LogicalPlan::Aggregate(Aggregate {
                     input,
@@ -692,16 +694,16 @@ impl DefaultPhysicalPlanner {
                         aggregates,
                         initial_aggr,
                         physical_input_schema.clone(),
-                    )?) )
+                    )?))
                 }
-                LogicalPlan::Distinct(Distinct {input}) => {
+                LogicalPlan::Distinct(Distinct { input }) => {
                     // Convert distinct to groupby with no aggregations
                     let group_expr = expand_wildcard(input.schema(), input)?;
-                    let aggregate =  
LogicalPlan::Aggregate(Aggregate::try_new_with_schema(
-                            input.clone(),
-                            group_expr,
-                            vec![],
-                        input.schema().clone() // input schema and aggregate 
schema are the same in this case
+                    let aggregate = 
LogicalPlan::Aggregate(Aggregate::try_new_with_schema(
+                        input.clone(),
+                        group_expr,
+                        vec![],
+                        input.schema().clone(), // input schema and aggregate 
schema are the same in this case
                     )?);
                     Ok(self.create_initial_plan(&aggregate, 
session_state).await?)
                 }
@@ -755,7 +757,7 @@ impl DefaultPhysicalPlanner {
                     Ok(Arc::new(ProjectionExec::try_new(
                         physical_exprs,
                         input_exec,
-                    )?) )
+                    )?))
                 }
                 LogicalPlan::Filter(filter) => {
                     let physical_input = 
self.create_initial_plan(filter.input(), session_state).await?;
@@ -768,14 +770,14 @@ impl DefaultPhysicalPlanner {
                         &input_schema,
                         session_state,
                     )?;
-                    Ok(Arc::new(FilterExec::try_new(runtime_expr, 
physical_input)?) )
+                    Ok(Arc::new(FilterExec::try_new(runtime_expr, 
physical_input)?))
                 }
                 LogicalPlan::Union(Union { inputs, .. }) => {
                     let physical_plans = futures::stream::iter(inputs)
                         .then(|lp| self.create_initial_plan(lp, session_state))
                         .try_collect::<Vec<_>>()
                         .await?;
-                    Ok(Arc::new(UnionExec::new(physical_plans)) )
+                    Ok(Arc::new(UnionExec::new(physical_plans)))
                 }
                 LogicalPlan::Repartition(Repartition {
                     input,
@@ -803,13 +805,13 @@ impl DefaultPhysicalPlanner {
                             Partitioning::Hash(runtime_expr, *n)
                         }
                         LogicalPartitioning::DistributeBy(_) => {
-                            return 
Err(DataFusionError::NotImplemented("Physical plan does not support 
DistributeBy partitioning".to_string()))
+                            return 
Err(DataFusionError::NotImplemented("Physical plan does not support 
DistributeBy partitioning".to_string()));
                         }
                     };
                     Ok(Arc::new(RepartitionExec::try_new(
                         physical_input,
                         physical_partitioning,
-                    )?) )
+                    )?))
                 }
                 LogicalPlan::Sort(Sort { expr, input, fetch, .. }) => {
                     let physical_input = self.create_initial_plan(input, 
session_state).await?;
@@ -852,7 +854,8 @@ impl DefaultPhysicalPlanner {
                         Arc::new(merge)
                     } else {
                         Arc::new(SortExec::try_new(sort_expr, physical_input, 
*fetch)?)
-                    })                }
+                    })
+                }
                 LogicalPlan::Join(Join {
                     left,
                     right,
@@ -922,14 +925,14 @@ impl DefaultPhysicalPlanner {
                                 expr,
                                 &filter_df_schema,
                                 &filter_schema,
-                                &session_state.execution_props
+                                &session_state.execution_props,
                             )?;
                             let column_indices = 
join_utils::JoinFilter::build_column_indices(left_field_indices, 
right_field_indices);
 
                             Some(join_utils::JoinFilter::new(
                                 filter_expr,
                                 column_indices,
-                                filter_schema
+                                filter_schema,
                             ))
                         }
                         _ => None
@@ -995,7 +998,7 @@ impl DefaultPhysicalPlanner {
                     *produce_one_row,
                     SchemaRef::new(schema.as_ref().to_owned().into()),
                 ))),
-                LogicalPlan::SubqueryAlias(SubqueryAlias { input,.. }) => {
+                LogicalPlan::SubqueryAlias(SubqueryAlias { input, .. }) => {
                     match input.as_ref() {
                         LogicalPlan::TableScan(..) => {
                             self.create_initial_plan(input, 
session_state).await
@@ -1003,7 +1006,7 @@ impl DefaultPhysicalPlanner {
                         _ => Err(DataFusionError::Plan("SubqueryAlias should 
only wrap TableScan".to_string()))
                     }
                 }
-                LogicalPlan::Limit(Limit { input, skip, fetch,.. }) => {
+                LogicalPlan::Limit(Limit { input, skip, fetch, .. }) => {
                     let input = self.create_initial_plan(input, 
session_state).await?;
 
                     // GlobalLimitExec requires a single partition for input
@@ -1055,7 +1058,7 @@ impl DefaultPhysicalPlanner {
                         SchemaRef::new(Schema::empty()),
                     )))
                 }
-                LogicalPlan::Explain (_) => Err(DataFusionError::Internal(
+                LogicalPlan::Explain(_) => Err(DataFusionError::Internal(
                     "Unsupported logical plan: Explain must be root of the 
plan".to_string(),
                 )),
                 LogicalPlan::Analyze(a) => {
diff --git a/datafusion/core/tests/provider_filter_pushdown.rs 
b/datafusion/core/tests/provider_filter_pushdown.rs
index 672f7ee1a..c1aa5ad70 100644
--- a/datafusion/core/tests/provider_filter_pushdown.rs
+++ b/datafusion/core/tests/provider_filter_pushdown.rs
@@ -32,7 +32,7 @@ use datafusion::physical_plan::{
 use datafusion::prelude::*;
 use datafusion::scalar::ScalarValue;
 use datafusion_common::DataFusionError;
-use datafusion_expr::expr::BinaryExpr;
+use datafusion_expr::expr::{BinaryExpr, Cast};
 use std::ops::Deref;
 use std::sync::Arc;
 
@@ -153,7 +153,7 @@ impl TableProvider for CustomProvider {
                     Expr::Literal(ScalarValue::Int16(Some(i))) => *i as i64,
                     Expr::Literal(ScalarValue::Int32(Some(i))) => *i as i64,
                     Expr::Literal(ScalarValue::Int64(Some(i))) => *i as i64,
-                    Expr::Cast { expr, data_type: _ } => match expr.deref() {
+                    Expr::Cast(Cast { expr, data_type: _ }) => match 
expr.deref() {
                         Expr::Literal(lit_value) => match lit_value {
                             ScalarValue::Int8(Some(v)) => *v as i64,
                             ScalarValue::Int16(Some(v)) => *v as i64,
@@ -163,21 +163,21 @@ impl TableProvider for CustomProvider {
                                 return 
Err(DataFusionError::NotImplemented(format!(
                                     "Do not support value {:?}",
                                     other_value
-                                )))
+                                )));
                             }
                         },
                         other_expr => {
                             return Err(DataFusionError::NotImplemented(format!(
                                 "Do not support expr {:?}",
                                 other_expr
-                            )))
+                            )));
                         }
                     },
                     other_expr => {
                         return Err(DataFusionError::NotImplemented(format!(
                             "Do not support expr {:?}",
                             other_expr
-                        )))
+                        )));
                     }
                 };
 
diff --git a/datafusion/expr/src/expr.rs b/datafusion/expr/src/expr.rs
index 1d11245c3..0108f92d3 100644
--- a/datafusion/expr/src/expr.rs
+++ b/datafusion/expr/src/expr.rs
@@ -143,12 +143,7 @@ pub enum Expr {
     Case(Case),
     /// Casts the expression to a given type and will return a runtime error 
if the expression cannot be cast.
     /// This expression is guaranteed to have a fixed type.
-    Cast {
-        /// The expression being cast
-        expr: Box<Expr>,
-        /// The `DataType` the expression will yield
-        data_type: DataType,
-    },
+    Cast(Cast),
     /// Casts the expression to a given type and will return a null value if 
the expression cannot be cast.
     /// This expression is guaranteed to have a fixed type.
     TryCast {
@@ -360,6 +355,22 @@ impl GetIndexedField {
     }
 }
 
+/// Cast expression
+#[derive(Clone, PartialEq, Eq, Hash)]
+pub struct Cast {
+    /// The expression being cast
+    pub expr: Box<Expr>,
+    /// The `DataType` the expression will yield
+    pub data_type: DataType,
+}
+
+impl Cast {
+    /// Create a new Cast expression
+    pub fn new(expr: Box<Expr>, data_type: DataType) -> Self {
+        Self { expr, data_type }
+    }
+}
+
 /// Grouping sets
 /// See 
https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-GROUPING-SETS
 /// for Postgres definition.
@@ -682,7 +693,7 @@ impl fmt::Debug for Expr {
                 }
                 write!(f, "END")
             }
-            Expr::Cast { expr, data_type } => {
+            Expr::Cast(Cast { expr, data_type }) => {
                 write!(f, "CAST({:?} AS {:?})", expr, data_type)
             }
             Expr::TryCast { expr, data_type } => {
@@ -1038,7 +1049,7 @@ fn create_name(e: &Expr) -> Result<String> {
             name += "END";
             Ok(name)
         }
-        Expr::Cast { expr, .. } => {
+        Expr::Cast(Cast { expr, .. }) => {
             // CAST does not change the expression name
             create_name(expr)
         }
@@ -1212,6 +1223,7 @@ fn create_names(exprs: &[Expr]) -> Result<String> {
 
 #[cfg(test)]
 mod test {
+    use crate::expr::Cast;
     use crate::expr_fn::col;
     use crate::{case, lit, Expr};
     use arrow::datatypes::DataType;
@@ -1233,10 +1245,10 @@ mod test {
 
     #[test]
     fn format_cast() -> Result<()> {
-        let expr = Expr::Cast {
+        let expr = Expr::Cast(Cast {
             expr: Box::new(Expr::Literal(ScalarValue::Float32(Some(1.23)))),
             data_type: DataType::Utf8,
-        };
+        });
         let expected_canonical = "CAST(Float32(1.23) AS Utf8)";
         assert_eq!(expected_canonical, expr.canonical_name());
         assert_eq!(expected_canonical, format!("{}", expr));
diff --git a/datafusion/expr/src/expr_fn.rs b/datafusion/expr/src/expr_fn.rs
index 9d8b05f2b..0685ec835 100644
--- a/datafusion/expr/src/expr_fn.rs
+++ b/datafusion/expr/src/expr_fn.rs
@@ -17,7 +17,7 @@
 
 //! Functions for creating logical expressions
 
-use crate::expr::{BinaryExpr, GroupingSet};
+use crate::expr::{BinaryExpr, Cast, GroupingSet};
 use crate::{
     aggregate_function, built_in_function, 
conditional_expressions::CaseBuilder,
     logical_plan::Subquery, AccumulatorFunctionImplementation, AggregateUDF,
@@ -259,10 +259,7 @@ pub fn rollup(exprs: Vec<Expr>) -> Expr {
 
 /// Create a cast expression
 pub fn cast(expr: Expr, data_type: DataType) -> Expr {
-    Expr::Cast {
-        expr: Box::new(expr),
-        data_type,
-    }
+    Expr::Cast(Cast::new(Box::new(expr), data_type))
 }
 
 /// Create a try cast expression
diff --git a/datafusion/expr/src/expr_rewriter.rs 
b/datafusion/expr/src/expr_rewriter.rs
index 89cadc5ee..8ac645617 100644
--- a/datafusion/expr/src/expr_rewriter.rs
+++ b/datafusion/expr/src/expr_rewriter.rs
@@ -17,7 +17,7 @@
 
 //! Expression rewriter
 
-use crate::expr::{Between, BinaryExpr, Case, GetIndexedField, GroupingSet, 
Like};
+use crate::expr::{Between, BinaryExpr, Case, Cast, GetIndexedField, 
GroupingSet, Like};
 use crate::logical_plan::{Aggregate, Projection};
 use crate::utils::{from_plan, grouping_set_to_exprlist};
 use crate::{Expr, ExprSchemable, LogicalPlan};
@@ -203,10 +203,9 @@ impl ExprRewritable for Expr {
 
                 Expr::Case(Case::new(expr, when_then_expr, else_expr))
             }
-            Expr::Cast { expr, data_type } => Expr::Cast {
-                expr: rewrite_boxed(expr, rewriter)?,
-                data_type,
-            },
+            Expr::Cast(Cast { expr, data_type }) => {
+                Expr::Cast(Cast::new(rewrite_boxed(expr, rewriter)?, 
data_type))
+            }
             Expr::TryCast { expr, data_type } => Expr::TryCast {
                 expr: rewrite_boxed(expr, rewriter)?,
                 data_type,
@@ -566,6 +565,7 @@ mod test {
     struct RecordingRewriter {
         v: Vec<String>,
     }
+
     impl ExprRewriter for RecordingRewriter {
         fn mutate(&mut self, expr: Expr) -> Result<Expr> {
             self.v.push(format!("Mutated {:?}", expr));
@@ -593,6 +593,7 @@ mod test {
 
     /// rewrites all "foo" string literals to "bar"
     struct FooBarRewriter {}
+
     impl ExprRewriter for FooBarRewriter {
         fn mutate(&mut self, expr: Expr) -> Result<Expr> {
             match expr {
diff --git a/datafusion/expr/src/expr_schema.rs 
b/datafusion/expr/src/expr_schema.rs
index e19f6a9fc..8424fa2aa 100644
--- a/datafusion/expr/src/expr_schema.rs
+++ b/datafusion/expr/src/expr_schema.rs
@@ -16,7 +16,7 @@
 // under the License.
 
 use super::{Between, Expr, Like};
-use crate::expr::{BinaryExpr, GetIndexedField};
+use crate::expr::{BinaryExpr, Cast, GetIndexedField};
 use crate::field_util::get_indexed_field;
 use crate::type_coercion::binary::binary_operator_data_type;
 use crate::{aggregate_function, function, window_function};
@@ -61,7 +61,7 @@ impl ExprSchemable for Expr {
             Expr::ScalarVariable(ty, _) => Ok(ty.clone()),
             Expr::Literal(l) => Ok(l.get_datatype()),
             Expr::Case(case) => case.when_then_expr[0].1.get_type(schema),
-            Expr::Cast { data_type, .. } | Expr::TryCast { data_type, .. } => {
+            Expr::Cast(Cast { data_type, .. }) | Expr::TryCast { data_type, .. 
} => {
                 Ok(data_type.clone())
             }
             Expr::ScalarUDF { fun, args } => {
@@ -182,7 +182,7 @@ impl ExprSchemable for Expr {
                     Ok(true)
                 }
             }
-            Expr::Cast { expr, .. } => expr.nullable(input_schema),
+            Expr::Cast(Cast { expr, .. }) => expr.nullable(input_schema),
             Expr::ScalarVariable(_, _)
             | Expr::TryCast { .. }
             | Expr::ScalarFunction { .. }
@@ -262,10 +262,7 @@ impl ExprSchemable for Expr {
         if this_type == *cast_to_type {
             Ok(self)
         } else if can_cast_types(&this_type, cast_to_type) {
-            Ok(Expr::Cast {
-                expr: Box::new(self),
-                data_type: cast_to_type.clone(),
-            })
+            Ok(Expr::Cast(Cast::new(Box::new(self), cast_to_type.clone())))
         } else {
             Err(DataFusionError::Plan(format!(
                 "Cannot automatically convert {:?} to {:?}",
diff --git a/datafusion/expr/src/expr_visitor.rs 
b/datafusion/expr/src/expr_visitor.rs
index 4014847bc..bd839f098 100644
--- a/datafusion/expr/src/expr_visitor.rs
+++ b/datafusion/expr/src/expr_visitor.rs
@@ -17,6 +17,7 @@
 
 //! Expression visitor
 
+use crate::expr::Cast;
 use crate::{
     expr::{BinaryExpr, GroupingSet},
     Between, Expr, GetIndexedField, Like,
@@ -108,7 +109,7 @@ impl ExprVisitable for Expr {
             | Expr::IsNotUnknown(expr)
             | Expr::IsNull(expr)
             | Expr::Negative(expr)
-            | Expr::Cast { expr, .. }
+            | Expr::Cast(Cast { expr, .. })
             | Expr::TryCast { expr, .. }
             | Expr::Sort { expr, .. }
             | Expr::InSubquery { expr, .. } => expr.accept(visitor),
diff --git a/datafusion/optimizer/src/projection_push_down.rs 
b/datafusion/optimizer/src/projection_push_down.rs
index d6ed6e488..b2e776821 100644
--- a/datafusion/optimizer/src/projection_push_down.rs
+++ b/datafusion/optimizer/src/projection_push_down.rs
@@ -534,10 +534,10 @@ fn projection_equal(p: &Projection, p2: &Projection) -> 
bool {
 
 #[cfg(test)]
 mod tests {
-
     use super::*;
     use crate::test::*;
     use arrow::datatypes::DataType;
+    use datafusion_expr::expr::Cast;
     use datafusion_expr::{
         col, count, lit,
         logical_plan::{builder::LogicalPlanBuilder, JoinType},
@@ -699,7 +699,7 @@ mod tests {
                     DFField::new(Some("test"), "b", DataType::UInt32, false),
                     DFField::new(Some("test2"), "c1", DataType::UInt32, false),
                 ],
-                HashMap::new()
+                HashMap::new(),
             )?,
         );
 
@@ -742,7 +742,7 @@ mod tests {
                     DFField::new(Some("test"), "b", DataType::UInt32, false),
                     DFField::new(Some("test2"), "c1", DataType::UInt32, false),
                 ],
-                HashMap::new()
+                HashMap::new(),
             )?,
         );
 
@@ -783,7 +783,7 @@ mod tests {
                     DFField::new(Some("test"), "b", DataType::UInt32, false),
                     DFField::new(Some("test2"), "a", DataType::UInt32, false),
                 ],
-                HashMap::new()
+                HashMap::new(),
             )?,
         );
 
@@ -795,10 +795,10 @@ mod tests {
         let table_scan = test_table_scan()?;
 
         let projection = LogicalPlanBuilder::from(table_scan)
-            .project(vec![Expr::Cast {
-                expr: Box::new(col("c")),
-                data_type: DataType::Float64,
-            }])?
+            .project(vec![Expr::Cast(Cast::new(
+                Box::new(col("c")),
+                DataType::Float64,
+            ))])?
             .build()?;
 
         let expected = "Projection: CAST(test.c AS Float64)\
diff --git a/datafusion/optimizer/src/reduce_outer_join.rs 
b/datafusion/optimizer/src/reduce_outer_join.rs
index d0016cc19..8b550e113 100644
--- a/datafusion/optimizer/src/reduce_outer_join.rs
+++ b/datafusion/optimizer/src/reduce_outer_join.rs
@@ -25,6 +25,7 @@ use datafusion_expr::{
 };
 use datafusion_expr::{Expr, Operator};
 
+use datafusion_expr::expr::Cast;
 use std::collections::HashMap;
 use std::sync::Arc;
 
@@ -351,15 +352,14 @@ fn extract_nonnullable_columns(
                 false,
             )
         }
-        Expr::Cast { expr, data_type: _ } | Expr::TryCast { expr, data_type: _ 
} => {
-            extract_nonnullable_columns(
-                expr,
-                nonnullable_cols,
-                left_schema,
-                right_schema,
-                false,
-            )
-        }
+        Expr::Cast(Cast { expr, data_type: _ })
+        | Expr::TryCast { expr, data_type: _ } => extract_nonnullable_columns(
+            expr,
+            nonnullable_cols,
+            left_schema,
+            right_schema,
+            false,
+        ),
         _ => Ok(()),
     }
 }
diff --git a/datafusion/optimizer/src/simplify_expressions.rs 
b/datafusion/optimizer/src/simplify_expressions.rs
index bc3ac6e84..32c8c9bce 100644
--- a/datafusion/optimizer/src/simplify_expressions.rs
+++ b/datafusion/optimizer/src/simplify_expressions.rs
@@ -278,9 +278,9 @@ fn simpl_concat(args: Vec<Expr>) -> Result<Expr> {
             ) => contiguous_scalar += &v,
             Expr::Literal(x) => {
                 return Err(DataFusionError::Internal(format!(
-                "The scalar {} should be casted to string type during the type 
coercion.",
-                x
-            )))
+                    "The scalar {} should be casted to string type during the 
type coercion.",
+                    x
+                )));
             }
             // If the arg is not a literal, we should first push the current 
`contiguous_scalar`
             // to the `new_args` (if it is not empty) and reset it to empty 
string.
@@ -921,7 +921,7 @@ impl<'a, S: SimplifyInfo> ExprRewriter for Simplifier<'a, 
S> {
                 op: Divide,
                 right,
             }) if !info.nullable(&left)? && is_zero(&right) => {
-                return 
Err(DataFusionError::ArrowError(ArrowError::DivideByZero))
+                return 
Err(DataFusionError::ArrowError(ArrowError::DivideByZero));
             }
 
             //
@@ -952,7 +952,7 @@ impl<'a, S: SimplifyInfo> ExprRewriter for Simplifier<'a, 
S> {
                 op: Modulo,
                 right,
             }) if !info.nullable(&left)? && is_zero(&right) => {
-                return 
Err(DataFusionError::ArrowError(ArrowError::DivideByZero))
+                return 
Err(DataFusionError::ArrowError(ArrowError::DivideByZero));
             }
 
             //
@@ -1079,7 +1079,7 @@ mod tests {
     use arrow::array::{ArrayRef, Int32Array};
     use chrono::{DateTime, TimeZone, Utc};
     use datafusion_common::{DFField, DFSchemaRef};
-    use datafusion_expr::expr::Case;
+    use datafusion_expr::expr::{Case, Cast};
     use datafusion_expr::expr_fn::{concat, concat_ws};
     use datafusion_expr::logical_plan::table_scan;
     use datafusion_expr::{
@@ -1663,10 +1663,7 @@ mod tests {
     }
 
     fn cast_to_int64_expr(expr: Expr) -> Expr {
-        Expr::Cast {
-            expr: expr.into(),
-            data_type: DataType::Int64,
-        }
+        Expr::Cast(Cast::new(expr.into(), DataType::Int64))
     }
 
     fn to_timestamp_expr(arg: impl Into<String>) -> Expr {
@@ -2425,10 +2422,7 @@ mod tests {
     #[test]
     fn cast_expr() {
         let table_scan = test_table_scan();
-        let proj = vec![Expr::Cast {
-            expr: Box::new(lit("0")),
-            data_type: DataType::Int32,
-        }];
+        let proj = vec![Expr::Cast(Cast::new(Box::new(lit("0")), 
DataType::Int32))];
         let plan = LogicalPlanBuilder::from(table_scan)
             .project(proj)
             .unwrap()
@@ -2444,10 +2438,7 @@ mod tests {
     #[test]
     fn cast_expr_wrong_arg() {
         let table_scan = test_table_scan();
-        let proj = vec![Expr::Cast {
-            expr: Box::new(lit("")),
-            data_type: DataType::Int32,
-        }];
+        let proj = vec![Expr::Cast(Cast::new(Box::new(lit("")), 
DataType::Int32))];
         let plan = LogicalPlanBuilder::from(table_scan)
             .project(proj)
             .unwrap()
diff --git a/datafusion/optimizer/src/unwrap_cast_in_comparison.rs 
b/datafusion/optimizer/src/unwrap_cast_in_comparison.rs
index 93b8b71d6..3dfbaa028 100644
--- a/datafusion/optimizer/src/unwrap_cast_in_comparison.rs
+++ b/datafusion/optimizer/src/unwrap_cast_in_comparison.rs
@@ -24,7 +24,7 @@ use arrow::datatypes::{
     DataType, MAX_DECIMAL_FOR_EACH_PRECISION, MIN_DECIMAL_FOR_EACH_PRECISION,
 };
 use datafusion_common::{DFSchema, DFSchemaRef, DataFusionError, Result, 
ScalarValue};
-use datafusion_expr::expr::BinaryExpr;
+use datafusion_expr::expr::{BinaryExpr, Cast};
 use datafusion_expr::expr_rewriter::{ExprRewriter, RewriteRecursion};
 use datafusion_expr::utils::from_plan;
 use datafusion_expr::{
@@ -132,7 +132,7 @@ impl ExprRewriter for UnwrapCastExprRewriter {
                     match (&left, &right) {
                         (
                             Expr::Literal(left_lit_value),
-                            Expr::TryCast { expr, .. } | Expr::Cast { expr, .. 
},
+                            Expr::TryCast { expr, .. } | Expr::Cast(Cast { 
expr, .. }),
                         ) => {
                             // if the left_lit_value can be casted to the type 
of expr
                             // we need to unwrap the cast for cast/try_cast 
expr, and add cast to the literal
@@ -149,7 +149,7 @@ impl ExprRewriter for UnwrapCastExprRewriter {
                             }
                         }
                         (
-                            Expr::TryCast { expr, .. } | Expr::Cast { expr, .. 
},
+                            Expr::TryCast { expr, .. } | Expr::Cast(Cast { 
expr, .. }),
                             Expr::Literal(right_lit_value),
                         ) => {
                             // if the right_lit_value can be casted to the 
type of expr
@@ -186,10 +186,10 @@ impl ExprRewriter for UnwrapCastExprRewriter {
                         expr: internal_left_expr,
                         ..
                     }
-                    | Expr::Cast {
+                    | Expr::Cast(Cast {
                         expr: internal_left_expr,
                         ..
-                    },
+                    }),
                 ) = Some(left_expr.as_ref())
                 {
                     let internal_left = internal_left_expr.as_ref().clone();
diff --git a/datafusion/optimizer/src/utils.rs 
b/datafusion/optimizer/src/utils.rs
index 130df3e0e..4eda6e3e3 100644
--- a/datafusion/optimizer/src/utils.rs
+++ b/datafusion/optimizer/src/utils.rs
@@ -469,6 +469,7 @@ mod tests {
     use super::*;
     use arrow::datatypes::DataType;
     use datafusion_common::Column;
+    use datafusion_expr::expr::Cast;
     use datafusion_expr::{col, lit, utils::expr_to_columns};
     use std::collections::HashSet;
     use std::ops::Add;
@@ -528,7 +529,7 @@ mod tests {
             vec![
                 col("a").eq(lit(5)),
                 // no alias on b
-                col("b")
+                col("b"),
             ]
         );
     }
@@ -577,17 +578,11 @@ mod tests {
     fn test_collect_expr() -> Result<()> {
         let mut accum: HashSet<Column> = HashSet::new();
         expr_to_columns(
-            &Expr::Cast {
-                expr: Box::new(col("a")),
-                data_type: DataType::Float64,
-            },
+            &Expr::Cast(Cast::new(Box::new(col("a")), DataType::Float64)),
             &mut accum,
         )?;
         expr_to_columns(
-            &Expr::Cast {
-                expr: Box::new(col("a")),
-                data_type: DataType::Float64,
-            },
+            &Expr::Cast(Cast::new(Box::new(col("a")), DataType::Float64)),
             &mut accum,
         )?;
         assert_eq!(1, accum.len());
@@ -604,10 +599,7 @@ mod tests {
         // cast data types
         test_rewrite(
             col("a"),
-            Expr::Cast {
-                expr: Box::new(col("a")),
-                data_type: DataType::Int32,
-            },
+            Expr::Cast(Cast::new(Box::new(col("a")), DataType::Int32)),
         );
 
         // change literal type from i32 to i64
diff --git a/datafusion/physical-expr/src/planner.rs 
b/datafusion/physical-expr/src/planner.rs
index 8080c8f30..7332b0910 100644
--- a/datafusion/physical-expr/src/planner.rs
+++ b/datafusion/physical-expr/src/planner.rs
@@ -27,6 +27,7 @@ use crate::{
 };
 use arrow::datatypes::{DataType, Schema};
 use datafusion_common::{DFSchema, DataFusionError, Result, ScalarValue};
+use datafusion_expr::expr::Cast;
 use datafusion_expr::{
     binary_expr, Between, BinaryExpr, Expr, GetIndexedField, Like, Operator,
 };
@@ -277,7 +278,7 @@ pub fn create_physical_expr(
                 };
             Ok(expressions::case(expr, when_then_expr, else_expr)?)
         }
-        Expr::Cast { expr, data_type } => expressions::cast(
+        Expr::Cast(Cast { expr, data_type }) => expressions::cast(
             create_physical_expr(expr, input_dfschema, input_schema, 
execution_props)?,
             input_schema,
             data_type.clone(),
diff --git a/datafusion/proto/src/from_proto.rs 
b/datafusion/proto/src/from_proto.rs
index 79b477b3e..7b2210eca 100644
--- a/datafusion/proto/src/from_proto.rs
+++ b/datafusion/proto/src/from_proto.rs
@@ -31,7 +31,7 @@ use datafusion::execution::registry::FunctionRegistry;
 use datafusion_common::{
     Column, DFField, DFSchema, DFSchemaRef, DataFusionError, ScalarValue,
 };
-use datafusion_expr::expr::BinaryExpr;
+use datafusion_expr::expr::{BinaryExpr, Cast};
 use datafusion_expr::{
     abs, acos, array, ascii, asin, atan, atan2, bit_length, btrim, ceil,
     character_length, chr, coalesce, concat_expr, concat_ws_expr, cos, 
date_bin,
@@ -967,7 +967,7 @@ pub fn parse_expr(
         ExprType::Cast(cast) => {
             let expr = Box::new(parse_required_expr(&cast.expr, registry, 
"expr")?);
             let data_type = cast.arrow_type.as_ref().required("arrow_type")?;
-            Ok(Expr::Cast { expr, data_type })
+            Ok(Expr::Cast(Cast::new(expr, data_type)))
         }
         ExprType::TryCast(cast) => {
             let expr = Box::new(parse_required_expr(&cast.expr, registry, 
"expr")?);
diff --git a/datafusion/proto/src/lib.rs b/datafusion/proto/src/lib.rs
index 7feae7965..8dd1b55f5 100644
--- a/datafusion/proto/src/lib.rs
+++ b/datafusion/proto/src/lib.rs
@@ -63,7 +63,7 @@ mod roundtrip_tests {
     use datafusion::prelude::{create_udf, CsvReadOptions, SessionContext};
     use datafusion_common::{DFSchemaRef, DataFusionError, ScalarValue};
     use datafusion_expr::create_udaf;
-    use datafusion_expr::expr::{Between, BinaryExpr, Case, GroupingSet, Like};
+    use datafusion_expr::expr::{Between, BinaryExpr, Case, Cast, GroupingSet, 
Like};
     use datafusion_expr::logical_plan::{Extension, UserDefinedLogicalNode};
     use datafusion_expr::{
         col, lit, Accumulator, AggregateFunction, AggregateState,
@@ -893,10 +893,7 @@ mod roundtrip_tests {
 
     #[test]
     fn roundtrip_cast() {
-        let test_expr = Expr::Cast {
-            expr: Box::new(lit(1.0_f32)),
-            data_type: DataType::Boolean,
-        };
+        let test_expr = Expr::Cast(Cast::new(Box::new(lit(1.0_f32)), 
DataType::Boolean));
 
         let ctx = SessionContext::new();
         roundtrip_expr_test(test_expr, ctx);
diff --git a/datafusion/proto/src/to_proto.rs b/datafusion/proto/src/to_proto.rs
index f8dab779b..9de52f291 100644
--- a/datafusion/proto/src/to_proto.rs
+++ b/datafusion/proto/src/to_proto.rs
@@ -34,7 +34,9 @@ use arrow::datatypes::{
     UnionMode,
 };
 use datafusion_common::{Column, DFField, DFSchemaRef, ScalarValue};
-use datafusion_expr::expr::{Between, BinaryExpr, GetIndexedField, GroupingSet, 
Like};
+use datafusion_expr::expr::{
+    Between, BinaryExpr, Cast, GetIndexedField, GroupingSet, Like,
+};
 use datafusion_expr::{
     logical_plan::PlanType, logical_plan::StringifiedPlan, AggregateFunction,
     BuiltInWindowFunction, BuiltinScalarFunction, Expr, WindowFrame, 
WindowFrameBound,
@@ -130,8 +132,7 @@ impl TryFrom<&DataType> for 
protobuf::arrow_type::ArrowTypeEnum {
     type Error = Error;
 
     fn try_from(val: &DataType) -> Result<Self, Self::Error> {
-        let res =
-        match val {
+        let res = match val {
             DataType::Null => Self::None(EmptyMessage {}),
             DataType::Boolean => Self::Bool(EmptyMessage {}),
             DataType::Int8 => Self::Int8(EmptyMessage {}),
@@ -194,7 +195,10 @@ impl TryFrom<&DataType> for 
protobuf::arrow_type::ArrowTypeEnum {
                     UnionMode::Dense => protobuf::UnionMode::Dense,
                 };
                 Self::Union(protobuf::Union {
-                    union_types: union_types.iter().map(|field| 
field.try_into()).collect::<Result<Vec<_>, Error>>()?,
+                    union_types: union_types
+                        .iter()
+                        .map(|field| field.try_into())
+                        .collect::<Result<Vec<_>, Error>>()?,
                     union_mode: union_mode.into(),
                     type_ids: type_ids.iter().map(|x| *x as i32).collect(),
                 })
@@ -456,7 +460,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     expr_type: Some(ExprType::BinaryExpr(binary_expr)),
                 }
             }
-            Expr::Like(Like { negated, expr, pattern, escape_char} ) => {
+            Expr::Like(Like { negated, expr, pattern, escape_char }) => {
                 let pb = Box::new(protobuf::LikeNode {
                     negated: *negated,
                     expr: Some(Box::new(expr.as_ref().try_into()?)),
@@ -469,7 +473,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     expr_type: Some(ExprType::Like(pb)),
                 }
             }
-            Expr::ILike(Like { negated, expr, pattern, escape_char} ) => {
+            Expr::ILike(Like { negated, expr, pattern, escape_char }) => {
                 let pb = Box::new(protobuf::ILikeNode {
                     negated: *negated,
                     expr: Some(Box::new(expr.as_ref().try_into()?)),
@@ -482,7 +486,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     expr_type: Some(ExprType::Ilike(pb)),
                 }
             }
-            Expr::SimilarTo(Like { negated, expr, pattern, escape_char} ) => {
+            Expr::SimilarTo(Like { negated, expr, pattern, escape_char }) => {
                 let pb = Box::new(protobuf::SimilarToNode {
                     negated: *negated,
                     expr: Some(Box::new(expr.as_ref().try_into()?)),
@@ -598,7 +602,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     filter: match filter {
                         Some(e) => Some(Box::new(e.as_ref().try_into()?)),
                         None => None,
-                    }
+                    },
                 };
                 Self {
                     expr_type: 
Some(ExprType::AggregateExpr(Box::new(aggregate_expr))),
@@ -637,16 +641,15 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                             args: args.iter().map(|expr| 
expr.try_into()).collect::<Result<
                                 Vec<_>,
                                 Error,
-                            >>(
-                            )?,
+                            >>()?,
                             filter: match filter {
                                 Some(e) => 
Some(Box::new(e.as_ref().try_into()?)),
                                 None => None,
-                            }
+                            },
                         },
-                    ))),
+                        ))),
                 }
-            },
+            }
             Expr::Not(expr) => {
                 let expr = Box::new(protobuf::Not {
                     expr: Some(Box::new(expr.as_ref().try_into()?)),
@@ -760,7 +763,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     expr_type: Some(ExprType::Case(expr)),
                 }
             }
-            Expr::Cast { expr, data_type } => {
+            Expr::Cast(Cast { expr, data_type }) => {
                 let expr = Box::new(protobuf::CastNode {
                     expr: Some(Box::new(expr.as_ref().try_into()?)),
                     arrow_type: Some(data_type.try_into()?),
@@ -814,25 +817,24 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
             Expr::ScalarSubquery(_) | Expr::InSubquery { .. } | Expr::Exists { 
.. } => {
                 // we would need to add logical plan operators to 
datafusion.proto to support this
                 // see discussion in 
https://github.com/apache/arrow-datafusion/issues/2565
-                return Err(Error::General("Proto serialization error: 
Expr::ScalarSubquery(_) | Expr::InSubquery { .. } | Expr::Exists { .. } not 
supported".to_string()))
+                return Err(Error::General("Proto serialization error: 
Expr::ScalarSubquery(_) | Expr::InSubquery { .. } | Expr::Exists { .. } not 
supported".to_string()));
             }
-            Expr::GetIndexedField(GetIndexedField{key, expr}) =>
+            Expr::GetIndexedField(GetIndexedField { key, expr }) =>
                 Self {
-                expr_type: Some(ExprType::GetIndexedField(Box::new(
-                    protobuf::GetIndexedField {
-                        key: Some(key.try_into()?),
-                        expr: Some(Box::new(expr.as_ref().try_into()?)),
-                    },
-                ))),
-            },
+                    expr_type: Some(ExprType::GetIndexedField(Box::new(
+                        protobuf::GetIndexedField {
+                            key: Some(key.try_into()?),
+                            expr: Some(Box::new(expr.as_ref().try_into()?)),
+                        },
+                    ))),
+                },
 
             Expr::GroupingSet(GroupingSet::Cube(exprs)) => Self {
                 expr_type: Some(ExprType::Cube(CubeNode {
                     expr: exprs.iter().map(|expr| 
expr.try_into()).collect::<Result<
                         Vec<_>,
                         Self::Error,
-                    >>(
-                    )?,
+                    >>()?,
                 })),
             },
             Expr::GroupingSet(GroupingSet::Rollup(exprs)) => Self {
@@ -840,8 +842,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     expr: exprs.iter().map(|expr| 
expr.try_into()).collect::<Result<
                         Vec<_>,
                         Self::Error,
-                    >>(
-                    )?,
+                    >>()?,
                 })),
             },
             Expr::GroupingSet(GroupingSet::GroupingSets(exprs)) => Self {
@@ -861,7 +862,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
             },
 
             Expr::QualifiedWildcard { .. } | Expr::TryCast { .. } =>
-            return Err(Error::General("Proto serialization error: 
Expr::QualifiedWildcard { .. } | Expr::TryCast { .. } not 
supported".to_string())),
+                return Err(Error::General("Proto serialization error: 
Expr::QualifiedWildcard { .. } | Expr::TryCast { .. } not 
supported".to_string())),
         };
 
         Ok(expr_node)
@@ -1066,7 +1067,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
             scalar::ScalarValue::FixedSizeBinary(_, _) => {
                 return Err(Error::General(
                     "FixedSizeBinary is not yet implemented".to_owned(),
-                ))
+                ));
             }
 
             datafusion::scalar::ScalarValue::Time64(v) => {
diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs
index 92264f060..7dccbc522 100644
--- a/datafusion/sql/src/planner.rs
+++ b/datafusion/sql/src/planner.rs
@@ -51,7 +51,7 @@ use crate::utils::{make_decimal_type, normalize_ident, 
resolve_columns};
 use datafusion_common::{
     field_not_found, Column, DFSchema, DFSchemaRef, DataFusionError, Result, 
ScalarValue,
 };
-use datafusion_expr::expr::{Between, BinaryExpr, Case, GroupingSet, Like};
+use datafusion_expr::expr::{Between, BinaryExpr, Case, Cast, GroupingSet, 
Like};
 use datafusion_expr::logical_plan::builder::project_with_alias;
 use datafusion_expr::logical_plan::{Filter, Subquery};
 use datafusion_expr::Expr::Alias;
@@ -105,7 +105,7 @@ fn plan_key(key: SQLExpr) -> Result<ScalarValue> {
             return Err(DataFusionError::SQL(ParserError(format!(
                 "Unsuported index key expression: {:?}",
                 key
-            ))))
+            ))));
         }
     };
 
@@ -1706,18 +1706,20 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                                 &schema,
                                 &mut HashMap::new(),
                             ),
-                        SQLExpr::TypedString { data_type, value } => 
Ok(Expr::Cast {
-                            expr: Box::new(lit(value)),
-                            data_type: convert_data_type(&data_type)?,
-                        }),
-                        SQLExpr::Cast { expr, data_type } => Ok(Expr::Cast {
-                            expr: Box::new(self.sql_expr_to_logical_expr(
+                        SQLExpr::TypedString { data_type, value } => {
+                            Ok(Expr::Cast(Cast::new(
+                                Box::new(lit(value)),
+                                convert_data_type(&data_type)?,
+                            )))
+                        }
+                        SQLExpr::Cast { expr, data_type } => 
Ok(Expr::Cast(Cast::new(
+                            Box::new(self.sql_expr_to_logical_expr(
                                 *expr,
                                 &schema,
                                 &mut HashMap::new(),
                             )?),
-                            data_type: convert_data_type(&data_type)?,
-                        }),
+                            convert_data_type(&data_type)?,
+                        ))),
                         other => Err(DataFusionError::NotImplemented(format!(
                             "Unsupported value {:?} in a values list 
expression",
                             other
@@ -1823,14 +1825,14 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                 } else {
                     match (var_names.pop(), var_names.pop()) {
                         (Some(name), Some(relation)) if var_names.is_empty() 
=> {
-                             match schema.field_with_qualified_name(&relation, 
&name) {
+                            match schema.field_with_qualified_name(&relation, 
&name) {
                                 Ok(_) => {
                                     // found an exact match on a qualified 
name so this is a table.column identifier
                                     Ok(Expr::Column(Column {
                                         relation: Some(relation),
                                         name,
                                     }))
-                                },
+                                }
                                 Err(_) => {
                                     if let Some(field) = 
schema.fields().iter().find(|f| f.name().eq(&relation)) {
                                         // Access to a field of a column which 
is a structure, example: SELECT my_struct.key
@@ -1895,10 +1897,10 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
             SQLExpr::Cast {
                 expr,
                 data_type,
-            } => Ok(Expr::Cast {
-                expr: Box::new(self.sql_expr_to_logical_expr(*expr, schema, 
ctes)?),
-                data_type: convert_data_type(&data_type)?,
-            }),
+            } => Ok(Expr::Cast(Cast::new(
+                Box::new(self.sql_expr_to_logical_expr(*expr, schema, ctes)?),
+                convert_data_type(&data_type)?,
+            ))),
 
             SQLExpr::TryCast {
                 expr,
@@ -1911,10 +1913,10 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
             SQLExpr::TypedString {
                 data_type,
                 value,
-            } => Ok(Expr::Cast {
-                expr: Box::new(lit(value)),
-                data_type: convert_data_type(&data_type)?,
-            }),
+            } => Ok(Expr::Cast(Cast::new(
+                Box::new(lit(value)),
+                convert_data_type(&data_type)?,
+            ))),
 
             SQLExpr::IsNull(expr) => Ok(Expr::IsNull(Box::new(
                 self.sql_expr_to_logical_expr(*expr, schema, ctes)?,
@@ -1991,7 +1993,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                     negated,
                     Box::new(self.sql_expr_to_logical_expr(*expr, schema, 
ctes)?),
                     Box::new(pattern),
-                    escape_char
+                    escape_char,
                 )))
             }
 
@@ -2007,7 +2009,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                     negated,
                     Box::new(self.sql_expr_to_logical_expr(*expr, schema, 
ctes)?),
                     Box::new(pattern),
-                    escape_char
+                    escape_char,
                 )))
             }
 
@@ -2119,10 +2121,9 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                 match self.sql_expr_to_logical_expr(*expr, schema, ctes)? {
                     Expr::AggregateFunction {
                         fun, args, distinct, ..
-                    } =>  Ok(Expr::AggregateFunction { fun, args, distinct, 
filter: Some(Box::new(self.sql_expr_to_logical_expr(*filter, schema, ctes)?)) 
}),
+                    } => Ok(Expr::AggregateFunction { fun, args, distinct, 
filter: Some(Box::new(self.sql_expr_to_logical_expr(*filter, schema, ctes)?)) 
}),
                     _ => 
Err(DataFusionError::Internal("AggregateExpressionWithFilter expression was not 
an AggregateFunction".to_string()))
                 }
-
             }
 
             SQLExpr::Function(mut function) => {
@@ -2221,7 +2222,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                         fun,
                         distinct,
                         args,
-                        filter: None
+                        filter: None,
                     });
                 };
 
@@ -2247,9 +2248,9 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
 
             SQLExpr::Nested(e) => self.sql_expr_to_logical_expr(*e, schema, 
ctes),
 
-            SQLExpr::Exists{ subquery, negated } => 
self.parse_exists_subquery(&subquery, negated, schema, ctes),
+            SQLExpr::Exists { subquery, negated } => 
self.parse_exists_subquery(&subquery, negated, schema, ctes),
 
-            SQLExpr::InSubquery {  expr, subquery, negated } => 
self.parse_in_subquery(&expr, &subquery, negated, schema, ctes),
+            SQLExpr::InSubquery { expr, subquery, negated } => 
self.parse_in_subquery(&expr, &subquery, negated, schema, ctes),
 
             SQLExpr::Subquery(subquery) => 
self.parse_scalar_subquery(&subquery, schema, ctes),
 
@@ -2390,7 +2391,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                 return Err(DataFusionError::NotImplemented(format!(
                     "Unsupported interval argument. Expected string literal, 
got: {:?}",
                     value
-                )))
+                )));
             }
         };
 
diff --git a/datafusion/sql/src/utils.rs b/datafusion/sql/src/utils.rs
index d138897a8..a4176474c 100644
--- a/datafusion/sql/src/utils.rs
+++ b/datafusion/sql/src/utils.rs
@@ -21,6 +21,7 @@ use arrow::datatypes::{DataType, DECIMAL128_MAX_PRECISION, 
DECIMAL_DEFAULT_SCALE
 use sqlparser::ast::Ident;
 
 use datafusion_common::{DataFusionError, Result, ScalarValue};
+use datafusion_expr::expr::Cast;
 use datafusion_expr::expr::{
     Between, BinaryExpr, Case, GetIndexedField, GroupingSet, Like,
 };
@@ -340,13 +341,10 @@ where
             Expr::IsNotUnknown(nested_expr) => Ok(Expr::IsNotUnknown(Box::new(
                 clone_with_replacement(nested_expr, replacement_fn)?,
             ))),
-            Expr::Cast {
-                expr: nested_expr,
-                data_type,
-            } => Ok(Expr::Cast {
-                expr: Box::new(clone_with_replacement(nested_expr, 
replacement_fn)?),
-                data_type: data_type.clone(),
-            }),
+            Expr::Cast(Cast { expr, data_type }) => Ok(Expr::Cast(Cast::new(
+                Box::new(clone_with_replacement(expr, replacement_fn)?),
+                data_type.clone(),
+            ))),
             Expr::TryCast {
                 expr: nested_expr,
                 data_type,

Reply via email to