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 17d02177b Refactor `Expr::Like`, `Expr::ILike`, `Expr::SimilarTo` to 
use a struct (#3836)
17d02177b is described below

commit 17d02177bbf00a05a7f785f960c24d45adbda8b9
Author: baishen <[email protected]>
AuthorDate: Sun Oct 16 04:21:33 2022 +0800

    Refactor `Expr::Like`, `Expr::ILike`, `Expr::SimilarTo` to use a struct 
(#3836)
    
    * Refactor `Expr::Like`, `Expr::ILike`, `Expr::SimilarTo` to use a struct
    
    * optimize type
    
    * fix clippy
---
 datafusion/core/src/physical_plan/planner.rs | 14 ++--
 datafusion/expr/src/expr.rs                  | 98 +++++++++++++---------------
 datafusion/expr/src/expr_rewriter.rs         | 32 ++++-----
 datafusion/expr/src/expr_schema.rs           |  8 +--
 datafusion/expr/src/expr_visitor.rs          |  8 +--
 datafusion/expr/src/lib.rs                   |  2 +-
 datafusion/optimizer/src/type_coercion.rs    | 46 ++++---------
 datafusion/physical-expr/src/planner.rs      |  6 +-
 datafusion/proto/src/from_proto.rs           | 38 +++++------
 datafusion/proto/src/lib.rs                  | 26 ++++----
 datafusion/proto/src/to_proto.rs             | 23 ++-----
 datafusion/row/src/writer.rs                 |  2 +-
 datafusion/sql/src/planner.rs                | 27 ++++----
 datafusion/sql/src/utils.rs                  | 44 ++++++-------
 14 files changed, 165 insertions(+), 209 deletions(-)

diff --git a/datafusion/core/src/physical_plan/planner.rs 
b/datafusion/core/src/physical_plan/planner.rs
index 4a33b299b..5ccf9f70f 100644
--- a/datafusion/core/src/physical_plan/planner.rs
+++ b/datafusion/core/src/physical_plan/planner.rs
@@ -59,7 +59,7 @@ use arrow::compute::SortOptions;
 use arrow::datatypes::{Schema, SchemaRef};
 use async_trait::async_trait;
 use datafusion_common::{DFSchema, ScalarValue};
-use datafusion_expr::expr::GroupingSet;
+use datafusion_expr::expr::{GroupingSet, Like};
 use datafusion_expr::expr_rewriter::unnormalize_cols;
 use datafusion_expr::utils::{expand_wildcard, expr_to_columns};
 use datafusion_expr::WindowFrameUnits;
@@ -273,12 +273,12 @@ fn create_physical_name(e: &Expr, is_first_expr: bool) -> 
Result<String> {
                 Ok(format!("{} BETWEEN {} AND {}", expr, low, high))
             }
         }
-        Expr::Like {
+        Expr::Like(Like {
             negated,
             expr,
             pattern,
             escape_char,
-        } => {
+        }) => {
             let expr = create_physical_name(expr, false)?;
             let pattern = create_physical_name(pattern, false)?;
             let escape = if let Some(char) = escape_char {
@@ -292,12 +292,12 @@ fn create_physical_name(e: &Expr, is_first_expr: bool) -> 
Result<String> {
                 Ok(format!("{} LIKE {}{}", expr, pattern, escape))
             }
         }
-        Expr::ILike {
+        Expr::ILike(Like {
             negated,
             expr,
             pattern,
             escape_char,
-        } => {
+        }) => {
             let expr = create_physical_name(expr, false)?;
             let pattern = create_physical_name(pattern, false)?;
             let escape = if let Some(char) = escape_char {
@@ -311,12 +311,12 @@ fn create_physical_name(e: &Expr, is_first_expr: bool) -> 
Result<String> {
                 Ok(format!("{} ILIKE {}{}", expr, pattern, escape))
             }
         }
-        Expr::SimilarTo {
+        Expr::SimilarTo(Like {
             negated,
             expr,
             pattern,
             escape_char,
-        } => {
+        }) => {
             let expr = create_physical_name(expr, false)?;
             let pattern = create_physical_name(pattern, false)?;
             let escape = if let Some(char) = escape_char {
diff --git a/datafusion/expr/src/expr.rs b/datafusion/expr/src/expr.rs
index 6f683dc7f..8b8938099 100644
--- a/datafusion/expr/src/expr.rs
+++ b/datafusion/expr/src/expr.rs
@@ -101,26 +101,11 @@ pub enum Expr {
         right: Box<Expr>,
     },
     /// LIKE expression
-    Like {
-        negated: bool,
-        expr: Box<Expr>,
-        pattern: Box<Expr>,
-        escape_char: Option<char>,
-    },
+    Like(Like),
     /// Case-insensitive LIKE expression
-    ILike {
-        negated: bool,
-        expr: Box<Expr>,
-        pattern: Box<Expr>,
-        escape_char: Option<char>,
-    },
+    ILike(Like),
     /// LIKE expression that uses regular expressions
-    SimilarTo {
-        negated: bool,
-        expr: Box<Expr>,
-        pattern: Box<Expr>,
-        escape_char: Option<char>,
-    },
+    SimilarTo(Like),
     /// Negation of an expression. The expression's type must be a boolean to 
make sense.
     Not(Box<Expr>),
     /// Whether an expression is not Null. This expression is never null.
@@ -311,6 +296,32 @@ impl Case {
     }
 }
 
+/// LIKE expression
+#[derive(Clone, PartialEq, Eq, Hash)]
+pub struct Like {
+    pub negated: bool,
+    pub expr: Box<Expr>,
+    pub pattern: Box<Expr>,
+    pub escape_char: Option<char>,
+}
+
+impl Like {
+    /// Create a new Like expression
+    pub fn new(
+        negated: bool,
+        expr: Box<Expr>,
+        pattern: Box<Expr>,
+        escape_char: Option<char>,
+    ) -> Self {
+        Self {
+            negated,
+            expr,
+            pattern,
+            escape_char,
+        }
+    }
+}
+
 /// Grouping sets
 /// See 
https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-GROUPING-SETS
 /// for Postgres definition.
@@ -580,39 +591,24 @@ impl Not for Expr {
 
     fn not(self) -> Self::Output {
         match self {
-            Expr::Like {
+            Expr::Like(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Expr::Like {
-                negated: !negated,
-                expr,
-                pattern,
-                escape_char,
-            },
-            Expr::ILike {
+            }) => Expr::Like(Like::new(!negated, expr, pattern, escape_char)),
+            Expr::ILike(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Expr::ILike {
-                negated: !negated,
-                expr,
-                pattern,
-                escape_char,
-            },
-            Expr::SimilarTo {
+            }) => Expr::ILike(Like::new(!negated, expr, pattern, escape_char)),
+            Expr::SimilarTo(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Expr::SimilarTo {
-                negated: !negated,
-                expr,
-                pattern,
-                escape_char,
-            },
+            }) => Expr::SimilarTo(Like::new(!negated, expr, pattern, 
escape_char)),
             _ => Expr::Not(Box::new(self)),
         }
     }
@@ -770,12 +766,12 @@ impl fmt::Debug for Expr {
                     write!(f, "{:?} BETWEEN {:?} AND {:?}", expr, low, high)
                 }
             }
-            Expr::Like {
+            Expr::Like(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => {
+            }) => {
                 write!(f, "{:?}", expr)?;
                 if *negated {
                     write!(f, " NOT")?;
@@ -786,12 +782,12 @@ impl fmt::Debug for Expr {
                     write!(f, " LIKE {:?}", pattern)
                 }
             }
-            Expr::ILike {
+            Expr::ILike(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => {
+            }) => {
                 write!(f, "{:?}", expr)?;
                 if *negated {
                     write!(f, " NOT")?;
@@ -802,12 +798,12 @@ impl fmt::Debug for Expr {
                     write!(f, " ILIKE {:?}", pattern)
                 }
             }
-            Expr::SimilarTo {
+            Expr::SimilarTo(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => {
+            }) => {
                 write!(f, "{:?}", expr)?;
                 if *negated {
                     write!(f, " NOT")?;
@@ -925,12 +921,12 @@ fn create_name(e: &Expr) -> Result<String> {
             let right = create_name(right)?;
             Ok(format!("{} {} {}", left, op, right))
         }
-        Expr::Like {
+        Expr::Like(Like {
             negated,
             expr,
             pattern,
             escape_char,
-        } => {
+        }) => {
             let s = format!(
                 "{} {} {} {}",
                 expr,
@@ -944,12 +940,12 @@ fn create_name(e: &Expr) -> Result<String> {
             );
             Ok(s)
         }
-        Expr::ILike {
+        Expr::ILike(Like {
             negated,
             expr,
             pattern,
             escape_char,
-        } => {
+        }) => {
             let s = format!(
                 "{} {} {} {}",
                 expr,
@@ -963,12 +959,12 @@ fn create_name(e: &Expr) -> Result<String> {
             );
             Ok(s)
         }
-        Expr::SimilarTo {
+        Expr::SimilarTo(Like {
             negated,
             expr,
             pattern,
             escape_char,
-        } => {
+        }) => {
             let s = format!(
                 "{} {} {} {}",
                 expr,
diff --git a/datafusion/expr/src/expr_rewriter.rs 
b/datafusion/expr/src/expr_rewriter.rs
index 427fcf170..97d39ceb7 100644
--- a/datafusion/expr/src/expr_rewriter.rs
+++ b/datafusion/expr/src/expr_rewriter.rs
@@ -17,7 +17,7 @@
 
 //! Expression rewriter
 
-use crate::expr::{Case, GroupingSet};
+use crate::expr::{Case, GroupingSet, Like};
 use crate::logical_plan::{Aggregate, Projection};
 use crate::utils::{from_plan, grouping_set_to_exprlist};
 use crate::{Expr, ExprSchemable, LogicalPlan};
@@ -128,39 +128,39 @@ impl ExprRewritable for Expr {
                 op,
                 right: rewrite_boxed(right, rewriter)?,
             },
-            Expr::Like {
+            Expr::Like(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Expr::Like {
+            }) => Expr::Like(Like::new(
                 negated,
-                expr: rewrite_boxed(expr, rewriter)?,
-                pattern: rewrite_boxed(pattern, rewriter)?,
+                rewrite_boxed(expr, rewriter)?,
+                rewrite_boxed(pattern, rewriter)?,
                 escape_char,
-            },
-            Expr::ILike {
+            )),
+            Expr::ILike(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Expr::ILike {
+            }) => Expr::ILike(Like::new(
                 negated,
-                expr: rewrite_boxed(expr, rewriter)?,
-                pattern: rewrite_boxed(pattern, rewriter)?,
+                rewrite_boxed(expr, rewriter)?,
+                rewrite_boxed(pattern, rewriter)?,
                 escape_char,
-            },
-            Expr::SimilarTo {
+            )),
+            Expr::SimilarTo(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Expr::SimilarTo {
+            }) => Expr::SimilarTo(Like::new(
                 negated,
-                expr: rewrite_boxed(expr, rewriter)?,
-                pattern: rewrite_boxed(pattern, rewriter)?,
+                rewrite_boxed(expr, rewriter)?,
+                rewrite_boxed(pattern, rewriter)?,
                 escape_char,
-            },
+            )),
             Expr::Not(expr) => Expr::Not(rewrite_boxed(expr, rewriter)?),
             Expr::IsNotNull(expr) => Expr::IsNotNull(rewrite_boxed(expr, 
rewriter)?),
             Expr::IsNull(expr) => Expr::IsNull(rewrite_boxed(expr, rewriter)?),
diff --git a/datafusion/expr/src/expr_schema.rs 
b/datafusion/expr/src/expr_schema.rs
index cfcbcc940..103f8edcc 100644
--- a/datafusion/expr/src/expr_schema.rs
+++ b/datafusion/expr/src/expr_schema.rs
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use super::Expr;
+use super::{Expr, Like};
 use crate::field_util::get_indexed_field;
 use crate::type_coercion::binary::binary_operator_data_type;
 use crate::{aggregate_function, function, window_function};
@@ -207,9 +207,9 @@ impl ExprSchemable for Expr {
                 ref right,
                 ..
             } => Ok(left.nullable(input_schema)? || 
right.nullable(input_schema)?),
-            Expr::Like { expr, .. } => expr.nullable(input_schema),
-            Expr::ILike { expr, .. } => expr.nullable(input_schema),
-            Expr::SimilarTo { expr, .. } => expr.nullable(input_schema),
+            Expr::Like(Like { expr, .. }) => expr.nullable(input_schema),
+            Expr::ILike(Like { expr, .. }) => expr.nullable(input_schema),
+            Expr::SimilarTo(Like { expr, .. }) => expr.nullable(input_schema),
             Expr::Wildcard => Err(DataFusionError::Internal(
                 "Wildcard expressions are not valid in a logical query 
plan".to_owned(),
             )),
diff --git a/datafusion/expr/src/expr_visitor.rs 
b/datafusion/expr/src/expr_visitor.rs
index f362a759e..a7d19d255 100644
--- a/datafusion/expr/src/expr_visitor.rs
+++ b/datafusion/expr/src/expr_visitor.rs
@@ -17,7 +17,7 @@
 
 //! Expression visitor
 
-use crate::{expr::GroupingSet, Expr};
+use crate::{expr::GroupingSet, Expr, Like};
 use datafusion_common::Result;
 
 /// Controls how the visitor recursion should proceed.
@@ -134,15 +134,15 @@ impl ExprVisitable for Expr {
                 let visitor = left.accept(visitor)?;
                 right.accept(visitor)
             }
-            Expr::Like { expr, pattern, .. } => {
+            Expr::Like(Like { expr, pattern, .. }) => {
                 let visitor = expr.accept(visitor)?;
                 pattern.accept(visitor)
             }
-            Expr::ILike { expr, pattern, .. } => {
+            Expr::ILike(Like { expr, pattern, .. }) => {
                 let visitor = expr.accept(visitor)?;
                 pattern.accept(visitor)
             }
-            Expr::SimilarTo { expr, pattern, .. } => {
+            Expr::SimilarTo(Like { expr, pattern, .. }) => {
                 let visitor = expr.accept(visitor)?;
                 pattern.accept(visitor)
             }
diff --git a/datafusion/expr/src/lib.rs b/datafusion/expr/src/lib.rs
index e1bae3314..72a9cb747 100644
--- a/datafusion/expr/src/lib.rs
+++ b/datafusion/expr/src/lib.rs
@@ -56,7 +56,7 @@ pub use accumulator::{Accumulator, AggregateState};
 pub use aggregate_function::AggregateFunction;
 pub use built_in_function::BuiltinScalarFunction;
 pub use columnar_value::{ColumnarValue, NullColumnarValue};
-pub use expr::{Case, Expr, GroupingSet};
+pub use expr::{Case, Expr, GroupingSet, Like};
 pub use expr_fn::*;
 pub use expr_schema::ExprSchemable;
 pub use function::{
diff --git a/datafusion/optimizer/src/type_coercion.rs 
b/datafusion/optimizer/src/type_coercion.rs
index ad9314406..f79b34246 100644
--- a/datafusion/optimizer/src/type_coercion.rs
+++ b/datafusion/optimizer/src/type_coercion.rs
@@ -21,7 +21,7 @@ use crate::utils::rewrite_preserving_name;
 use crate::{OptimizerConfig, OptimizerRule};
 use arrow::datatypes::DataType;
 use datafusion_common::{DFSchema, DFSchemaRef, DataFusionError, Result};
-use datafusion_expr::expr::Case;
+use datafusion_expr::expr::{Case, Like};
 use datafusion_expr::expr_rewriter::{ExprRewriter, RewriteRecursion};
 use datafusion_expr::logical_plan::Subquery;
 use datafusion_expr::type_coercion::binary::{coerce_types, 
comparison_coercion};
@@ -168,44 +168,34 @@ impl ExprRewriter for TypeCoercionRewriter {
                     is_not_false(get_casted_expr_for_bool_op(&expr, 
&self.schema)?);
                 Ok(expr)
             }
-            Expr::Like {
+            Expr::Like(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => {
+            }) => {
                 let left_type = expr.get_type(&self.schema)?;
                 let right_type = pattern.get_type(&self.schema)?;
                 let coerced_type =
                     coerce_types(&left_type, &Operator::Like, &right_type)?;
                 let expr = Box::new(expr.cast_to(&coerced_type, 
&self.schema)?);
                 let pattern = Box::new(pattern.cast_to(&coerced_type, 
&self.schema)?);
-                let expr = Expr::Like {
-                    negated,
-                    expr,
-                    pattern,
-                    escape_char,
-                };
+                let expr = Expr::Like(Like::new(negated, expr, pattern, 
escape_char));
                 Ok(expr)
             }
-            Expr::ILike {
+            Expr::ILike(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => {
+            }) => {
                 let left_type = expr.get_type(&self.schema)?;
                 let right_type = pattern.get_type(&self.schema)?;
                 let coerced_type =
                     coerce_types(&left_type, &Operator::Like, &right_type)?;
                 let expr = Box::new(expr.cast_to(&coerced_type, 
&self.schema)?);
                 let pattern = Box::new(pattern.cast_to(&coerced_type, 
&self.schema)?);
-                let expr = Expr::ILike {
-                    negated,
-                    expr,
-                    pattern,
-                    escape_char,
-                };
+                let expr = Expr::ILike(Like::new(negated, expr, pattern, 
escape_char));
                 Ok(expr)
             }
             Expr::IsUnknown(expr) => {
@@ -498,6 +488,7 @@ mod test {
     use crate::{OptimizerConfig, OptimizerRule};
     use arrow::datatypes::DataType;
     use datafusion_common::{DFField, DFSchema, Result, ScalarValue};
+    use datafusion_expr::expr::Like;
     use datafusion_expr::expr_rewriter::ExprRewritable;
     use datafusion_expr::{
         cast, col, concat, concat_ws, create_udaf, is_true,
@@ -885,12 +876,7 @@ mod test {
         // like : utf8 like "abc"
         let expr = Box::new(col("a"));
         let pattern = Box::new(lit(ScalarValue::new_utf8("abc")));
-        let like_expr = Expr::Like {
-            negated: false,
-            expr,
-            pattern,
-            escape_char: None,
-        };
+        let like_expr = Expr::Like(Like::new(false, expr, pattern, None));
         let empty = empty_with_type(DataType::Utf8);
         let plan =
             LogicalPlan::Projection(Projection::try_new(vec![like_expr], 
empty, None)?);
@@ -904,12 +890,7 @@ mod test {
 
         let expr = Box::new(col("a"));
         let pattern = Box::new(lit(ScalarValue::Null));
-        let like_expr = Expr::Like {
-            negated: false,
-            expr,
-            pattern,
-            escape_char: None,
-        };
+        let like_expr = Expr::Like(Like::new(false, expr, pattern, None));
         let empty = empty_with_type(DataType::Utf8);
         let plan =
             LogicalPlan::Projection(Projection::try_new(vec![like_expr], 
empty, None)?);
@@ -924,12 +905,7 @@ mod test {
 
         let expr = Box::new(col("a"));
         let pattern = Box::new(lit(ScalarValue::new_utf8("abc")));
-        let like_expr = Expr::Like {
-            negated: false,
-            expr,
-            pattern,
-            escape_char: None,
-        };
+        let like_expr = Expr::Like(Like::new(false, expr, pattern, None));
         let empty = empty_with_type(DataType::Int64);
         let plan =
             LogicalPlan::Projection(Projection::try_new(vec![like_expr], 
empty, None)?);
diff --git a/datafusion/physical-expr/src/planner.rs 
b/datafusion/physical-expr/src/planner.rs
index 993891884..6a454f841 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::{binary_expr, Expr, Operator};
+use datafusion_expr::{binary_expr, Expr, Like, Operator};
 use std::sync::Arc;
 
 /// Create a physical expression from a logical expression ([Expr]).
@@ -201,12 +201,12 @@ pub fn create_physical_expr(
                 }
             }
         }
-        Expr::Like {
+        Expr::Like(Like {
             negated,
             expr,
             pattern,
             escape_char,
-        } => {
+        }) => {
             if escape_char.is_some() {
                 return Err(DataFusionError::Execution(
                     "LIKE does not support escape_char".to_string(),
diff --git a/datafusion/proto/src/from_proto.rs 
b/datafusion/proto/src/from_proto.rs
index ffbf62658..b85ec2eda 100644
--- a/datafusion/proto/src/from_proto.rs
+++ b/datafusion/proto/src/from_proto.rs
@@ -43,7 +43,7 @@ use datafusion_expr::{
     trim, trunc, upper, AggregateFunction, BuiltInWindowFunction, 
BuiltinScalarFunction,
     Case, Expr, GroupingSet,
     GroupingSet::GroupingSets,
-    Operator, WindowFrame, WindowFrameBound, WindowFrameUnits,
+    Like, Operator, WindowFrame, WindowFrameBound, WindowFrameUnits,
 };
 use std::sync::Arc;
 
@@ -926,24 +926,24 @@ pub fn parse_expr(
             low: Box::new(parse_required_expr(&between.low, registry, 
"expr")?),
             high: Box::new(parse_required_expr(&between.high, registry, 
"expr")?),
         }),
-        ExprType::Like(like) => Ok(Expr::Like {
-            expr: Box::new(parse_required_expr(&like.expr, registry, "expr")?),
-            negated: like.negated,
-            pattern: Box::new(parse_required_expr(&like.pattern, registry, 
"pattern")?),
-            escape_char: parse_escape_char(&like.escape_char)?,
-        }),
-        ExprType::Ilike(like) => Ok(Expr::ILike {
-            expr: Box::new(parse_required_expr(&like.expr, registry, "expr")?),
-            negated: like.negated,
-            pattern: Box::new(parse_required_expr(&like.pattern, registry, 
"pattern")?),
-            escape_char: parse_escape_char(&like.escape_char)?,
-        }),
-        ExprType::SimilarTo(like) => Ok(Expr::SimilarTo {
-            expr: Box::new(parse_required_expr(&like.expr, registry, "expr")?),
-            negated: like.negated,
-            pattern: Box::new(parse_required_expr(&like.pattern, registry, 
"pattern")?),
-            escape_char: parse_escape_char(&like.escape_char)?,
-        }),
+        ExprType::Like(like) => Ok(Expr::Like(Like::new(
+            like.negated,
+            Box::new(parse_required_expr(&like.expr, registry, "expr")?),
+            Box::new(parse_required_expr(&like.pattern, registry, "pattern")?),
+            parse_escape_char(&like.escape_char)?,
+        ))),
+        ExprType::Ilike(like) => Ok(Expr::ILike(Like::new(
+            like.negated,
+            Box::new(parse_required_expr(&like.expr, registry, "expr")?),
+            Box::new(parse_required_expr(&like.pattern, registry, "pattern")?),
+            parse_escape_char(&like.escape_char)?,
+        ))),
+        ExprType::SimilarTo(like) => Ok(Expr::SimilarTo(Like::new(
+            like.negated,
+            Box::new(parse_required_expr(&like.expr, registry, "expr")?),
+            Box::new(parse_required_expr(&like.pattern, registry, "pattern")?),
+            parse_escape_char(&like.escape_char)?,
+        ))),
         ExprType::Case(case) => {
             let when_then_expr = case
                 .when_then_expr
diff --git a/datafusion/proto/src/lib.rs b/datafusion/proto/src/lib.rs
index af5205cea..8d6344b79 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::{Case, GroupingSet};
+    use datafusion_expr::expr::{Case, GroupingSet, Like};
     use datafusion_expr::logical_plan::{Extension, UserDefinedLogicalNode};
     use datafusion_expr::{
         col, lit, Accumulator, AggregateFunction, AggregateState,
@@ -940,12 +940,12 @@ mod roundtrip_tests {
     #[test]
     fn roundtrip_like() {
         fn like(negated: bool, escape_char: Option<char>) {
-            let test_expr = Expr::Like {
+            let test_expr = Expr::Like(Like::new(
                 negated,
-                expr: Box::new(col("col")),
-                pattern: Box::new(lit("[0-9]+")),
+                Box::new(col("col")),
+                Box::new(lit("[0-9]+")),
                 escape_char,
-            };
+            ));
             let ctx = SessionContext::new();
             roundtrip_expr_test(test_expr, ctx);
         }
@@ -958,12 +958,12 @@ mod roundtrip_tests {
     #[test]
     fn roundtrip_ilike() {
         fn ilike(negated: bool, escape_char: Option<char>) {
-            let test_expr = Expr::ILike {
+            let test_expr = Expr::ILike(Like::new(
                 negated,
-                expr: Box::new(col("col")),
-                pattern: Box::new(lit("[0-9]+")),
+                Box::new(col("col")),
+                Box::new(lit("[0-9]+")),
                 escape_char,
-            };
+            ));
             let ctx = SessionContext::new();
             roundtrip_expr_test(test_expr, ctx);
         }
@@ -976,12 +976,12 @@ mod roundtrip_tests {
     #[test]
     fn roundtrip_similar_to() {
         fn similar_to(negated: bool, escape_char: Option<char>) {
-            let test_expr = Expr::SimilarTo {
+            let test_expr = Expr::SimilarTo(Like::new(
                 negated,
-                expr: Box::new(col("col")),
-                pattern: Box::new(lit("[0-9]+")),
+                Box::new(col("col")),
+                Box::new(lit("[0-9]+")),
                 escape_char,
-            };
+            ));
             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 3c4f01075..06a72eae2 100644
--- a/datafusion/proto/src/to_proto.rs
+++ b/datafusion/proto/src/to_proto.rs
@@ -34,7 +34,7 @@ use arrow::datatypes::{
     UnionMode,
 };
 use datafusion_common::{Column, DFField, DFSchemaRef, ScalarValue};
-use datafusion_expr::expr::GroupingSet;
+use datafusion_expr::expr::{GroupingSet, Like};
 use datafusion_expr::{
     logical_plan::PlanType, logical_plan::StringifiedPlan, AggregateFunction,
     BuiltInWindowFunction, BuiltinScalarFunction, Expr, WindowFrame, 
WindowFrameBound,
@@ -456,12 +456,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     expr_type: Some(ExprType::BinaryExpr(binary_expr)),
                 }
             }
-            Expr::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()?)),
@@ -474,12 +469,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     expr_type: Some(ExprType::Like(pb)),
                 }
             }
-            Expr::ILike {
-                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()?)),
@@ -492,12 +482,7 @@ impl TryFrom<&Expr> for protobuf::LogicalExprNode {
                     expr_type: Some(ExprType::Ilike(pb)),
                 }
             }
-            Expr::SimilarTo {
-                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()?)),
diff --git a/datafusion/row/src/writer.rs b/datafusion/row/src/writer.rs
index fcfaae976..e796be2a9 100644
--- a/datafusion/row/src/writer.rs
+++ b/datafusion/row/src/writer.rs
@@ -190,7 +190,7 @@ impl RowWriter {
     fn set_bool(&mut self, idx: usize, value: bool) {
         self.assert_index_valid(idx);
         let offset = self.field_offsets()[idx];
-        self.data[offset] = if value { 1 } else { 0 };
+        self.data[offset] = u8::from(value);
     }
 
     fn set_u8(&mut self, idx: usize, value: u8) {
diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs
index 12fa1ae6c..6575445f0 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::{Case, GroupingSet};
+use datafusion_expr::expr::{Case, GroupingSet, Like};
 use datafusion_expr::logical_plan::builder::project_with_alias;
 use datafusion_expr::logical_plan::{Filter, Subquery};
 use datafusion_expr::Expr::Alias;
@@ -1987,13 +1987,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                         "Invalid pattern in LIKE expression".to_string(),
                     ));
                 }
-                Ok(Expr::Like {
+                Ok(Expr::Like(Like::new(
                     negated,
-                    expr: Box::new(self.sql_expr_to_logical_expr(*expr, 
schema, ctes)?),
-                    pattern: Box::new(pattern),
+                    Box::new(self.sql_expr_to_logical_expr(*expr, schema, 
ctes)?),
+                    Box::new(pattern),
                     escape_char
-
-                })
+                )))
             }
 
             SQLExpr::ILike { negated, expr, pattern, escape_char } => {
@@ -2004,12 +2003,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                         "Invalid pattern in ILIKE expression".to_string(),
                     ));
                 }
-                Ok(Expr::ILike {
+                Ok(Expr::ILike(Like::new(
                     negated,
-                    expr: Box::new(self.sql_expr_to_logical_expr(*expr, 
schema, ctes)?),
-                    pattern: Box::new(pattern),
+                    Box::new(self.sql_expr_to_logical_expr(*expr, schema, 
ctes)?),
+                    Box::new(pattern),
                     escape_char
-                })
+                )))
             }
 
             SQLExpr::SimilarTo { negated, expr, pattern, escape_char } => {
@@ -2020,12 +2019,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                         "Invalid pattern in SIMILAR TO expression".to_string(),
                     ));
                 }
-                Ok(Expr::SimilarTo {
+                Ok(Expr::SimilarTo(Like::new(
                     negated,
-                    expr: Box::new(self.sql_expr_to_logical_expr(*expr, 
schema, ctes)?),
-                    pattern: Box::new(pattern),
+                    Box::new(self.sql_expr_to_logical_expr(*expr, schema, 
ctes)?),
+                    Box::new(pattern),
                     escape_char
-                })
+                )))
             }
 
             SQLExpr::BinaryOp {
diff --git a/datafusion/sql/src/utils.rs b/datafusion/sql/src/utils.rs
index 16f24deff..a786a21fc 100644
--- a/datafusion/sql/src/utils.rs
+++ b/datafusion/sql/src/utils.rs
@@ -21,7 +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::{Case, GroupingSet};
+use datafusion_expr::expr::{Case, GroupingSet, Like};
 use datafusion_expr::utils::{expr_as_column_expr, find_column_exprs};
 use datafusion_expr::{Expr, LogicalPlan};
 use std::collections::HashMap;
@@ -235,39 +235,39 @@ where
                 op: *op,
                 right: Box::new(clone_with_replacement(right, 
replacement_fn)?),
             }),
-            Expr::Like {
+            Expr::Like(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Ok(Expr::Like {
-                negated: *negated,
-                expr: Box::new(clone_with_replacement(expr, replacement_fn)?),
-                pattern: Box::new(clone_with_replacement(pattern, 
replacement_fn)?),
-                escape_char: *escape_char,
-            }),
-            Expr::ILike {
+            }) => Ok(Expr::Like(Like::new(
+                *negated,
+                Box::new(clone_with_replacement(expr, replacement_fn)?),
+                Box::new(clone_with_replacement(pattern, replacement_fn)?),
+                *escape_char,
+            ))),
+            Expr::ILike(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Ok(Expr::ILike {
-                negated: *negated,
-                expr: Box::new(clone_with_replacement(expr, replacement_fn)?),
-                pattern: Box::new(clone_with_replacement(pattern, 
replacement_fn)?),
-                escape_char: *escape_char,
-            }),
-            Expr::SimilarTo {
+            }) => Ok(Expr::ILike(Like::new(
+                *negated,
+                Box::new(clone_with_replacement(expr, replacement_fn)?),
+                Box::new(clone_with_replacement(pattern, replacement_fn)?),
+                *escape_char,
+            ))),
+            Expr::SimilarTo(Like {
                 negated,
                 expr,
                 pattern,
                 escape_char,
-            } => Ok(Expr::SimilarTo {
-                negated: *negated,
-                expr: Box::new(clone_with_replacement(expr, replacement_fn)?),
-                pattern: Box::new(clone_with_replacement(pattern, 
replacement_fn)?),
-                escape_char: *escape_char,
-            }),
+            }) => Ok(Expr::SimilarTo(Like::new(
+                *negated,
+                Box::new(clone_with_replacement(expr, replacement_fn)?),
+                Box::new(clone_with_replacement(pattern, replacement_fn)?),
+                *escape_char,
+            ))),
             Expr::Case(case) => Ok(Expr::Case(Case::new(
                 match &case.expr {
                     Some(case_expr) => {


Reply via email to