diff --git a/datafusion/optimizer/src/analyzer/function_rewrite.rs b/datafusion/optimizer/src/analyzer/function_rewrite.rs index d872edb740c5..098c934bf7e1 100644 --- a/datafusion/optimizer/src/analyzer/function_rewrite.rs +++ b/datafusion/optimizer/src/analyzer/function_rewrite.rs @@ -85,11 +85,6 @@ impl AnalyzerRule for ApplyFunctionRewrites { } fn analyze(&self, plan: LogicalPlan, options: &ConfigOptions) -> Result { - if self.function_rewrites.is_empty() { - // No need to walk the plan tree since there's nothing to rewrite - return Ok(plan); - } - plan.transform_up_with_subqueries(|plan| self.rewrite_plan(plan, options)) .map(|res| res.data) } diff --git a/datafusion/optimizer/src/analyzer/mod.rs b/datafusion/optimizer/src/analyzer/mod.rs index 32bb2bc70452..91ee8a9e1033 100644 --- a/datafusion/optimizer/src/analyzer/mod.rs +++ b/datafusion/optimizer/src/analyzer/mod.rs @@ -136,9 +136,15 @@ impl Analyzer { // Note this is run before all other rules since it rewrites based on // the argument types (List or Scalar), and TypeCoercion may cast the // argument types from Scalar to List. - let expr_to_function: Arc = - Arc::new(ApplyFunctionRewrites::new(self.function_rewrites.clone())); - let rules = std::iter::once(&expr_to_function).chain(self.rules.iter()); + let expr_to_function: Option> = + if self.function_rewrites.is_empty() { + None + } else { + Some(Arc::new(ApplyFunctionRewrites::new( + self.function_rewrites.clone(), + ))) + }; + let rules = expr_to_function.iter().chain(self.rules.iter()); // TODO add common rule executor for Analyzer and Optimizer for rule in rules { diff --git a/datafusion/sqllogictest/test_files/explain.slt b/datafusion/sqllogictest/test_files/explain.slt index 5a1733460120..eae4f428b4b4 100644 --- a/datafusion/sqllogictest/test_files/explain.slt +++ b/datafusion/sqllogictest/test_files/explain.slt @@ -176,7 +176,6 @@ EXPLAIN VERBOSE SELECT a, b, c FROM simple_explain_test initial_logical_plan 01)Projection: simple_explain_test.a, simple_explain_test.b, simple_explain_test.c 02)--TableScan: simple_explain_test -logical_plan after apply_function_rewrites SAME TEXT AS ABOVE logical_plan after inline_table_scan SAME TEXT AS ABOVE logical_plan after type_coercion SAME TEXT AS ABOVE logical_plan after count_wildcard_rule SAME TEXT AS ABOVE