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

github-bot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 4a7330fa30 Add a builder to `SimplifyContext` to avoid allocating 
default values (#21092)
4a7330fa30 is described below

commit 4a7330fa309f5fd1614a032f87b9507c211b7d28
Author: Adam Gutglick <[email protected]>
AuthorDate: Mon Mar 23 16:49:43 2026 +0000

    Add a builder to `SimplifyContext` to avoid allocating default values 
(#21092)
    
    ## Which issue does this PR close?
    
    - Closes #.
    
    ## Rationale for this change
    
    This is a follow up to #21084, where @blaginin realized that allocating
    `ConfigOptions` has this surprising side effect. Reading through how its
    used I realized that on mode "real" code paths (and in many tests),
    DataFusion ends up allocating the default values of `SimplifyContext`
    just to immediately drop them and override them with pre-existing
    clone-able data.
    
    ## What changes are included in this PR?
    
    Adds a new type `SimplifyContextBuilder` and `SimplifyContext::builder`
    
    ## Are these changes tested?
    
    Includes a couple of tests to make sure the builder makes sense, in
    addition to many existing tests.
    
    ## Are there any user-facing changes?
    
    As noted above, new type and a new function on an existing type.
    
    <!--
    If there are any breaking changes to public APIs, please add the `api
    change` label.
    -->
    
    ---------
    
    Signed-off-by: Adam Gutglick <[email protected]>
    Co-authored-by: Andrew Lamb <[email protected]>
---
 .../examples/query_planning/expr_api.rs            |  15 +--
 datafusion/core/src/execution/context/mod.rs       |   5 +-
 datafusion/core/src/execution/session_state.rs     |  10 +-
 datafusion/core/src/test_util/parquet.rs           |   4 +-
 datafusion/core/tests/expr_api/mod.rs              |   4 +-
 datafusion/core/tests/expr_api/simplification.rs   |  21 +++--
 datafusion/expr/src/simplify.rs                    | 104 +++++++++++++++++++++
 datafusion/functions-nested/src/array_has.rs       |  11 ++-
 datafusion/functions/src/datetime/current_time.rs  |   3 +-
 datafusion/optimizer/src/decorrelate.rs            |  10 +-
 .../src/simplify_expressions/expr_simplifier.rs    |  79 ++++++++++------
 .../src/simplify_expressions/simplify_exprs.rs     |   5 +-
 .../src/simplify_expressions/simplify_literal.rs   |   7 +-
 .../src/simplify_expressions/udf_preimage.rs       |   4 +-
 .../src/simplify_expressions/unwrap_cast.rs        |   4 +-
 15 files changed, 222 insertions(+), 64 deletions(-)

diff --git a/datafusion-examples/examples/query_planning/expr_api.rs 
b/datafusion-examples/examples/query_planning/expr_api.rs
index 386273c728..94589a2470 100644
--- a/datafusion-examples/examples/query_planning/expr_api.rs
+++ b/datafusion-examples/examples/query_planning/expr_api.rs
@@ -175,9 +175,10 @@ fn simplify_demo() -> Result<()> {
     // the ExecutionProps carries information needed to simplify
     // expressions, such as the current time (to evaluate `now()`
     // correctly)
-    let context = SimplifyContext::default()
+    let context = SimplifyContext::builder()
         .with_schema(schema)
-        .with_current_time();
+        .with_current_time()
+        .build();
     let simplifier = ExprSimplifier::new(context);
 
     // And then call the simplify_expr function:
@@ -192,9 +193,10 @@ fn simplify_demo() -> Result<()> {
 
     // here are some other examples of what DataFusion is capable of
     let schema = Schema::new(vec![make_field("i", 
DataType::Int64)]).to_dfschema_ref()?;
-    let context = SimplifyContext::default()
+    let context = SimplifyContext::builder()
         .with_schema(Arc::clone(&schema))
-        .with_current_time();
+        .with_current_time()
+        .build();
     let simplifier = ExprSimplifier::new(context);
 
     // basic arithmetic simplification
@@ -554,9 +556,10 @@ fn type_coercion_demo() -> Result<()> {
     assert!(physical_expr.evaluate(&batch).is_ok());
 
     // 2. Type coercion with `ExprSimplifier::coerce`.
-    let context = SimplifyContext::default()
+    let context = SimplifyContext::builder()
         .with_schema(Arc::new(df_schema.clone()))
-        .with_current_time();
+        .with_current_time()
+        .build();
     let simplifier = ExprSimplifier::new(context);
     let coerced_expr = simplifier.coerce(expr.clone(), &df_schema)?;
     let physical_expr = datafusion::physical_expr::create_physical_expr(
diff --git a/datafusion/core/src/execution/context/mod.rs 
b/datafusion/core/src/execution/context/mod.rs
index 5dbae61fc5..1731120558 100644
--- a/datafusion/core/src/execution/context/mod.rs
+++ b/datafusion/core/src/execution/context/mod.rs
@@ -1488,12 +1488,13 @@ impl SessionContext {
         })?;
 
         let state = self.state.read();
-        let context = SimplifyContext::default()
+        let context = SimplifyContext::builder()
             .with_schema(Arc::clone(prepared.plan.schema()))
             .with_config_options(Arc::clone(state.config_options()))
             .with_query_execution_start_time(
                 state.execution_props().query_execution_start_time,
-            );
+            )
+            .build();
         let simplifier = ExprSimplifier::new(context);
 
         // Only allow literals as parameters for now.
diff --git a/datafusion/core/src/execution/session_state.rs 
b/datafusion/core/src/execution/session_state.rs
index 9560616c1b..347c8eb3d2 100644
--- a/datafusion/core/src/execution/session_state.rs
+++ b/datafusion/core/src/execution/session_state.rs
@@ -743,12 +743,13 @@ impl SessionState {
         df_schema: &DFSchema,
     ) -> datafusion_common::Result<Arc<dyn PhysicalExpr>> {
         let config_options = self.config_options();
-        let simplify_context = SimplifyContext::default()
+        let simplify_context = SimplifyContext::builder()
             .with_schema(Arc::new(df_schema.clone()))
             .with_config_options(Arc::clone(config_options))
             .with_query_execution_start_time(
                 self.execution_props().query_execution_start_time,
-            );
+            )
+            .build();
         let simplifier = ExprSimplifier::new(simplify_context);
         // apply type coercion here to ensure types match
         let mut expr = simplifier.coerce(expr, df_schema)?;
@@ -1835,11 +1836,12 @@ impl ContextProvider for SessionContextProvider<'_> {
             .get(name)
             .cloned()
             .ok_or_else(|| plan_datafusion_err!("table function '{name}' not 
found"))?;
-        let simplify_context = SimplifyContext::default()
+        let simplify_context = SimplifyContext::builder()
             .with_config_options(Arc::clone(self.state.config_options()))
             .with_query_execution_start_time(
                 self.state.execution_props().query_execution_start_time,
-            );
+            )
+            .build();
         let simplifier = ExprSimplifier::new(simplify_context);
         let schema = DFSchema::empty();
         let args = args
diff --git a/datafusion/core/src/test_util/parquet.rs 
b/datafusion/core/src/test_util/parquet.rs
index dba017f83b..53084fd9a0 100644
--- a/datafusion/core/src/test_util/parquet.rs
+++ b/datafusion/core/src/test_util/parquet.rs
@@ -166,7 +166,9 @@ impl TestParquetFile {
         let df_schema = Arc::clone(&self.schema).to_dfschema_ref()?;
 
         // run coercion on the filters to coerce types etc.
-        let context = 
SimplifyContext::default().with_schema(Arc::clone(&df_schema));
+        let context = SimplifyContext::builder()
+            .with_schema(Arc::clone(&df_schema))
+            .build();
         if let Some(filter) = maybe_filter {
             let simplifier = ExprSimplifier::new(context);
             let filter = simplifier.coerce(filter, &df_schema).unwrap();
diff --git a/datafusion/core/tests/expr_api/mod.rs 
b/datafusion/core/tests/expr_api/mod.rs
index 91dd5de7fc..8726c5aec9 100644
--- a/datafusion/core/tests/expr_api/mod.rs
+++ b/datafusion/core/tests/expr_api/mod.rs
@@ -421,7 +421,9 @@ fn create_simplified_expr_test(expr: Expr, expected_expr: 
&str) {
     let df_schema = DFSchema::try_from(batch.schema()).unwrap();
 
     // Simplify the expression first
-    let simplify_context = 
SimplifyContext::default().with_schema(Arc::new(df_schema));
+    let simplify_context = SimplifyContext::builder()
+        .with_schema(Arc::new(df_schema))
+        .build();
     let simplifier = ExprSimplifier::new(simplify_context).with_max_cycles(10);
     let simplified = simplifier.simplify(expr).unwrap();
     create_expr_test(simplified, expected_expr);
diff --git a/datafusion/core/tests/expr_api/simplification.rs 
b/datafusion/core/tests/expr_api/simplification.rs
index 02f2503faf..245aba6684 100644
--- a/datafusion/core/tests/expr_api/simplification.rs
+++ b/datafusion/core/tests/expr_api/simplification.rs
@@ -88,9 +88,10 @@ fn test_evaluate_with_start_time(
     expected_expr: Expr,
     date_time: &DateTime<Utc>,
 ) {
-    let context = SimplifyContext::default()
+    let context = SimplifyContext::builder()
         .with_schema(schema())
-        .with_query_execution_start_time(Some(*date_time));
+        .with_query_execution_start_time(Some(*date_time))
+        .build();
     let simplifier = ExprSimplifier::new(context);
     let simplified_expr = simplifier
         .simplify(input_expr.clone())
@@ -153,9 +154,10 @@ fn to_timestamp_expr(arg: impl Into<String>) -> Expr {
 
 #[test]
 fn basic() {
-    let context = SimplifyContext::default()
+    let context = SimplifyContext::builder()
         .with_schema(schema())
-        .with_query_execution_start_time(Some(Utc::now()));
+        .with_query_execution_start_time(Some(Utc::now()))
+        .build();
 
     // The `Expr` is a core concept in DataFusion, and DataFusion can
     // help simplify it.
@@ -171,7 +173,7 @@ fn basic() {
 
 #[test]
 fn fold_and_simplify() {
-    let context = SimplifyContext::default().with_schema(schema());
+    let context = SimplifyContext::builder().with_schema(schema()).build();
 
     // What will it do with the expression `concat('foo', 'bar') == 'foobar')`?
     let expr = concat(vec![lit("foo"), lit("bar")]).eq(lit("foobar"));
@@ -565,7 +567,9 @@ fn expr_test_schema() -> DFSchemaRef {
 }
 
 fn test_simplify(input_expr: Expr, expected_expr: Expr) {
-    let context = SimplifyContext::default().with_schema(expr_test_schema());
+    let context = SimplifyContext::builder()
+        .with_schema(expr_test_schema())
+        .build();
     let simplifier = ExprSimplifier::new(context);
     let simplified_expr = simplifier
         .simplify(input_expr.clone())
@@ -581,9 +585,10 @@ fn test_simplify_with_cycle_count(
     expected_expr: Expr,
     expected_count: u32,
 ) {
-    let context = SimplifyContext::default()
+    let context = SimplifyContext::builder()
         .with_schema(expr_test_schema())
-        .with_query_execution_start_time(Some(Utc::now()));
+        .with_query_execution_start_time(Some(Utc::now()))
+        .build();
     let simplifier = ExprSimplifier::new(context);
     let (simplified_expr, count) = simplifier
         .simplify_with_cycle_count_transformed(input_expr.clone())
diff --git a/datafusion/expr/src/simplify.rs b/datafusion/expr/src/simplify.rs
index 8c68067a55..522cf122a2 100644
--- a/datafusion/expr/src/simplify.rs
+++ b/datafusion/expr/src/simplify.rs
@@ -40,6 +40,14 @@ pub struct SimplifyContext {
     config_options: Arc<ConfigOptions>,
 }
 
+/// Builder for [`SimplifyContext`].
+#[derive(Debug, Default)]
+pub struct SimplifyContextBuilder {
+    schema: Option<DFSchemaRef>,
+    query_execution_start_time: Option<DateTime<Utc>>,
+    config_options: Option<Arc<ConfigOptions>>,
+}
+
 impl Default for SimplifyContext {
     fn default() -> Self {
         Self {
@@ -51,18 +59,35 @@ impl Default for SimplifyContext {
 }
 
 impl SimplifyContext {
+    /// Returns a builder for [`SimplifyContext`].
+    pub fn builder() -> SimplifyContextBuilder {
+        SimplifyContextBuilder::default()
+    }
+
+    #[deprecated(
+        since = "54.0.0",
+        note = "Use SimplifyContextBuilder if you intend to use non-default 
values."
+    )]
     /// Set the [`ConfigOptions`] for this context
     pub fn with_config_options(mut self, config_options: Arc<ConfigOptions>) 
-> Self {
         self.config_options = config_options;
         self
     }
 
+    #[deprecated(
+        since = "54.0.0",
+        note = "Use SimplifyContextBuilder if you intend to use non-default 
values."
+    )]
     /// Set the schema for this context
     pub fn with_schema(mut self, schema: DFSchemaRef) -> Self {
         self.schema = schema;
         self
     }
 
+    #[deprecated(
+        since = "54.0.0",
+        note = "Use SimplifyContextBuilder if you intend to use non-default 
values."
+    )]
     /// Set the query execution start time
     pub fn with_query_execution_start_time(
         mut self,
@@ -72,6 +97,10 @@ impl SimplifyContext {
         self
     }
 
+    #[deprecated(
+        since = "54.0.0",
+        note = "Use SimplifyContextBuilder if you intend to use non-default 
values."
+    )]
     /// Set the query execution start to the current time
     pub fn with_current_time(mut self) -> Self {
         self.query_execution_start_time = Some(Utc::now());
@@ -110,6 +139,46 @@ impl SimplifyContext {
     }
 }
 
+impl SimplifyContextBuilder {
+    /// Set the [`ConfigOptions`] for this context.
+    pub fn with_config_options(mut self, config_options: Arc<ConfigOptions>) 
-> Self {
+        self.config_options = Some(config_options);
+        self
+    }
+
+    /// Set the schema for this context.
+    pub fn with_schema(mut self, schema: DFSchemaRef) -> Self {
+        self.schema = Some(schema);
+        self
+    }
+
+    /// Set the query execution start time.
+    pub fn with_query_execution_start_time(
+        mut self,
+        query_execution_start_time: Option<DateTime<Utc>>,
+    ) -> Self {
+        self.query_execution_start_time = query_execution_start_time;
+        self
+    }
+
+    /// Set the query execution start to the current time.
+    pub fn with_current_time(mut self) -> Self {
+        self.query_execution_start_time = Some(Utc::now());
+        self
+    }
+
+    /// Build a [`SimplifyContext`], filling in any unspecified fields with 
defaults.
+    pub fn build(self) -> SimplifyContext {
+        SimplifyContext {
+            schema: self.schema.unwrap_or_else(|| Arc::new(DFSchema::empty())),
+            query_execution_start_time: self.query_execution_start_time,
+            config_options: self
+                .config_options
+                .unwrap_or_else(|| Arc::new(ConfigOptions::default())),
+        }
+    }
+}
+
 /// Was the expression simplified?
 #[derive(Debug)]
 pub enum ExprSimplifyResult {
@@ -119,3 +188,38 @@ pub enum ExprSimplifyResult {
     /// are return unmodified.
     Original(Vec<Expr>),
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn simplify_context_builder_builds_default_context() {
+        let context = SimplifyContext::builder().build();
+        let default_options = ConfigOptions::default();
+
+        assert_eq!(context.schema().as_ref(), &DFSchema::empty());
+        assert_eq!(context.query_execution_start_time(), None);
+        assert_eq!(
+            context.config_options().optimizer.max_passes,
+            default_options.optimizer.max_passes
+        );
+    }
+
+    #[test]
+    fn simplify_context_builder_uses_overrides() {
+        let schema = Arc::new(DFSchema::empty());
+        let config_options = Arc::new(ConfigOptions::default());
+        let current_time = Utc::now();
+
+        let context = SimplifyContext::builder()
+            .with_schema(Arc::clone(&schema))
+            .with_config_options(Arc::clone(&config_options))
+            .with_query_execution_start_time(Some(current_time))
+            .build();
+
+        assert_eq!(context.schema().as_ref(), schema.as_ref());
+        assert_eq!(context.query_execution_start_time(), Some(current_time));
+        assert!(Arc::ptr_eq(context.config_options(), &config_options));
+    }
+}
diff --git a/datafusion/functions-nested/src/array_has.rs 
b/datafusion/functions-nested/src/array_has.rs
index 03ba0adde0..872cdc7300 100644
--- a/datafusion/functions-nested/src/array_has.rs
+++ b/datafusion/functions-nested/src/array_has.rs
@@ -999,6 +999,7 @@ mod tests {
         DataFusionError, ScalarValue, config::ConfigOptions,
         utils::SingleRowListArrayBuilder,
     };
+    use datafusion_expr::simplify::SimplifyContext;
     use datafusion_expr::{
         ColumnarValue, Expr, ScalarFunctionArgs, ScalarUDFImpl, col, lit,
         simplify::ExprSimplifyResult,
@@ -1017,7 +1018,7 @@ mod tests {
         .build_list_scalar());
         let needle = col("c");
 
-        let context = datafusion_expr::simplify::SimplifyContext::default();
+        let context = SimplifyContext::default();
 
         let Ok(ExprSimplifyResult::Simplified(Expr::InList(in_list))) =
             ArrayHas::new().simplify(vec![haystack, needle.clone()], &context)
@@ -1040,7 +1041,7 @@ mod tests {
         let haystack = make_array(vec![lit(1), lit(2), lit(3)]);
         let needle = col("c");
 
-        let context = datafusion_expr::simplify::SimplifyContext::default();
+        let context = SimplifyContext::default();
 
         let Ok(ExprSimplifyResult::Simplified(Expr::InList(in_list))) =
             ArrayHas::new().simplify(vec![haystack, needle.clone()], &context)
@@ -1063,7 +1064,7 @@ mod tests {
         let haystack = Expr::Literal(ScalarValue::Null, None);
         let needle = col("c");
 
-        let context = datafusion_expr::simplify::SimplifyContext::default();
+        let context = SimplifyContext::default();
         let Ok(ExprSimplifyResult::Simplified(simplified)) =
             ArrayHas::new().simplify(vec![haystack, needle], &context)
         else {
@@ -1080,7 +1081,7 @@ mod tests {
         let haystack = Expr::Literal(ScalarValue::List(Arc::new(haystack)), 
None);
         let needle = col("c");
 
-        let context = datafusion_expr::simplify::SimplifyContext::default();
+        let context = SimplifyContext::default();
         let Ok(ExprSimplifyResult::Simplified(simplified)) =
             ArrayHas::new().simplify(vec![haystack, needle], &context)
         else {
@@ -1095,7 +1096,7 @@ mod tests {
         let haystack = col("c1");
         let needle = col("c2");
 
-        let context = datafusion_expr::simplify::SimplifyContext::default();
+        let context = SimplifyContext::default();
 
         let Ok(ExprSimplifyResult::Original(args)) =
             ArrayHas::new().simplify(vec![haystack, needle.clone()], &context)
diff --git a/datafusion/functions/src/datetime/current_time.rs 
b/datafusion/functions/src/datetime/current_time.rs
index 9b3e21d5d6..9f1e3ead01 100644
--- a/datafusion/functions/src/datetime/current_time.rs
+++ b/datafusion/functions/src/datetime/current_time.rs
@@ -151,10 +151,11 @@ mod tests {
             Some(tz.to_string())
         };
         let schema = Arc::new(DFSchema::empty());
-        SimplifyContext::default()
+        SimplifyContext::builder()
             .with_schema(schema)
             .with_config_options(Arc::new(config))
             .with_query_execution_start_time(Some(start_time))
+            .build()
     }
 
     #[test]
diff --git a/datafusion/optimizer/src/decorrelate.rs 
b/datafusion/optimizer/src/decorrelate.rs
index 52d777f874..e7bc62e8da 100644
--- a/datafusion/optimizer/src/decorrelate.rs
+++ b/datafusion/optimizer/src/decorrelate.rs
@@ -508,7 +508,9 @@ fn agg_exprs_evaluation_result_on_empty_batch(
             .data()?;
 
         let result_expr = result_expr.unalias();
-        let info = SimplifyContext::default().with_schema(Arc::clone(schema));
+        let info = SimplifyContext::builder()
+            .with_schema(Arc::clone(schema))
+            .build();
         let simplifier = ExprSimplifier::new(info);
         let result_expr = simplifier.simplify(result_expr)?;
         expr_result_map_for_count_bug.insert(e.schema_name().to_string(), 
result_expr);
@@ -541,7 +543,9 @@ fn proj_exprs_evaluation_result_on_empty_batch(
             .data()?;
 
         if result_expr.ne(expr) {
-            let info = 
SimplifyContext::default().with_schema(Arc::clone(schema));
+            let info = SimplifyContext::builder()
+                .with_schema(Arc::clone(schema))
+                .build();
             let simplifier = ExprSimplifier::new(info);
             let result_expr = simplifier.simplify(result_expr)?;
             let expr_name = match expr {
@@ -581,7 +585,7 @@ fn filter_exprs_evaluation_result_on_empty_batch(
         .data()?;
 
     let pull_up_expr = if result_expr.ne(filter_expr) {
-        let info = SimplifyContext::default().with_schema(schema);
+        let info = SimplifyContext::builder().with_schema(schema).build();
         let simplifier = ExprSimplifier::new(info);
         let result_expr = simplifier.simplify(result_expr)?;
         match &result_expr {
diff --git a/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs 
b/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
index a26ed4a85a..12449ed2f4 100644
--- a/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
+++ b/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
@@ -87,7 +87,7 @@ use regex::Regex;
 ///     .unwrap();
 ///
 /// // Create the simplifier
-/// let context = SimplifyContext::default().with_schema(schema);
+/// let context = SimplifyContext::builder().with_schema(schema).build();
 /// let simplifier = ExprSimplifier::new(context);
 ///
 /// // Use the simplifier
@@ -157,7 +157,7 @@ impl ExprSimplifier {
     ///     .to_dfschema_ref()
     ///     .unwrap();
     /// // Create the simplifier
-    /// let context = SimplifyContext::default().with_schema(schema);
+    /// let context = SimplifyContext::builder().with_schema(schema).build();
     /// let simplifier = ExprSimplifier::new(context);
     ///
     /// // b < 2
@@ -285,7 +285,7 @@ impl ExprSimplifier {
     /// .unwrap();
     ///
     /// // Create the simplifier
-    /// let context = SimplifyContext::default().with_schema(schema);
+    /// let context = SimplifyContext::builder().with_schema(schema).build();
     ///
     /// // Expression: (x >= 3) AND (y + 2 < 10) AND (z > 5)
     /// let expr_x = col("x").gt_eq(lit(3_i64));
@@ -345,7 +345,7 @@ impl ExprSimplifier {
     /// .unwrap();
     ///
     /// // Create the simplifier
-    /// let context = SimplifyContext::default().with_schema(schema);
+    /// let context = SimplifyContext::builder().with_schema(schema).build();
     /// let simplifier = ExprSimplifier::new(context);
     ///
     /// // Expression: a = c AND 1 = b
@@ -399,7 +399,7 @@ impl ExprSimplifier {
     ///   .to_dfschema_ref().unwrap();
     ///
     /// // Create the simplifier
-    /// let context = SimplifyContext::default().with_schema(schema);
+    /// let context = SimplifyContext::builder().with_schema(schema).build();
     /// let simplifier = ExprSimplifier::new(context);
     ///
     /// // Expression: a IS NOT NULL
@@ -2380,8 +2380,11 @@ mod tests {
     // ------------------------------
     #[test]
     fn api_basic() {
-        let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(test_schema()));
+        let simplifier = ExprSimplifier::new(
+            SimplifyContext::builder()
+                .with_schema(test_schema())
+                .build(),
+        );
 
         let expr = lit(1) + lit(2);
         let expected = lit(3);
@@ -2392,7 +2395,9 @@ mod tests {
     fn basic_coercion() {
         let schema = test_schema();
         let simplifier = ExprSimplifier::new(
-            SimplifyContext::default().with_schema(Arc::clone(&schema)),
+            SimplifyContext::builder()
+                .with_schema(Arc::clone(&schema))
+                .build(),
         );
 
         // Note expr type is int32 (not int64)
@@ -2420,8 +2425,11 @@ mod tests {
 
     #[test]
     fn simplify_and_constant_prop() {
-        let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(test_schema()));
+        let simplifier = ExprSimplifier::new(
+            SimplifyContext::builder()
+                .with_schema(test_schema())
+                .build(),
+        );
 
         // should be able to simplify to false
         // (i * (1 - 2)) > 0
@@ -2432,8 +2440,11 @@ mod tests {
 
     #[test]
     fn simplify_and_constant_prop_with_case() {
-        let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(test_schema()));
+        let simplifier = ExprSimplifier::new(
+            SimplifyContext::builder()
+                .with_schema(test_schema())
+                .build(),
+        );
 
         //   CASE
         //     WHEN i>5 AND false THEN i > 5
@@ -3569,14 +3580,16 @@ mod tests {
     fn try_simplify(expr: Expr) -> Result<Expr> {
         let schema = expr_test_schema();
         let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(schema));
+            
ExprSimplifier::new(SimplifyContext::builder().with_schema(schema).build());
         simplifier.simplify(expr)
     }
 
     fn coerce(expr: Expr) -> Expr {
         let schema = expr_test_schema();
         let simplifier = ExprSimplifier::new(
-            SimplifyContext::default().with_schema(Arc::clone(&schema)),
+            SimplifyContext::builder()
+                .with_schema(Arc::clone(&schema))
+                .build(),
         );
         simplifier.coerce(expr, schema.as_ref()).unwrap()
     }
@@ -3588,7 +3601,7 @@ mod tests {
     fn try_simplify_with_cycle_count(expr: Expr) -> Result<(Expr, u32)> {
         let schema = expr_test_schema();
         let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(schema));
+            
ExprSimplifier::new(SimplifyContext::builder().with_schema(schema).build());
         let (expr, count) = 
simplifier.simplify_with_cycle_count_transformed(expr)?;
         Ok((expr.data, count))
     }
@@ -3603,7 +3616,7 @@ mod tests {
     ) -> Expr {
         let schema = expr_test_schema();
         let simplifier =
-            ExprSimplifier::new(SimplifyContext::default().with_schema(schema))
+            
ExprSimplifier::new(SimplifyContext::builder().with_schema(schema).build())
                 .with_guarantees(guarantees);
         simplifier.simplify(expr).unwrap()
     }
@@ -4506,7 +4519,7 @@ mod tests {
     fn just_simplifier_simplify_null_in_empty_inlist() {
         let simplify = |expr: Expr| -> Expr {
             let schema = expr_test_schema();
-            let info = SimplifyContext::default().with_schema(schema);
+            let info = SimplifyContext::builder().with_schema(schema).build();
             let simplifier = &mut Simplifier::new(&info);
             expr.rewrite(simplifier)
                 .expect("Failed to simplify expression")
@@ -4874,7 +4887,7 @@ mod tests {
     fn simplify_common_factor_conjunction_in_disjunction() {
         let schema = boolean_test_schema();
         let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(schema));
+            
ExprSimplifier::new(SimplifyContext::builder().with_schema(schema).build());
 
         let a = || col("A");
         let b = || col("B");
@@ -5205,7 +5218,7 @@ mod tests {
         // The simplification should now fail with an error at plan time
         let schema = test_schema();
         let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(schema));
+            
ExprSimplifier::new(SimplifyContext::builder().with_schema(schema).build());
         let result = simplifier.simplify(expr);
         assert!(result.is_err(), "Expected error for invalid cast");
         let err_msg = result.unwrap_err().to_string();
@@ -5260,8 +5273,11 @@ mod tests {
 
         let expr = make_struct_cast_expr(source_fields, target_fields);
 
-        let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(test_schema()));
+        let simplifier = ExprSimplifier::new(
+            SimplifyContext::builder()
+                .with_schema(test_schema())
+                .build(),
+        );
 
         // The cast should remain unchanged since field counts differ
         let result = simplifier.simplify(expr.clone()).unwrap();
@@ -5288,8 +5304,11 @@ mod tests {
 
         let expr = make_struct_cast_expr(source_fields, target_fields);
 
-        let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(test_schema()));
+        let simplifier = ExprSimplifier::new(
+            SimplifyContext::builder()
+                .with_schema(test_schema())
+                .build(),
+        );
 
         // The cast should be simplified
         let result = simplifier.simplify(expr.clone()).unwrap();
@@ -5319,8 +5338,11 @@ mod tests {
 
         let expr = make_struct_cast_expr(source_fields, target_fields);
 
-        let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(test_schema()));
+        let simplifier = ExprSimplifier::new(
+            SimplifyContext::builder()
+                .with_schema(test_schema())
+                .build(),
+        );
 
         // The cast should remain unchanged because there is no name overlap
         let result = simplifier.simplify(expr.clone()).unwrap();
@@ -5361,8 +5383,11 @@ mod tests {
             DataType::Struct(target_fields),
         ));
 
-        let simplifier =
-            
ExprSimplifier::new(SimplifyContext::default().with_schema(test_schema()));
+        let simplifier = ExprSimplifier::new(
+            SimplifyContext::builder()
+                .with_schema(test_schema())
+                .build(),
+        );
 
         // The cast should remain unchanged since the struct array is empty 
(0-row)
         let result = simplifier.simplify(expr.clone()).unwrap();
diff --git a/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs 
b/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
index 29ee593422..3e495f5355 100644
--- a/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
+++ b/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
@@ -98,10 +98,11 @@ impl SimplifyExpressions {
             Arc::new(DFSchema::empty())
         };
 
-        let info = SimplifyContext::default()
+        let info = SimplifyContext::builder()
             .with_schema(schema)
             .with_config_options(config.options())
-            
.with_query_execution_start_time(config.query_execution_start_time());
+            
.with_query_execution_start_time(config.query_execution_start_time())
+            .build();
 
         // Inputs have already been rewritten (due to bottom-up traversal 
handled by Optimizer)
         // Just need to rewrite our own expressions
diff --git a/datafusion/optimizer/src/simplify_expressions/simplify_literal.rs 
b/datafusion/optimizer/src/simplify_expressions/simplify_literal.rs
index b77240fc53..72e9dbc99d 100644
--- a/datafusion/optimizer/src/simplify_expressions/simplify_literal.rs
+++ b/datafusion/optimizer/src/simplify_expressions/simplify_literal.rs
@@ -51,8 +51,11 @@ where
 
     log::debug!("Parsing expr {:?} to type {}", expr, T::DATA_TYPE);
 
-    let simplifier =
-        
ExprSimplifier::new(SimplifyContext::default().with_schema(Arc::clone(&schema)));
+    let simplifier = ExprSimplifier::new(
+        SimplifyContext::builder()
+            .with_schema(Arc::clone(&schema))
+            .build(),
+    );
 
     // Simplify and coerce expression in case of constant arithmetic 
operations (e.g., 10 + 5)
     let simplified_expr: Expr = simplifier
diff --git a/datafusion/optimizer/src/simplify_expressions/udf_preimage.rs 
b/datafusion/optimizer/src/simplify_expressions/udf_preimage.rs
index da2716d13c..644d971234 100644
--- a/datafusion/optimizer/src/simplify_expressions/udf_preimage.rs
+++ b/datafusion/optimizer/src/simplify_expressions/udf_preimage.rs
@@ -179,7 +179,9 @@ mod test {
     }
 
     fn optimize_test(expr: Expr, schema: &DFSchemaRef) -> Expr {
-        let simplify_context = 
SimplifyContext::default().with_schema(Arc::clone(schema));
+        let simplify_context = SimplifyContext::builder()
+            .with_schema(Arc::clone(schema))
+            .build();
         ExprSimplifier::new(simplify_context)
             .simplify(expr)
             .unwrap()
diff --git a/datafusion/optimizer/src/simplify_expressions/unwrap_cast.rs 
b/datafusion/optimizer/src/simplify_expressions/unwrap_cast.rs
index acf0f32ab2..a5b65d0d8e 100644
--- a/datafusion/optimizer/src/simplify_expressions/unwrap_cast.rs
+++ b/datafusion/optimizer/src/simplify_expressions/unwrap_cast.rs
@@ -588,7 +588,9 @@ mod tests {
 
     fn optimize_test(expr: Expr, schema: &DFSchemaRef) -> Expr {
         let simplifier = ExprSimplifier::new(
-            SimplifyContext::default().with_schema(Arc::clone(schema)),
+            SimplifyContext::builder()
+                .with_schema(Arc::clone(schema))
+                .build(),
         );
 
         simplifier.simplify(expr).unwrap()


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to