From 25f5bbb4b218a743dc4da90e7e88f730cc81a531 Mon Sep 17 00:00:00 2001 From: Jackie Yan Date: Sat, 29 Nov 2025 12:06:21 +0800 Subject: [PATCH 1/8] chore: enforce clippy::allow_attributes for common crates --- datafusion/common-runtime/src/common.rs | 6 +++--- datafusion/common-runtime/src/lib.rs | 1 + datafusion/common/src/config.rs | 16 ++-------------- datafusion/common/src/error.rs | 6 +----- .../common/src/file_options/parquet_writer.rs | 12 ++++++------ datafusion/common/src/instant.rs | 2 +- datafusion/common/src/lib.rs | 1 + datafusion/common/src/scalar/mod.rs | 3 +-- datafusion/common/src/stats.rs | 3 +-- 9 files changed, 17 insertions(+), 33 deletions(-) diff --git a/datafusion/common-runtime/src/common.rs b/datafusion/common-runtime/src/common.rs index 649abb338c75..ca618b19ed2f 100644 --- a/datafusion/common-runtime/src/common.rs +++ b/datafusion/common-runtime/src/common.rs @@ -44,7 +44,7 @@ impl SpawnedTask { R: Send, { // Ok to use spawn here as SpawnedTask handles aborting/cancelling the task on Drop - #[allow(clippy::disallowed_methods)] + #[expect(clippy::disallowed_methods)] let inner = tokio::task::spawn(trace_future(task)); Self { inner } } @@ -56,7 +56,7 @@ impl SpawnedTask { R: Send, { // Ok to use spawn_blocking here as SpawnedTask handles aborting/cancelling the task on Drop - #[allow(clippy::disallowed_methods)] + #[expect(clippy::disallowed_methods)] let inner = tokio::task::spawn_blocking(trace_block(task)); Self { inner } } @@ -122,7 +122,7 @@ mod tests { #[tokio::test] async fn runtime_shutdown() { let rt = Runtime::new().unwrap(); - #[allow(clippy::async_yields_async)] + #[expect(clippy::async_yields_async)] let task = rt .spawn(async { SpawnedTask::spawn(async { diff --git a/datafusion/common-runtime/src/lib.rs b/datafusion/common-runtime/src/lib.rs index 81fd61a4c629..cb3b11dd4df2 100644 --- a/datafusion/common-runtime/src/lib.rs +++ b/datafusion/common-runtime/src/lib.rs @@ -18,6 +18,7 @@ // https://github.com/apache/datafusion/issues/18503 #![deny(clippy::needless_pass_by_value)] #![cfg_attr(test, allow(clippy::needless_pass_by_value))] +#![deny(clippy::allow_attributes)] #![doc( html_logo_url = "https://raw.githubusercontent.com/apache/datafusion/19fe44cf2f30cbdd63d4a4f52c74055163c6cc38/docs/logos/standalone_logo/logo_original.svg", html_favicon_url = "https://raw.githubusercontent.com/apache/datafusion/19fe44cf2f30cbdd63d4a4f52c74055163c6cc38/docs/logos/standalone_logo/logo_original.svg" diff --git a/datafusion/common/src/config.rs b/datafusion/common/src/config.rs index a4385f0fd844..f7641057496c 100644 --- a/datafusion/common/src/config.rs +++ b/datafusion/common/src/config.rs @@ -157,12 +157,10 @@ macro_rules! config_namespace { // $(#[allow(deprecated)])? { $(let value = $transform(value);)? // Apply transformation if specified - #[allow(deprecated)] let ret = self.$field_name.set(rem, value.as_ref()); $(if !$warn.is_empty() { let default: $field_type = $default; - #[allow(deprecated)] if default != self.$field_name { log::warn!($warn); } @@ -181,7 +179,6 @@ macro_rules! config_namespace { $( let key = format!(concat!("{}.", stringify!($field_name)), key_prefix); let desc = concat!($($d),*).trim(); - #[allow(deprecated)] self.$field_name.visit(v, key.as_str(), desc); )* } @@ -191,8 +188,7 @@ macro_rules! config_namespace { match key { $( stringify!($field_name) => { - #[allow(deprecated)] - { + { if rem.is_empty() { let default_value: $field_type = $default; self.$field_name = default_value; @@ -213,7 +209,6 @@ macro_rules! config_namespace { } impl Default for $struct_name { fn default() -> Self { - #[allow(deprecated)] Self { $($field_name: $default),* } @@ -1851,8 +1846,7 @@ macro_rules! extensions_options { // Safely apply deprecated attribute if present // $(#[allow(deprecated)])? { - #[allow(deprecated)] - self.$field_name.set(rem, value.as_ref()) + self.$field_name.set(rem, value.as_ref()) } }, )* @@ -1866,7 +1860,6 @@ macro_rules! extensions_options { $( let key = stringify!($field_name).to_string(); let desc = concat!($($d),*).trim(); - #[allow(deprecated)] self.$field_name.visit(v, key.as_str(), desc); )* } @@ -2309,7 +2302,6 @@ macro_rules! config_namespace_with_hashmap { $( stringify!($field_name) => { // Handle deprecated fields - #[allow(deprecated)] // Allow deprecated fields $(let value = $transform(value);)? self.$field_name.set(rem, value.as_ref()) }, @@ -2325,7 +2317,6 @@ macro_rules! config_namespace_with_hashmap { let key = format!(concat!("{}.", stringify!($field_name)), key_prefix); let desc = concat!($($d),*).trim(); // Handle deprecated fields - #[allow(deprecated)] self.$field_name.visit(v, key.as_str(), desc); )* } @@ -2333,7 +2324,6 @@ macro_rules! config_namespace_with_hashmap { impl Default for $struct_name { fn default() -> Self { - #[allow(deprecated)] Self { $($field_name: $default),* } @@ -2361,7 +2351,6 @@ macro_rules! config_namespace_with_hashmap { $( let key = format!("{}.{field}::{}", key_prefix, column_name, field = stringify!($field_name)); let desc = concat!($($d),*).trim(); - #[allow(deprecated)] col_options.$field_name.visit(v, key.as_str(), desc); )* } @@ -2940,7 +2929,6 @@ config_namespace! { pub trait OutputFormatExt: Display {} #[derive(Debug, Clone, PartialEq)] -#[allow(clippy::large_enum_variant)] pub enum OutputFormat { CSV(CsvOptions), JSON(JsonOptions), diff --git a/datafusion/common/src/error.rs b/datafusion/common/src/error.rs index 83ffca99d17c..d1b90d6f4e21 100644 --- a/datafusion/common/src/error.rs +++ b/datafusion/common/src/error.rs @@ -939,10 +939,8 @@ macro_rules! make_error { // This macro generates a use or all of them in case they are needed // so we allow unused code to avoid warnings when they are not used #[doc(hidden)] - #[allow(unused)] pub use $NAME_ERR as [<_ $NAME_ERR>]; #[doc(hidden)] - #[allow(unused)] pub use $NAME_DF_ERR as [<_ $NAME_DF_ERR>]; } }; @@ -1238,7 +1236,7 @@ mod test { // To pass the test the environment variable RUST_BACKTRACE should be set to 1 to enforce backtrace #[cfg(feature = "backtrace")] #[test] - #[allow(clippy::unnecessary_literal_unwrap)] + #[expect(clippy::unnecessary_literal_unwrap)] fn test_enabled_backtrace() { match std::env::var("RUST_BACKTRACE") { Ok(val) if val == "1" => {} @@ -1266,7 +1264,6 @@ mod test { #[cfg(not(feature = "backtrace"))] #[test] - #[allow(clippy::unnecessary_literal_unwrap)] fn test_disabled_backtrace() { let res: Result<(), DataFusionError> = plan_err!("Err"); let res = res.unwrap_err().to_string(); @@ -1336,7 +1333,6 @@ mod test { } #[test] - #[allow(clippy::unnecessary_literal_unwrap)] fn test_make_error_parse_input() { let res: Result<(), DataFusionError> = plan_err!("Err"); let res = res.unwrap_err(); diff --git a/datafusion/common/src/file_options/parquet_writer.rs b/datafusion/common/src/file_options/parquet_writer.rs index 47feb12c120d..586e47176857 100644 --- a/datafusion/common/src/file_options/parquet_writer.rs +++ b/datafusion/common/src/file_options/parquet_writer.rs @@ -27,7 +27,7 @@ use crate::{ use arrow::datatypes::Schema; use parquet::arrow::encode_arrow_schema; // TODO: handle once deprecated -#[allow(deprecated)] +#[expect(deprecated)] use parquet::{ arrow::ARROW_SCHEMA_META_KEY, basic::{BrotliLevel, GzipLevel, ZstdLevel}, @@ -176,7 +176,7 @@ impl ParquetOptions { /// /// Note that this method does not include the key_value_metadata from [`TableParquetOptions`]. pub fn into_writer_properties_builder(&self) -> Result { - #[allow(deprecated)] + #[expect(deprecated)] let ParquetOptions { data_pagesize_limit, write_batch_size, @@ -263,7 +263,7 @@ pub(crate) fn parse_encoding_string( "plain" => Ok(parquet::basic::Encoding::PLAIN), "plain_dictionary" => Ok(parquet::basic::Encoding::PLAIN_DICTIONARY), "rle" => Ok(parquet::basic::Encoding::RLE), - #[allow(deprecated)] + #[expect(deprecated)] "bit_packed" => Ok(parquet::basic::Encoding::BIT_PACKED), "delta_binary_packed" => Ok(parquet::basic::Encoding::DELTA_BINARY_PACKED), "delta_length_byte_array" => { @@ -440,7 +440,7 @@ mod tests { "1.0" }; - #[allow(deprecated)] // max_statistics_size + #[expect(deprecated)] // max_statistics_size ParquetOptions { data_pagesize_limit: 42, write_batch_size: 42, @@ -486,7 +486,7 @@ mod tests { ) -> ParquetColumnOptions { let bloom_filter_default_props = props.bloom_filter_properties(&col); - #[allow(deprecated)] // max_statistics_size + #[expect(deprecated)] // max_statistics_size ParquetColumnOptions { bloom_filter_enabled: Some(bloom_filter_default_props.is_some()), encoding: props.encoding(&col).map(|s| s.to_string()), @@ -547,7 +547,7 @@ mod tests { #[cfg(not(feature = "parquet_encryption"))] let fep = None; - #[allow(deprecated)] // max_statistics_size + #[expect(deprecated)] // max_statistics_size TableParquetOptions { global: ParquetOptions { // global options diff --git a/datafusion/common/src/instant.rs b/datafusion/common/src/instant.rs index 42f21c061c0c..a5dfb2829258 100644 --- a/datafusion/common/src/instant.rs +++ b/datafusion/common/src/instant.rs @@ -22,7 +22,7 @@ /// under `wasm` feature gate. It provides the same API as [`std::time::Instant`]. pub type Instant = web_time::Instant; -#[allow(clippy::disallowed_types)] +#[expect(clippy::disallowed_types)] #[cfg(not(target_family = "wasm"))] /// DataFusion wrapper around [`std::time::Instant`]. This is only a type alias. pub type Instant = std::time::Instant; diff --git a/datafusion/common/src/lib.rs b/datafusion/common/src/lib.rs index 9e0238f97da2..3d89780ab3d0 100644 --- a/datafusion/common/src/lib.rs +++ b/datafusion/common/src/lib.rs @@ -26,6 +26,7 @@ // https://github.com/apache/datafusion/issues/18503 #![deny(clippy::needless_pass_by_value)] #![cfg_attr(test, allow(clippy::needless_pass_by_value))] +#![deny(clippy::allow_attributes)] mod column; mod dfschema; diff --git a/datafusion/common/src/scalar/mod.rs b/datafusion/common/src/scalar/mod.rs index 94f2ba0ecf7b..bd2c420a7fee 100644 --- a/datafusion/common/src/scalar/mod.rs +++ b/datafusion/common/src/scalar/mod.rs @@ -6331,7 +6331,7 @@ mod tests { #[test] // despite clippy claiming they are useless, the code doesn't compile otherwise. - #[allow(clippy::useless_vec)] + #[expect(clippy::useless_vec)] fn scalar_iter_to_array_boolean() { check_scalar_iter!(Boolean, BooleanArray, vec![Some(true), None, Some(false)]); check_scalar_iter!(Float32, Float32Array, vec![Some(1.9), None, Some(-2.1)]); @@ -7766,7 +7766,6 @@ mod tests { } #[test] - #[allow(arithmetic_overflow)] // we want to test them fn test_scalar_negative_overflows() -> Result<()> { macro_rules! test_overflow_on_value { ($($val:expr),* $(,)?) => {$( diff --git a/datafusion/common/src/stats.rs b/datafusion/common/src/stats.rs index b42e98d13023..29c7c003b2b8 100644 --- a/datafusion/common/src/stats.rs +++ b/datafusion/common/src/stats.rs @@ -367,7 +367,7 @@ impl Statistics { return self; }; - #[allow(clippy::large_enum_variant)] + #[expect(clippy::large_enum_variant)] enum Slot { /// The column is taken and put into the specified statistics location Taken(usize), @@ -979,7 +979,6 @@ mod tests { let precision: Precision = Precision::Exact(ScalarValue::Int64(Some(42))); // Clippy would complain about this if it were Copy - #[allow(clippy::redundant_clone)] let p2 = precision.clone(); assert_eq!(precision, p2); } From c87cb321c6fdef6e2af0f961320eddc53ca5f0d2 Mon Sep 17 00:00:00 2001 From: Jackie Yan Date: Sat, 29 Nov 2025 14:24:20 +0800 Subject: [PATCH 2/8] fix: resolve clippy allow_attributes CI errors --- datafusion/common/src/config.rs | 1 + datafusion/common/src/file_options/parquet_writer.rs | 12 +++--------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/datafusion/common/src/config.rs b/datafusion/common/src/config.rs index f7641057496c..9976087d1b4b 100644 --- a/datafusion/common/src/config.rs +++ b/datafusion/common/src/config.rs @@ -2929,6 +2929,7 @@ config_namespace! { pub trait OutputFormatExt: Display {} #[derive(Debug, Clone, PartialEq)] +#[cfg_attr(feature = "parquet", expect(clippy::large_enum_variant))] pub enum OutputFormat { CSV(CsvOptions), JSON(JsonOptions), diff --git a/datafusion/common/src/file_options/parquet_writer.rs b/datafusion/common/src/file_options/parquet_writer.rs index 586e47176857..0b00af3d47de 100644 --- a/datafusion/common/src/file_options/parquet_writer.rs +++ b/datafusion/common/src/file_options/parquet_writer.rs @@ -27,7 +27,6 @@ use crate::{ use arrow::datatypes::Schema; use parquet::arrow::encode_arrow_schema; // TODO: handle once deprecated -#[expect(deprecated)] use parquet::{ arrow::ARROW_SCHEMA_META_KEY, basic::{BrotliLevel, GzipLevel, ZstdLevel}, @@ -176,7 +175,6 @@ impl ParquetOptions { /// /// Note that this method does not include the key_value_metadata from [`TableParquetOptions`]. pub fn into_writer_properties_builder(&self) -> Result { - #[expect(deprecated)] let ParquetOptions { data_pagesize_limit, write_batch_size, @@ -404,10 +402,9 @@ pub(crate) fn parse_statistics_string(str_setting: &str) -> Result ParquetColumnOptions { let bloom_filter_default_props = props.bloom_filter_properties(&col); - #[expect(deprecated)] // max_statistics_size ParquetColumnOptions { bloom_filter_enabled: Some(bloom_filter_default_props.is_some()), encoding: props.encoding(&col).map(|s| s.to_string()), @@ -547,7 +542,6 @@ mod tests { #[cfg(not(feature = "parquet_encryption"))] let fep = None; - #[expect(deprecated)] // max_statistics_size TableParquetOptions { global: ParquetOptions { // global options From 42e1cfccea0ce0aaed23ae3cfc9477948fd8e34a Mon Sep 17 00:00:00 2001 From: Jackie Yan Date: Sat, 29 Nov 2025 14:31:49 +0800 Subject: [PATCH 3/8] fix: resolve clippy allow_attributes CI errors --- datafusion/common/src/file_options/parquet_writer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion/common/src/file_options/parquet_writer.rs b/datafusion/common/src/file_options/parquet_writer.rs index 0b00af3d47de..4140b047ff7f 100644 --- a/datafusion/common/src/file_options/parquet_writer.rs +++ b/datafusion/common/src/file_options/parquet_writer.rs @@ -402,9 +402,9 @@ pub(crate) fn parse_statistics_string(str_setting: &str) -> Result Date: Sat, 29 Nov 2025 21:57:09 +0800 Subject: [PATCH 4/8] Apply suggestion from @Jefffrey Co-authored-by: Jeffrey Vo --- datafusion/common/src/file_options/parquet_writer.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/datafusion/common/src/file_options/parquet_writer.rs b/datafusion/common/src/file_options/parquet_writer.rs index 4140b047ff7f..131041c92070 100644 --- a/datafusion/common/src/file_options/parquet_writer.rs +++ b/datafusion/common/src/file_options/parquet_writer.rs @@ -26,7 +26,6 @@ use crate::{ use arrow::datatypes::Schema; use parquet::arrow::encode_arrow_schema; -// TODO: handle once deprecated use parquet::{ arrow::ARROW_SCHEMA_META_KEY, basic::{BrotliLevel, GzipLevel, ZstdLevel}, From 8728714b71f30a3ce1ee213014999c79e5090b89 Mon Sep 17 00:00:00 2001 From: Chakkk Date: Sat, 29 Nov 2025 21:58:56 +0800 Subject: [PATCH 5/8] Apply suggestion from @Jefffrey Co-authored-by: Jeffrey Vo --- datafusion/common/src/error.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/datafusion/common/src/error.rs b/datafusion/common/src/error.rs index d1b90d6f4e21..0ed903176a1c 100644 --- a/datafusion/common/src/error.rs +++ b/datafusion/common/src/error.rs @@ -937,7 +937,6 @@ macro_rules! make_error { // Note: Certain macros are used in this crate, but not all. // This macro generates a use or all of them in case they are needed - // so we allow unused code to avoid warnings when they are not used #[doc(hidden)] pub use $NAME_ERR as [<_ $NAME_ERR>]; #[doc(hidden)] From 3e92d012227140841257bcf58218f7951f02e771 Mon Sep 17 00:00:00 2001 From: Chakkk Date: Sat, 29 Nov 2025 21:59:10 +0800 Subject: [PATCH 6/8] Apply suggestion from @Jefffrey Co-authored-by: Jeffrey Vo --- datafusion/common/src/stats.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/datafusion/common/src/stats.rs b/datafusion/common/src/stats.rs index 29c7c003b2b8..cf0143ebf1d7 100644 --- a/datafusion/common/src/stats.rs +++ b/datafusion/common/src/stats.rs @@ -978,7 +978,6 @@ mod tests { // Precision is not copy (requires .clone()) let precision: Precision = Precision::Exact(ScalarValue::Int64(Some(42))); - // Clippy would complain about this if it were Copy let p2 = precision.clone(); assert_eq!(precision, p2); } From 6982ffd4950d9abd2b346552e9177ec4b9836194 Mon Sep 17 00:00:00 2001 From: Jackie Yan Date: Sat, 29 Nov 2025 22:00:18 +0800 Subject: [PATCH 7/8] fix: resolve useless useless_vec expect --- datafusion/common/src/scalar/mod.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/datafusion/common/src/scalar/mod.rs b/datafusion/common/src/scalar/mod.rs index bd2c420a7fee..529172854170 100644 --- a/datafusion/common/src/scalar/mod.rs +++ b/datafusion/common/src/scalar/mod.rs @@ -6330,8 +6330,6 @@ mod tests { } #[test] - // despite clippy claiming they are useless, the code doesn't compile otherwise. - #[expect(clippy::useless_vec)] fn scalar_iter_to_array_boolean() { check_scalar_iter!(Boolean, BooleanArray, vec![Some(true), None, Some(false)]); check_scalar_iter!(Float32, Float32Array, vec![Some(1.9), None, Some(-2.1)]); From 9ad4fe029405fb4565e88027f3256d155b12cb22 Mon Sep 17 00:00:00 2001 From: Jackie Yan Date: Sat, 29 Nov 2025 22:32:35 +0800 Subject: [PATCH 8/8] fix: remove unnecessary lint suppressions --- datafusion/common/src/error.rs | 2 -- datafusion/common/src/scalar/mod.rs | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/datafusion/common/src/error.rs b/datafusion/common/src/error.rs index 0ed903176a1c..19a36e450783 100644 --- a/datafusion/common/src/error.rs +++ b/datafusion/common/src/error.rs @@ -935,8 +935,6 @@ macro_rules! make_error { } - // Note: Certain macros are used in this crate, but not all. - // This macro generates a use or all of them in case they are needed #[doc(hidden)] pub use $NAME_ERR as [<_ $NAME_ERR>]; #[doc(hidden)] diff --git a/datafusion/common/src/scalar/mod.rs b/datafusion/common/src/scalar/mod.rs index 529172854170..1859f2e47bf6 100644 --- a/datafusion/common/src/scalar/mod.rs +++ b/datafusion/common/src/scalar/mod.rs @@ -6379,12 +6379,12 @@ mod tests { check_scalar_iter_binary!( Binary, BinaryArray, - vec![Some(b"foo"), None, Some(b"bar")] + [Some(b"foo"), None, Some(b"bar")] ); check_scalar_iter_binary!( LargeBinary, LargeBinaryArray, - vec![Some(b"foo"), None, Some(b"bar")] + [Some(b"foo"), None, Some(b"bar")] ); }