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