You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by gi...@apache.org on 2026/09/01 10:00:02 UTC

(datafusion) 01/01: Enable more clippy lints (#24837)

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

github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-24837-19d31c509633f105fba881954bbb432f7c3a0103
in repository https://gitbox.apache.org/repos/asf/datafusion.git

commit a28ba02846b10c45ddff9a3ea5f9bc9e442667ec
Author: Emil Ernerfeldt <em...@gmail.com>
AuthorDate: Tue Sep 1 09:59:40 2026 +0000

    Enable more clippy lints (#24837)
    
    ## Which issue does this PR close?
    
    - Part of #18467.
    
    ## Rationale for this change
    
    Continuing the work in:
    
    - #24466
    - #24566
    
    Turn on more `clippy::pedantic` lints from the opt-out list in
    `Cargo.toml`,
    picking ones that buy performance, correctness, or readability.
    
    ## What changes are included in this PR?
    
    One commit per lint, each removing its `"allow"` line from `Cargo.toml`
    and
    fixing every site. Review one commit at a time!
    
    Let me know if you disagree with any and I'll revert it.
    
    | Lint | Sites | Fix |
    |
    ------------------------------------------------------------------------------------------------------------------------------------------------------
    | ----: |
    -------------------------------------------------------------------------------
    |
    |
    [`needless_bitwise_bool`](https://rust-lang.github.io/rust-clippy/master/index.html#needless_bitwise_bool)
    | 1 | `#[expect]`: the non-short-circuiting `\|` is the point of the
    branchless IN-list kernel |
    |
    [`unicode_not_nfc`](https://rust-lang.github.io/rust-clippy/master/index.html#unicode_not_nfc)
    | 2 | two copies of the same decomposed literal; one now covers the
    composed form, both written with `\u{...}` |
    |
    [`format_collect`](https://rust-lang.github.io/rust-clippy/master/index.html#format_collect)
    | 4 | `fold` + `write!` into one `String` instead of a `format!` alloc
    per item |
    |
    [`large_digit_groups`](https://rust-lang.github.io/rust-clippy/master/index.html#large_digit_groups)
    | 3 | `#[expect]`: the single `_` marks the decimal point of fixed-point
    test literals |
    |
    [`borrow_as_ptr`](https://rust-lang.github.io/rust-clippy/master/index.html#borrow_as_ptr)
    | 6 | explicit `&raw const` / `&raw mut` |
    |
    [`doc_comment_double_space_linebreaks`](https://rust-lang.github.io/rust-clippy/master/index.html#doc_comment_double_space_linebreaks)
    | 8 | stray trailing spaces, not intended hard breaks |
    |
    [`single_char_pattern`](https://rust-lang.github.io/rust-clippy/master/index.html#single_char_pattern)
    | 23 | `char` patterns instead of one-character `&str` patterns |
    |
    [`format_push_string`](https://rust-lang.github.io/rust-clippy/master/index.html#format_push_string)
    | 42 | `write!`/`writeln!` into the target `String`, dropping the
    temporary alloc |
    |
    [`ptr_as_ptr`](https://rust-lang.github.io/rust-clippy/master/index.html#ptr_as_ptr)
    | 83 | `ptr.cast::<T>()`, which cannot silently change constness |
    
    ## What is the testing strategy for this PR?
    
    `cargo clippy --workspace --all-targets --all-features -- -D warnings`
    reports
    no warnings, and the extended test suite passes. The changes are
    mechanical and
    behavior-preserving, so no new tests, with one exception: the
    `unicode_not_nfc`
    commit turns a duplicated `reverse` test case into real coverage of the
    composed grapheme.
    
    ## Are there any user-facing changes?
    
    No.
---
 Cargo.toml                                         | 101 ++++++++++-----------
 benchmarks/src/bin/benchmark_runner.rs             |   9 +-
 benchmarks/src/sql_benchmark_runner.rs             |   7 +-
 benchmarks/src/util/memory.rs                      |   6 +-
 datafusion-cli/src/highlighter.rs                  |   5 +-
 .../examples/builtin_functions/main.rs             |   2 +-
 .../examples/custom_data_source/main.rs            |   6 +-
 datafusion-examples/examples/data_io/main.rs       |   2 +-
 .../examples/data_io/parquet_encrypted_with_kms.rs |   2 +-
 datafusion-examples/examples/dataframe/main.rs     |   2 +-
 datafusion-examples/examples/flight/main.rs        |   2 +-
 datafusion-examples/examples/sql_ops/main.rs       |   2 +-
 .../src/utils/example_metadata/render.rs           |  15 +--
 datafusion/common/src/dfschema.rs                  |  53 +++++++----
 datafusion/common/src/heap_size.rs                 |   2 +-
 datafusion/common/src/test_util.rs                 |   2 +-
 datafusion/common/src/tree_node.rs                 |   4 +-
 datafusion/common/src/utils/hex.rs                 |  11 ++-
 datafusion/common/src/utils/memory.rs              |   2 +-
 datafusion/core/benches/reset_plan_states.rs       |   5 +-
 datafusion/core/benches/sql_planner.rs             |  16 ++--
 datafusion/core/src/bin/print_functions_docs.rs    |   2 +-
 datafusion/core/src/test_util/parquet.rs           |   2 +-
 .../tests/custom_sources_cases/dml_planning.rs     |   4 +-
 datafusion/core/tests/dataframe/mod.rs             |   2 +-
 datafusion/core/tests/function_docs/mod.rs         |   5 +-
 .../fuzz_cases/aggregation_fuzzer/query_builder.rs |   3 +-
 .../core/tests/fuzz_cases/sort_query_fuzz.rs       |   5 +-
 datafusion/core/tests/parquet/encryption.rs        |   2 +-
 .../core/tests/parquet/external_access_plan.rs     |   2 +-
 .../tests/physical_optimizer/pushdown_utils.rs     |   3 +-
 .../user_defined_async_scalar_functions.rs         |   2 +-
 datafusion/datasource-json/src/source.rs           |   9 +-
 datafusion/datasource/src/url.rs                   |   4 +-
 datafusion/ffi/src/catalog_provider.rs             |   7 +-
 datafusion/ffi/src/catalog_provider_list.rs        |   7 +-
 datafusion/ffi/src/config/extension_options.rs     |   6 +-
 datafusion/ffi/src/execution/task_ctx.rs           |   5 +-
 datafusion/ffi/src/execution/task_ctx_provider.rs  |   6 +-
 datafusion/ffi/src/execution_plan.rs               |   4 +-
 datafusion/ffi/src/physical_expr/mod.rs            |   7 +-
 datafusion/ffi/src/physical_optimizer.rs           |   8 +-
 datafusion/ffi/src/plan_properties.rs              |   4 +-
 .../ffi/src/proto/logical_extension_codec.rs       |   9 +-
 .../ffi/src/proto/physical_extension_codec.rs      |   9 +-
 datafusion/ffi/src/query_planner.rs                |   7 +-
 datafusion/ffi/src/record_batch_stream.rs          |   7 +-
 datafusion/ffi/src/schema_provider.rs              |   7 +-
 datafusion/ffi/src/session/config.rs               |  10 +-
 datafusion/ffi/src/session/mod.rs                  |  11 ++-
 datafusion/ffi/src/table_provider.rs               |   7 +-
 datafusion/ffi/src/table_provider_factory.rs       |   8 +-
 datafusion/ffi/src/udaf/accumulator.rs             |  16 ++--
 datafusion/ffi/src/udaf/groups_accumulator.rs      |  20 ++--
 datafusion/ffi/src/udaf/mod.rs                     |   4 +-
 datafusion/ffi/src/udf/mod.rs                      |   6 +-
 datafusion/ffi/src/udtf.rs                         |   4 +-
 datafusion/ffi/src/udwf/mod.rs                     |   7 +-
 datafusion/ffi/src/udwf/partition_evaluator.rs     |  22 +++--
 .../src/aggregate/avg_distinct/decimal.rs          |   5 +
 datafusion/functions/src/regex/mod.rs              |   2 +-
 datafusion/functions/src/string/starts_with.rs     |   6 +-
 datafusion/functions/src/unicode/reverse.rs        |   6 +-
 .../src/expressions/in_list/branchless_filter.rs   |   4 +
 .../physical-plan/src/aggregates/topk/heap.rs      |   9 +-
 datafusion/physical-plan/src/statistics.rs         |   2 +-
 datafusion/proto-common/src/generated/mod.rs       |   1 +
 datafusion/proto-models/src/generated/mod.rs       |   1 +
 datafusion/sql/src/unparser/dialect.rs             |   3 +-
 datafusion/sql/tests/cases/diagnostic.rs           |   2 +-
 datafusion/sqllogictest/bin/sqllogictests.rs       |  21 +++--
 datafusion/sqllogictest/src/engines/conversion.rs  |   2 +-
 .../src/engines/datafusion_engine/runner.rs        |   8 +-
 .../runner.rs                                      |   2 +-
 .../src/engines/postgres_engine/mod.rs             |   2 +-
 xtask/src/ci_steps.rs                              |  23 +++--
 76 files changed, 345 insertions(+), 263 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 79a5077bf6..66bd816945 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -270,61 +270,52 @@ wildcard_dependencies = "warn"
 
 # Pedantic lints we opt out of, with the number of hits at the time we enabled `pedantic`.
 # Some of these we should consider enabling.
-borrow_as_ptr = "allow"                       # 6 hits
-cast_lossless = "allow"                       # 361 hits
-cast_possible_truncation = "allow"            # 911 hits
-cast_possible_wrap = "allow"                  # 493 hits
-cast_precision_loss = "allow"                 # 266 hits
-cast_sign_loss = "allow"                      # 440 hits
-default_trait_access = "allow"                # 221 hits
-doc_comment_double_space_linebreaks = "allow" # 6 hits
-doc_markdown = "allow"                        # 4933 hits; needs a long `doc-valid-idents` list in `clippy.toml`
-enum_glob_use = "allow"                       # 98 hits
-explicit_into_iter_loop = "allow"             # 55 hits
-explicit_iter_loop = "allow"                  # 189 hits
-float_cmp = "allow"                           # 8 hits; exact float comparisons are often intentional here
-format_collect = "allow"                      # 4 hits
-format_push_string = "allow"                  # 34 hits
-from_iter_instead_of_collect = "allow"        # 51 hits
-if_not_else = "allow"                         # 133 hits
-ignored_unit_patterns = "allow"               # 52 hits
-implicit_clone = "allow"                      # 198 hits
-implicit_hasher = "allow"                     # 17 hits
-inline_always = "allow"                       # 45 hits
-items_after_statements = "allow"              # 171 hits
-large_digit_groups = "allow"                  # 3 hits
-manual_string_new = "allow"                   # 84 hits
-many_single_char_names = "allow"              # 12 hits; short names are idiomatic in the numeric kernels
-map_unwrap_or = "allow"                       # 198 hits
-match_bool = "allow"                          # 46 hits
-match_same_arms = "allow"                     # 261 hits
-match_wildcard_for_single_variants = "allow"  # 132 hits
-missing_errors_doc = "allow"                  # 1807 hits
-missing_fields_in_debug = "allow"             # 29 hits
-missing_panics_doc = "allow"                  # 244 hits
-must_use_candidate = "allow"                  # 2726 hits
-needless_bitwise_bool = "allow"               # 1 hit
-needless_raw_string_hashes = "allow"          # 540 hits
-ptr_as_ptr = "allow"                          # 83 hits
-redundant_closure_for_method_calls = "allow"  # 686 hits
-redundant_else = "allow"                      # 48 hits
-return_self_not_must_use = "allow"            # 644 hits
-semicolon_if_nothing_returned = "allow"       # 1353 hits
-similar_names = "allow"                       # 228 hits; too many false positives, e.g. `expr`/`exprs`
-single_char_pattern = "allow"                 # 23 hits
-single_match_else = "allow"                   # 155 hits
-struct_excessive_bools = "allow"              # 24 hits
-struct_field_names = "allow"                  # 14 hits
-too_many_lines = "allow"                      # 484 hits
-trivially_copy_pass_by_ref = "allow"          # 74 hits
-unicode_not_nfc = "allow"                     # 2 hits
-unnecessary_literal_bound = "allow"           # 471 hits
-unnecessary_wraps = "allow"                   # 427 hits
-unnested_or_patterns = "allow"                # 68 hits
-unreadable_literal = "allow"                  # 502 hits
-unused_self = "allow"                         # 69 hits
-used_underscore_items = "allow"               # 28 hits
-wildcard_imports = "allow"                    # 48 hits; `use crate::prelude::*` is idiomatic
+cast_lossless = "allow"                      # 361 hits
+cast_possible_truncation = "allow"           # 911 hits
+cast_possible_wrap = "allow"                 # 493 hits
+cast_precision_loss = "allow"                # 266 hits
+cast_sign_loss = "allow"                     # 440 hits
+default_trait_access = "allow"               # 221 hits
+doc_markdown = "allow"                       # 4933 hits; needs a long `doc-valid-idents` list in `clippy.toml`
+enum_glob_use = "allow"                      # 98 hits
+explicit_into_iter_loop = "allow"            # 55 hits
+explicit_iter_loop = "allow"                 # 189 hits
+float_cmp = "allow"                          # 8 hits; exact float comparisons are often intentional here
+from_iter_instead_of_collect = "allow"       # 51 hits
+if_not_else = "allow"                        # 133 hits
+ignored_unit_patterns = "allow"              # 52 hits
+implicit_clone = "allow"                     # 198 hits
+implicit_hasher = "allow"                    # 17 hits; some sites feed arrow APIs that require the default hasher
+inline_always = "allow"                      # 45 hits
+items_after_statements = "allow"             # 171 hits
+manual_string_new = "allow"                  # 84 hits
+many_single_char_names = "allow"             # 12 hits; short names are idiomatic in the numeric kernels
+map_unwrap_or = "allow"                      # 198 hits
+match_bool = "allow"                         # 46 hits
+match_same_arms = "allow"                    # 261 hits
+match_wildcard_for_single_variants = "allow" # 132 hits
+missing_errors_doc = "allow"                 # 1807 hits
+missing_fields_in_debug = "allow"            # 29 hits
+missing_panics_doc = "allow"                 # 244 hits
+must_use_candidate = "allow"                 # 2726 hits
+needless_raw_string_hashes = "allow"         # 540 hits
+redundant_closure_for_method_calls = "allow" # 686 hits
+redundant_else = "allow"                     # 48 hits
+return_self_not_must_use = "allow"           # 644 hits
+semicolon_if_nothing_returned = "allow"      # 1353 hits
+similar_names = "allow"                      # 228 hits; too many false positives, e.g. `expr`/`exprs`
+single_match_else = "allow"                  # 155 hits
+struct_excessive_bools = "allow"             # 24 hits
+struct_field_names = "allow"                 # 14 hits
+too_many_lines = "allow"                     # 484 hits
+trivially_copy_pass_by_ref = "allow"         # 74 hits
+unnecessary_literal_bound = "allow"          # 471 hits
+unnecessary_wraps = "allow"                  # 427 hits
+unnested_or_patterns = "allow"               # 68 hits
+unreadable_literal = "allow"                 # 502 hits
+unused_self = "allow"                        # 69 hits
+used_underscore_items = "allow"              # 28 hits
+wildcard_imports = "allow"                   # 48 hits; `use crate::prelude::*` is idiomatic
 
 [workspace.lints.rust]
 unexpected_cfgs = { level = "warn", check-cfg = [
diff --git a/benchmarks/src/bin/benchmark_runner.rs b/benchmarks/src/bin/benchmark_runner.rs
index fc980a63bf..2628276ca2 100644
--- a/benchmarks/src/bin/benchmark_runner.rs
+++ b/benchmarks/src/bin/benchmark_runner.rs
@@ -40,6 +40,7 @@ use datafusion_common_runtime::SpawnedTask;
 use serde::{Serialize, Serializer};
 use std::collections::{BTreeMap, BTreeSet};
 use std::ffi::{OsStr, OsString};
+use std::fmt::Write as _;
 use std::io::IsTerminal;
 use std::path::Path;
 
@@ -333,12 +334,14 @@ fn format_suite_list(suites: &[SuiteMetadata]) -> String {
         } else {
             "queries "
         };
-        output.push_str(&format!(
-            "  {:<24} {} {query_word}{}\n",
+        writeln!(
+            output,
+            "  {:<24} {} {query_word}{}",
             suite.name(),
             suite.benchmark_count(),
             suite.description()
-        ));
+        )
+        .ok();
     }
     output.trim_end().to_string()
 }
diff --git a/benchmarks/src/sql_benchmark_runner.rs b/benchmarks/src/sql_benchmark_runner.rs
index 550c1d383f..de2ba8f041 100644
--- a/benchmarks/src/sql_benchmark_runner.rs
+++ b/benchmarks/src/sql_benchmark_runner.rs
@@ -26,6 +26,7 @@ use datafusion::prelude::SessionContext;
 use datafusion_common::{DataFusionError, exec_datafusion_err};
 use std::any::Any;
 use std::collections::{BTreeMap, HashMap};
+use std::fmt::Write as _;
 use std::fs;
 use std::panic::{AssertUnwindSafe, catch_unwind};
 use std::path::{Path, PathBuf};
@@ -357,7 +358,7 @@ pub fn format_benchmark_list(benchmarks: &BTreeMap<String, Vec<SqlBenchmark>>) -
         } else {
             "queries"
         };
-        output.push_str(&format!("  {name:<24} {} {query_word}\n", benchmarks.len()));
+        writeln!(output, "  {name:<24} {} {query_word}", benchmarks.len()).ok();
     }
 
     output.trim_end().to_string()
@@ -439,7 +440,7 @@ fn format_subgroup_list(benchmark_name: &str, benchmarks: &[SqlBenchmark]) -> St
         output.push_str("  <none>");
     } else {
         for entry in entries {
-            output.push_str(&format!("  {entry}\n"));
+            writeln!(output, "  {entry}").ok();
         }
     }
 
@@ -485,7 +486,7 @@ fn format_query_list(
         output.push_str("  <none>");
     } else {
         for entry in entries {
-            output.push_str(&format!("  {entry}\n"));
+            writeln!(output, "  {entry}").ok();
         }
     }
 
diff --git a/benchmarks/src/util/memory.rs b/benchmarks/src/util/memory.rs
index f0339c9cf0..7e13a9b168 100644
--- a/benchmarks/src/util/memory.rs
+++ b/benchmarks/src/util/memory.rs
@@ -53,10 +53,10 @@ fn print_allocator_stats() {
                 std::ptr::null_mut(),
                 std::ptr::null_mut(),
                 std::ptr::null_mut(),
-                &mut peak_rss,
+                &raw mut peak_rss,
                 std::ptr::null_mut(),
-                &mut peak_commit,
-                &mut page_faults,
+                &raw mut peak_commit,
+                &raw mut page_faults,
             );
         }
 
diff --git a/datafusion-cli/src/highlighter.rs b/datafusion-cli/src/highlighter.rs
index adcb135bb4..11e2a4a1ce 100644
--- a/datafusion-cli/src/highlighter.rs
+++ b/datafusion-cli/src/highlighter.rs
@@ -17,6 +17,7 @@
 
 //! The syntax highlighter.
 
+use std::fmt::Write as _;
 use std::{
     borrow::Cow::{self, Borrowed},
     fmt::Display,
@@ -66,7 +67,9 @@ impl Highlighter for SyntaxHighlighter {
                         Token::SingleQuotedString(_) => {
                             out_line.push_str(&Color::green(token));
                         }
-                        other => out_line.push_str(&format!("{other}")),
+                        other => {
+                            write!(out_line, "{other}").ok();
+                        }
                     }
                 }
                 out_line.into()
diff --git a/datafusion-examples/examples/builtin_functions/main.rs b/datafusion-examples/examples/builtin_functions/main.rs
index 42ca15f919..66f115f3d0 100644
--- a/datafusion-examples/examples/builtin_functions/main.rs
+++ b/datafusion-examples/examples/builtin_functions/main.rs
@@ -30,7 +30,7 @@
 //! - `date_time`
 //!   (file: date_time.rs, desc: Examples of date-time related functions and queries)
 //!
-//! - `function_factory`  
+//! - `function_factory`
 //!   (file: function_factory.rs, desc: Register `CREATE FUNCTION` handler to implement SQL macros)
 //!
 //! - `regexp`
diff --git a/datafusion-examples/examples/custom_data_source/main.rs b/datafusion-examples/examples/custom_data_source/main.rs
index 40409d3690..78bd3e8e70 100644
--- a/datafusion-examples/examples/custom_data_source/main.rs
+++ b/datafusion-examples/examples/custom_data_source/main.rs
@@ -27,16 +27,16 @@
 //! Each subcommand runs a corresponding example:
 //! - `all` — run all examples included in this module
 //!
-//! - `adapter_serialization`  
+//! - `adapter_serialization`
 //!   (file: adapter_serialization.rs, desc: Preserve custom PhysicalExprAdapter information during plan serialization using PhysicalExtensionCodec interception)
 //!
-//! - `csv_json_opener`  
+//! - `csv_json_opener`
 //!   (file: csv_json_opener.rs, desc: Use low-level FileOpener APIs for CSV/JSON)
 //!
 //! - `csv_sql_streaming`
 //!   (file: csv_sql_streaming.rs, desc: Run a streaming SQL query against CSV data)
 //!
-//! - `custom_datasource`  
+//! - `custom_datasource`
 //!   (file: custom_datasource.rs, desc: Query a custom TableProvider)
 //!
 //! - `custom_file_casts`
diff --git a/datafusion-examples/examples/data_io/main.rs b/datafusion-examples/examples/data_io/main.rs
index 041308463c..75889ba36c 100644
--- a/datafusion-examples/examples/data_io/main.rs
+++ b/datafusion-examples/examples/data_io/main.rs
@@ -45,7 +45,7 @@
 //! - `parquet_emb_idx`
 //!   (file: parquet_embedded_index.rs, desc: Store a custom index inside Parquet files)
 //!
-//! - `parquet_enc`  
+//! - `parquet_enc`
 //!   (file: parquet_encrypted.rs, desc: Read & write encrypted Parquet files)
 //!
 //! - `parquet_enc_with_kms`
diff --git a/datafusion-examples/examples/data_io/parquet_encrypted_with_kms.rs b/datafusion-examples/examples/data_io/parquet_encrypted_with_kms.rs
index 1a9bf56c09..8e92f465ea 100644
--- a/datafusion-examples/examples/data_io/parquet_encrypted_with_kms.rs
+++ b/datafusion-examples/examples/data_io/parquet_encrypted_with_kms.rs
@@ -241,7 +241,7 @@ impl EncryptionFactory for TestEncryptionFactory {
             .with_footer_key_metadata(key_metadata.clone());
 
         let encrypted_columns: HashSet<&str> =
-            config.encrypted_columns.split(",").collect();
+            config.encrypted_columns.split(',').collect();
         if !encrypted_columns.is_empty() {
             // Set up per-column encryption.
             for field in schema.fields().iter() {
diff --git a/datafusion-examples/examples/dataframe/main.rs b/datafusion-examples/examples/dataframe/main.rs
index 25b5377d38..62503b4899 100644
--- a/datafusion-examples/examples/dataframe/main.rs
+++ b/datafusion-examples/examples/dataframe/main.rs
@@ -27,7 +27,7 @@
 //! Each subcommand runs a corresponding example:
 //! - `all` — run all examples included in this module
 //!
-//! - `cache_factory`  
+//! - `cache_factory`
 //!   (file: cache_factory.rs, desc: Custom lazy caching for DataFrames using `CacheFactory`)
 //
 //! - `dataframe`
diff --git a/datafusion-examples/examples/flight/main.rs b/datafusion-examples/examples/flight/main.rs
index 426e806486..365763d27c 100644
--- a/datafusion-examples/examples/flight/main.rs
+++ b/datafusion-examples/examples/flight/main.rs
@@ -49,7 +49,7 @@ use strum_macros::{Display, EnumIter, EnumString, VariantNames};
 
 /// The `all` option cannot run all examples end-to-end because the
 /// `server` example must run in a separate process before the `client`
-/// example can connect.  
+/// example can connect.
 /// Therefore, `all` only iterates over individually runnable examples.
 #[derive(EnumIter, EnumString, Display, VariantNames)]
 #[strum(serialize_all = "snake_case")]
diff --git a/datafusion-examples/examples/sql_ops/main.rs b/datafusion-examples/examples/sql_ops/main.rs
index ce7be8fa2b..b97dbe0804 100644
--- a/datafusion-examples/examples/sql_ops/main.rs
+++ b/datafusion-examples/examples/sql_ops/main.rs
@@ -36,7 +36,7 @@
 //! - `frontend`
 //!   (file: frontend.rs, desc: Build LogicalPlans from SQL)
 //!
-//! - `query`  
+//! - `query`
 //!   (file: query.rs, desc: Query data using SQL)
 
 mod analysis;
diff --git a/datafusion-examples/src/utils/example_metadata/render.rs b/datafusion-examples/src/utils/example_metadata/render.rs
index a4ea620e78..f8312102f1 100644
--- a/datafusion-examples/src/utils/example_metadata/render.rs
+++ b/datafusion-examples/src/utils/example_metadata/render.rs
@@ -21,6 +21,7 @@
 //! `README.md` content for `datafusion-examples`, including group
 //! sections and example tables.
 
+use std::fmt::Write as _;
 use std::path::PathBuf;
 
 use datafusion::error::{DataFusionError, Result};
@@ -140,22 +141,24 @@ impl ExampleGroup {
     /// Renders this example group as a Markdown section for the README.
     pub fn render_markdown(&self) -> String {
         let mut out = String::new();
-        out.push_str(&format!("\n## {} Examples\n\n", self.name.title()));
-        out.push_str(&format!("### Group: `{}`\n\n", self.name.raw()));
-        out.push_str(&format!("#### Category: {}\n\n", self.category.name()));
+        write!(out, "\n## {} Examples\n\n", self.name.title()).ok();
+        write!(out, "### Group: `{}`\n\n", self.name.raw()).ok();
+        write!(out, "#### Category: {}\n\n", self.category.name()).ok();
         out.push_str("| Subcommand | File Path | Description |\n");
         out.push_str("| --- | --- | --- |\n");
 
         for example in &self.examples {
-            out.push_str(&format!(
-                "| {} | [`{}/{}`](examples/{}/{}) | {} |\n",
+            writeln!(
+                out,
+                "| {} | [`{}/{}`](examples/{}/{}) | {} |",
                 example.subcommand,
                 self.name.raw(),
                 example.file,
                 self.name.raw(),
                 example.file,
                 example.desc
-            ));
+            )
+            .ok();
         }
 
         out
diff --git a/datafusion/common/src/dfschema.rs b/datafusion/common/src/dfschema.rs
index 690cf99c1c..a0e2f0590a 100644
--- a/datafusion/common/src/dfschema.rs
+++ b/datafusion/common/src/dfschema.rs
@@ -19,6 +19,7 @@
 //! fields with optional relation names.
 
 use std::collections::{BTreeSet, HashMap, HashSet};
+use std::fmt::Write as _;
 use std::fmt::{Display, Formatter};
 use std::hash::Hash;
 use std::sync::{Arc, LazyLock};
@@ -949,9 +950,11 @@ fn format_field_with_indent(
 
     match data_type {
         DataType::List(field) => {
-            result.push_str(&format!(
-                "{indent}|-- {field_name}: list (nullable = {nullable_str})\n"
-            ));
+            writeln!(
+                result,
+                "{indent}|-- {field_name}: list (nullable = {nullable_str})"
+            )
+            .ok();
             format_field_with_indent(
                 result,
                 field.name(),
@@ -961,9 +964,11 @@ fn format_field_with_indent(
             );
         }
         DataType::LargeList(field) => {
-            result.push_str(&format!(
-                "{indent}|-- {field_name}: large list (nullable = {nullable_str})\n"
-            ));
+            writeln!(
+                result,
+                "{indent}|-- {field_name}: large list (nullable = {nullable_str})"
+            )
+            .ok();
             format_field_with_indent(
                 result,
                 field.name(),
@@ -973,9 +978,11 @@ fn format_field_with_indent(
             );
         }
         DataType::FixedSizeList(field, _size) => {
-            result.push_str(&format!(
-                "{indent}|-- {field_name}: fixed size list (nullable = {nullable_str})\n"
-            ));
+            writeln!(
+                result,
+                "{indent}|-- {field_name}: fixed size list (nullable = {nullable_str})"
+            )
+            .ok();
             format_field_with_indent(
                 result,
                 field.name(),
@@ -985,9 +992,11 @@ fn format_field_with_indent(
             );
         }
         DataType::Map(field, _) => {
-            result.push_str(&format!(
-                "{indent}|-- {field_name}: map (nullable = {nullable_str})\n"
-            ));
+            writeln!(
+                result,
+                "{indent}|-- {field_name}: map (nullable = {nullable_str})"
+            )
+            .ok();
             if let DataType::Struct(inner_fields) = field.data_type()
                 && inner_fields.len() == 2
             {
@@ -1015,16 +1024,18 @@ fn format_field_with_indent(
                         );
                     }
                     _ => {
-                        result.push_str(&format!("{child_indent}|-- value: {} (nullable = {value_contains_null})\n",
-                                format_simple_data_type(inner_fields[1].data_type())));
+                        writeln!(result, "{child_indent}|-- value: {} (nullable = {value_contains_null})",
+                                format_simple_data_type(inner_fields[1].data_type())).ok();
                     }
                 }
             }
         }
         DataType::Struct(fields) => {
-            result.push_str(&format!(
-                "{indent}|-- {field_name}: struct (nullable = {nullable_str})\n"
-            ));
+            writeln!(
+                result,
+                "{indent}|-- {field_name}: struct (nullable = {nullable_str})"
+            )
+            .ok();
             for struct_field in fields {
                 format_field_with_indent(
                     result,
@@ -1037,9 +1048,11 @@ fn format_field_with_indent(
         }
         _ => {
             let type_str = format_simple_data_type(data_type);
-            result.push_str(&format!(
-                "{indent}|-- {field_name}: {type_str} (nullable = {nullable_str})\n"
-            ));
+            writeln!(
+                result,
+                "{indent}|-- {field_name}: {type_str} (nullable = {nullable_str})"
+            )
+            .ok();
         }
     }
 }
diff --git a/datafusion/common/src/heap_size.rs b/datafusion/common/src/heap_size.rs
index 037f807fce..3dbe096953 100644
--- a/datafusion/common/src/heap_size.rs
+++ b/datafusion/common/src/heap_size.rs
@@ -294,7 +294,7 @@ fn arc_ptr<T>(arc: &Arc<T>) -> usize {
 /// For unsized types, `Arc::as_ptr` returns the data address + metadata - we only need the thin address
 /// Casting through `*const i32` gets us the thin pointer
 fn arc_unsized_ptr<T: ?Sized>(arc: &Arc<T>) -> usize {
-    Arc::as_ptr(arc) as *const i32 as usize
+    Arc::as_ptr(arc).cast::<i32>() as usize
 }
 
 impl<T: DFHeapSize> DFHeapSize for Arc<T> {
diff --git a/datafusion/common/src/test_util.rs b/datafusion/common/src/test_util.rs
index c0353ff408..348fe2ef54 100644
--- a/datafusion/common/src/test_util.rs
+++ b/datafusion/common/src/test_util.rs
@@ -259,7 +259,7 @@ pub fn parquet_test_data() -> String {
             let mut path = pb.display().to_string();
             if cfg!(target_os = "windows") {
                 // Replace backslashes (Windows paths; avoids some test issues).
-                path = path.replace("\\", "/");
+                path = path.replace('\\', "/");
             }
             path
         }
diff --git a/datafusion/common/src/tree_node.rs b/datafusion/common/src/tree_node.rs
index 39300b9564..d5261a8925 100644
--- a/datafusion/common/src/tree_node.rs
+++ b/datafusion/common/src/tree_node.rs
@@ -2454,9 +2454,9 @@ pub(crate) mod tests {
     #[test]
     fn box_map_elements_reuses_allocation() {
         let boxed = Box::new(TestTreeNode::new_leaf(42i32));
-        let before: *const TestTreeNode<i32> = &*boxed;
+        let before: *const TestTreeNode<i32> = &raw const *boxed;
         let out = boxed.map_elements(|n| Ok(Transformed::no(n))).unwrap();
-        let after: *const TestTreeNode<i32> = &*out.data;
+        let after: *const TestTreeNode<i32> = &raw const *out.data;
         assert_eq!(after, before);
     }
 
diff --git a/datafusion/common/src/utils/hex.rs b/datafusion/common/src/utils/hex.rs
index 672cd8463f..8ff9a6d36d 100644
--- a/datafusion/common/src/utils/hex.rs
+++ b/datafusion/common/src/utils/hex.rs
@@ -241,6 +241,7 @@ fn write_digits(v: u64, case: HexCase, buf: &mut [u8; 16]) -> usize {
 #[cfg(test)]
 mod tests {
     use super::*;
+    use std::fmt::Write as _;
 
     fn hex_u64(v: u64, case: HexCase) -> String {
         let mut buf = [0u8; 16];
@@ -319,10 +320,16 @@ mod tests {
     fn encode_bytes_covers_every_byte_value() {
         let bytes: Vec<u8> = (0..=255u8).collect();
 
-        let expected: String = bytes.iter().map(|b| format!("{b:02x}")).collect();
+        let expected: String = bytes.iter().fold(String::new(), |mut acc, b| {
+            write!(acc, "{b:02x}").ok();
+            acc
+        });
         assert_eq!(encode_bytes(&bytes, HexCase::Lower), expected);
 
-        let expected: String = bytes.iter().map(|b| format!("{b:02X}")).collect();
+        let expected: String = bytes.iter().fold(String::new(), |mut acc, b| {
+            write!(acc, "{b:02X}").ok();
+            acc
+        });
         assert_eq!(encode_bytes(&bytes, HexCase::Upper), expected);
     }
 
diff --git a/datafusion/common/src/utils/memory.rs b/datafusion/common/src/utils/memory.rs
index 2927db444c..119d2e73ee 100644
--- a/datafusion/common/src/utils/memory.rs
+++ b/datafusion/common/src/utils/memory.rs
@@ -381,7 +381,7 @@ fn count_unique_array_object_memory_size(
     array: &ArrayRef,
     counted_arrays: &mut HashSet<usize>,
 ) -> usize {
-    let array_ptr = Arc::as_ptr(array) as *const () as usize;
+    let array_ptr = Arc::as_ptr(array).cast::<()>() as usize;
     if !counted_arrays.insert(array_ptr) {
         return 0;
     }
diff --git a/datafusion/core/benches/reset_plan_states.rs b/datafusion/core/benches/reset_plan_states.rs
index 5afae7f432..872b97b023 100644
--- a/datafusion/core/benches/reset_plan_states.rs
+++ b/datafusion/core/benches/reset_plan_states.rs
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::fmt::Write as _;
 use std::sync::{Arc, LazyLock};
 
 use arrow_schema::{DataType, Field, Fields, Schema, SchemaRef};
@@ -117,9 +118,9 @@ fn query2() -> String {
             query.push_str(", ");
         }
         if (i / 2) % 2 == 0 {
-            query.push_str(&format!("t.{}", col_name(i)));
+            write!(query, "t.{}", col_name(i)).ok();
         } else {
-            query.push_str(&format!("v.{}", col_name(i)));
+            write!(query, "v.{}", col_name(i)).ok();
         }
     }
     query.push_str(" FROM t JOIN v ON t.x_0 = v.x_0 WHERE ");
diff --git a/datafusion/core/benches/sql_planner.rs b/datafusion/core/benches/sql_planner.rs
index 5fae803708..de81ed021b 100644
--- a/datafusion/core/benches/sql_planner.rs
+++ b/datafusion/core/benches/sql_planner.rs
@@ -29,6 +29,7 @@ use datafusion::execution::context::SessionContext;
 use datafusion_common::{ScalarValue, config::Dialect};
 use datafusion_expr::col;
 use rand_distr::num_traits::NumCast;
+use std::fmt::Write as _;
 use std::hint::black_box;
 use std::path::PathBuf;
 use std::sync::Arc;
@@ -290,15 +291,17 @@ fn union_orderby_query(n: usize) -> String {
             })
             .collect::<Vec<_>>()
             .join(", ");
-        query.push_str(&format!("(SELECT {select_list} FROM t ORDER BY c{i})"));
+        write!(query, "(SELECT {select_list} FROM t ORDER BY c{i})").ok();
     }
-    query.push_str(&format!(
+    write!(
+        query,
         "\nORDER BY {}",
         (0..n)
             .map(|i| format!("c{i}"))
             .collect::<Vec<_>>()
             .join(", ")
-    ));
+    )
+    .ok();
     query
 }
 
@@ -394,9 +397,10 @@ fn criterion_benchmark(c: &mut Criterion) {
             |b| {
                 let source = format!(
                     "SELECT 1 AS n{}",
-                    (0..partitioning_columns)
-                        .map(|i| format!(", {i} AS c{i}"))
-                        .collect::<String>()
+                    (0..partitioning_columns).fold(String::new(), |mut acc, i| {
+                        write!(acc, ", {i} AS c{i}").ok();
+                        acc
+                    })
                 );
                 let window = format!(
                     "SUM(n) OVER (PARTITION BY {}) AS sum_n",
diff --git a/datafusion/core/src/bin/print_functions_docs.rs b/datafusion/core/src/bin/print_functions_docs.rs
index da9399e99f..10a259dd8b 100644
--- a/datafusion/core/src/bin/print_functions_docs.rs
+++ b/datafusion/core/src/bin/print_functions_docs.rs
@@ -213,7 +213,7 @@ fn print_docs(
                 let _ = writeln!(docs, "#### Aliases");
 
                 for alias in f.get_aliases() {
-                    let _ = writeln!(docs, "- {}", alias.replace("_", r#"\_"#));
+                    let _ = writeln!(docs, "- {}", alias.replace('_', r#"\_"#));
                 }
             }
 
diff --git a/datafusion/core/src/test_util/parquet.rs b/datafusion/core/src/test_util/parquet.rs
index 31cab41f68..b085010b0d 100644
--- a/datafusion/core/src/test_util/parquet.rs
+++ b/datafusion/core/src/test_util/parquet.rs
@@ -110,7 +110,7 @@ impl TestParquetFile {
             canonical_path = canonical_path
                 .to_str()
                 .unwrap()
-                .replace("\\", "/")
+                .replace('\\', "/")
                 .strip_prefix("//?/")
                 .unwrap()
                 .into();
diff --git a/datafusion/core/tests/custom_sources_cases/dml_planning.rs b/datafusion/core/tests/custom_sources_cases/dml_planning.rs
index 6ae942bfbb..cb5b134fab 100644
--- a/datafusion/core/tests/custom_sources_cases/dml_planning.rs
+++ b/datafusion/core/tests/custom_sources_cases/dml_planning.rs
@@ -704,7 +704,7 @@ async fn test_delete_target_table_scoping() -> Result<()> {
         "Filter should be for id column"
     );
     assert!(
-        filters[0].to_string().contains("5"),
+        filters[0].to_string().contains('5'),
         "Filter should contain the value 5"
     );
     Ok(())
@@ -784,7 +784,7 @@ async fn test_delete_qualifier_stripping_and_validation() -> Result<()> {
         "Filter should not contain qualified column reference, got: {filter_str}"
     );
     assert!(
-        filter_str.contains("id") || filter_str.contains("1"),
+        filter_str.contains("id") || filter_str.contains('1'),
         "Filter should reference id column or the value 1, got: {filter_str}"
     );
     Ok(())
diff --git a/datafusion/core/tests/dataframe/mod.rs b/datafusion/core/tests/dataframe/mod.rs
index 44ab14e6cc..1676a69de8 100644
--- a/datafusion/core/tests/dataframe/mod.rs
+++ b/datafusion/core/tests/dataframe/mod.rs
@@ -3359,7 +3359,7 @@ async fn union_with_mix_of_presorted_and_explicitly_resorted_inputs_impl(
 
     // To be able to remove user specific paths from the plan, for stable assertions
     let testdata_clean = Path::new(&testdata).canonicalize()?.display().to_string();
-    let testdata_clean = testdata_clean.replace("\\", "/");
+    let testdata_clean = testdata_clean.replace('\\', "/");
     let testdata_clean = testdata_clean
         .strip_prefix("//?/")
         .or_else(|| testdata_clean.strip_prefix("/"))
diff --git a/datafusion/core/tests/function_docs/mod.rs b/datafusion/core/tests/function_docs/mod.rs
index 93bf9cc410..17c9d27fd5 100644
--- a/datafusion/core/tests/function_docs/mod.rs
+++ b/datafusion/core/tests/function_docs/mod.rs
@@ -20,6 +20,7 @@
 
 use datafusion::execution::SessionStateDefaults;
 use datafusion::logical_expr::Documentation;
+use std::fmt::Write as _;
 use unicode_width::UnicodeWidthStr;
 
 fn is_border(line: &str) -> bool {
@@ -71,9 +72,9 @@ fn misaligned_tables(name: &str, example: &str) -> Vec<String> {
         }
         let mut report = format!("{name}, table at line {} of the example:", start + 1);
         for ((line, width), fault) in table.iter().zip(&widths).zip(&faults) {
-            report.push_str(&format!("\n  {width:>4}  {line}"));
+            write!(report, "\n  {width:>4}  {line}").ok();
             if let Some(fault) = fault {
-                report.push_str(&format!("    <- {fault}"));
+                write!(report, "    <- {fault}").ok();
             }
         }
         reports.push(report);
diff --git a/datafusion/core/tests/fuzz_cases/aggregation_fuzzer/query_builder.rs b/datafusion/core/tests/fuzz_cases/aggregation_fuzzer/query_builder.rs
index 7bb6177c31..d32078ec63 100644
--- a/datafusion/core/tests/fuzz_cases/aggregation_fuzzer/query_builder.rs
+++ b/datafusion/core/tests/fuzz_cases/aggregation_fuzzer/query_builder.rs
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::fmt::Write as _;
 use std::{collections::HashSet, str::FromStr};
 
 use rand::{Rng, rng, seq::SliceRandom};
@@ -342,7 +343,7 @@ impl QueryBuilder {
         let mut result = String::from_str(" order by ").unwrap();
         for col in selected_columns {
             let order = if rng.random_bool(0.5) { "ASC" } else { "DESC" };
-            result.push_str(&format!("{col} {order},"));
+            write!(result, "{col} {order},").ok();
         }
 
         result.strip_suffix(",").unwrap().to_string()
diff --git a/datafusion/core/tests/fuzz_cases/sort_query_fuzz.rs b/datafusion/core/tests/fuzz_cases/sort_query_fuzz.rs
index 376306f3e0..445b3f5f13 100644
--- a/datafusion/core/tests/fuzz_cases/sort_query_fuzz.rs
+++ b/datafusion/core/tests/fuzz_cases/sort_query_fuzz.rs
@@ -18,6 +18,7 @@
 //! Fuzz Test for various corner cases sorting RecordBatches exceeds available memory and should spill
 
 use std::cmp::min;
+use std::fmt::Write as _;
 use std::sync::Arc;
 
 use arrow::array::RecordBatch;
@@ -430,7 +431,7 @@ impl SortFuzzerTestGenerator {
             let mut clause = col.name.clone();
             if rng.random_bool(0.5) {
                 let order = if rng.random_bool(0.5) { "ASC" } else { "DESC" };
-                clause.push_str(&format!(" {order}"));
+                write!(clause, " {order}").ok();
             }
             if rng.random_bool(0.5) {
                 let nulls = if rng.random_bool(0.5) {
@@ -438,7 +439,7 @@ impl SortFuzzerTestGenerator {
                 } else {
                     "NULLS LAST"
                 };
-                clause.push_str(&format!(" {nulls}"));
+                write!(clause, " {nulls}").ok();
             }
             order_by_clauses.push(clause);
         }
diff --git a/datafusion/core/tests/parquet/encryption.rs b/datafusion/core/tests/parquet/encryption.rs
index a59871f30e..b7bfcefa30 100644
--- a/datafusion/core/tests/parquet/encryption.rs
+++ b/datafusion/core/tests/parquet/encryption.rs
@@ -293,7 +293,7 @@ async fn verify_file_encrypted(
         // Windows backslashes are eventually converted to slashes when writing the Parquet files,
         // through `ListingTableUrl::parse`, making `encryption_factory.encryption_keys` store them
         // it that format. So we also replace backslashes here to ensure they match.
-        file_path.to_str().unwrap().replace("\\", "/")
+        file_path.to_str().unwrap().replace('\\', "/")
     } else {
         file_path.to_str().unwrap().to_owned()
     };
diff --git a/datafusion/core/tests/parquet/external_access_plan.rs b/datafusion/core/tests/parquet/external_access_plan.rs
index 81acba37cb..4d74a1f282 100644
--- a/datafusion/core/tests/parquet/external_access_plan.rs
+++ b/datafusion/core/tests/parquet/external_access_plan.rs
@@ -442,7 +442,7 @@ impl TestFull {
 
         let new_file_name = if cfg!(target_os = "windows") {
             // Windows path separator is different from Unix
-            file_name.replace("\\", "/")
+            file_name.replace('\\', "/")
         } else {
             file_name.clone()
         };
diff --git a/datafusion/core/tests/physical_optimizer/pushdown_utils.rs b/datafusion/core/tests/physical_optimizer/pushdown_utils.rs
index 852cf3bf18..861ead100c 100644
--- a/datafusion/core/tests/physical_optimizer/pushdown_utils.rs
+++ b/datafusion/core/tests/physical_optimizer/pushdown_utils.rs
@@ -43,6 +43,7 @@ use datafusion_physical_plan::{
 use futures::StreamExt;
 use futures::{FutureExt, Stream};
 use object_store::ObjectStore;
+use std::fmt::Write as _;
 use std::{
     fmt::{Display, Formatter},
     pin::Pin,
@@ -440,7 +441,7 @@ fn format_lines(s: &str) -> Vec<String> {
 pub fn format_plan_for_test(plan: &Arc<dyn ExecutionPlan>) -> String {
     let mut out = String::new();
     for line in format_execution_plan(plan) {
-        out.push_str(&format!("  - {line}\n"));
+        writeln!(out, "  - {line}").ok();
     }
     out.push('\n');
     out
diff --git a/datafusion/core/tests/user_defined/user_defined_async_scalar_functions.rs b/datafusion/core/tests/user_defined/user_defined_async_scalar_functions.rs
index 5b552e5369..150801e38f 100644
--- a/datafusion/core/tests/user_defined/user_defined_async_scalar_functions.rs
+++ b/datafusion/core/tests/user_defined/user_defined_async_scalar_functions.rs
@@ -104,7 +104,7 @@ async fn test_async_udf_metrics() -> Result<()> {
 
     let explain_analyze_str = format_batches(&result)?.to_string();
     let async_func_exec_without_metrics =
-        explain_analyze_str.split("\n").any(|metric_line| {
+        explain_analyze_str.split('\n').any(|metric_line| {
             metric_line.contains("AsyncFuncExec")
                 && !metric_line.contains("output_rows=3")
         });
diff --git a/datafusion/datasource-json/src/source.rs b/datafusion/datasource-json/src/source.rs
index 5b576c1166..c523dd47f3 100644
--- a/datafusion/datasource-json/src/source.rs
+++ b/datafusion/datasource-json/src/source.rs
@@ -602,6 +602,7 @@ mod tests {
     use object_store::memory::InMemory;
     use object_store::path::Path;
     use object_store::{ObjectStoreExt, PutPayload};
+    use std::fmt::Write as _;
 
     /// Helper to create a test schema
     fn test_schema() -> SchemaRef {
@@ -817,7 +818,7 @@ mod tests {
             if i > 0 {
                 json_data.push(',');
             }
-            json_data.push_str(&format!(r#"{{"id": {i}, "name": "user{i}"}}"#));
+            write!(json_data, r#"{{"id": {i}, "name": "user{i}"}}"#).ok();
         }
         json_data.push(']');
 
@@ -858,7 +859,7 @@ mod tests {
             if i > 0 {
                 json_data.push(',');
             }
-            json_data.push_str(&format!(r#"{{"id": {i}, "name": "user{i}"}}"#));
+            write!(json_data, r#"{{"id": {i}, "name": "user{i}"}}"#).ok();
         }
         json_data.push(']');
 
@@ -954,7 +955,7 @@ mod tests {
         let num_rows: usize = 20;
         let mut ndjson = String::new();
         for i in 0..num_rows {
-            ndjson.push_str(&format!("{{\"id\": {i}, \"name\": \"user{i}\"}}\n"));
+            writeln!(ndjson, "{{\"id\": {i}, \"name\": \"user{i}\"}}").ok();
         }
         let ndjson_bytes = Bytes::from(ndjson);
         let file_size = ndjson_bytes.len() as u64;
@@ -1026,7 +1027,7 @@ mod tests {
 
         let mut ndjson = String::new();
         for (id, name) in rows {
-            ndjson.push_str(&format!("{{\"id\": {id}, \"name\": \"{name}\"}}\n"));
+            writeln!(ndjson, "{{\"id\": {id}, \"name\": \"{name}\"}}").ok();
         }
         let ndjson_bytes = Bytes::from(ndjson);
         let file_size = ndjson_bytes.len() as u64;
diff --git a/datafusion/datasource/src/url.rs b/datafusion/datasource/src/url.rs
index 9ac4c5f50d..cfb6608ca0 100644
--- a/datafusion/datasource/src/url.rs
+++ b/datafusion/datasource/src/url.rs
@@ -220,8 +220,8 @@ impl ListingTableUrl {
     pub fn file_extension(&self) -> Option<&str> {
         if let Some(mut segments) = self.url.path_segments()
             && let Some(last_segment) = segments.next_back()
-            && last_segment.contains(".")
-            && !last_segment.ends_with(".")
+            && last_segment.contains('.')
+            && !last_segment.ends_with('.')
         {
             return last_segment.split('.').next_back();
         }
diff --git a/datafusion/ffi/src/catalog_provider.rs b/datafusion/ffi/src/catalog_provider.rs
index ff37e8e7e0..2c84ac52c2 100644
--- a/datafusion/ffi/src/catalog_provider.rs
+++ b/datafusion/ffi/src/catalog_provider.rs
@@ -186,7 +186,7 @@ unsafe extern "C" fn release_fn_wrapper(provider: &mut FFI_CatalogProvider) {
     unsafe {
         debug_assert!(!provider.private_data.is_null());
         let private_data =
-            Box::from_raw(provider.private_data as *mut ProviderPrivateData);
+            Box::from_raw(provider.private_data.cast::<ProviderPrivateData>());
         drop(private_data);
         provider.private_data = std::ptr::null_mut();
     }
@@ -202,7 +202,8 @@ unsafe extern "C" fn clone_fn_wrapper(
         let private_data = Box::into_raw(Box::new(ProviderPrivateData {
             provider: Arc::clone(&(*old_private_data).provider),
             runtime,
-        })) as *mut c_void;
+        }))
+        .cast::<c_void>();
 
         FFI_CatalogProvider {
             schema_names: schema_names_fn_wrapper,
@@ -264,7 +265,7 @@ impl FFI_CatalogProvider {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: super::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/catalog_provider_list.rs b/datafusion/ffi/src/catalog_provider_list.rs
index af7cfd0f87..36d7b800f6 100644
--- a/datafusion/ffi/src/catalog_provider_list.rs
+++ b/datafusion/ffi/src/catalog_provider_list.rs
@@ -151,7 +151,7 @@ unsafe extern "C" fn release_fn_wrapper(provider: &mut FFI_CatalogProviderList)
     unsafe {
         debug_assert!(!provider.private_data.is_null());
         let private_data =
-            Box::from_raw(provider.private_data as *mut ProviderPrivateData);
+            Box::from_raw(provider.private_data.cast::<ProviderPrivateData>());
         drop(private_data);
         provider.private_data = std::ptr::null_mut();
     }
@@ -167,7 +167,8 @@ unsafe extern "C" fn clone_fn_wrapper(
         let private_data = Box::into_raw(Box::new(ProviderPrivateData {
             provider: Arc::clone(&(*old_private_data).provider),
             runtime,
-        })) as *mut c_void;
+        }))
+        .cast::<c_void>();
 
         FFI_CatalogProviderList {
             register_catalog: register_catalog_fn_wrapper,
@@ -226,7 +227,7 @@ impl FFI_CatalogProviderList {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: super::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/config/extension_options.rs b/datafusion/ffi/src/config/extension_options.rs
index 139e64e999..32ebbaa299 100644
--- a/datafusion/ffi/src/config/extension_options.rs
+++ b/datafusion/ffi/src/config/extension_options.rs
@@ -69,7 +69,7 @@ pub struct ExtensionOptionsPrivateData {
 impl FFI_ExtensionOptions {
     #[inline]
     fn inner_mut(&mut self) -> &mut HashMap<String, String> {
-        let private_data = self.private_data as *mut ExtensionOptionsPrivateData;
+        let private_data = self.private_data.cast::<ExtensionOptionsPrivateData>();
         unsafe { &mut (*private_data).options }
     }
 
@@ -116,7 +116,7 @@ unsafe extern "C" fn release_fn_wrapper(options: &mut FFI_ExtensionOptions) {
     unsafe {
         debug_assert!(!options.private_data.is_null());
         let private_data =
-            Box::from_raw(options.private_data as *mut ExtensionOptionsPrivateData);
+            Box::from_raw(options.private_data.cast::<ExtensionOptionsPrivateData>());
         drop(private_data);
         options.private_data = std::ptr::null_mut();
     }
@@ -137,7 +137,7 @@ impl From<HashMap<String, String>> for FFI_ExtensionOptions {
             set: set_fn_wrapper,
             entries: entries_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(Box::new(private_data)) as *mut c_void,
+            private_data: Box::into_raw(Box::new(private_data)).cast::<c_void>(),
         }
     }
 }
diff --git a/datafusion/ffi/src/execution/task_ctx.rs b/datafusion/ffi/src/execution/task_ctx.rs
index 0a48a5fe5a..ff284efdcf 100644
--- a/datafusion/ffi/src/execution/task_ctx.rs
+++ b/datafusion/ffi/src/execution/task_ctx.rs
@@ -152,7 +152,8 @@ unsafe extern "C" fn window_functions_fn_wrapper(
 
 unsafe extern "C" fn release_fn_wrapper(ctx: &mut FFI_TaskContext) {
     unsafe {
-        let private_data = Box::from_raw(ctx.private_data as *mut TaskContextPrivateData);
+        let private_data =
+            Box::from_raw(ctx.private_data.cast::<TaskContextPrivateData>());
         drop(private_data);
     }
 }
@@ -175,7 +176,7 @@ impl From<Arc<TaskContext>> for FFI_TaskContext {
             aggregate_functions: aggregate_functions_fn_wrapper,
             window_functions: window_functions_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/execution/task_ctx_provider.rs b/datafusion/ffi/src/execution/task_ctx_provider.rs
index b8fa68a16a..febc5f951b 100644
--- a/datafusion/ffi/src/execution/task_ctx_provider.rs
+++ b/datafusion/ffi/src/execution/task_ctx_provider.rs
@@ -102,7 +102,7 @@ unsafe extern "C" fn clone_fn_wrapper(
             task_ctx: task_ctx_fn_wrapper,
             release: release_fn_wrapper,
             clone: clone_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
@@ -110,7 +110,7 @@ unsafe extern "C" fn clone_fn_wrapper(
 unsafe extern "C" fn release_fn_wrapper(ctx: &mut FFI_TaskContextProvider) {
     unsafe {
         let private_data =
-            Box::from_raw(ctx.private_data as *mut TaskContextProviderPrivateData);
+            Box::from_raw(ctx.private_data.cast::<TaskContextProviderPrivateData>());
         drop(private_data);
     }
 }
@@ -135,7 +135,7 @@ impl From<&Arc<dyn TaskContextProvider>> for FFI_TaskContextProvider {
             task_ctx: task_ctx_fn_wrapper,
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/execution_plan.rs b/datafusion/ffi/src/execution_plan.rs
index d7ee5dace3..056d29d16a 100644
--- a/datafusion/ffi/src/execution_plan.rs
+++ b/datafusion/ffi/src/execution_plan.rs
@@ -260,7 +260,7 @@ unsafe extern "C" fn release_fn_wrapper(plan: &mut FFI_ExecutionPlan) {
     unsafe {
         debug_assert!(!plan.private_data.is_null());
         let private_data =
-            Box::from_raw(plan.private_data as *mut ExecutionPlanPrivateData);
+            Box::from_raw(plan.private_data.cast::<ExecutionPlanPrivateData>());
         drop(private_data);
         plan.private_data = std::ptr::null_mut();
     }
@@ -359,7 +359,7 @@ impl FFI_ExecutionPlan {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: crate::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/physical_expr/mod.rs b/datafusion/ffi/src/physical_expr/mod.rs
index 8e6676b6e4..0cea40934f 100644
--- a/datafusion/ffi/src/physical_expr/mod.rs
+++ b/datafusion/ffi/src/physical_expr/mod.rs
@@ -412,7 +412,7 @@ unsafe extern "C" fn release_fn_wrapper(expr: &mut FFI_PhysicalExpr) {
     unsafe {
         debug_assert!(!expr.private_data.is_null());
         let private_data =
-            Box::from_raw(expr.private_data as *mut PhysicalExprPrivateData);
+            Box::from_raw(expr.private_data.cast::<PhysicalExprPrivateData>());
         drop(private_data);
         expr.private_data = std::ptr::null_mut();
     }
@@ -424,7 +424,8 @@ unsafe extern "C" fn clone_fn_wrapper(expr: &FFI_PhysicalExpr) -> FFI_PhysicalEx
 
         let private_data = Box::into_raw(Box::new(PhysicalExprPrivateData {
             expr: Arc::clone(&(*old_private_data).expr),
-        })) as *mut c_void;
+        }))
+        .cast::<c_void>();
 
         FFI_PhysicalExpr {
             data_type: data_type_fn_wrapper,
@@ -493,7 +494,7 @@ impl From<Arc<dyn PhysicalExpr>> for FFI_PhysicalExpr {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: super::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/physical_optimizer.rs b/datafusion/ffi/src/physical_optimizer.rs
index 3fb2132083..87fe3314af 100644
--- a/datafusion/ffi/src/physical_optimizer.rs
+++ b/datafusion/ffi/src/physical_optimizer.rs
@@ -70,7 +70,7 @@ impl FFI_PhysicalOptimizerContext {
     }
 
     fn inner(&self) -> &OptimizerContextPrivateData {
-        unsafe { &*(self.private_data as *const OptimizerContextPrivateData) }
+        unsafe { &*self.private_data.cast::<OptimizerContextPrivateData>() }
     }
 }
 
@@ -211,7 +211,7 @@ unsafe extern "C" fn schema_check_fn_wrapper(rule: &FFI_PhysicalOptimizerRule) -
 unsafe extern "C" fn release_fn_wrapper(rule: &mut FFI_PhysicalOptimizerRule) {
     unsafe {
         debug_assert!(!rule.private_data.is_null());
-        let private_data = Box::from_raw(rule.private_data as *mut RulePrivateData);
+        let private_data = Box::from_raw(rule.private_data.cast::<RulePrivateData>());
         drop(private_data);
         rule.private_data = std::ptr::null_mut();
     }
@@ -224,7 +224,7 @@ unsafe extern "C" fn clone_fn_wrapper(
     let rule = Arc::clone(rule.inner());
 
     let private_data =
-        Box::into_raw(Box::new(RulePrivateData { rule, runtime })) as *mut c_void;
+        Box::into_raw(Box::new(RulePrivateData { rule, runtime })).cast::<c_void>();
 
     FFI_PhysicalOptimizerRule {
         optimize: optimize_fn_wrapper,
@@ -258,7 +258,7 @@ impl FFI_PhysicalOptimizerRule {
         }
 
         let private_data = Box::new(RulePrivateData { rule, runtime });
-        let private_data = Box::into_raw(private_data) as *mut c_void;
+        let private_data = Box::into_raw(private_data).cast::<c_void>();
 
         Self {
             optimize: optimize_fn_wrapper,
diff --git a/datafusion/ffi/src/plan_properties.rs b/datafusion/ffi/src/plan_properties.rs
index 09ef26af32..dcbdbe59d1 100644
--- a/datafusion/ffi/src/plan_properties.rs
+++ b/datafusion/ffi/src/plan_properties.rs
@@ -118,7 +118,7 @@ unsafe extern "C" fn release_fn_wrapper(props: &mut FFI_PlanProperties) {
     unsafe {
         debug_assert!(!props.private_data.is_null());
         let private_data =
-            Box::from_raw(props.private_data as *mut PlanPropertiesPrivateData);
+            Box::from_raw(props.private_data.cast::<PlanPropertiesPrivateData>());
         drop(private_data);
         props.private_data = std::ptr::null_mut();
     }
@@ -143,7 +143,7 @@ impl From<&PlanProperties> for FFI_PlanProperties {
             output_ordering: output_ordering_fn_wrapper,
             schema: schema_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/proto/logical_extension_codec.rs b/datafusion/ffi/src/proto/logical_extension_codec.rs
index 7c49983cd5..0dc78e8f98 100644
--- a/datafusion/ffi/src/proto/logical_extension_codec.rs
+++ b/datafusion/ffi/src/proto/logical_extension_codec.rs
@@ -271,8 +271,11 @@ unsafe extern "C" fn try_encode_udwf_fn_wrapper(
 
 unsafe extern "C" fn release_fn_wrapper(provider: &mut FFI_LogicalExtensionCodec) {
     unsafe {
-        let private_data =
-            Box::from_raw(provider.private_data as *mut LogicalExtensionCodecPrivateData);
+        let private_data = Box::from_raw(
+            provider
+                .private_data
+                .cast::<LogicalExtensionCodecPrivateData>(),
+        );
         drop(private_data);
     }
 }
@@ -333,7 +336,7 @@ impl FFI_LogicalExtensionCodec {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: crate::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/proto/physical_extension_codec.rs b/datafusion/ffi/src/proto/physical_extension_codec.rs
index 21da5acbc0..47a6f1e95c 100644
--- a/datafusion/ffi/src/proto/physical_extension_codec.rs
+++ b/datafusion/ffi/src/proto/physical_extension_codec.rs
@@ -257,8 +257,11 @@ unsafe extern "C" fn try_encode_udwf_fn_wrapper(
 
 unsafe extern "C" fn release_fn_wrapper(codec: &mut FFI_PhysicalExtensionCodec) {
     unsafe {
-        let private_data =
-            Box::from_raw(codec.private_data as *mut PhysicalExtensionCodecPrivateData);
+        let private_data = Box::from_raw(
+            codec
+                .private_data
+                .cast::<PhysicalExtensionCodecPrivateData>(),
+        );
         drop(private_data);
     }
 }
@@ -319,7 +322,7 @@ impl FFI_PhysicalExtensionCodec {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: crate::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/query_planner.rs b/datafusion/ffi/src/query_planner.rs
index 727e1e5781..6811b91adf 100644
--- a/datafusion/ffi/src/query_planner.rs
+++ b/datafusion/ffi/src/query_planner.rs
@@ -179,7 +179,7 @@ unsafe extern "C" fn release_fn_wrapper(planner: &mut FFI_QueryPlanner) {
     unsafe {
         debug_assert!(!planner.private_data.is_null());
         let private_data =
-            Box::from_raw(planner.private_data as *mut QueryPlannerPrivateData);
+            Box::from_raw(planner.private_data.cast::<QueryPlannerPrivateData>());
         drop(private_data);
         planner.private_data = std::ptr::null_mut();
     }
@@ -190,7 +190,8 @@ unsafe extern "C" fn clone_fn_wrapper(planner: &FFI_QueryPlanner) -> FFI_QueryPl
 
     let private_data = Box::into_raw(Box::new(QueryPlannerPrivateData {
         planner: old_planner,
-    })) as *mut c_void;
+    }))
+    .cast::<c_void>();
 
     FFI_QueryPlanner {
         create_physical_plan: create_physical_plan_fn_wrapper,
@@ -271,7 +272,7 @@ impl FFI_QueryPlanner {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: super::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/record_batch_stream.rs b/datafusion/ffi/src/record_batch_stream.rs
index 5a92cbfe5f..2fd0cd0ad8 100644
--- a/datafusion/ffi/src/record_batch_stream.rs
+++ b/datafusion/ffi/src/record_batch_stream.rs
@@ -71,7 +71,8 @@ impl FFI_RecordBatchStream {
         let private_data = Box::into_raw(Box::new(RecordBatchStreamPrivateData {
             rbs: stream,
             runtime,
-        })) as *mut c_void;
+        }))
+        .cast::<c_void>();
         FFI_RecordBatchStream {
             poll_next: poll_next_fn_wrapper,
             schema: schema_fn_wrapper,
@@ -96,7 +97,7 @@ unsafe extern "C" fn release_fn_wrapper(provider: &mut FFI_RecordBatchStream) {
     unsafe {
         debug_assert!(!provider.private_data.is_null());
         let private_data =
-            Box::from_raw(provider.private_data as *mut RecordBatchStreamPrivateData);
+            Box::from_raw(provider.private_data.cast::<RecordBatchStreamPrivateData>());
         drop(private_data);
         provider.private_data = std::ptr::null_mut();
     }
@@ -131,7 +132,7 @@ unsafe extern "C" fn poll_next_fn_wrapper(
     cx: &mut FfiContext,
 ) -> FfiPoll<FFI_Option<FFI_Result<WrappedArray>>> {
     unsafe {
-        let private_data = stream.private_data as *mut RecordBatchStreamPrivateData;
+        let private_data = stream.private_data.cast::<RecordBatchStreamPrivateData>();
         let stream = &mut (*private_data).rbs;
 
         let _guard = (*private_data).runtime.as_ref().map(|rt| rt.enter());
diff --git a/datafusion/ffi/src/schema_provider.rs b/datafusion/ffi/src/schema_provider.rs
index 8441b84b48..322d3bbfcd 100644
--- a/datafusion/ffi/src/schema_provider.rs
+++ b/datafusion/ffi/src/schema_provider.rs
@@ -194,7 +194,7 @@ unsafe extern "C" fn release_fn_wrapper(provider: &mut FFI_SchemaProvider) {
     unsafe {
         debug_assert!(!provider.private_data.is_null());
         let private_data =
-            Box::from_raw(provider.private_data as *mut ProviderPrivateData);
+            Box::from_raw(provider.private_data.cast::<ProviderPrivateData>());
         drop(private_data);
         provider.private_data = std::ptr::null_mut();
     }
@@ -210,7 +210,8 @@ unsafe extern "C" fn clone_fn_wrapper(
         let private_data = Box::into_raw(Box::new(ProviderPrivateData {
             provider: Arc::clone(&(*old_private_data).provider),
             runtime,
-        })) as *mut c_void;
+        }))
+        .cast::<c_void>();
 
         FFI_SchemaProvider {
             owner_name: provider.owner_name.clone(),
@@ -277,7 +278,7 @@ impl FFI_SchemaProvider {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: super::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/session/config.rs b/datafusion/ffi/src/session/config.rs
index fca0190c07..90f0f59aa5 100644
--- a/datafusion/ffi/src/session/config.rs
+++ b/datafusion/ffi/src/session/config.rs
@@ -60,7 +60,7 @@ unsafe impl Sync for FFI_SessionConfig {}
 
 impl FFI_SessionConfig {
     fn inner(&self) -> &SessionConfig {
-        let private_data = self.private_data as *mut SessionConfigPrivateData;
+        let private_data = self.private_data.cast::<SessionConfigPrivateData>();
         unsafe { &(*private_data).config }
     }
 }
@@ -69,7 +69,7 @@ unsafe extern "C" fn release_fn_wrapper(config: &mut FFI_SessionConfig) {
     unsafe {
         debug_assert!(!config.private_data.is_null());
         let private_data =
-            Box::from_raw(config.private_data as *mut SessionConfigPrivateData);
+            Box::from_raw(config.private_data.cast::<SessionConfigPrivateData>());
         drop(private_data);
         config.private_data = std::ptr::null_mut();
     }
@@ -77,14 +77,14 @@ unsafe extern "C" fn release_fn_wrapper(config: &mut FFI_SessionConfig) {
 
 unsafe extern "C" fn clone_fn_wrapper(config: &FFI_SessionConfig) -> FFI_SessionConfig {
     unsafe {
-        let old_private_data = config.private_data as *mut SessionConfigPrivateData;
+        let old_private_data = config.private_data.cast::<SessionConfigPrivateData>();
         let old_config = (*old_private_data).config.clone();
 
         let private_data = Box::new(SessionConfigPrivateData { config: old_config });
 
         FFI_SessionConfig {
             config_options: config.config_options.clone(),
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             library_marker_id: crate::get_library_marker_id,
@@ -106,7 +106,7 @@ impl From<&SessionConfig> for FFI_SessionConfig {
 
         Self {
             config_options,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             library_marker_id: crate::get_library_marker_id,
diff --git a/datafusion/ffi/src/session/mod.rs b/datafusion/ffi/src/session/mod.rs
index 9c37158a2c..14ab5a0498 100644
--- a/datafusion/ffi/src/session/mod.rs
+++ b/datafusion/ffi/src/session/mod.rs
@@ -387,7 +387,7 @@ unsafe extern "C" fn physical_optimizers_fn_wrapper(
 unsafe extern "C" fn release_fn_wrapper(provider: &mut FFI_SessionRef) {
     unsafe {
         let private_data =
-            Box::from_raw(provider.private_data as *mut SessionPrivateData);
+            Box::from_raw(provider.private_data.cast::<SessionPrivateData>());
         drop(private_data);
     }
 }
@@ -399,7 +399,8 @@ unsafe extern "C" fn clone_fn_wrapper(provider: &FFI_SessionRef) -> FFI_SessionR
         let private_data = Box::into_raw(Box::new(SessionPrivateData {
             session: (*old_private_data).session,
             runtime: (*old_private_data).runtime.clone(),
-        })) as *mut c_void;
+        }))
+        .cast::<c_void>();
 
         FFI_SessionRef {
             session_id: session_id_fn_wrapper,
@@ -514,7 +515,7 @@ impl FFI_SessionRef {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: super::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
@@ -659,7 +660,7 @@ fn table_options_from_rhashmap(options: SVec<(SString, SString)>) -> TableOption
         let format_options: HashMap<String, String> = options
             .iter()
             .filter_map(|(k, v)| {
-                let (prefix, key) = k.split_once(".")?;
+                let (prefix, key) = k.split_once('.')?;
                 if prefix == format_name {
                     Some((format!("format.{key}"), v.to_owned()))
                 } else {
@@ -677,7 +678,7 @@ fn table_options_from_rhashmap(options: SVec<(SString, SString)>) -> TableOption
     let extension_options: HashMap<String, String> = options
         .iter()
         .filter_map(|(k, v)| {
-            let (prefix, _) = k.split_once(".")?;
+            let (prefix, _) = k.split_once('.')?;
             if !["json", "parquet", "csv"].contains(&prefix) {
                 Some((k.to_owned(), v.to_owned()))
             } else {
diff --git a/datafusion/ffi/src/table_provider.rs b/datafusion/ffi/src/table_provider.rs
index 7f3deccbb2..5103297fcb 100644
--- a/datafusion/ffi/src/table_provider.rs
+++ b/datafusion/ffi/src/table_provider.rs
@@ -499,7 +499,7 @@ unsafe extern "C" fn release_fn_wrapper(provider: &mut FFI_TableProvider) {
     unsafe {
         debug_assert!(!provider.private_data.is_null());
         let private_data =
-            Box::from_raw(provider.private_data as *mut ProviderPrivateData);
+            Box::from_raw(provider.private_data.cast::<ProviderPrivateData>());
         drop(private_data);
         provider.private_data = std::ptr::null_mut();
     }
@@ -512,7 +512,8 @@ unsafe extern "C" fn clone_fn_wrapper(provider: &FFI_TableProvider) -> FFI_Table
     let private_data = Box::into_raw(Box::new(ProviderPrivateData {
         provider: old_provider,
         runtime,
-    })) as *mut c_void;
+    }))
+    .cast::<c_void>();
 
     FFI_TableProvider {
         schema: schema_fn_wrapper,
@@ -601,7 +602,7 @@ impl FFI_TableProvider {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: super::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
             delete_from: delete_from_fn_wrapper,
             update: update_fn_wrapper,
diff --git a/datafusion/ffi/src/table_provider_factory.rs b/datafusion/ffi/src/table_provider_factory.rs
index 5972be38d3..70cab63ede 100644
--- a/datafusion/ffi/src/table_provider_factory.rs
+++ b/datafusion/ffi/src/table_provider_factory.rs
@@ -126,7 +126,7 @@ impl FFI_TableProviderFactory {
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
             version: super::version,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
@@ -235,7 +235,8 @@ unsafe extern "C" fn clone_fn_wrapper(
     let private_data = Box::into_raw(Box::new(FactoryPrivateData {
         factory: old_factory,
         runtime,
-    })) as *mut c_void;
+    }))
+    .cast::<c_void>();
 
     FFI_TableProviderFactory {
         create: create_fn_wrapper,
@@ -251,7 +252,8 @@ unsafe extern "C" fn clone_fn_wrapper(
 unsafe extern "C" fn release_fn_wrapper(factory: &mut FFI_TableProviderFactory) {
     unsafe {
         debug_assert!(!factory.private_data.is_null());
-        let private_data = Box::from_raw(factory.private_data as *mut FactoryPrivateData);
+        let private_data =
+            Box::from_raw(factory.private_data.cast::<FactoryPrivateData>());
         drop(private_data);
         factory.private_data = std::ptr::null_mut();
     }
diff --git a/datafusion/ffi/src/udaf/accumulator.rs b/datafusion/ffi/src/udaf/accumulator.rs
index 8e6e5983bb..04c67a9d95 100644
--- a/datafusion/ffi/src/udaf/accumulator.rs
+++ b/datafusion/ffi/src/udaf/accumulator.rs
@@ -86,7 +86,7 @@ impl FFI_Accumulator {
     #[inline]
     unsafe fn inner_mut(&mut self) -> &mut Box<dyn Accumulator> {
         unsafe {
-            let private_data = self.private_data as *mut AccumulatorPrivateData;
+            let private_data = self.private_data.cast::<AccumulatorPrivateData>();
             &mut (*private_data).accumulator
         }
     }
@@ -195,7 +195,7 @@ unsafe extern "C" fn release_fn_wrapper(accumulator: &mut FFI_Accumulator) {
     unsafe {
         if !accumulator.private_data.is_null() {
             let private_data =
-                Box::from_raw(accumulator.private_data as *mut AccumulatorPrivateData);
+                Box::from_raw(accumulator.private_data.cast::<AccumulatorPrivateData>());
             drop(private_data);
             accumulator.private_data = null_mut();
         }
@@ -223,7 +223,7 @@ impl From<Box<dyn Accumulator>> for FFI_Accumulator {
             retract_batch: retract_batch_fn_wrapper,
             supports_retract_batch,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(Box::new(private_data)) as *mut c_void,
+            private_data: Box::into_raw(Box::new(private_data)).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
@@ -251,7 +251,7 @@ impl From<FFI_Accumulator> for Box<dyn Accumulator> {
         if (accumulator.library_marker_id)() == crate::get_library_marker_id() {
             unsafe {
                 let private_data = Box::from_raw(
-                    accumulator.private_data as *mut AccumulatorPrivateData,
+                    accumulator.private_data.cast::<AccumulatorPrivateData>(),
                 );
                 // We must set this to null to avoid a double free
                 accumulator.private_data = null_mut();
@@ -419,8 +419,8 @@ mod tests {
         let foreign_accum: Box<dyn Accumulator> = ffi_accum.into();
         unsafe {
             let concrete =
-                &*(std::ptr::from_ref::<dyn Accumulator>(foreign_accum.as_ref())
-                    as *const AvgAccumulator);
+                &*std::ptr::from_ref::<dyn Accumulator>(foreign_accum.as_ref())
+                    .cast::<AvgAccumulator>();
             assert_eq!(original_size, concrete.size());
         }
 
@@ -432,8 +432,8 @@ mod tests {
         let foreign_accum: Box<dyn Accumulator> = ffi_accum.into();
         unsafe {
             let concrete =
-                &*(std::ptr::from_ref::<dyn Accumulator>(foreign_accum.as_ref())
-                    as *const ForeignAccumulator);
+                &*std::ptr::from_ref::<dyn Accumulator>(foreign_accum.as_ref())
+                    .cast::<ForeignAccumulator>();
             assert_eq!(original_size, concrete.size());
         }
 
diff --git a/datafusion/ffi/src/udaf/groups_accumulator.rs b/datafusion/ffi/src/udaf/groups_accumulator.rs
index ddf5204104..a23d613150 100644
--- a/datafusion/ffi/src/udaf/groups_accumulator.rs
+++ b/datafusion/ffi/src/udaf/groups_accumulator.rs
@@ -93,7 +93,7 @@ impl FFI_GroupsAccumulator {
     #[inline]
     unsafe fn inner_mut(&mut self) -> &mut Box<dyn GroupsAccumulator> {
         unsafe {
-            let private_data = self.private_data as *mut GroupsAccumulatorPrivateData;
+            let private_data = self.private_data.cast::<GroupsAccumulatorPrivateData>();
             &mut (*private_data).accumulator
         }
     }
@@ -227,7 +227,9 @@ unsafe extern "C" fn release_fn_wrapper(accumulator: &mut FFI_GroupsAccumulator)
     unsafe {
         if !accumulator.private_data.is_null() {
             let private_data = Box::from_raw(
-                accumulator.private_data as *mut GroupsAccumulatorPrivateData,
+                accumulator
+                    .private_data
+                    .cast::<GroupsAccumulatorPrivateData>(),
             );
             drop(private_data);
             accumulator.private_data = null_mut();
@@ -255,7 +257,7 @@ impl From<Box<dyn GroupsAccumulator>> for FFI_GroupsAccumulator {
             convert_to_state: convert_to_state_fn_wrapper,
 
             release: release_fn_wrapper,
-            private_data: Box::into_raw(Box::new(private_data)) as *mut c_void,
+            private_data: Box::into_raw(Box::new(private_data)).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
@@ -286,7 +288,9 @@ impl From<FFI_GroupsAccumulator> for Box<dyn GroupsAccumulator> {
         if (accumulator.library_marker_id)() == crate::get_library_marker_id() {
             unsafe {
                 let private_data = Box::from_raw(
-                    accumulator.private_data as *mut GroupsAccumulatorPrivateData,
+                    accumulator
+                        .private_data
+                        .cast::<GroupsAccumulatorPrivateData>(),
                 );
                 // We must set this to null to avoid a double free
                 accumulator.private_data = null_mut();
@@ -542,8 +546,8 @@ mod tests {
         let foreign_accum: Box<dyn GroupsAccumulator> = ffi_accum.into();
         unsafe {
             let concrete =
-                &*(std::ptr::from_ref::<dyn GroupsAccumulator>(foreign_accum.as_ref())
-                    as *const StddevGroupsAccumulator);
+                &*std::ptr::from_ref::<dyn GroupsAccumulator>(foreign_accum.as_ref())
+                    .cast::<StddevGroupsAccumulator>();
             assert_eq!(original_size, concrete.size());
         }
 
@@ -555,8 +559,8 @@ mod tests {
         let foreign_accum: Box<dyn GroupsAccumulator> = ffi_accum.into();
         unsafe {
             let concrete =
-                &*(std::ptr::from_ref::<dyn GroupsAccumulator>(foreign_accum.as_ref())
-                    as *const ForeignGroupsAccumulator);
+                &*std::ptr::from_ref::<dyn GroupsAccumulator>(foreign_accum.as_ref())
+                    .cast::<ForeignGroupsAccumulator>();
             assert_eq!(original_size, concrete.size());
         }
 
diff --git a/datafusion/ffi/src/udaf/mod.rs b/datafusion/ffi/src/udaf/mod.rs
index 28d2221ac1..7bddb927a4 100644
--- a/datafusion/ffi/src/udaf/mod.rs
+++ b/datafusion/ffi/src/udaf/mod.rs
@@ -364,7 +364,7 @@ unsafe extern "C" fn release_fn_wrapper(udaf: &mut FFI_AggregateUDF) {
     unsafe {
         debug_assert!(!udaf.private_data.is_null());
         let private_data =
-            Box::from_raw(udaf.private_data as *mut AggregateUDFPrivateData);
+            Box::from_raw(udaf.private_data.cast::<AggregateUDFPrivateData>());
         drop(private_data);
         udaf.private_data = std::ptr::null_mut();
     }
@@ -409,7 +409,7 @@ impl From<Arc<AggregateUDF>> for FFI_AggregateUDF {
             coerce_types: coerce_types_fn_wrapper,
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
             supports_null_handling_clause: supports_null_handling_clause_fn_wrapper,
         }
diff --git a/datafusion/ffi/src/udf/mod.rs b/datafusion/ffi/src/udf/mod.rs
index fa08cbd042..d14614f147 100644
--- a/datafusion/ffi/src/udf/mod.rs
+++ b/datafusion/ffi/src/udf/mod.rs
@@ -272,7 +272,7 @@ unsafe extern "C" fn invoke_with_args_fn_wrapper(
 unsafe extern "C" fn release_fn_wrapper(udf: &mut FFI_ScalarUDF) {
     unsafe {
         debug_assert!(!udf.private_data.is_null());
-        let private_data = Box::from_raw(udf.private_data as *mut ScalarUDFPrivateData);
+        let private_data = Box::from_raw(udf.private_data.cast::<ScalarUDFPrivateData>());
         drop(private_data);
         udf.private_data = std::ptr::null_mut();
     }
@@ -317,7 +317,7 @@ impl From<Arc<ScalarUDF>> for FFI_ScalarUDF {
             placement: placement_fn_wrapper,
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
             preserves_lex_ordering: preserves_lex_ordering_fn_wrapper,
             with_updated_config: with_updated_config_fn_wrapper,
@@ -373,7 +373,7 @@ impl PartialEq for ForeignScalarUDF {
         } = self;
         name == &other.name
             && aliases == &other.aliases
-            && std::ptr::eq(udf, &other.udf)
+            && std::ptr::eq(udf, &raw const other.udf)
             && signature == &other.signature
     }
 }
diff --git a/datafusion/ffi/src/udtf.rs b/datafusion/ffi/src/udtf.rs
index eb1744b7b1..00ccc747e5 100644
--- a/datafusion/ffi/src/udtf.rs
+++ b/datafusion/ffi/src/udtf.rs
@@ -172,7 +172,7 @@ unsafe extern "C" fn release_fn_wrapper(udtf: &mut FFI_TableFunction) {
     unsafe {
         debug_assert!(!udtf.private_data.is_null());
         let private_data =
-            Box::from_raw(udtf.private_data as *mut TableFunctionPrivateData);
+            Box::from_raw(udtf.private_data.cast::<TableFunctionPrivateData>());
         drop(private_data);
         udtf.private_data = std::ptr::null_mut();
     }
@@ -234,7 +234,7 @@ impl FFI_TableFunction {
             logical_codec,
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/udwf/mod.rs b/datafusion/ffi/src/udwf/mod.rs
index bff4638670..9ba874dc6b 100644
--- a/datafusion/ffi/src/udwf/mod.rs
+++ b/datafusion/ffi/src/udwf/mod.rs
@@ -181,7 +181,8 @@ unsafe extern "C" fn coerce_types_fn_wrapper(
 unsafe extern "C" fn release_fn_wrapper(udwf: &mut FFI_WindowUDF) {
     unsafe {
         debug_assert!(!udwf.private_data.is_null());
-        let private_data = Box::from_raw(udwf.private_data as *mut WindowUDFPrivateData);
+        let private_data =
+            Box::from_raw(udwf.private_data.cast::<WindowUDFPrivateData>());
         drop(private_data);
         udwf.private_data = std::ptr::null_mut();
     }
@@ -209,7 +210,7 @@ unsafe extern "C" fn clone_fn_wrapper(udwf: &FFI_WindowUDF) -> FFI_WindowUDF {
             field: field_fn_wrapper,
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
@@ -244,7 +245,7 @@ impl From<Arc<WindowUDF>> for FFI_WindowUDF {
             field: field_fn_wrapper,
             clone: clone_fn_wrapper,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(private_data) as *mut c_void,
+            private_data: Box::into_raw(private_data).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
diff --git a/datafusion/ffi/src/udwf/partition_evaluator.rs b/datafusion/ffi/src/udwf/partition_evaluator.rs
index 1074c1a019..03d45ca161 100644
--- a/datafusion/ffi/src/udwf/partition_evaluator.rs
+++ b/datafusion/ffi/src/udwf/partition_evaluator.rs
@@ -93,14 +93,14 @@ pub struct PartitionEvaluatorPrivateData {
 impl FFI_PartitionEvaluator {
     unsafe fn inner_mut(&mut self) -> &mut Box<dyn PartitionEvaluator + 'static> {
         unsafe {
-            let private_data = self.private_data as *mut PartitionEvaluatorPrivateData;
+            let private_data = self.private_data.cast::<PartitionEvaluatorPrivateData>();
             &mut (*private_data).evaluator
         }
     }
 
     unsafe fn inner(&self) -> &(dyn PartitionEvaluator + 'static) {
         unsafe {
-            let private_data = self.private_data as *mut PartitionEvaluatorPrivateData;
+            let private_data = self.private_data.cast::<PartitionEvaluatorPrivateData>();
             (*private_data).evaluator.as_ref()
         }
     }
@@ -196,7 +196,9 @@ unsafe extern "C" fn release_fn_wrapper(evaluator: &mut FFI_PartitionEvaluator)
     unsafe {
         if !evaluator.private_data.is_null() {
             let private_data = Box::from_raw(
-                evaluator.private_data as *mut PartitionEvaluatorPrivateData,
+                evaluator
+                    .private_data
+                    .cast::<PartitionEvaluatorPrivateData>(),
             );
             drop(private_data);
             evaluator.private_data = std::ptr::null_mut();
@@ -230,7 +232,7 @@ impl From<Box<dyn PartitionEvaluator>> for FFI_PartitionEvaluator {
             include_rank,
             uses_window_frame,
             release: release_fn_wrapper,
-            private_data: Box::into_raw(Box::new(private_data)) as *mut c_void,
+            private_data: Box::into_raw(Box::new(private_data)).cast::<c_void>(),
             library_marker_id: crate::get_library_marker_id,
         }
     }
@@ -258,7 +260,9 @@ impl From<FFI_PartitionEvaluator> for Box<dyn PartitionEvaluator> {
         if (evaluator.library_marker_id)() == crate::get_library_marker_id() {
             unsafe {
                 let private_data = Box::from_raw(
-                    evaluator.private_data as *mut PartitionEvaluatorPrivateData,
+                    evaluator
+                        .private_data
+                        .cast::<PartitionEvaluatorPrivateData>(),
                 );
                 // We must set this to null to avoid a double free
                 evaluator.private_data = std::ptr::null_mut();
@@ -397,8 +401,8 @@ mod tests {
         let foreign_accum: Box<dyn PartitionEvaluator> = ffi_accum.into();
         unsafe {
             let concrete =
-                &*(std::ptr::from_ref::<dyn PartitionEvaluator>(foreign_accum.as_ref())
-                    as *const TestPartitionEvaluator);
+                &*std::ptr::from_ref::<dyn PartitionEvaluator>(foreign_accum.as_ref())
+                    .cast::<TestPartitionEvaluator>();
             assert!(!concrete.uses_window_frame());
         }
 
@@ -410,8 +414,8 @@ mod tests {
         let foreign_accum: Box<dyn PartitionEvaluator> = ffi_accum.into();
         unsafe {
             let concrete =
-                &*(std::ptr::from_ref::<dyn PartitionEvaluator>(foreign_accum.as_ref())
-                    as *const ForeignPartitionEvaluator);
+                &*std::ptr::from_ref::<dyn PartitionEvaluator>(foreign_accum.as_ref())
+                    .cast::<ForeignPartitionEvaluator>();
             assert!(!concrete.uses_window_frame());
         }
 
diff --git a/datafusion/functions-aggregate-common/src/aggregate/avg_distinct/decimal.rs b/datafusion/functions-aggregate-common/src/aggregate/avg_distinct/decimal.rs
index 62db8622c5..5d2a2fc38b 100644
--- a/datafusion/functions-aggregate-common/src/aggregate/avg_distinct/decimal.rs
+++ b/datafusion/functions-aggregate-common/src/aggregate/avg_distinct/decimal.rs
@@ -154,6 +154,11 @@ where
 
 #[cfg(test)]
 mod tests {
+    #![expect(
+        clippy::large_digit_groups,
+        reason = "the single `_` marks the decimal point of the fixed-point literal"
+    )]
+
     use super::*;
     use arrow::array::{
         Decimal32Array, Decimal64Array, Decimal128Array, Decimal256Array,
diff --git a/datafusion/functions/src/regex/mod.rs b/datafusion/functions/src/regex/mod.rs
index caeab9d745..614fcc5af0 100644
--- a/datafusion/functions/src/regex/mod.rs
+++ b/datafusion/functions/src/regex/mod.rs
@@ -166,7 +166,7 @@ pub fn compile_regex(regex: &str, flags: Option<&str>) -> Result<Regex, ArrowErr
     let pattern = match flags {
         None | Some("") => regex.to_string(),
         Some(flags) => {
-            if flags.contains("g") {
+            if flags.contains('g') {
                 return Err(ArrowError::ComputeError(
                     "regexp_count()/regexp_instr() does not support the global flag"
                         .to_string(),
diff --git a/datafusion/functions/src/string/starts_with.rs b/datafusion/functions/src/string/starts_with.rs
index c89bd66d72..7ed67115f8 100644
--- a/datafusion/functions/src/string/starts_with.rs
+++ b/datafusion/functions/src/string/starts_with.rs
@@ -171,9 +171,9 @@ impl ScalarUDFImpl for StartsWithFunc {
                 | ScalarValue::LargeUtf8(Some(pattern))
                 | ScalarValue::Utf8View(Some(pattern)) => {
                     let escaped_pattern = pattern
-                        .replace("\\", "\\\\")
-                        .replace("%", "\\%")
-                        .replace("_", "\\_");
+                        .replace('\\', "\\\\")
+                        .replace('%', "\\%")
+                        .replace('_', "\\_");
                     let like_pattern = format!("{escaped_pattern}%");
                     Expr::Literal(ScalarValue::Utf8(Some(like_pattern)), None)
                 }
diff --git a/datafusion/functions/src/unicode/reverse.rs b/datafusion/functions/src/unicode/reverse.rs
index e42240ba66..9815e22cab 100644
--- a/datafusion/functions/src/unicode/reverse.rs
+++ b/datafusion/functions/src/unicode/reverse.rs
@@ -227,8 +227,10 @@ mod tests {
     #[test]
     fn test_functions() -> Result<()> {
         test_reverse!(Some("abcde".into()), Ok(Some("edcba")));
-        test_reverse!(Some("loẅks".into()), Ok(Some("sk̈wol")));
-        test_reverse!(Some("loẅks".into()), Ok(Some("sk̈wol")));
+        // `reverse` works per `char`, so a decomposed grapheme is split from its base char ...
+        test_reverse!(Some("low\u{308}ks".into()), Ok(Some("sk\u{308}wol")));
+        // ... while the composed form is a single `char` and stays intact.
+        test_reverse!(Some("lo\u{1e85}ks".into()), Ok(Some("sk\u{1e85}ol")));
         test_reverse!(None, Ok(None));
         #[cfg(not(feature = "unicode_expressions"))]
         test_reverse!(
diff --git a/datafusion/physical-expr/src/expressions/in_list/branchless_filter.rs b/datafusion/physical-expr/src/expressions/in_list/branchless_filter.rs
index b4d4c10fd7..7ea169b446 100644
--- a/datafusion/physical-expr/src/expressions/in_list/branchless_filter.rs
+++ b/datafusion/physical-expr/src/expressions/in_list/branchless_filter.rs
@@ -313,6 +313,10 @@ where
 }
 
 #[inline]
+#[expect(
+    clippy::needless_bitwise_bool,
+    reason = "the non-short-circuiting `|` is the point of this branchless kernel"
+)]
 fn check_values<C, const N: usize>(
     in_list_values: &[C],
     input_values: &[C],
diff --git a/datafusion/physical-plan/src/aggregates/topk/heap.rs b/datafusion/physical-plan/src/aggregates/topk/heap.rs
index aef6bb5596..7982d94d39 100644
--- a/datafusion/physical-plan/src/aggregates/topk/heap.rs
+++ b/datafusion/physical-plan/src/aggregates/topk/heap.rs
@@ -37,6 +37,7 @@ use datafusion_common::exec_datafusion_err;
 
 use half::f16;
 use std::cmp::Ordering;
+use std::fmt::Write as _;
 use std::fmt::{Debug, Display, Formatter};
 use std::sync::Arc;
 
@@ -478,10 +479,12 @@ impl<VAL: ValueType> TopKHeap<VAL> {
             } else {
                 ""
             };
-            output.push_str(&format!(
-                "{}{}val={:?} idx={}, bucket={}\n",
+            writeln!(
+                output,
+                "{}{}val={:?} idx={}, bucket={}",
                 prefix, connector, hi.val, idx, hi.map_idx
-            ));
+            )
+            .ok();
             let new_prefix = if is_tail { "" } else { "│   " };
             let child_prefix = format!("{prefix}{new_prefix}");
 
diff --git a/datafusion/physical-plan/src/statistics.rs b/datafusion/physical-plan/src/statistics.rs
index 0898d75b17..c1a8ad29bc 100644
--- a/datafusion/physical-plan/src/statistics.rs
+++ b/datafusion/physical-plan/src/statistics.rs
@@ -40,7 +40,7 @@ type CacheKey = (usize, Option<usize>);
 
 fn cache_key(plan: &dyn ExecutionPlan, partition: Option<usize>) -> CacheKey {
     (
-        from_ref::<dyn ExecutionPlan>(plan) as *const () as usize,
+        from_ref::<dyn ExecutionPlan>(plan).cast::<()>() as usize,
         partition,
     )
 }
diff --git a/datafusion/proto-common/src/generated/mod.rs b/datafusion/proto-common/src/generated/mod.rs
index 49d09bf3f4..790410b0bc 100644
--- a/datafusion/proto-common/src/generated/mod.rs
+++ b/datafusion/proto-common/src/generated/mod.rs
@@ -18,6 +18,7 @@
 // This code is generated so we don't want to fix any lint violations manually
 #[allow(clippy::allow_attributes)]
 #[allow(clippy::all)]
+#[allow(clippy::pedantic)]
 #[allow(clippy::uninlined_format_args)]
 #[allow(unused_qualifications)]
 #[rustfmt::skip]
diff --git a/datafusion/proto-models/src/generated/mod.rs b/datafusion/proto-models/src/generated/mod.rs
index 7ed335e813..0ea12c1c62 100644
--- a/datafusion/proto-models/src/generated/mod.rs
+++ b/datafusion/proto-models/src/generated/mod.rs
@@ -18,6 +18,7 @@
 // This code is generated so we don't want to fix any lint violations manually
 #[allow(clippy::allow_attributes)]
 #[allow(clippy::all)]
+#[allow(clippy::pedantic)]
 #[allow(clippy::uninlined_format_args)]
 #[allow(unused_qualifications)]
 #[rustfmt::skip]
diff --git a/datafusion/sql/src/unparser/dialect.rs b/datafusion/sql/src/unparser/dialect.rs
index d7dad04014..545da7a95c 100644
--- a/datafusion/sql/src/unparser/dialect.rs
+++ b/datafusion/sql/src/unparser/dialect.rs
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::fmt::Write as _;
 use std::{collections::HashMap, sync::Arc};
 
 use super::{
@@ -703,7 +704,7 @@ impl Dialect for BigQueryDialect {
             let mut encoded_name = String::new();
             for c in alias.chars() {
                 if special_chars.contains(&c) {
-                    encoded_name.push_str(&format!("_{}", c as u32));
+                    write!(encoded_name, "_{}", c as u32).ok();
                 } else {
                     encoded_name.push(c);
                 }
diff --git a/datafusion/sql/tests/cases/diagnostic.rs b/datafusion/sql/tests/cases/diagnostic.rs
index 1f4eeca83b..c385393bed 100644
--- a/datafusion/sql/tests/cases/diagnostic.rs
+++ b/datafusion/sql/tests/cases/diagnostic.rs
@@ -150,7 +150,7 @@ fn get_spans(query: &'static str) -> HashMap<String, Span> {
     let mut stack: Vec<(String, usize)> = vec![];
     for c in re.captures_iter(query) {
         let m = c.get(0).unwrap();
-        let tags = c.get(1).unwrap().as_str().split("+").collect::<Vec<_>>();
+        let tags = c.get(1).unwrap().as_str().split('+').collect::<Vec<_>>();
 
         for tag in tags {
             if stack.last().map(|(top_tag, _)| top_tag.as_str()) == Some(tag) {
diff --git a/datafusion/sqllogictest/bin/sqllogictests.rs b/datafusion/sqllogictest/bin/sqllogictests.rs
index 2ae1ae149f..71573c5e53 100644
--- a/datafusion/sqllogictest/bin/sqllogictests.rs
+++ b/datafusion/sqllogictest/bin/sqllogictests.rs
@@ -45,6 +45,7 @@ use crate::postgres_container::{
 };
 use datafusion::common::runtime::SpawnedTask;
 use futures::FutureExt;
+use std::fmt::Write as _;
 use std::fs;
 use std::io::{IsTerminal, Write, stderr, stdout};
 use std::path::{Path, PathBuf};
@@ -360,11 +361,13 @@ async fn run_tests() -> Result<()> {
                             test_file_path.display()
                         )))
                     } else {
-                        let sqls = current_sql
-                            .iter()
-                            .enumerate()
-                            .map(|(i, sql)| format!("\n[{}]: {}", i + 1, sql))
-                            .collect::<String>();
+                        let sqls = current_sql.iter().enumerate().fold(
+                            String::new(),
+                            |mut acc, (i, sql)| {
+                                write!(acc, "\n[{}]: {}", i + 1, sql).ok();
+                                acc
+                            },
+                        );
                         Some(error.context(format!(
                             "failure in {} for multiple currently running sqls: {}",
                             test_file_path.display(),
@@ -738,14 +741,16 @@ where
         let mut msg = format!("{} errors in file {}\n\n", errs.len(), path.display());
         for (i, err) in errs.iter().enumerate() {
             if i >= ERRS_PER_FILE_LIMIT {
-                msg.push_str(&format!(
+                write!(
+                    msg,
                     "... other {} errors in {} not shown ...\n\n",
                     errs.len() - ERRS_PER_FILE_LIMIT,
                     path.display()
-                ));
+                )
+                .ok();
                 break;
             }
-            msg.push_str(&format!("{}. {err}\n\n", i + 1));
+            write!(msg, "{}. {err}\n\n", i + 1).ok();
         }
         return Err(DataFusionError::External(msg.into()));
     }
diff --git a/datafusion/sqllogictest/src/engines/conversion.rs b/datafusion/sqllogictest/src/engines/conversion.rs
index 4447ea9f03..10d8285b63 100644
--- a/datafusion/sqllogictest/src/engines/conversion.rs
+++ b/datafusion/sqllogictest/src/engines/conversion.rs
@@ -36,7 +36,7 @@ pub(crate) fn varchar_to_str(value: &str) -> String {
         "(empty)".to_string()
     } else {
         // Escape nulls so that github renders them correctly in the webui
-        value.trim_end_matches('\n').replace("\u{0000}", "\\0")
+        value.trim_end_matches('\n').replace('\u{0000}', "\\0")
     }
 }
 
diff --git a/datafusion/sqllogictest/src/engines/datafusion_engine/runner.rs b/datafusion/sqllogictest/src/engines/datafusion_engine/runner.rs
index 08facc4800..470efa6f4f 100644
--- a/datafusion/sqllogictest/src/engines/datafusion_engine/runner.rs
+++ b/datafusion/sqllogictest/src/engines/datafusion_engine/runner.rs
@@ -16,6 +16,7 @@
 // under the License.
 
 use std::collections::HashMap;
+use std::fmt::Write as _;
 use std::sync::{Arc, Mutex};
 use std::{path::PathBuf, time::Duration};
 
@@ -85,7 +86,7 @@ impl DataFusion {
 
     fn update_slow_count(&self) {
         let msg = self.pb.message();
-        let split: Vec<&str> = msg.split(" ").collect();
+        let split: Vec<&str> = msg.split(' ').collect();
         let mut current_count = 0;
 
         if split.len() > 2 {
@@ -117,8 +118,7 @@ impl DataFusion {
                 let default = default_entry.as_deref().unwrap_or("NULL");
                 let current = entry.value.as_deref().unwrap_or("NULL");
 
-                message
-                    .push_str(&format!("\n  {}: {} -> {}", entry.key, default, current));
+                write!(message, "\n  {}: {} -> {}", entry.key, default, current).ok();
             }
         }
 
@@ -126,7 +126,7 @@ impl DataFusion {
             changed = true;
 
             let default = value.as_deref().unwrap_or("NULL");
-            message.push_str(&format!("\n  {key}: {default} -> NULL"));
+            write!(message, "\n  {key}: {default} -> NULL").ok();
         }
 
         if changed {
diff --git a/datafusion/sqllogictest/src/engines/datafusion_substrait_roundtrip_engine/runner.rs b/datafusion/sqllogictest/src/engines/datafusion_substrait_roundtrip_engine/runner.rs
index d4b4377e30..90ad6646dc 100644
--- a/datafusion/sqllogictest/src/engines/datafusion_substrait_roundtrip_engine/runner.rs
+++ b/datafusion/sqllogictest/src/engines/datafusion_substrait_roundtrip_engine/runner.rs
@@ -68,7 +68,7 @@ impl DataFusionSubstraitRoundTrip {
 
     fn update_slow_count(&self) {
         let msg = self.pb.message();
-        let split: Vec<&str> = msg.split(" ").collect();
+        let split: Vec<&str> = msg.split(' ').collect();
         let mut current_count = 0;
 
         if split.len() > 2 {
diff --git a/datafusion/sqllogictest/src/engines/postgres_engine/mod.rs b/datafusion/sqllogictest/src/engines/postgres_engine/mod.rs
index 3c7087e7dc..7ab5f1977d 100644
--- a/datafusion/sqllogictest/src/engines/postgres_engine/mod.rs
+++ b/datafusion/sqllogictest/src/engines/postgres_engine/mod.rs
@@ -216,7 +216,7 @@ impl Postgres {
 
     fn update_slow_count(&self) {
         let msg = self.pb.message();
-        let split: Vec<&str> = msg.split(" ").collect();
+        let split: Vec<&str> = msg.split(' ').collect();
         let mut current_count = 0;
 
         if split.len() > 2 {
diff --git a/xtask/src/ci_steps.rs b/xtask/src/ci_steps.rs
index f40cb61818..e409d14164 100644
--- a/xtask/src/ci_steps.rs
+++ b/xtask/src/ci_steps.rs
@@ -20,6 +20,7 @@
 use crate::Result;
 use std::env;
 use std::ffi::OsStr;
+use std::fmt::Write as _;
 use std::path::{Path, PathBuf};
 use std::process::{Command, Stdio};
 
@@ -68,10 +69,10 @@ pub(crate) fn help() -> String {
     );
     for step in CI_STEPS {
         if let Some(example) = step.help_examples.first() {
-            help.push_str(&format!("  {CI_COMMAND} {example}\n"));
+            writeln!(help, "  {CI_COMMAND} {example}").ok();
         }
     }
-    help.push_str(&format!("  {CI_COMMAND} test workspace --explain\n"));
+    writeln!(help, "  {CI_COMMAND} test workspace --explain").ok();
 
     let command_width = CI_STEPS
         .iter()
@@ -80,15 +81,17 @@ pub(crate) fn help() -> String {
         .unwrap_or_default();
     help.push_str("\nAvailable steps:\n");
     for step in CI_STEPS {
-        help.push_str(&format!(
-            "  {:command_width$}  {}\n",
+        writeln!(
+            help,
+            "  {:command_width$}  {}",
             step.command, step.help_description
-        ));
+        )
+        .ok();
     }
 
-    help.push_str(&format!(
+    write!(help,
         "\nShortcut:\n  # `{CI_SHORTCUT}` is short for `{CI_COMMAND}`.\n  {CI_SHORTCUT} check workspace\n\nFor more details:\n  {CI_COMMAND} check --help\n"
-    ));
+    ).ok();
     help
 }
 
@@ -98,12 +101,12 @@ fn step_help(step: &StepInfo) -> String {
         step.command, step.help_description, step.help_usage,
     );
     for example in step.help_examples {
-        help.push_str(&format!("  {CI_COMMAND} {example}\n"));
+        writeln!(help, "  {CI_COMMAND} {example}").ok();
     }
     if let Some(example) = step.help_examples.first() {
-        help.push_str(&format!(
+        write!(help,
             "\nUse '--explain' to show the full command:\n  {CI_COMMAND} {example} --explain\n"
-        ));
+        ).ok();
     }
     help
 }


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