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 a4d41d6a66 Support `LogicalPlan` `Debug` differently than `Display` 
(#11774)
a4d41d6a66 is described below

commit a4d41d6a661753f24de0913228f02898ebabc201
Author: 张林伟 <[email protected]>
AuthorDate: Sun Aug 4 19:40:39 2024 +0800

    Support `LogicalPlan` `Debug` differently than `Display` (#11774)
    
    * Derive Debug for logical plan nodes
    
    * Improve LogicalPlan debug printing
    
    * Fix tests
    
    * Fix tests
    
    * Fix tests
---
 benchmarks/src/tpch/run.rs                         |  4 +-
 datafusion/core/src/dataframe/mod.rs               | 14 ++--
 datafusion/core/tests/custom_sources_cases/mod.rs  |  2 +-
 datafusion/core/tests/expr_api/simplification.rs   |  2 +-
 datafusion/core/tests/optimizer_integration.rs     |  5 +-
 datafusion/core/tests/sql/explain_analyze.rs       |  6 +-
 .../tests/user_defined/user_defined_aggregates.rs  |  2 +-
 .../user_defined/user_defined_scalar_functions.rs  |  6 +-
 datafusion/expr/src/logical_plan/builder.rs        | 30 ++++-----
 datafusion/expr/src/logical_plan/ddl.rs            | 18 +++---
 datafusion/expr/src/logical_plan/dml.rs            | 18 +++++-
 datafusion/expr/src/logical_plan/plan.rs           | 17 ++++-
 datafusion/expr/src/logical_plan/statement.rs      |  8 +--
 .../optimizer/src/common_subexpr_eliminate.rs      |  6 +-
 datafusion/optimizer/src/eliminate_limit.rs        |  4 +-
 .../optimizer/src/optimize_projections/mod.rs      |  6 +-
 datafusion/optimizer/src/push_down_filter.rs       | 74 +++++++++++-----------
 .../src/simplify_expressions/simplify_exprs.rs     |  4 +-
 datafusion/optimizer/src/test/mod.rs               |  8 +--
 .../optimizer/tests/optimizer_integration.rs       | 40 ++++++------
 .../proto/tests/cases/roundtrip_logical_plan.rs    | 26 ++++----
 datafusion/sql/examples/sql.rs                     |  2 +-
 datafusion/sql/tests/cases/plan_to_sql.rs          |  4 +-
 datafusion/sql/tests/sql_integration.rs            | 11 ++--
 datafusion/substrait/src/logical_plan/producer.rs  |  2 +-
 .../substrait/tests/cases/consumer_integration.rs  | 32 +++++-----
 datafusion/substrait/tests/cases/function_test.rs  |  2 +-
 datafusion/substrait/tests/cases/logical_plans.rs  |  6 +-
 .../tests/cases/roundtrip_logical_plan.rs          | 34 +++++-----
 datafusion/substrait/tests/cases/serialize.rs      |  4 +-
 30 files changed, 211 insertions(+), 186 deletions(-)

diff --git a/benchmarks/src/tpch/run.rs b/benchmarks/src/tpch/run.rs
index a72dfaa0f5..ebc5ac0dbd 100644
--- a/benchmarks/src/tpch/run.rs
+++ b/benchmarks/src/tpch/run.rs
@@ -205,12 +205,12 @@ impl RunOpt {
         let (state, plan) = plan.into_parts();
 
         if debug {
-            println!("=== Logical plan ===\n{plan:?}\n");
+            println!("=== Logical plan ===\n{plan}\n");
         }
 
         let plan = state.optimize(&plan)?;
         if debug {
-            println!("=== Optimized logical plan ===\n{plan:?}\n");
+            println!("=== Optimized logical plan ===\n{plan}\n");
         }
         let physical_plan = state.create_physical_plan(&plan).await?;
         if debug {
diff --git a/datafusion/core/src/dataframe/mod.rs 
b/datafusion/core/src/dataframe/mod.rs
index cacfa4c6f2..6ec44b33f8 100644
--- a/datafusion/core/src/dataframe/mod.rs
+++ b/datafusion/core/src/dataframe/mod.rs
@@ -2553,7 +2553,7 @@ mod tests {
         \n    TableScan: a\
         \n  Projection: b.c1, b.c2\
         \n    TableScan: b";
-        assert_eq!(expected_plan, format!("{:?}", join.logical_plan()));
+        assert_eq!(expected_plan, format!("{}", join.logical_plan()));
 
         Ok(())
     }
@@ -2572,7 +2572,7 @@ mod tests {
         let expected_plan = "CrossJoin:\
         \n  TableScan: a projection=[c1], full_filters=[Boolean(NULL)]\
         \n  TableScan: b projection=[c1]";
-        assert_eq!(expected_plan, format!("{:?}", 
join.into_optimized_plan()?));
+        assert_eq!(expected_plan, format!("{}", join.into_optimized_plan()?));
 
         // JOIN ON expression must be boolean type
         let join = left.join_on(right, JoinType::Inner, Some(lit("TRUE")))?;
@@ -2914,7 +2914,7 @@ mod tests {
         \n      Inner Join: t1.c1 = t2.c1\
         \n        TableScan: t1\
         \n        TableScan: t2",
-            format!("{:?}", df_with_column.logical_plan())
+            format!("{}", df_with_column.logical_plan())
         );
 
         assert_eq!(
@@ -2927,7 +2927,7 @@ mod tests {
         \n          TableScan: aggregate_test_100 projection=[c1]\
         \n        SubqueryAlias: t2\
         \n          TableScan: aggregate_test_100 projection=[c1]",
-            format!("{:?}", df_with_column.clone().into_optimized_plan()?)
+            format!("{}", df_with_column.clone().into_optimized_plan()?)
         );
 
         let df_results = df_with_column.collect().await?;
@@ -3109,7 +3109,7 @@ mod tests {
         \n      Inner Join: t1.c1 = t2.c1\
         \n        TableScan: t1\
         \n        TableScan: t2",
-                   format!("{:?}", df_renamed.logical_plan())
+                   format!("{}", df_renamed.logical_plan())
         );
 
         assert_eq!("\
@@ -3121,7 +3121,7 @@ mod tests {
         \n          TableScan: aggregate_test_100 projection=[c1, c2, c3]\
         \n        SubqueryAlias: t2\
         \n          TableScan: aggregate_test_100 projection=[c1, c2, c3]",
-                   format!("{:?}", df_renamed.clone().into_optimized_plan()?)
+                   format!("{}", df_renamed.clone().into_optimized_plan()?)
         );
 
         let df_results = df_renamed.collect().await?;
@@ -3306,7 +3306,7 @@ mod tests {
 
         assert_eq!(
             "TableScan: ?table? projection=[c2, c3, sum]",
-            format!("{:?}", cached_df.clone().into_optimized_plan()?)
+            format!("{}", cached_df.clone().into_optimized_plan()?)
         );
 
         let df_results = df.collect().await?;
diff --git a/datafusion/core/tests/custom_sources_cases/mod.rs 
b/datafusion/core/tests/custom_sources_cases/mod.rs
index 7c051ffaa7..673fafe55b 100644
--- a/datafusion/core/tests/custom_sources_cases/mod.rs
+++ b/datafusion/core/tests/custom_sources_cases/mod.rs
@@ -246,7 +246,7 @@ async fn custom_source_dataframe() -> Result<()> {
     }
 
     let expected = format!("TableScan: {UNNAMED_TABLE} projection=[c2]");
-    assert_eq!(format!("{optimized_plan:?}"), expected);
+    assert_eq!(format!("{optimized_plan}"), expected);
 
     let physical_plan = state.create_physical_plan(&optimized_plan).await?;
 
diff --git a/datafusion/core/tests/expr_api/simplification.rs 
b/datafusion/core/tests/expr_api/simplification.rs
index 9ce47153ba..b6068e4859 100644
--- a/datafusion/core/tests/expr_api/simplification.rs
+++ b/datafusion/core/tests/expr_api/simplification.rs
@@ -119,7 +119,7 @@ fn get_optimized_plan_formatted(plan: LogicalPlan, 
date_time: &DateTime<Utc>) ->
     let optimizer = 
Optimizer::with_rules(vec![Arc::new(SimplifyExpressions::new())]);
     let optimized_plan = optimizer.optimize(plan, &config, observe).unwrap();
 
-    format!("{optimized_plan:?}")
+    format!("{optimized_plan}")
 }
 
 // ------------------------------
diff --git a/datafusion/core/tests/optimizer_integration.rs 
b/datafusion/core/tests/optimizer_integration.rs
index 39f745cd33..f17d13a420 100644
--- a/datafusion/core/tests/optimizer_integration.rs
+++ b/datafusion/core/tests/optimizer_integration.rs
@@ -81,14 +81,13 @@ fn timestamp_nano_ts_utc_predicates() {
     let sql = "SELECT col_int32
         FROM test
         WHERE col_ts_nano_utc < (now() - interval '1 hour')";
-    let plan = test_sql(sql).unwrap();
     // a scan should have the now()... predicate folded to a single
     // constant and compared to the column without a cast so it can be
     // pushed down / pruned
     let expected =
         "Projection: test.col_int32\n  Filter: test.col_ts_nano_utc < 
TimestampNanosecond(1666612093000000000, Some(\"+00:00\"))\
          \n    TableScan: test projection=[col_int32, col_ts_nano_utc]";
-    assert_eq!(expected, format!("{plan:?}"));
+    quick_test(sql, expected);
 }
 
 #[test]
@@ -117,7 +116,7 @@ fn concat_ws_literals() -> Result<()> {
 
 fn quick_test(sql: &str, expected_plan: &str) {
     let plan = test_sql(sql).unwrap();
-    assert_eq!(expected_plan, format!("{:?}", plan));
+    assert_eq!(expected_plan, format!("{}", plan));
 }
 
 fn test_sql(sql: &str) -> Result<LogicalPlan> {
diff --git a/datafusion/core/tests/sql/explain_analyze.rs 
b/datafusion/core/tests/sql/explain_analyze.rs
index fe4777b043..07be00fc35 100644
--- a/datafusion/core/tests/sql/explain_analyze.rs
+++ b/datafusion/core/tests/sql/explain_analyze.rs
@@ -253,7 +253,7 @@ async fn csv_explain_plans() {
 
     // Optimized logical plan
     let state = ctx.state();
-    let msg = format!("Optimizing logical plan for '{sql}': {plan:?}");
+    let msg = format!("Optimizing logical plan for '{sql}': {plan}");
     let plan = state.optimize(plan).expect(&msg);
     let optimized_logical_schema = plan.schema();
     // Both schema has to be the same
@@ -327,7 +327,7 @@ async fn csv_explain_plans() {
 
     // Physical plan
     // Create plan
-    let msg = format!("Creating physical plan for '{sql}': {plan:?}");
+    let msg = format!("Creating physical plan for '{sql}': {plan}");
     let plan = state.create_physical_plan(&plan).await.expect(&msg);
     //
     // Execute plan
@@ -548,7 +548,7 @@ async fn csv_explain_verbose_plans() {
 
     // Physical plan
     // Create plan
-    let msg = format!("Creating physical plan for '{sql}': {plan:?}");
+    let msg = format!("Creating physical plan for '{sql}': {plan}");
     let plan = state.create_physical_plan(&plan).await.expect(&msg);
     //
     // Execute plan
diff --git a/datafusion/core/tests/user_defined/user_defined_aggregates.rs 
b/datafusion/core/tests/user_defined/user_defined_aggregates.rs
index 96de865b65..93550d3802 100644
--- a/datafusion/core/tests/user_defined/user_defined_aggregates.rs
+++ b/datafusion/core/tests/user_defined/user_defined_aggregates.rs
@@ -413,7 +413,7 @@ async fn test_parameterized_aggregate_udf() -> Result<()> {
         .build()?;
 
     assert_eq!(
-        format!("{plan:?}"),
+        format!("{plan}"),
         "Aggregate: groupBy=[[t.text]], aggr=[[geo_mean(t.text) AS a, 
geo_mean(t.text) AS b]]\n  TableScan: t projection=[text]"
     );
 
diff --git 
a/datafusion/core/tests/user_defined/user_defined_scalar_functions.rs 
b/datafusion/core/tests/user_defined/user_defined_scalar_functions.rs
index 9164e89de8..259cce74f2 100644
--- a/datafusion/core/tests/user_defined/user_defined_scalar_functions.rs
+++ b/datafusion/core/tests/user_defined/user_defined_scalar_functions.rs
@@ -139,7 +139,7 @@ async fn scalar_udf() -> Result<()> {
         .build()?;
 
     assert_eq!(
-        format!("{plan:?}"),
+        format!("{plan}"),
         "Projection: t.a, t.b, my_add(t.a, t.b)\n  TableScan: t projection=[a, 
b]"
     );
 
@@ -393,7 +393,7 @@ async fn udaf_as_window_func() -> Result<()> {
     TableScan: my_table"#;
 
     let dataframe = context.sql(sql).await.unwrap();
-    assert_eq!(format!("{:?}", dataframe.logical_plan()), expected);
+    assert_eq!(format!("{}", dataframe.logical_plan()), expected);
     Ok(())
 }
 
@@ -1124,7 +1124,7 @@ async fn test_parameterized_scalar_udf() -> Result<()> {
         .build()?;
 
     assert_eq!(
-        format!("{plan:?}"),
+        format!("{plan}"),
         "Filter: t.text IS NOT NULL\n  Filter: regex_udf(t.text) AND 
regex_udf(t.text)\n    TableScan: t projection=[text]"
     );
 
diff --git a/datafusion/expr/src/logical_plan/builder.rs 
b/datafusion/expr/src/logical_plan/builder.rs
index 736310c7ac..aa2ea4ae1c 100644
--- a/datafusion/expr/src/logical_plan/builder.rs
+++ b/datafusion/expr/src/logical_plan/builder.rs
@@ -1749,7 +1749,7 @@ mod tests {
         \n  Filter: employee_csv.state = Utf8(\"CO\")\
         \n    TableScan: employee_csv projection=[id, state]";
 
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         Ok(())
     }
@@ -1802,7 +1802,7 @@ mod tests {
         let expected = "Sort: employee_csv.state ASC NULLS FIRST, 
employee_csv.salary DESC NULLS LAST\
         \n  TableScan: employee_csv projection=[state, salary]";
 
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         Ok(())
     }
@@ -1822,7 +1822,7 @@ mod tests {
         \n    TableScan: t1\
         \n    TableScan: t2";
 
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         Ok(())
     }
@@ -1847,7 +1847,7 @@ mod tests {
         \n    TableScan: employee_csv projection=[state, salary]\
         \n  TableScan: employee_csv projection=[state, salary]";
 
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         Ok(())
     }
@@ -1876,7 +1876,7 @@ mod tests {
         \n        TableScan: employee_csv projection=[state, salary]\
         \n    TableScan: employee_csv projection=[state, salary]";
 
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         Ok(())
     }
@@ -1913,7 +1913,7 @@ mod tests {
         \n    Filter: employee_csv.state = Utf8(\"CO\")\
         \n      TableScan: employee_csv projection=[id, state]";
 
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         Ok(())
     }
@@ -1940,7 +1940,7 @@ mod tests {
         \n        TableScan: foo\
         \n  Projection: bar.a\
         \n    TableScan: bar";
-        assert_eq!(expected, format!("{outer_query:?}"));
+        assert_eq!(expected, format!("{outer_query}"));
 
         Ok(())
     }
@@ -1968,7 +1968,7 @@ mod tests {
         \n        TableScan: foo\
         \n  Projection: bar.a\
         \n    TableScan: bar";
-        assert_eq!(expected, format!("{outer_query:?}"));
+        assert_eq!(expected, format!("{outer_query}"));
 
         Ok(())
     }
@@ -1994,7 +1994,7 @@ mod tests {
         \n      Projection: foo.b\
         \n        TableScan: foo\
         \n  TableScan: bar";
-        assert_eq!(expected, format!("{outer_query:?}"));
+        assert_eq!(expected, format!("{outer_query}"));
 
         Ok(())
     }
@@ -2116,7 +2116,7 @@ mod tests {
         let expected = "\
         Unnest: lists[test_table.strings] structs[]\
         \n  TableScan: test_table";
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         // Check unnested field is a scalar
         let field = plan.schema().field_with_name(None, "strings").unwrap();
@@ -2130,7 +2130,7 @@ mod tests {
         let expected = "\
         Unnest: lists[] structs[test_table.struct_singular]\
         \n  TableScan: test_table";
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         for field_name in &["a", "b"] {
             // Check unnested struct field is a scalar
@@ -2153,7 +2153,7 @@ mod tests {
         \n  Unnest: lists[test_table.structs] structs[]\
         \n    Unnest: lists[test_table.strings] structs[]\
         \n      TableScan: test_table";
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         // Check unnested struct list field should be a struct.
         let field = plan.schema().field_with_name(None, "structs").unwrap();
@@ -2171,7 +2171,7 @@ mod tests {
         let expected = "\
         Unnest: lists[test_table.strings, test_table.structs] 
structs[test_table.struct_singular]\
         \n  TableScan: test_table";
-        assert_eq!(expected, format!("{plan:?}"));
+        assert_eq!(expected, format!("{plan}"));
 
         // Unnesting missing column should fail.
         let plan = nested_table_scan("test_table")?.unnest_column("missing");
@@ -2263,9 +2263,9 @@ mod tests {
                 ])?
                 .build()?;
 
-        let plan_expected = format!("{plan:?}");
+        let plan_expected = format!("{plan}");
         let plan_builder: LogicalPlanBuilder = Arc::new(plan).into();
-        assert_eq!(plan_expected, format!("{:?}", plan_builder.plan));
+        assert_eq!(plan_expected, format!("{}", plan_builder.plan));
 
         Ok(())
     }
diff --git a/datafusion/expr/src/logical_plan/ddl.rs 
b/datafusion/expr/src/logical_plan/ddl.rs
index 45ddbafecf..255bf4699b 100644
--- a/datafusion/expr/src/logical_plan/ddl.rs
+++ b/datafusion/expr/src/logical_plan/ddl.rs
@@ -29,7 +29,7 @@ use datafusion_common::{Constraints, DFSchemaRef, 
SchemaReference, TableReferenc
 use sqlparser::ast::Ident;
 
 /// Various types of DDL  (CREATE / DROP) catalog manipulation
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum DdlStatement {
     /// Creates an external table.
     CreateExternalTable(CreateExternalTable),
@@ -179,7 +179,7 @@ impl DdlStatement {
 }
 
 /// Creates an external table.
-#[derive(Clone, PartialEq, Eq)]
+#[derive(Debug, Clone, PartialEq, Eq)]
 pub struct CreateExternalTable {
     /// The table schema
     pub schema: DFSchemaRef,
@@ -224,7 +224,7 @@ impl Hash for CreateExternalTable {
 }
 
 /// Creates an in memory table.
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct CreateMemoryTable {
     /// The table name
     pub name: TableReference,
@@ -241,7 +241,7 @@ pub struct CreateMemoryTable {
 }
 
 /// Creates a view.
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct CreateView {
     /// The table name
     pub name: TableReference,
@@ -254,7 +254,7 @@ pub struct CreateView {
 }
 
 /// Creates a catalog (aka "Database").
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct CreateCatalog {
     /// The catalog name
     pub catalog_name: String,
@@ -265,7 +265,7 @@ pub struct CreateCatalog {
 }
 
 /// Creates a schema.
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct CreateCatalogSchema {
     /// The table schema
     pub schema_name: String,
@@ -276,7 +276,7 @@ pub struct CreateCatalogSchema {
 }
 
 /// Drops a table.
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct DropTable {
     /// The table name
     pub name: TableReference,
@@ -287,7 +287,7 @@ pub struct DropTable {
 }
 
 /// Drops a view.
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct DropView {
     /// The view name
     pub name: TableReference,
@@ -298,7 +298,7 @@ pub struct DropView {
 }
 
 /// Drops a schema
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct DropCatalogSchema {
     /// The schema name
     pub name: SchemaReference,
diff --git a/datafusion/expr/src/logical_plan/dml.rs 
b/datafusion/expr/src/logical_plan/dml.rs
index c9eef9bd34..025bb7b289 100644
--- a/datafusion/expr/src/logical_plan/dml.rs
+++ b/datafusion/expr/src/logical_plan/dml.rs
@@ -16,7 +16,7 @@
 // under the License.
 
 use std::collections::HashMap;
-use std::fmt::{self, Display};
+use std::fmt::{self, Debug, Display, Formatter};
 use std::hash::{Hash, Hasher};
 use std::sync::Arc;
 
@@ -41,6 +41,18 @@ pub struct CopyTo {
     pub options: HashMap<String, String>,
 }
 
+impl Debug for CopyTo {
+    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+        f.debug_struct("CopyTo")
+            .field("input", &self.input)
+            .field("output_url", &self.output_url)
+            .field("partition_by", &self.partition_by)
+            .field("file_type", &"...")
+            .field("options", &self.options)
+            .finish_non_exhaustive()
+    }
+}
+
 // Implement PartialEq manually
 impl PartialEq for CopyTo {
     fn eq(&self, other: &Self) -> bool {
@@ -61,7 +73,7 @@ impl Hash for CopyTo {
 
 /// The operator that modifies the content of a database (adapted from
 /// substrait WriteRel)
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct DmlStatement {
     /// The table name
     pub table_name: TableReference,
@@ -100,7 +112,7 @@ impl DmlStatement {
     }
 }
 
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum WriteOp {
     InsertOverwrite,
     InsertInto,
diff --git a/datafusion/expr/src/logical_plan/plan.rs 
b/datafusion/expr/src/logical_plan/plan.rs
index 6bea1ad948..02176a506a 100644
--- a/datafusion/expr/src/logical_plan/plan.rs
+++ b/datafusion/expr/src/logical_plan/plan.rs
@@ -187,7 +187,7 @@ pub use datafusion_common::{JoinConstraint, JoinType};
 /// # }
 /// ```
 ///
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum LogicalPlan {
     /// Evaluates an arbitrary list of expressions (essentially a
     /// SELECT with an expression list) on its input.
@@ -1882,7 +1882,7 @@ impl LogicalPlan {
     }
 }
 
-impl Debug for LogicalPlan {
+impl Display for LogicalPlan {
     fn fmt(&self, f: &mut Formatter) -> fmt::Result {
         self.display_indent().fmt(f)
     }
@@ -2291,6 +2291,19 @@ pub struct TableScan {
     pub fetch: Option<usize>,
 }
 
+impl Debug for TableScan {
+    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+        f.debug_struct("TableScan")
+            .field("table_name", &self.table_name)
+            .field("source", &"...")
+            .field("projection", &self.projection)
+            .field("projected_schema", &self.projected_schema)
+            .field("filters", &self.filters)
+            .field("fetch", &self.fetch)
+            .finish_non_exhaustive()
+    }
+}
+
 impl PartialEq for TableScan {
     fn eq(&self, other: &Self) -> bool {
         self.table_name == other.table_name
diff --git a/datafusion/expr/src/logical_plan/statement.rs 
b/datafusion/expr/src/logical_plan/statement.rs
index f294e7d3ea..21ff8dbd8e 100644
--- a/datafusion/expr/src/logical_plan/statement.rs
+++ b/datafusion/expr/src/logical_plan/statement.rs
@@ -25,7 +25,7 @@ use std::fmt::{self, Display};
 /// While DataFusion does not offer support transactions, it provides
 /// [`LogicalPlan`](crate::LogicalPlan) support to assist building
 /// database systems using DataFusion
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum Statement {
     // Begin a transaction
     TransactionStart(TransactionStart),
@@ -115,7 +115,7 @@ pub enum TransactionIsolationLevel {
 }
 
 /// Indicator that the following statements should be committed or rolled back 
atomically
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct TransactionStart {
     /// indicates if transaction is allowed to write
     pub access_mode: TransactionAccessMode,
@@ -126,7 +126,7 @@ pub struct TransactionStart {
 }
 
 /// Indicator that any current transaction should be terminated
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct TransactionEnd {
     /// whether the transaction committed or aborted
     pub conclusion: TransactionConclusion,
@@ -138,7 +138,7 @@ pub struct TransactionEnd {
 
 /// Set a Variable's value -- value in
 /// [`ConfigOptions`](datafusion_common::config::ConfigOptions)
-#[derive(Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct SetVariable {
     /// The variable name
     pub variable: String,
diff --git a/datafusion/optimizer/src/common_subexpr_eliminate.rs 
b/datafusion/optimizer/src/common_subexpr_eliminate.rs
index 70ca6f5304..9cd9e4dece 100644
--- a/datafusion/optimizer/src/common_subexpr_eliminate.rs
+++ b/datafusion/optimizer/src/common_subexpr_eliminate.rs
@@ -1189,7 +1189,7 @@ mod test {
         plan: LogicalPlan,
         config: Option<&dyn OptimizerConfig>,
     ) {
-        assert_eq!(expected, format!("{plan:?}"), "Unexpected starting plan");
+        assert_eq!(expected, format!("{plan}"), "Unexpected starting plan");
         let optimizer = CommonSubexprEliminate::new();
         let default_config = OptimizerContext::new();
         let config = config.unwrap_or(&default_config);
@@ -1198,7 +1198,7 @@ mod test {
         let optimized_plan = optimized_plan.data;
         assert_eq!(
             expected,
-            format!("{optimized_plan:?}"),
+            format!("{optimized_plan}"),
             "Unexpected optimized plan"
         );
     }
@@ -1214,7 +1214,7 @@ mod test {
         let optimized_plan = optimizer.rewrite(plan, config).unwrap();
         assert!(optimized_plan.transformed, "failed to optimize plan");
         let optimized_plan = optimized_plan.data;
-        let formatted_plan = format!("{optimized_plan:?}");
+        let formatted_plan = format!("{optimized_plan}");
         assert_eq!(expected, formatted_plan);
     }
 
diff --git a/datafusion/optimizer/src/eliminate_limit.rs 
b/datafusion/optimizer/src/eliminate_limit.rs
index 165834e759..a42fe6a6f9 100644
--- a/datafusion/optimizer/src/eliminate_limit.rs
+++ b/datafusion/optimizer/src/eliminate_limit.rs
@@ -105,7 +105,7 @@ mod tests {
         let optimized_plan =
             optimizer.optimize(plan, &OptimizerContext::new(), observe)?;
 
-        let formatted_plan = format!("{optimized_plan:?}");
+        let formatted_plan = format!("{optimized_plan}");
         assert_eq!(formatted_plan, expected);
         Ok(())
     }
@@ -123,7 +123,7 @@ mod tests {
         let optimized_plan = optimizer
             .optimize(plan, &config, observe)
             .expect("failed to optimize plan");
-        let formatted_plan = format!("{optimized_plan:?}");
+        let formatted_plan = format!("{optimized_plan}");
         assert_eq!(formatted_plan, expected);
         Ok(())
     }
diff --git a/datafusion/optimizer/src/optimize_projections/mod.rs 
b/datafusion/optimizer/src/optimize_projections/mod.rs
index 31d59da133..a307d0ae0a 100644
--- a/datafusion/optimizer/src/optimize_projections/mod.rs
+++ b/datafusion/optimizer/src/optimize_projections/mod.rs
@@ -1529,7 +1529,7 @@ mod tests {
         \n  TableScan: test2 projection=[c1]";
 
         let optimized_plan = optimize(plan)?;
-        let formatted_plan = format!("{optimized_plan:?}");
+        let formatted_plan = format!("{optimized_plan}");
         assert_eq!(formatted_plan, expected);
 
         // make sure schema for join node include both join columns
@@ -1581,7 +1581,7 @@ mod tests {
         \n    TableScan: test2 projection=[c1]";
 
         let optimized_plan = optimize(plan)?;
-        let formatted_plan = format!("{optimized_plan:?}");
+        let formatted_plan = format!("{optimized_plan}");
         assert_eq!(formatted_plan, expected);
 
         // make sure schema for join node include both join columns
@@ -1631,7 +1631,7 @@ mod tests {
         \n    TableScan: test2 projection=[a]";
 
         let optimized_plan = optimize(plan)?;
-        let formatted_plan = format!("{optimized_plan:?}");
+        let formatted_plan = format!("{optimized_plan}");
         assert_eq!(formatted_plan, expected);
 
         // make sure schema for join node include both join columns
diff --git a/datafusion/optimizer/src/push_down_filter.rs 
b/datafusion/optimizer/src/push_down_filter.rs
index f9c9ec961c..4254d34646 100644
--- a/datafusion/optimizer/src/push_down_filter.rs
+++ b/datafusion/optimizer/src/push_down_filter.rs
@@ -1240,7 +1240,7 @@ mod tests {
         let optimized_plan =
             optimizer.optimize(plan, &OptimizerContext::new(), observe)?;
 
-        let formatted_plan = format!("{optimized_plan:?}");
+        let formatted_plan = format!("{optimized_plan}");
         assert_eq!(expected, formatted_plan);
         Ok(())
     }
@@ -1401,7 +1401,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "\
             Filter: b = Int64(1)\
             \n  Projection: test.a * Int32(2) + test.c AS b, test.c\
@@ -1431,7 +1431,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "\
             Filter: a = Int64(1)\
             \n  Projection: b * Int32(3) AS a, test.c\
@@ -1581,7 +1581,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "\
             Filter: sum(test.c) > Int64(10)\
             \n  Filter: b > Int64(10)\
@@ -1616,7 +1616,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "\
             Filter: sum(test.c) > Int64(10) AND b > Int64(10) AND sum(test.c) 
< Int64(20)\
             \n  Aggregate: groupBy=[[b]], aggr=[[sum(test.c)]]\
@@ -1765,7 +1765,7 @@ mod tests {
 
         // not part of the test
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test.a >= Int64(1)\
              \n  Projection: test.a\
              \n    Limit: skip=0, fetch=1\
@@ -1797,7 +1797,7 @@ mod tests {
 
         // not part of the test
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Projection: test.a\
             \n  Filter: test.a >= Int64(1)\
             \n    Filter: test.a <= Int64(1)\
@@ -1831,7 +1831,7 @@ mod tests {
              \n    TableScan: test";
 
         // not part of the test
-        assert_eq!(format!("{plan:?}"), expected);
+        assert_eq!(format!("{plan}"), expected);
 
         let expected = "\
         TestUserDefined\
@@ -1861,7 +1861,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test.a <= Int64(1)\
             \n  Inner Join: test.a = test2.a\
             \n    TableScan: test\
@@ -1898,7 +1898,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test.a <= Int64(1)\
             \n  Inner Join: Using test.a = test2.a\
             \n    TableScan: test\
@@ -1938,7 +1938,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test.c <= test2.b\
             \n  Inner Join: test.a = test2.a\
             \n    Projection: test.a, test.c\
@@ -1981,7 +1981,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test.b <= Int64(1)\
             \n  Inner Join: test.a = test2.a\
             \n    Projection: test.a, test.b\
@@ -2020,7 +2020,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test2.a <= Int64(1)\
             \n  Left Join: Using test.a = test2.a\
             \n    TableScan: test\
@@ -2058,7 +2058,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test.a <= Int64(1)\
             \n  Right Join: Using test.a = test2.a\
             \n    TableScan: test\
@@ -2097,7 +2097,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test.a <= Int64(1)\
             \n  Left Join: Using test.a = test2.a\
             \n    TableScan: test\
@@ -2135,7 +2135,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: test2.a <= Int64(1)\
             \n  Right Join: Using test.a = test2.a\
             \n    TableScan: test\
@@ -2178,7 +2178,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Inner Join: test.a = test2.a Filter: test.c > UInt32(1) AND 
test.b < test2.b AND test2.c > UInt32(4)\
             \n  Projection: test.a, test.b, test.c\
             \n    TableScan: test\
@@ -2220,7 +2220,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Inner Join: test.a = test2.a Filter: test.b > UInt32(1) AND 
test2.c > UInt32(4)\
             \n  Projection: test.a, test.b, test.c\
             \n    TableScan: test\
@@ -2260,7 +2260,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Inner Join: test.a = test2.b Filter: test.a > UInt32(1)\
             \n  Projection: test.a\
             \n    TableScan: test\
@@ -2303,7 +2303,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Left Join: test.a = test2.a Filter: test.a > UInt32(1) AND test.b 
< test2.b AND test2.c > UInt32(4)\
             \n  Projection: test.a, test.b, test.c\
             \n    TableScan: test\
@@ -2346,7 +2346,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Right Join: test.a = test2.a Filter: test.a > UInt32(1) AND 
test.b < test2.b AND test2.c > UInt32(4)\
             \n  Projection: test.a, test.b, test.c\
             \n    TableScan: test\
@@ -2389,7 +2389,7 @@ mod tests {
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Full Join: test.a = test2.a Filter: test.a > UInt32(1) AND test.b 
< test2.b AND test2.c > UInt32(4)\
             \n  Projection: test.a, test.b, test.c\
             \n    TableScan: test\
@@ -2397,7 +2397,7 @@ mod tests {
             \n    TableScan: test2"
         );
 
-        let expected = &format!("{plan:?}");
+        let expected = &format!("{plan}");
         assert_optimized_plan_eq(plan, expected)
     }
 
@@ -2574,7 +2574,7 @@ Projection: a, b
 
         // filter on col b
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: b > Int64(10) AND test.c > Int64(10)\
             \n  Projection: test.a AS b, test.c\
             \n    TableScan: test"
@@ -2603,7 +2603,7 @@ Projection: a, b
 
         // filter on col b
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: b > Int64(10) AND test.c > Int64(10)\
             \n  Projection: b, test.c\
             \n    Projection: test.a AS b, test.c\
@@ -2631,7 +2631,7 @@ Projection: a, b
 
         // filter on col b and d
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: b > Int64(10) AND d > Int64(10)\
             \n  Projection: test.a AS b, test.c AS d\
             \n    TableScan: test\
@@ -2668,7 +2668,7 @@ Projection: a, b
             .build()?;
 
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Inner Join: c = d Filter: c > UInt32(1)\
             \n  Projection: test.a AS c\
             \n    TableScan: test\
@@ -2700,7 +2700,7 @@ Projection: a, b
 
         // filter on col b
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: b IN ([UInt32(1), UInt32(2), UInt32(3), UInt32(4)])\
             \n  Projection: test.a AS b, test.c\
             \n    TableScan: test\
@@ -2730,7 +2730,7 @@ Projection: a, b
 
         // filter on col b
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "Filter: b IN ([UInt32(1), UInt32(2), UInt32(3), UInt32(4)])\
             \n  Projection: b, test.c\
             \n    Projection: test.a AS b, test.c\
@@ -2771,7 +2771,7 @@ Projection: a, b
         \n      TableScan: sq\
         \n  Projection: test.a AS b, test.c\
         \n    TableScan: test";
-        assert_eq!(format!("{plan:?}"), expected_before);
+        assert_eq!(format!("{plan}"), expected_before);
 
         // rewrite filter col b to test.a
         let expected_after = "\
@@ -2802,7 +2802,7 @@ Projection: a, b
         \n        SubqueryAlias: b\
         \n          Projection: Int64(0) AS a\
         \n            EmptyRelation";
-        assert_eq!(format!("{plan:?}"), expected_before);
+        assert_eq!(format!("{plan}"), expected_before);
 
         // Ensure that the predicate without any columns (0 = 1) is
         // still there.
@@ -2877,7 +2877,7 @@ Projection: a, b
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "LeftSemi Join: test1.a = test2.a Filter: test1.b > UInt32(1) AND 
test2.b > UInt32(2)\
             \n  TableScan: test1\
             \n  Projection: test2.a, test2.b\
@@ -2918,7 +2918,7 @@ Projection: a, b
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "RightSemi Join: test1.a = test2.a Filter: test1.b > UInt32(1) AND 
test2.b > UInt32(2)\
             \n  TableScan: test1\
             \n  Projection: test2.a, test2.b\
@@ -2962,7 +2962,7 @@ Projection: a, b
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "LeftAnti Join: test1.a = test2.a Filter: test1.b > UInt32(1) AND 
test2.b > UInt32(2)\
             \n  Projection: test1.a, test1.b\
             \n    TableScan: test1\
@@ -3008,7 +3008,7 @@ Projection: a, b
 
         // not part of the test, just good to know:
         assert_eq!(
-            format!("{plan:?}"),
+            format!("{plan}"),
             "RightAnti Join: test1.a = test2.a Filter: test1.b > UInt32(1) AND 
test2.b > UInt32(2)\
             \n  Projection: test1.a, test1.b\
             \n    TableScan: test1\
@@ -3074,7 +3074,7 @@ Projection: a, b
         \n      Projection: test1.a, sum(test1.b), TestScalarUDF() + Int32(1) 
AS r\
         \n        Aggregate: groupBy=[[test1.a]], aggr=[[sum(test1.b)]]\
         \n          TableScan: test1";
-        assert_eq!(format!("{plan:?}"), expected_before);
+        assert_eq!(format!("{plan}"), expected_before);
 
         let expected_after = "Projection: t.a, t.r\
         \n  SubqueryAlias: t\
@@ -3119,7 +3119,7 @@ Projection: a, b
         \n        Inner Join: test1.a = test2.a\
         \n          TableScan: test1\
         \n          TableScan: test2";
-        assert_eq!(format!("{plan:?}"), expected_before);
+        assert_eq!(format!("{plan}"), expected_before);
 
         let expected = "Projection: t.a, t.r\
         \n  SubqueryAlias: t\
diff --git a/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs 
b/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
index e44f60d1df..cb9ec3024d 100644
--- a/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
+++ b/datafusion/optimizer/src/simplify_expressions/simplify_exprs.rs
@@ -187,7 +187,7 @@ mod tests {
         let optimizer = 
Optimizer::with_rules(vec![Arc::new(SimplifyExpressions::new())]);
         let optimized_plan =
             optimizer.optimize(plan, &OptimizerContext::new(), observe)?;
-        let formatted_plan = format!("{optimized_plan:?}");
+        let formatted_plan = format!("{optimized_plan}");
         assert_eq!(formatted_plan, expected);
         Ok(())
     }
@@ -437,7 +437,7 @@ mod tests {
         let rule = SimplifyExpressions::new();
 
         let optimized_plan = rule.rewrite(plan, &config).unwrap().data;
-        format!("{optimized_plan:?}")
+        format!("{optimized_plan}")
     }
 
     #[test]
diff --git a/datafusion/optimizer/src/test/mod.rs 
b/datafusion/optimizer/src/test/mod.rs
index 4dccb42941..1266b548ab 100644
--- a/datafusion/optimizer/src/test/mod.rs
+++ b/datafusion/optimizer/src/test/mod.rs
@@ -116,7 +116,7 @@ pub fn assert_analyzed_plan_eq(
     let options = ConfigOptions::default();
     let analyzed_plan =
         Analyzer::with_rules(vec![rule]).execute_and_check(plan, &options, |_, 
_| {})?;
-    let formatted_plan = format!("{analyzed_plan:?}");
+    let formatted_plan = format!("{analyzed_plan}");
     assert_eq!(formatted_plan, expected);
 
     Ok(())
@@ -130,7 +130,7 @@ pub fn assert_analyzed_plan_ne(
     let options = ConfigOptions::default();
     let analyzed_plan =
         Analyzer::with_rules(vec![rule]).execute_and_check(plan, &options, |_, 
_| {})?;
-    let formatted_plan = format!("{analyzed_plan:?}");
+    let formatted_plan = format!("{analyzed_plan}");
     assert_ne!(formatted_plan, expected);
 
     Ok(())
@@ -178,7 +178,7 @@ pub fn assert_optimized_plan_eq(
 
     let optimizer = Optimizer::with_rules(vec![Arc::clone(&rule)]);
     let optimized_plan = optimizer.optimize(plan, &opt_context, observe)?;
-    let formatted_plan = format!("{optimized_plan:?}");
+    let formatted_plan = format!("{optimized_plan}");
     assert_eq!(formatted_plan, expected);
 
     Ok(())
@@ -205,7 +205,7 @@ pub fn assert_optimized_plan_with_rules(
     eq: bool,
 ) -> Result<()> {
     let optimized_plan = generate_optimized_plan_with_rules(rules, plan);
-    let formatted_plan = format!("{optimized_plan:?}");
+    let formatted_plan = format!("{optimized_plan}");
     if eq {
         assert_eq!(formatted_plan, expected);
     } else {
diff --git a/datafusion/optimizer/tests/optimizer_integration.rs 
b/datafusion/optimizer/tests/optimizer_integration.rs
index 3c77ffaa17..aaa5eec395 100644
--- a/datafusion/optimizer/tests/optimizer_integration.rs
+++ b/datafusion/optimizer/tests/optimizer_integration.rs
@@ -50,13 +50,13 @@ fn case_when() -> Result<()> {
     let expected =
         "Projection: CASE WHEN test.col_int32 > Int32(0) THEN Int64(1) ELSE 
Int64(0) END AS CASE WHEN test.col_int32 > Int64(0) THEN Int64(1) ELSE Int64(0) 
END\
          \n  TableScan: test projection=[col_int32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 
     let sql = "SELECT CASE WHEN col_uint32 > 0 THEN 1 ELSE 0 END FROM test";
     let plan = test_sql(sql)?;
     let expected = "Projection: CASE WHEN test.col_uint32 > UInt32(0) THEN 
Int64(1) ELSE Int64(0) END AS CASE WHEN test.col_uint32 > Int64(0) THEN 
Int64(1) ELSE Int64(0) END\
                     \n  TableScan: test projection=[col_uint32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -78,7 +78,7 @@ fn subquery_filter_with_cast() -> Result<()> {
     \n        Projection: test.col_int32\
     \n          Filter: test.col_utf8 >= Utf8(\"2002-05-08\") AND 
test.col_utf8 <= Utf8(\"2002-05-13\")\
     \n            TableScan: test projection=[col_int32, col_utf8]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -89,7 +89,7 @@ fn case_when_aggregate() -> Result<()> {
     let expected = "Projection: test.col_utf8, sum(CASE WHEN test.col_int32 > 
Int64(0) THEN Int64(1) ELSE Int64(0) END) AS n\
                     \n  Aggregate: groupBy=[[test.col_utf8]], aggr=[[sum(CASE 
WHEN test.col_int32 > Int32(0) THEN Int64(1) ELSE Int64(0) END) AS sum(CASE 
WHEN test.col_int32 > Int64(0) THEN Int64(1) ELSE Int64(0) END)]]\
                     \n    TableScan: test projection=[col_int32, col_utf8]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -100,7 +100,7 @@ fn unsigned_target_type() -> Result<()> {
     let expected = "Projection: test.col_utf8\
                     \n  Filter: test.col_uint32 > UInt32(0)\
                     \n    TableScan: test projection=[col_uint32, col_utf8]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -111,7 +111,7 @@ fn distribute_by() -> Result<()> {
     let plan = test_sql(sql)?;
     let expected = "Repartition: DistributeBy(test.col_utf8)\
     \n  TableScan: test projection=[col_int32, col_utf8]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -128,7 +128,7 @@ fn semi_join_with_join_filter() -> Result<()> {
                     \n    SubqueryAlias: __correlated_sq_1\
                     \n      SubqueryAlias: t2\
                     \n        TableScan: test projection=[col_int32, 
col_uint32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -145,7 +145,7 @@ fn anti_join_with_join_filter() -> Result<()> {
     \n    SubqueryAlias: __correlated_sq_1\
     \n      SubqueryAlias: t2\
     \n        TableScan: test projection=[col_int32, col_uint32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -160,7 +160,7 @@ fn where_exists_distinct() -> Result<()> {
     \n    Aggregate: groupBy=[[t2.col_int32]], aggr=[[]]\
     \n      SubqueryAlias: t2\
     \n        TableScan: test projection=[col_int32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -178,7 +178,7 @@ fn intersect() -> Result<()> {
     \n        TableScan: test projection=[col_int32, col_utf8]\
     \n      TableScan: test projection=[col_int32, col_utf8]\
     \n  TableScan: test projection=[col_int32, col_utf8]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -192,7 +192,7 @@ fn between_date32_plus_interval() -> Result<()> {
         \n  Projection: \
         \n    Filter: test.col_date32 >= Date32(\"1998-03-18\") AND 
test.col_date32 <= Date32(\"1998-06-16\")\
         \n      TableScan: test projection=[col_date32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -206,7 +206,7 @@ fn between_date64_plus_interval() -> Result<()> {
         \n  Projection: \
         \n    Filter: test.col_date64 >= Date64(\"1998-03-18\") AND 
test.col_date64 <= Date64(\"1998-06-16\")\
         \n      TableScan: test projection=[col_date64]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
     Ok(())
 }
 
@@ -216,7 +216,7 @@ fn propagate_empty_relation() {
     let plan = test_sql(sql).unwrap();
     // when children exist EmptyRelation, it will bottom-up propagate.
     let expected = "EmptyRelation";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 }
 
 #[test]
@@ -232,7 +232,7 @@ fn join_keys_in_subquery_alias() {
     \n      Filter: test.col_int32 IS NOT NULL\
     \n        TableScan: test projection=[col_int32]";
 
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 }
 
 #[test]
@@ -251,7 +251,7 @@ fn join_keys_in_subquery_alias_1() {
     \n        SubqueryAlias: c\
     \n          Filter: test.col_int32 IS NOT NULL\
     \n            TableScan: test projection=[col_int32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 }
 
 #[test]
@@ -262,7 +262,7 @@ fn push_down_filter_groupby_expr_contains_alias() {
     \n  Aggregate: groupBy=[[test.col_int32 + CAST(test.col_uint32 AS 
Int32)]], aggr=[[count(Int64(1)) AS count(*)]]\
     \n    Filter: test.col_int32 + CAST(test.col_uint32 AS Int32) > Int32(3)\
     \n      TableScan: test projection=[col_int32, col_uint32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 }
 
 #[test]
@@ -276,7 +276,7 @@ fn test_same_name_but_not_ambiguous() {
     \n      TableScan: test projection=[col_int32]\
     \n  SubqueryAlias: t2\
     \n    TableScan: test projection=[col_int32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 }
 
 #[test]
@@ -291,7 +291,7 @@ fn eliminate_nested_filters() {
         Filter: test.col_int32 > Int32(0)\
         \n  TableScan: test projection=[col_int32]";
 
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 }
 
 #[test]
@@ -306,7 +306,7 @@ fn eliminate_redundant_null_check_on_count() {
         Projection: test.col_int32, count(*) AS c\
         \n  Aggregate: groupBy=[[test.col_int32]], aggr=[[count(Int64(1)) AS 
count(*)]]\
         \n    TableScan: test projection=[col_int32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 }
 
 #[test]
@@ -332,7 +332,7 @@ fn test_propagate_empty_relation_inner_join_and_unions() {
         \n  TableScan: test projection=[col_int32]\
         \n  Filter: test.col_int32 < Int32(0)\
         \n    TableScan: test projection=[col_int32]";
-    assert_eq!(expected, format!("{plan:?}"));
+    assert_eq!(expected, format!("{plan}"));
 }
 
 fn test_sql(sql: &str) -> Result<LogicalPlan> {
diff --git a/datafusion/proto/tests/cases/roundtrip_logical_plan.rs 
b/datafusion/proto/tests/cases/roundtrip_logical_plan.rs
index d150c474e8..b96398ef21 100644
--- a/datafusion/proto/tests/cases/roundtrip_logical_plan.rs
+++ b/datafusion/proto/tests/cases/roundtrip_logical_plan.rs
@@ -308,7 +308,7 @@ async fn roundtrip_logical_plan_aggregation_with_pk() -> 
Result<()> {
 
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     Ok(())
 }
@@ -334,7 +334,7 @@ async fn roundtrip_logical_plan_aggregation() -> Result<()> 
{
 
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     Ok(())
 }
@@ -358,7 +358,7 @@ async fn roundtrip_logical_plan_copy_to_sql_options() -> 
Result<()> {
     let bytes = logical_plan_to_bytes_with_extension_codec(&plan, &codec)?;
     let logical_round_trip =
         logical_plan_from_bytes_with_extension_codec(&bytes, &ctx, &codec)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     Ok(())
 }
@@ -430,7 +430,7 @@ async fn roundtrip_logical_plan_copy_to_arrow() -> 
Result<()> {
     let bytes = logical_plan_to_bytes_with_extension_codec(&plan, &codec)?;
     let logical_round_trip =
         logical_plan_from_bytes_with_extension_codec(&bytes, &ctx, &codec)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     match logical_round_trip {
         LogicalPlan::Copy(copy_to) => {
@@ -544,7 +544,7 @@ async fn roundtrip_logical_plan_copy_to_json() -> 
Result<()> {
     let bytes = logical_plan_to_bytes_with_extension_codec(&plan, &codec)?;
     let logical_round_trip =
         logical_plan_from_bytes_with_extension_codec(&bytes, &ctx, &codec)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     match logical_round_trip {
         LogicalPlan::Copy(copy_to) => {
@@ -614,7 +614,7 @@ async fn roundtrip_logical_plan_copy_to_parquet() -> 
Result<()> {
     let bytes = logical_plan_to_bytes_with_extension_codec(&plan, &codec)?;
     let logical_round_trip =
         logical_plan_from_bytes_with_extension_codec(&bytes, &ctx, &codec)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     match logical_round_trip {
         LogicalPlan::Copy(copy_to) => {
@@ -701,7 +701,7 @@ async fn roundtrip_logical_plan_distinct_on() -> Result<()> 
{
 
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     Ok(())
 }
@@ -727,7 +727,7 @@ async fn roundtrip_single_count_distinct() -> Result<()> {
 
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     Ok(())
 }
@@ -740,7 +740,7 @@ async fn roundtrip_logical_plan_with_extension() -> 
Result<()> {
     let plan = ctx.table("t1").await?.into_optimized_plan()?;
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
     Ok(())
 }
 
@@ -765,7 +765,7 @@ async fn roundtrip_logical_plan_unnest() -> Result<()> {
     let plan = ctx.sql(query).await?.into_optimized_plan()?;
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
     Ok(())
 }
 
@@ -906,7 +906,7 @@ async fn roundtrip_expr_api() -> Result<()> {
     let plan = table.select(expr_list)?.into_optimized_plan()?;
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
     Ok(())
 }
 
@@ -926,13 +926,13 @@ async fn roundtrip_logical_plan_with_view_scan() -> 
Result<()> {
 
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     // DROP
     let plan = ctx.sql("DROP VIEW view_t1").await?.into_optimized_plan()?;
     let bytes = logical_plan_to_bytes(&plan)?;
     let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
-    assert_eq!(format!("{plan:?}"), format!("{logical_round_trip:?}"));
+    assert_eq!(format!("{plan}"), format!("{logical_round_trip}"));
 
     Ok(())
 }
diff --git a/datafusion/sql/examples/sql.rs b/datafusion/sql/examples/sql.rs
index d9ee1b4db8..aa17be6273 100644
--- a/datafusion/sql/examples/sql.rs
+++ b/datafusion/sql/examples/sql.rs
@@ -63,7 +63,7 @@ fn main() {
     let plan = sql_to_rel.sql_statement_to_plan(statement.clone()).unwrap();
 
     // show the plan
-    println!("{plan:?}");
+    println!("{plan}");
 }
 
 struct MyContextProvider {
diff --git a/datafusion/sql/tests/cases/plan_to_sql.rs 
b/datafusion/sql/tests/cases/plan_to_sql.rs
index bae3ec2e27..b65f976a22 100644
--- a/datafusion/sql/tests/cases/plan_to_sql.rs
+++ b/datafusion/sql/tests/cases/plan_to_sql.rs
@@ -209,7 +209,7 @@ fn roundtrip_crossjoin() -> Result<()> {
         \n    TableScan: j1\
         \n    TableScan: j2";
 
-    assert_eq!(format!("{plan_roundtrip:?}"), expected);
+    assert_eq!(format!("{plan_roundtrip}"), expected);
 
     Ok(())
 }
@@ -420,7 +420,7 @@ fn test_unnest_logical_plan() -> Result<()> {
         \n    Projection: unnest_table.struct_col AS 
unnest(unnest_table.struct_col), unnest_table.array_col AS 
unnest(unnest_table.array_col), unnest_table.struct_col, unnest_table.array_col\
         \n      TableScan: unnest_table";
 
-    assert_eq!(format!("{plan:?}"), expected);
+    assert_eq!(format!("{plan}"), expected);
 
     Ok(())
 }
diff --git a/datafusion/sql/tests/sql_integration.rs 
b/datafusion/sql/tests/sql_integration.rs
index c1b2246e49..e61c29f1c8 100644
--- a/datafusion/sql/tests/sql_integration.rs
+++ b/datafusion/sql/tests/sql_integration.rs
@@ -149,7 +149,8 @@ fn parse_ident_normalization() {
             },
         );
         if plan.is_ok() {
-            assert_eq!(expected, format!("{plan:?}"));
+            let plan = plan.unwrap();
+            assert_eq!(expected, format!("Ok({plan})"));
         } else {
             assert_eq!(expected, plan.unwrap_err().strip_backtrace());
         }
@@ -198,7 +199,7 @@ fn test_parse_options_value_normalization() {
             },
         );
         if let Ok(plan) = plan {
-            assert_eq!(expected_plan, format!("{plan:?}"));
+            assert_eq!(expected_plan, format!("{plan}"));
 
             match plan {
                 LogicalPlan::Ddl(DdlStatement::CreateExternalTable(
@@ -2827,7 +2828,7 @@ fn quick_test(sql: &str, expected: &str) {
 
 fn quick_test_with_options(sql: &str, expected: &str, options: ParserOptions) {
     let plan = logical_plan_with_options(sql, options).unwrap();
-    assert_eq!(format!("{plan:?}"), expected);
+    assert_eq!(format!("{plan}"), expected);
 }
 
 fn prepare_stmt_quick_test(
@@ -2839,7 +2840,7 @@ fn prepare_stmt_quick_test(
 
     let assert_plan = plan.clone();
     // verify plan
-    assert_eq!(format!("{assert_plan:?}"), expected_plan);
+    assert_eq!(format!("{assert_plan}"), expected_plan);
 
     // verify data types
     if let LogicalPlan::Prepare(Prepare { data_types, .. }) = assert_plan {
@@ -2857,7 +2858,7 @@ fn prepare_stmt_replace_params_quick_test(
 ) -> LogicalPlan {
     // replace params
     let plan = plan.with_param_values(param_values).unwrap();
-    assert_eq!(format!("{plan:?}"), expected_plan);
+    assert_eq!(format!("{plan}"), expected_plan);
 
     plan
 }
diff --git a/datafusion/substrait/src/logical_plan/producer.rs 
b/datafusion/substrait/src/logical_plan/producer.rs
index bd6e0e0049..a782af8eb2 100644
--- a/datafusion/substrait/src/logical_plan/producer.rs
+++ b/datafusion/substrait/src/logical_plan/producer.rs
@@ -558,7 +558,7 @@ pub fn to_substrait_rel(
                 rel_type: Some(rel_type),
             }))
         }
-        _ => not_impl_err!("Unsupported operator: {plan:?}"),
+        _ => not_impl_err!("Unsupported operator: {plan}"),
     }
 }
 
diff --git a/datafusion/substrait/tests/cases/consumer_integration.rs 
b/datafusion/substrait/tests/cases/consumer_integration.rs
index 8fbcd72116..fc5f82127d 100644
--- a/datafusion/substrait/tests/cases/consumer_integration.rs
+++ b/datafusion/substrait/tests/cases/consumer_integration.rs
@@ -55,7 +55,7 @@ mod tests {
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
 
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(
             plan_str,
             "Projection: FILENAME_PLACEHOLDER_0.l_returnflag AS L_RETURNFLAG, 
FILENAME_PLACEHOLDER_0.l_linestatus AS L_LINESTATUS, 
sum(FILENAME_PLACEHOLDER_0.l_quantity) AS SUM_QTY, 
sum(FILENAME_PLACEHOLDER_0.l_extendedprice) AS SUM_BASE_PRICE, 
sum(FILENAME_PLACEHOLDER_0.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_0.l_discount) AS SUM_DISC_PRICE, 
sum(FILENAME_PLACEHOLDER_0.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_0.l_discount * Int32(1) + FILENAME_PLACEHOLDER_0.l_tax) AS 
S [...]
@@ -89,7 +89,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(
             plan_str,
             "Projection: FILENAME_PLACEHOLDER_1.s_acctbal AS S_ACCTBAL, 
FILENAME_PLACEHOLDER_1.s_name AS S_NAME, FILENAME_PLACEHOLDER_3.n_name AS 
N_NAME, FILENAME_PLACEHOLDER_0.p_partkey AS P_PARTKEY, 
FILENAME_PLACEHOLDER_0.p_mfgr AS P_MFGR, FILENAME_PLACEHOLDER_1.s_address AS 
S_ADDRESS, FILENAME_PLACEHOLDER_1.s_phone AS S_PHONE, 
FILENAME_PLACEHOLDER_1.s_comment AS S_COMMENT\
@@ -136,7 +136,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: FILENAME_PLACEHOLDER_2.l_orderkey AS 
L_ORDERKEY, sum(FILENAME_PLACEHOLDER_2.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_2.l_discount) AS REVENUE, 
FILENAME_PLACEHOLDER_1.o_orderdate AS O_ORDERDATE, 
FILENAME_PLACEHOLDER_1.o_shippriority AS O_SHIPPRIORITY\
         \n  Limit: skip=0, fetch=10\
         \n    Sort: sum(FILENAME_PLACEHOLDER_2.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_2.l_discount) DESC NULLS FIRST, 
FILENAME_PLACEHOLDER_1.o_orderdate ASC NULLS LAST\
@@ -164,7 +164,7 @@ mod tests {
         ))
         .expect("failed to parse json");
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: 
FILENAME_PLACEHOLDER_0.o_orderpriority AS O_ORDERPRIORITY, count(Int64(1)) AS 
ORDER_COUNT\
         \n  Sort: FILENAME_PLACEHOLDER_0.o_orderpriority ASC NULLS LAST\
         \n    Aggregate: groupBy=[[FILENAME_PLACEHOLDER_0.o_orderpriority]], 
aggr=[[count(Int64(1))]]\
@@ -195,7 +195,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: NATION.n_name AS N_NAME, 
sum(FILENAME_PLACEHOLDER_2.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_2.l_discount) AS REVENUE\
         \n  Sort: sum(FILENAME_PLACEHOLDER_2.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_2.l_discount) DESC NULLS FIRST\
         \n    Aggregate: groupBy=[[NATION.n_name]], 
aggr=[[sum(FILENAME_PLACEHOLDER_2.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_2.l_discount)]]\
@@ -229,7 +229,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Aggregate: groupBy=[[]], 
aggr=[[sum(FILENAME_PLACEHOLDER_0.l_extendedprice * 
FILENAME_PLACEHOLDER_0.l_discount) AS REVENUE]]\
         \n  Projection: FILENAME_PLACEHOLDER_0.l_extendedprice * 
FILENAME_PLACEHOLDER_0.l_discount\
         \n    Filter: FILENAME_PLACEHOLDER_0.l_shipdate >= 
CAST(Utf8(\"1994-01-01\") AS Date32) AND FILENAME_PLACEHOLDER_0.l_shipdate < 
CAST(Utf8(\"1995-01-01\") AS Date32) AND FILENAME_PLACEHOLDER_0.l_discount >= 
Decimal128(Some(5),3,2) AND FILENAME_PLACEHOLDER_0.l_discount <= 
Decimal128(Some(7),3,2) AND FILENAME_PLACEHOLDER_0.l_quantity < CAST(Int32(24) 
AS Decimal128(19, 0))\
@@ -254,7 +254,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: FILENAME_PLACEHOLDER_0.c_custkey AS 
C_CUSTKEY, FILENAME_PLACEHOLDER_0.c_name AS C_NAME, 
sum(FILENAME_PLACEHOLDER_2.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_2.l_discount) AS REVENUE, FILENAME_PLACEHOLDER_0.c_acctbal 
AS C_ACCTBAL, FILENAME_PLACEHOLDER_3.n_name AS N_NAME, 
FILENAME_PLACEHOLDER_0.c_address AS C_ADDRESS, FILENAME_PLACEHOLDER_0.c_phone 
AS C_PHONE, FILENAME_PLACEHOLDER_0.c_comment AS C_COMMENT\
         \n  Limit: skip=0, fetch=20\
         \n    Sort: sum(FILENAME_PLACEHOLDER_2.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_2.l_discount) DESC NULLS FIRST\
@@ -289,7 +289,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: FILENAME_PLACEHOLDER_0.ps_partkey AS 
PS_PARTKEY, sum(FILENAME_PLACEHOLDER_0.ps_supplycost * 
FILENAME_PLACEHOLDER_0.ps_availqty) AS value\
         \n  Sort: sum(FILENAME_PLACEHOLDER_0.ps_supplycost * 
FILENAME_PLACEHOLDER_0.ps_availqty) DESC NULLS FIRST\
         \n    Filter: sum(FILENAME_PLACEHOLDER_0.ps_supplycost * 
FILENAME_PLACEHOLDER_0.ps_availqty) > (<subquery>)\
@@ -329,7 +329,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: 
count(FILENAME_PLACEHOLDER_1.o_orderkey) AS C_COUNT, count(Int64(1)) AS 
CUSTDIST\
         \n  Sort: count(Int64(1)) DESC NULLS FIRST, 
count(FILENAME_PLACEHOLDER_1.o_orderkey) DESC NULLS FIRST\
         \n    Projection: count(FILENAME_PLACEHOLDER_1.o_orderkey), 
count(Int64(1))\
@@ -357,7 +357,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: Decimal128(Some(10000),5,2) * 
sum(CASE WHEN FILENAME_PLACEHOLDER_1.p_type LIKE CAST(Utf8(\"PROMO%\") AS Utf8) 
THEN FILENAME_PLACEHOLDER_0.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_0.l_discount ELSE Decimal128(Some(0),19,0) END) / 
sum(FILENAME_PLACEHOLDER_0.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_0.l_discount) AS PROMO_REVENUE\
         \n  Aggregate: groupBy=[[]], aggr=[[sum(CASE WHEN 
FILENAME_PLACEHOLDER_1.p_type LIKE CAST(Utf8(\"PROMO%\") AS Utf8) THEN 
FILENAME_PLACEHOLDER_0.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_0.l_discount ELSE Decimal128(Some(0),19,0) END), 
sum(FILENAME_PLACEHOLDER_0.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_0.l_discount)]]\
         \n    Projection: CASE WHEN FILENAME_PLACEHOLDER_1.p_type LIKE 
CAST(Utf8(\"PROMO%\") AS Utf8) THEN FILENAME_PLACEHOLDER_0.l_extendedprice * 
(CAST(Int32(1) AS Decimal128(19, 0)) - FILENAME_PLACEHOLDER_0.l_discount) ELSE 
Decimal128(Some(0),19,0) END, FILENAME_PLACEHOLDER_0.l_extendedprice * 
(CAST(Int32(1) AS Decimal128(19, 0)) - FILENAME_PLACEHOLDER_0.l_discount)\
@@ -383,7 +383,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: FILENAME_PLACEHOLDER_1.p_brand AS 
P_BRAND, FILENAME_PLACEHOLDER_1.p_type AS P_TYPE, FILENAME_PLACEHOLDER_1.p_size 
AS P_SIZE, count(DISTINCT FILENAME_PLACEHOLDER_0.ps_suppkey) AS SUPPLIER_CNT\
         \n  Sort: count(DISTINCT FILENAME_PLACEHOLDER_0.ps_suppkey) DESC NULLS 
FIRST, FILENAME_PLACEHOLDER_1.p_brand ASC NULLS LAST, 
FILENAME_PLACEHOLDER_1.p_type ASC NULLS LAST, FILENAME_PLACEHOLDER_1.p_size ASC 
NULLS LAST\
         \n    Aggregate: groupBy=[[FILENAME_PLACEHOLDER_1.p_brand, 
FILENAME_PLACEHOLDER_1.p_type, FILENAME_PLACEHOLDER_1.p_size]], 
aggr=[[count(DISTINCT FILENAME_PLACEHOLDER_0.ps_suppkey)]]\
@@ -434,7 +434,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: FILENAME_PLACEHOLDER_0.c_name AS 
C_NAME, FILENAME_PLACEHOLDER_0.c_custkey AS C_CUSTKEY, 
FILENAME_PLACEHOLDER_1.o_orderkey AS O_ORDERKEY, 
FILENAME_PLACEHOLDER_1.o_orderdate AS O_ORDERDATE, 
FILENAME_PLACEHOLDER_1.o_totalprice AS O_TOTALPRICE, 
sum(FILENAME_PLACEHOLDER_2.l_quantity) AS EXPR$5\
         \n  Limit: skip=0, fetch=100\
         \n    Sort: FILENAME_PLACEHOLDER_1.o_totalprice DESC NULLS FIRST, 
FILENAME_PLACEHOLDER_1.o_orderdate ASC NULLS LAST\
@@ -468,7 +468,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Aggregate: groupBy=[[]], 
aggr=[[sum(FILENAME_PLACEHOLDER_0.l_extendedprice * Int32(1) - 
FILENAME_PLACEHOLDER_0.l_discount) AS REVENUE]]\n  Projection: 
FILENAME_PLACEHOLDER_0.l_extendedprice * (CAST(Int32(1) AS Decimal128(19, 0)) - 
FILENAME_PLACEHOLDER_0.l_discount)\
         \n    Filter: FILENAME_PLACEHOLDER_1.p_partkey = 
FILENAME_PLACEHOLDER_0.l_partkey AND FILENAME_PLACEHOLDER_1.p_brand = 
CAST(Utf8(\"Brand#12\") AS Utf8) AND (FILENAME_PLACEHOLDER_1.p_container = 
Utf8(\"SM CASE\") OR FILENAME_PLACEHOLDER_1.p_container = Utf8(\"SM BOX\") OR 
FILENAME_PLACEHOLDER_1.p_container = Utf8(\"SM PACK\") OR 
FILENAME_PLACEHOLDER_1.p_container = Utf8(\"SM PKG\")) AND 
FILENAME_PLACEHOLDER_0.l_quantity >= CAST(Int32(1) AS Decimal128(19, 0)) AND 
FILENAME_PLACEHOLD [...]
         \n      Inner Join:  Filter: Boolean(true)\
@@ -494,7 +494,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: FILENAME_PLACEHOLDER_0.s_name AS 
S_NAME, FILENAME_PLACEHOLDER_0.s_address AS S_ADDRESS\
         \n  Sort: FILENAME_PLACEHOLDER_0.s_name ASC NULLS LAST\
         \n    Projection: FILENAME_PLACEHOLDER_0.s_name, 
FILENAME_PLACEHOLDER_0.s_address\
@@ -537,7 +537,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: FILENAME_PLACEHOLDER_0.s_name AS 
S_NAME, count(Int64(1)) AS NUMWAIT\
         \n  Limit: skip=0, fetch=100\
         \n    Sort: count(Int64(1)) DESC NULLS FIRST, 
FILENAME_PLACEHOLDER_0.s_name ASC NULLS LAST\
@@ -574,7 +574,7 @@ mod tests {
         .expect("failed to parse json");
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
         assert_eq!(plan_str, "Projection: 
substr(FILENAME_PLACEHOLDER_0.c_phone,Int32(1),Int32(2)) AS CNTRYCODE, 
count(Int64(1)) AS NUMCUST, sum(FILENAME_PLACEHOLDER_0.c_acctbal) AS 
TOTACCTBAL\n  Sort: substr(FILENAME_PLACEHOLDER_0.c_phone,Int32(1),Int32(2)) 
ASC NULLS LAST\
         \n    Aggregate: 
groupBy=[[substr(FILENAME_PLACEHOLDER_0.c_phone,Int32(1),Int32(2))]], 
aggr=[[count(Int64(1)), sum(FILENAME_PLACEHOLDER_0.c_acctbal)]]\
         \n      Projection: substr(FILENAME_PLACEHOLDER_0.c_phone, Int32(1), 
Int32(2)), FILENAME_PLACEHOLDER_0.c_acctbal\
diff --git a/datafusion/substrait/tests/cases/function_test.rs 
b/datafusion/substrait/tests/cases/function_test.rs
index b4c5659a3a..610caf3a81 100644
--- a/datafusion/substrait/tests/cases/function_test.rs
+++ b/datafusion/substrait/tests/cases/function_test.rs
@@ -38,7 +38,7 @@ mod tests {
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
 
-        let plan_str = format!("{:?}", plan);
+        let plan_str = format!("{}", plan);
 
         assert_eq!(
             plan_str,
diff --git a/datafusion/substrait/tests/cases/logical_plans.rs 
b/datafusion/substrait/tests/cases/logical_plans.rs
index 6492febc93..f6a2b5036c 100644
--- a/datafusion/substrait/tests/cases/logical_plans.rs
+++ b/datafusion/substrait/tests/cases/logical_plans.rs
@@ -44,7 +44,7 @@ mod tests {
         let plan = from_substrait_plan(&ctx, &proto).await?;
 
         assert_eq!(
-            format!("{:?}", plan),
+            format!("{}", plan),
             "Projection: NOT DATA.a AS EXPR$0\
             \n  TableScan: DATA projection=[a, b, c, d, e, f]"
         );
@@ -70,7 +70,7 @@ mod tests {
         let plan = from_substrait_plan(&ctx, &proto).await?;
 
         assert_eq!(
-            format!("{:?}", plan),
+            format!("{}", plan),
             "Projection: sum(DATA.a) PARTITION BY [DATA.b] ORDER BY [DATA.c 
ASC NULLS LAST] ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING AS LEAD_EXPR\
             \n  WindowAggr: windowExpr=[[sum(DATA.a) PARTITION BY [DATA.b] 
ORDER BY [DATA.c ASC NULLS LAST] ROWS BETWEEN 1 PRECEDING AND UNBOUNDED 
FOLLOWING]]\
             \n    TableScan: DATA projection=[a, b, c, d, e, f]"
@@ -89,7 +89,7 @@ mod tests {
 
         let plan = from_substrait_plan(&ctx, &proto).await?;
 
-        assert_eq!(format!("{:?}", &plan), "Values: (List([1, 2]))");
+        assert_eq!(format!("{}", &plan), "Values: (List([1, 2]))");
 
         // Need to trigger execution to ensure that Arrow has validated the 
plan
         DataFrame::new(ctx.state(), plan).show().await?;
diff --git a/datafusion/substrait/tests/cases/roundtrip_logical_plan.rs 
b/datafusion/substrait/tests/cases/roundtrip_logical_plan.rs
index 439e3efa29..083a589fce 100644
--- a/datafusion/substrait/tests/cases/roundtrip_logical_plan.rs
+++ b/datafusion/substrait/tests/cases/roundtrip_logical_plan.rs
@@ -841,8 +841,8 @@ async fn extension_logical_plan() -> Result<()> {
     let proto = to_substrait_plan(&ext_plan, &ctx)?;
     let plan2 = from_substrait_plan(&ctx, &proto).await?;
 
-    let plan1str = format!("{ext_plan:?}");
-    let plan2str = format!("{plan2:?}");
+    let plan1str = format!("{ext_plan}");
+    let plan2str = format!("{plan2}");
     assert_eq!(plan1str, plan2str);
 
     Ok(())
@@ -943,7 +943,7 @@ async fn roundtrip_repartition_roundrobin() -> Result<()> {
     let plan2 = from_substrait_plan(&ctx, &proto).await?;
     let plan2 = ctx.state().optimize(&plan2)?;
 
-    assert_eq!(format!("{plan:?}"), format!("{plan2:?}"));
+    assert_eq!(format!("{plan}"), format!("{plan2}"));
     Ok(())
 }
 
@@ -960,7 +960,7 @@ async fn roundtrip_repartition_hash() -> Result<()> {
     let plan2 = from_substrait_plan(&ctx, &proto).await?;
     let plan2 = ctx.state().optimize(&plan2)?;
 
-    assert_eq!(format!("{plan:?}"), format!("{plan2:?}"));
+    assert_eq!(format!("{plan}"), format!("{plan2}"));
     Ok(())
 }
 
@@ -1061,8 +1061,8 @@ async fn assert_expected_plan(
     let plan2 = from_substrait_plan(&ctx, &proto).await?;
     let plan2 = ctx.state().optimize(&plan2)?;
 
-    println!("{plan:#?}");
-    println!("{plan2:#?}");
+    println!("{plan}");
+    println!("{plan2}");
 
     println!("{proto:?}");
 
@@ -1070,7 +1070,7 @@ async fn assert_expected_plan(
         assert_eq!(plan.schema(), plan2.schema());
     }
 
-    let plan2str = format!("{plan2:?}");
+    let plan2str = format!("{plan2}");
     assert_eq!(expected_plan_str, &plan2str);
 
     Ok(())
@@ -1085,8 +1085,8 @@ async fn roundtrip_fill_na(sql: &str) -> Result<()> {
     let plan2 = ctx.state().optimize(&plan2)?;
 
     // Format plan string and replace all None's with 0
-    let plan1str = format!("{plan:?}").replace("None", "0");
-    let plan2str = format!("{plan2:?}").replace("None", "0");
+    let plan1str = format!("{plan}").replace("None", "0");
+    let plan2str = format!("{plan2}").replace("None", "0");
 
     assert_eq!(plan1str, plan2str);
 
@@ -1108,11 +1108,11 @@ async fn test_alias(sql_with_alias: &str, sql_no_alias: 
&str) -> Result<()> {
     let proto = to_substrait_plan(&df.into_optimized_plan()?, &ctx)?;
     let plan = from_substrait_plan(&ctx, &proto).await?;
 
-    println!("{plan_with_alias:#?}");
-    println!("{plan:#?}");
+    println!("{plan_with_alias}");
+    println!("{plan}");
 
-    let plan1str = format!("{plan_with_alias:?}");
-    let plan2str = format!("{plan:?}");
+    let plan1str = format!("{plan_with_alias}");
+    let plan2str = format!("{plan}");
     assert_eq!(plan1str, plan2str);
 
     assert_eq!(plan_with_alias.schema(), plan.schema());
@@ -1126,13 +1126,13 @@ async fn roundtrip_with_ctx(sql: &str, ctx: 
SessionContext) -> Result<Box<Plan>>
     let plan2 = from_substrait_plan(&ctx, &proto).await?;
     let plan2 = ctx.state().optimize(&plan2)?;
 
-    println!("{plan:#?}");
-    println!("{plan2:#?}");
+    println!("{plan}");
+    println!("{plan2}");
 
     println!("{proto:?}");
 
-    let plan1str = format!("{plan:?}");
-    let plan2str = format!("{plan2:?}");
+    let plan1str = format!("{plan}");
+    let plan2str = format!("{plan2}");
     assert_eq!(plan1str, plan2str);
 
     assert_eq!(plan.schema(), plan2.schema());
diff --git a/datafusion/substrait/tests/cases/serialize.rs 
b/datafusion/substrait/tests/cases/serialize.rs
index f6736ca222..d792ac33c3 100644
--- a/datafusion/substrait/tests/cases/serialize.rs
+++ b/datafusion/substrait/tests/cases/serialize.rs
@@ -43,8 +43,8 @@ mod tests {
         let proto = serializer::deserialize(path).await?;
         // Check plan equality
         let plan = from_substrait_plan(&ctx, &proto).await?;
-        let plan_str_ref = format!("{plan_ref:?}");
-        let plan_str = format!("{plan:?}");
+        let plan_str_ref = format!("{plan_ref}");
+        let plan_str = format!("{plan}");
         assert_eq!(plan_str_ref, plan_str);
         // Delete test binary file
         fs::remove_file(path)?;


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

Reply via email to