You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by al...@apache.org on 2024/09/23 17:15:39 UTC

(datafusion) branch main updated: Require `Debug` for `AnalyzerRule`, `FunctionRewriter`, and `OptimizerRule` (#12556)

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

alamb 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 2e274bfbdf Require `Debug` for `AnalyzerRule`, `FunctionRewriter`, and `OptimizerRule` (#12556)
2e274bfbdf is described below

commit 2e274bfbdfc19f11b2951456bb2a48e88733c9bf
Author: Andrew Lamb <an...@nerdnetworks.org>
AuthorDate: Mon Sep 23 13:15:35 2024 -0400

    Require `Debug` for `AnalyzerRule`, `FunctionRewriter`, and `OptimizerRule` (#12556)
---
 datafusion-examples/examples/optimizer_rule.rs                  | 1 +
 datafusion/core/src/execution/session_state.rs                  | 1 +
 datafusion/core/tests/user_defined/user_defined_plan.rs         | 3 +++
 datafusion/expr/src/expr_rewriter/mod.rs                        | 3 ++-
 datafusion/optimizer/src/analyzer/count_wildcard_rule.rs        | 2 +-
 datafusion/optimizer/src/analyzer/expand_wildcard_rule.rs       | 2 +-
 datafusion/optimizer/src/analyzer/function_rewrite.rs           | 2 +-
 datafusion/optimizer/src/analyzer/inline_table_scan.rs          | 2 +-
 datafusion/optimizer/src/analyzer/mod.rs                        | 6 ++++--
 datafusion/optimizer/src/analyzer/type_coercion.rs              | 2 +-
 datafusion/optimizer/src/common_subexpr_eliminate.rs            | 1 +
 datafusion/optimizer/src/decorrelate_predicate_subquery.rs      | 2 +-
 datafusion/optimizer/src/eliminate_cross_join.rs                | 2 +-
 datafusion/optimizer/src/eliminate_duplicated_expr.rs           | 2 +-
 datafusion/optimizer/src/eliminate_filter.rs                    | 2 +-
 datafusion/optimizer/src/eliminate_group_by_constant.rs         | 2 +-
 datafusion/optimizer/src/eliminate_join.rs                      | 2 +-
 datafusion/optimizer/src/eliminate_limit.rs                     | 2 +-
 datafusion/optimizer/src/eliminate_nested_union.rs              | 2 +-
 datafusion/optimizer/src/eliminate_one_union.rs                 | 2 +-
 datafusion/optimizer/src/eliminate_outer_join.rs                | 2 +-
 datafusion/optimizer/src/extract_equijoin_predicate.rs          | 2 +-
 datafusion/optimizer/src/filter_null_join_keys.rs               | 2 +-
 datafusion/optimizer/src/optimize_projections/mod.rs            | 2 +-
 datafusion/optimizer/src/optimizer.rs                           | 8 ++++++--
 datafusion/optimizer/src/propagate_empty_relation.rs            | 2 +-
 datafusion/optimizer/src/push_down_filter.rs                    | 2 +-
 datafusion/optimizer/src/push_down_limit.rs                     | 2 +-
 datafusion/optimizer/src/replace_distinct_aggregate.rs          | 2 +-
 datafusion/optimizer/src/rewrite_disjunctive_predicate.rs       | 2 +-
 datafusion/optimizer/src/scalar_subquery_to_join.rs             | 2 +-
 datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs | 2 +-
 datafusion/optimizer/src/single_distinct_to_groupby.rs          | 2 +-
 datafusion/optimizer/src/unwrap_cast_in_comparison.rs           | 2 +-
 34 files changed, 45 insertions(+), 32 deletions(-)

diff --git a/datafusion-examples/examples/optimizer_rule.rs b/datafusion-examples/examples/optimizer_rule.rs
index b4663b345f..e0b552620a 100644
--- a/datafusion-examples/examples/optimizer_rule.rs
+++ b/datafusion-examples/examples/optimizer_rule.rs
@@ -100,6 +100,7 @@ pub async fn main() -> Result<()> {
 
 /// An example OptimizerRule that replaces all `col = <const>` predicates with a
 /// user defined function
+#[derive(Default, Debug)]
 struct MyOptimizerRule {}
 
 impl OptimizerRule for MyOptimizerRule {
diff --git a/datafusion/core/src/execution/session_state.rs b/datafusion/core/src/execution/session_state.rs
index e447220a1f..3e6577a486 100644
--- a/datafusion/core/src/execution/session_state.rs
+++ b/datafusion/core/src/execution/session_state.rs
@@ -1954,6 +1954,7 @@ mod tests {
 
     #[test]
     fn test_session_state_with_optimizer_rules() {
+        #[derive(Default, Debug)]
         struct DummyRule {}
 
         impl OptimizerRule for DummyRule {
diff --git a/datafusion/core/tests/user_defined/user_defined_plan.rs b/datafusion/core/tests/user_defined/user_defined_plan.rs
index 101e676484..caf639434a 100644
--- a/datafusion/core/tests/user_defined/user_defined_plan.rs
+++ b/datafusion/core/tests/user_defined/user_defined_plan.rs
@@ -335,7 +335,9 @@ impl QueryPlanner for TopKQueryPlanner {
     }
 }
 
+#[derive(Default, Debug)]
 struct TopKOptimizerRule {}
+
 impl OptimizerRule for TopKOptimizerRule {
     fn name(&self) -> &str {
         "topk"
@@ -686,6 +688,7 @@ impl RecordBatchStream for TopKReader {
     }
 }
 
+#[derive(Default, Debug)]
 struct MyAnalyzerRule {}
 
 impl AnalyzerRule for MyAnalyzerRule {
diff --git a/datafusion/expr/src/expr_rewriter/mod.rs b/datafusion/expr/src/expr_rewriter/mod.rs
index 05ee3e112d..15930914dd 100644
--- a/datafusion/expr/src/expr_rewriter/mod.rs
+++ b/datafusion/expr/src/expr_rewriter/mod.rs
@@ -19,6 +19,7 @@
 
 use std::collections::HashMap;
 use std::collections::HashSet;
+use std::fmt::Debug;
 use std::sync::Arc;
 
 use crate::expr::{Alias, Sort, Unnest};
@@ -42,7 +43,7 @@ pub use order_by::rewrite_sort_cols_by_aggs;
 /// `Operator::ArrowAt`, but can be implemented by calling a function
 /// `array_concat` from the `functions-nested` crate.
 // This is not used in datafusion internally, but it is still helpful for downstream project so don't remove it.
-pub trait FunctionRewrite {
+pub trait FunctionRewrite: Debug {
     /// Return a human readable name for this rewrite
     fn name(&self) -> &str;
 
diff --git a/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs b/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs
index 32ca790b00..86520b3587 100644
--- a/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs
+++ b/datafusion/optimizer/src/analyzer/count_wildcard_rule.rs
@@ -28,7 +28,7 @@ use datafusion_expr::{lit, Expr, LogicalPlan, WindowFunctionDefinition};
 /// Rewrite `Count(Expr:Wildcard)` to `Count(Expr:Literal)`.
 ///
 /// Resolves issue: <https://github.com/apache/datafusion/issues/5473>
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct CountWildcardRule {}
 
 impl CountWildcardRule {
diff --git a/datafusion/optimizer/src/analyzer/expand_wildcard_rule.rs b/datafusion/optimizer/src/analyzer/expand_wildcard_rule.rs
index b2de541a34..a26ec4be5c 100644
--- a/datafusion/optimizer/src/analyzer/expand_wildcard_rule.rs
+++ b/datafusion/optimizer/src/analyzer/expand_wildcard_rule.rs
@@ -28,7 +28,7 @@ use datafusion_expr::utils::{
 };
 use datafusion_expr::{Expr, LogicalPlan, Projection, SubqueryAlias};
 
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct ExpandWildcardRule {}
 
 impl ExpandWildcardRule {
diff --git a/datafusion/optimizer/src/analyzer/function_rewrite.rs b/datafusion/optimizer/src/analyzer/function_rewrite.rs
index ec3626b2c8..c6bf14ebce 100644
--- a/datafusion/optimizer/src/analyzer/function_rewrite.rs
+++ b/datafusion/optimizer/src/analyzer/function_rewrite.rs
@@ -29,7 +29,7 @@ use datafusion_expr::LogicalPlan;
 use std::sync::Arc;
 
 /// Analyzer rule that invokes [`FunctionRewrite`]s on expressions
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct ApplyFunctionRewrites {
     /// Expr --> Function writes to apply
     function_rewrites: Vec<Arc<dyn FunctionRewrite + Send + Sync>>,
diff --git a/datafusion/optimizer/src/analyzer/inline_table_scan.rs b/datafusion/optimizer/src/analyzer/inline_table_scan.rs
index 2fc9b91da6..342d85a915 100644
--- a/datafusion/optimizer/src/analyzer/inline_table_scan.rs
+++ b/datafusion/optimizer/src/analyzer/inline_table_scan.rs
@@ -28,7 +28,7 @@ use datafusion_expr::{logical_plan::LogicalPlan, Expr, LogicalPlanBuilder};
 
 /// Analyzed rule that inlines TableScan that provide a [`LogicalPlan`]
 /// (DataFrame / ViewTable)
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct InlineTableScan;
 
 impl InlineTableScan {
diff --git a/datafusion/optimizer/src/analyzer/mod.rs b/datafusion/optimizer/src/analyzer/mod.rs
index 6e2afeca88..4cd891664e 100644
--- a/datafusion/optimizer/src/analyzer/mod.rs
+++ b/datafusion/optimizer/src/analyzer/mod.rs
@@ -16,6 +16,8 @@
 // under the License.
 
 //! [`Analyzer`] and [`AnalyzerRule`]
+
+use std::fmt::Debug;
 use std::sync::Arc;
 
 use log::debug;
@@ -60,7 +62,7 @@ pub mod type_coercion;
 /// `AnalyzerRule`s.
 ///
 /// [`SessionState::add_analyzer_rule`]: https://docs.rs/datafusion/latest/datafusion/execution/session_state/struct.SessionState.html#method.add_analyzer_rule
-pub trait AnalyzerRule {
+pub trait AnalyzerRule: Debug {
     /// Rewrite `plan`
     fn analyze(&self, plan: LogicalPlan, config: &ConfigOptions) -> Result<LogicalPlan>;
 
@@ -72,7 +74,7 @@ pub trait AnalyzerRule {
 ///
 /// An `Analyzer` transforms a `LogicalPlan`
 /// prior to the rest of the DataFusion optimization process.
-#[derive(Clone)]
+#[derive(Clone, Debug)]
 pub struct Analyzer {
     /// Expr --> Function writes to apply prior to analysis passes
     pub function_rewrites: Vec<Arc<dyn FunctionRewrite + Send + Sync>>,
diff --git a/datafusion/optimizer/src/analyzer/type_coercion.rs b/datafusion/optimizer/src/analyzer/type_coercion.rs
index 3e31ac1c63..4dc34284c7 100644
--- a/datafusion/optimizer/src/analyzer/type_coercion.rs
+++ b/datafusion/optimizer/src/analyzer/type_coercion.rs
@@ -57,7 +57,7 @@ use datafusion_expr::{
 
 /// Performs type coercion by determining the schema
 /// and performing the expression rewrites.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct TypeCoercion {}
 
 impl TypeCoercion {
diff --git a/datafusion/optimizer/src/common_subexpr_eliminate.rs b/datafusion/optimizer/src/common_subexpr_eliminate.rs
index 442cc93f5b..c13cb3a8e9 100644
--- a/datafusion/optimizer/src/common_subexpr_eliminate.rs
+++ b/datafusion/optimizer/src/common_subexpr_eliminate.rs
@@ -139,6 +139,7 @@ type CommonExprs<'n> = IndexMap<Identifier<'n>, (Expr, String)>;
 /// ProjectionExec(exprs=[extract (day from new_col), extract (year from new_col)]) <-- reuse here
 ///   ProjectionExec(exprs=[to_date(c1) as new_col]) <-- compute to_date once
 /// ```
+#[derive(Debug)]
 pub struct CommonSubexprEliminate {
     random_state: RandomState,
 }
diff --git a/datafusion/optimizer/src/decorrelate_predicate_subquery.rs b/datafusion/optimizer/src/decorrelate_predicate_subquery.rs
index 5bb57bf05f..d1ac80003b 100644
--- a/datafusion/optimizer/src/decorrelate_predicate_subquery.rs
+++ b/datafusion/optimizer/src/decorrelate_predicate_subquery.rs
@@ -40,7 +40,7 @@ use datafusion_expr::{
 use log::debug;
 
 /// Optimizer rule for rewriting predicate(IN/EXISTS) subquery to left semi/anti joins
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct DecorrelatePredicateSubquery {}
 
 impl DecorrelatePredicateSubquery {
diff --git a/datafusion/optimizer/src/eliminate_cross_join.rs b/datafusion/optimizer/src/eliminate_cross_join.rs
index 93df0dcfd5..550728ddd3 100644
--- a/datafusion/optimizer/src/eliminate_cross_join.rs
+++ b/datafusion/optimizer/src/eliminate_cross_join.rs
@@ -30,7 +30,7 @@ use datafusion_expr::logical_plan::{
 use datafusion_expr::utils::{can_hash, find_valid_equijoin_key_pair};
 use datafusion_expr::{build_join_schema, ExprSchemable, Operator};
 
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct EliminateCrossJoin;
 
 impl EliminateCrossJoin {
diff --git a/datafusion/optimizer/src/eliminate_duplicated_expr.rs b/datafusion/optimizer/src/eliminate_duplicated_expr.rs
index c460d7a93d..554985667f 100644
--- a/datafusion/optimizer/src/eliminate_duplicated_expr.rs
+++ b/datafusion/optimizer/src/eliminate_duplicated_expr.rs
@@ -26,7 +26,7 @@ use datafusion_expr::{Aggregate, Expr, Sort, SortExpr};
 use indexmap::IndexSet;
 use std::hash::{Hash, Hasher};
 /// Optimization rule that eliminate duplicated expr.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct EliminateDuplicatedExpr;
 
 impl EliminateDuplicatedExpr {
diff --git a/datafusion/optimizer/src/eliminate_filter.rs b/datafusion/optimizer/src/eliminate_filter.rs
index bb2b4547e9..4ed2ac8ba1 100644
--- a/datafusion/optimizer/src/eliminate_filter.rs
+++ b/datafusion/optimizer/src/eliminate_filter.rs
@@ -30,7 +30,7 @@ use crate::{OptimizerConfig, OptimizerRule};
 ///
 /// This saves time in planning and executing the query.
 /// Note that this rule should be applied after simplify expressions optimizer rule.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct EliminateFilter;
 
 impl EliminateFilter {
diff --git a/datafusion/optimizer/src/eliminate_group_by_constant.rs b/datafusion/optimizer/src/eliminate_group_by_constant.rs
index c7869d9e4d..13d03d647f 100644
--- a/datafusion/optimizer/src/eliminate_group_by_constant.rs
+++ b/datafusion/optimizer/src/eliminate_group_by_constant.rs
@@ -26,7 +26,7 @@ use datafusion_expr::{Aggregate, Expr, LogicalPlan, LogicalPlanBuilder, Volatili
 /// Optimizer rule that removes constant expressions from `GROUP BY` clause
 /// and places additional projection on top of aggregation, to preserve
 /// original schema
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct EliminateGroupByConstant {}
 
 impl EliminateGroupByConstant {
diff --git a/datafusion/optimizer/src/eliminate_join.rs b/datafusion/optimizer/src/eliminate_join.rs
index b15d981d11..f9b79e036f 100644
--- a/datafusion/optimizer/src/eliminate_join.rs
+++ b/datafusion/optimizer/src/eliminate_join.rs
@@ -28,7 +28,7 @@ use datafusion_expr::{
 
 /// Eliminates joins when join condition is false.
 /// Replaces joins when inner join condition is true with a cross join.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct EliminateJoin;
 
 impl EliminateJoin {
diff --git a/datafusion/optimizer/src/eliminate_limit.rs b/datafusion/optimizer/src/eliminate_limit.rs
index 2503475bd8..25304d4cca 100644
--- a/datafusion/optimizer/src/eliminate_limit.rs
+++ b/datafusion/optimizer/src/eliminate_limit.rs
@@ -30,7 +30,7 @@ use std::sync::Arc;
 /// plan with an empty relation.
 ///
 /// This rule also removes OFFSET 0 from the [LogicalPlan]
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct EliminateLimit;
 
 impl EliminateLimit {
diff --git a/datafusion/optimizer/src/eliminate_nested_union.rs b/datafusion/optimizer/src/eliminate_nested_union.rs
index 9657713268..94da08243d 100644
--- a/datafusion/optimizer/src/eliminate_nested_union.rs
+++ b/datafusion/optimizer/src/eliminate_nested_union.rs
@@ -25,7 +25,7 @@ use datafusion_expr::{Distinct, LogicalPlan, Union};
 use itertools::Itertools;
 use std::sync::Arc;
 
-#[derive(Default)]
+#[derive(Default, Debug)]
 /// An optimization rule that replaces nested unions with a single union.
 pub struct EliminateNestedUnion;
 
diff --git a/datafusion/optimizer/src/eliminate_one_union.rs b/datafusion/optimizer/src/eliminate_one_union.rs
index 7a1c4e118e..3e02781142 100644
--- a/datafusion/optimizer/src/eliminate_one_union.rs
+++ b/datafusion/optimizer/src/eliminate_one_union.rs
@@ -24,7 +24,7 @@ use std::sync::Arc;
 
 use crate::optimizer::ApplyOrder;
 
-#[derive(Default)]
+#[derive(Default, Debug)]
 /// An optimization rule that eliminates union with one element.
 pub struct EliminateOneUnion;
 
diff --git a/datafusion/optimizer/src/eliminate_outer_join.rs b/datafusion/optimizer/src/eliminate_outer_join.rs
index e7c88df551..1ecb32ca2a 100644
--- a/datafusion/optimizer/src/eliminate_outer_join.rs
+++ b/datafusion/optimizer/src/eliminate_outer_join.rs
@@ -26,7 +26,6 @@ use datafusion_common::tree_node::Transformed;
 use datafusion_expr::expr::{BinaryExpr, Cast, TryCast};
 use std::sync::Arc;
 
-#[derive(Default)]
 ///
 /// Attempt to replace outer joins with inner joins.
 ///
@@ -49,6 +48,7 @@ use std::sync::Arc;
 /// filters from the WHERE clause return false while any inputs are
 /// null and columns of those quals are come from nullable side of
 /// outer join.
+#[derive(Default, Debug)]
 pub struct EliminateOuterJoin;
 
 impl EliminateOuterJoin {
diff --git a/datafusion/optimizer/src/extract_equijoin_predicate.rs b/datafusion/optimizer/src/extract_equijoin_predicate.rs
index 0dae777ab5..48191ec206 100644
--- a/datafusion/optimizer/src/extract_equijoin_predicate.rs
+++ b/datafusion/optimizer/src/extract_equijoin_predicate.rs
@@ -38,7 +38,7 @@ type EquijoinPredicate = (Expr, Expr);
 /// has one equijoin predicate (`A.x = B.y`) and one filter predicate (`B.z > 50`).
 /// See [find_valid_equijoin_key_pair] for more information on what predicates
 /// are considered equijoins.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct ExtractEquijoinPredicate;
 
 impl ExtractEquijoinPredicate {
diff --git a/datafusion/optimizer/src/filter_null_join_keys.rs b/datafusion/optimizer/src/filter_null_join_keys.rs
index caf94a2c88..66c7463c3d 100644
--- a/datafusion/optimizer/src/filter_null_join_keys.rs
+++ b/datafusion/optimizer/src/filter_null_join_keys.rs
@@ -29,7 +29,7 @@ use std::sync::Arc;
 /// The FilterNullJoinKeys rule will identify joins with equi-join conditions
 /// where the join key is nullable and then insert an `IsNotNull` filter on the nullable side since null values
 /// can never match.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct FilterNullJoinKeys {}
 
 impl OptimizerRule for FilterNullJoinKeys {
diff --git a/datafusion/optimizer/src/optimize_projections/mod.rs b/datafusion/optimizer/src/optimize_projections/mod.rs
index 8c61d45cc8..5ab427a316 100644
--- a/datafusion/optimizer/src/optimize_projections/mod.rs
+++ b/datafusion/optimizer/src/optimize_projections/mod.rs
@@ -57,7 +57,7 @@ use datafusion_common::tree_node::{
 /// The rule analyzes the input logical plan, determines the necessary column
 /// indices, and then removes any unnecessary columns. It also removes any
 /// unnecessary projections from the plan tree.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct OptimizeProjections {}
 
 impl OptimizeProjections {
diff --git a/datafusion/optimizer/src/optimizer.rs b/datafusion/optimizer/src/optimizer.rs
index 2fc560ccee..08dcefa22f 100644
--- a/datafusion/optimizer/src/optimizer.rs
+++ b/datafusion/optimizer/src/optimizer.rs
@@ -18,6 +18,7 @@
 //! [`Optimizer`] and [`OptimizerRule`]
 
 use std::collections::HashSet;
+use std::fmt::Debug;
 use std::sync::Arc;
 
 use chrono::{DateTime, Utc};
@@ -70,7 +71,7 @@ use crate::utils::log_plan;
 /// [`AnalyzerRule`]: crate::analyzer::AnalyzerRule
 /// [`SessionState::add_optimizer_rule`]: https://docs.rs/datafusion/latest/datafusion/execution/session_state/struct.SessionState.html#method.add_optimizer_rule
 
-pub trait OptimizerRule {
+pub trait OptimizerRule: Debug {
     /// Try and rewrite `plan` to an optimized form, returning None if the plan
     /// cannot be optimized by this rule.
     ///
@@ -214,7 +215,7 @@ impl OptimizerConfig for OptimizerContext {
 }
 
 /// A rule-based optimizer.
-#[derive(Clone)]
+#[derive(Clone, Debug)]
 pub struct Optimizer {
     /// All optimizer rules to apply
     pub rules: Vec<Arc<dyn OptimizerRule + Send + Sync>>,
@@ -666,6 +667,7 @@ mod tests {
 
     fn observe(_plan: &LogicalPlan, _rule: &dyn OptimizerRule) {}
 
+    #[derive(Default, Debug)]
     struct BadRule {}
 
     impl OptimizerRule for BadRule {
@@ -687,6 +689,7 @@ mod tests {
     }
 
     /// Replaces whatever plan with a single table scan
+    #[derive(Default, Debug)]
     struct GetTableScanRule {}
 
     impl OptimizerRule for GetTableScanRule {
@@ -713,6 +716,7 @@ mod tests {
     /// A goofy rule doing rotation of columns in all projections.
     ///
     /// Useful to test cycle detection.
+    #[derive(Default, Debug)]
     struct RotateProjectionRule {
         // reverse exprs instead of rotating on the first pass
         reverse_on_first_pass: Mutex<bool>,
diff --git a/datafusion/optimizer/src/propagate_empty_relation.rs b/datafusion/optimizer/src/propagate_empty_relation.rs
index 61d9934d89..b5e1077ee5 100644
--- a/datafusion/optimizer/src/propagate_empty_relation.rs
+++ b/datafusion/optimizer/src/propagate_empty_relation.rs
@@ -29,7 +29,7 @@ use crate::optimizer::ApplyOrder;
 use crate::{OptimizerConfig, OptimizerRule};
 
 /// Optimization rule that bottom-up to eliminate plan by propagating empty_relation.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct PropagateEmptyRelation;
 
 impl PropagateEmptyRelation {
diff --git a/datafusion/optimizer/src/push_down_filter.rs b/datafusion/optimizer/src/push_down_filter.rs
index a306ff7d2d..0787d4006f 100644
--- a/datafusion/optimizer/src/push_down_filter.rs
+++ b/datafusion/optimizer/src/push_down_filter.rs
@@ -130,7 +130,7 @@ use crate::{OptimizerConfig, OptimizerRule};
 /// reaches a plan node that does not commute with that filter, it adds the
 /// filter to that place. When it passes through a projection, it re-writes the
 /// filter's expression taking into account that projection.
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct PushDownFilter {}
 
 /// For a given JOIN type, determine whether each input of the join is preserved
diff --git a/datafusion/optimizer/src/push_down_limit.rs b/datafusion/optimizer/src/push_down_limit.rs
index ab78802136..158c7592df 100644
--- a/datafusion/optimizer/src/push_down_limit.rs
+++ b/datafusion/optimizer/src/push_down_limit.rs
@@ -31,7 +31,7 @@ use datafusion_expr::logical_plan::{Join, JoinType, Limit, LogicalPlan};
 /// Optimization rule that tries to push down `LIMIT`.
 ///
 //. It will push down through projection, limits (taking the smaller limit)
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct PushDownLimit {}
 
 impl PushDownLimit {
diff --git a/datafusion/optimizer/src/replace_distinct_aggregate.rs b/datafusion/optimizer/src/replace_distinct_aggregate.rs
index c887192f63..c026130c42 100644
--- a/datafusion/optimizer/src/replace_distinct_aggregate.rs
+++ b/datafusion/optimizer/src/replace_distinct_aggregate.rs
@@ -54,7 +54,7 @@ use datafusion_expr::{Aggregate, Distinct, DistinctOn, Expr, LogicalPlan};
 /// ```
 
 /// Optimizer that replaces logical [[Distinct]] with a logical [[Aggregate]]
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct ReplaceDistinctWithAggregate {}
 
 impl ReplaceDistinctWithAggregate {
diff --git a/datafusion/optimizer/src/rewrite_disjunctive_predicate.rs b/datafusion/optimizer/src/rewrite_disjunctive_predicate.rs
index 897afda267..a6b633fdb8 100644
--- a/datafusion/optimizer/src/rewrite_disjunctive_predicate.rs
+++ b/datafusion/optimizer/src/rewrite_disjunctive_predicate.rs
@@ -122,7 +122,7 @@ use datafusion_expr::{Expr, LogicalPlan, Operator};
 /// )
 /// ```
 ///
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct RewriteDisjunctivePredicate;
 
 impl RewriteDisjunctivePredicate {
diff --git a/datafusion/optimizer/src/scalar_subquery_to_join.rs b/datafusion/optimizer/src/scalar_subquery_to_join.rs
index e5c8757405..6409bb9e03 100644
--- a/datafusion/optimizer/src/scalar_subquery_to_join.rs
+++ b/datafusion/optimizer/src/scalar_subquery_to_join.rs
@@ -36,7 +36,7 @@ use datafusion_expr::utils::conjunction;
 use datafusion_expr::{expr, EmptyRelation, Expr, LogicalPlan, LogicalPlanBuilder};
 
 /// Optimizer rule for rewriting subquery filters to joins
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct ScalarSubqueryToJoin {}
 
 impl ScalarSubqueryToJoin {
diff --git a/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs b/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
index c4dba4c8df..c0142ae0fc 100644
--- a/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
+++ b/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
@@ -45,7 +45,7 @@ use super::ExprSimplifier;
 /// `Filter: b > 2`
 ///
 /// [`Expr`]: datafusion_expr::Expr
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct SimplifyExpressions {}
 
 impl OptimizerRule for SimplifyExpressions {
diff --git a/datafusion/optimizer/src/single_distinct_to_groupby.rs b/datafusion/optimizer/src/single_distinct_to_groupby.rs
index 2509e67dbe..1c22c2a437 100644
--- a/datafusion/optimizer/src/single_distinct_to_groupby.rs
+++ b/datafusion/optimizer/src/single_distinct_to_groupby.rs
@@ -49,7 +49,7 @@ use hashbrown::HashSet;
 ///    )
 ///    GROUP BY a
 ///  ```
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct SingleDistinctToGroupBy {}
 
 const SINGLE_DISTINCT_ALIAS: &str = "alias1";
diff --git a/datafusion/optimizer/src/unwrap_cast_in_comparison.rs b/datafusion/optimizer/src/unwrap_cast_in_comparison.rs
index 2118ae96a1..22e3c0ddd0 100644
--- a/datafusion/optimizer/src/unwrap_cast_in_comparison.rs
+++ b/datafusion/optimizer/src/unwrap_cast_in_comparison.rs
@@ -72,7 +72,7 @@ use datafusion_expr::{lit, Expr, ExprSchemable, LogicalPlan};
 /// Filter: c1 > INT32(10)
 /// ```
 ///
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct UnwrapCastInComparison {}
 
 impl UnwrapCastInComparison {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org