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

scovich pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new 53a16144b1 Remove unnecessary Arc<ArrayRef> (#9316)
53a16144b1 is described below

commit 53a16144b1a5cfde183c270284ea3b3cf5176521
Author: Ryan Johnson <[email protected]>
AuthorDate: Mon Feb 2 21:24:51 2026 -0700

    Remove unnecessary Arc<ArrayRef> (#9316)
    
    # Which issue does this PR close?
    
    - Related to https://github.com/apache/arrow-rs/issues/8794
    
    # Rationale for this change
    
    Because `Arc<dyn Array>` (ArrayRef) implements `Array`, it's easy to
    create redundant `Arc<Arc<dyn Array>>`. The extra indirection is pure
    overhead (both cognitive and runtime) with no benefit.
    
    # What changes are included in this PR?
    
    Remove the redundant wrapping.
    
    # Are these changes tested?
    
    Compilation suffices -- failing to wrap a concrete array type in Arc
    would cause compilation failures.
    
    # Are there any user-facing changes?
    
    No.
---
 arrow-arith/src/temporal.rs                        |  1 -
 arrow-cast/src/cast/mod.rs                         |  8 ++---
 arrow-cast/src/cast/run_array.rs                   |  2 +-
 arrow-ipc/src/reader.rs                            |  4 +--
 arrow-ord/src/sort.rs                              | 42 +++++++++++-----------
 arrow-select/src/concat.rs                         |  4 +--
 arrow-select/src/interleave.rs                     |  2 +-
 arrow/tests/array_cast.rs                          |  4 +--
 parquet-variant-compute/src/variant_get.rs         |  2 +-
 parquet-variant-compute/src/variant_to_arrow.rs    |  5 ++-
 .../arrow/array_reader/byte_array_dictionary.rs    |  3 +-
 parquet/tests/arrow_reader/statistics.rs           |  4 +--
 12 files changed, 39 insertions(+), 42 deletions(-)

diff --git a/arrow-arith/src/temporal.rs b/arrow-arith/src/temporal.rs
index faff59bc30..771d0f97b7 100644
--- a/arrow-arith/src/temporal.rs
+++ b/arrow-arith/src/temporal.rs
@@ -189,7 +189,6 @@ pub fn date_part(array: &dyn Array, part: DatePart) -> 
Result<ArrayRef, ArrowErr
         DataType::Dictionary(_, _) => {
             let array = array.as_any_dictionary();
             let values = date_part(array.values(), part)?;
-            let values = Arc::new(values) as ArrayRef;
             let new_array = array.with_values(values);
             Ok(new_array)
         }
diff --git a/arrow-cast/src/cast/mod.rs b/arrow-cast/src/cast/mod.rs
index ff99e1d6a5..67efb57424 100644
--- a/arrow-cast/src/cast/mod.rs
+++ b/arrow-cast/src/cast/mod.rs
@@ -8963,8 +8963,6 @@ mod tests {
         ];
 
         for (array, expected) in cases {
-            let array = Arc::new(array) as ArrayRef;
-
             assert!(
                 can_cast_types(array.data_type(), expected.data_type()),
                 "can_cast_types claims we cannot cast {:?} to {:?}",
@@ -13288,8 +13286,7 @@ mod tests {
         for values in values_arrays {
             let keys =
                 Int8Array::from_iter([Some(1), Some(0), None, Some(3), None, 
Some(1), Some(4)]);
-            let string_dict_array =
-                DictionaryArray::<Int8Type>::try_new(keys, 
Arc::new(values)).unwrap();
+            let string_dict_array = DictionaryArray::<Int8Type>::try_new(keys, 
values).unwrap();
 
             let casted = cast(&string_dict_array, 
&DataType::BinaryView).unwrap();
             assert_eq!(casted.as_ref(), &expected);
@@ -13316,8 +13313,7 @@ mod tests {
         for values in values_arrays {
             let keys =
                 Int8Array::from_iter([Some(1), Some(0), None, Some(3), None, 
Some(1), Some(4)]);
-            let string_dict_array =
-                DictionaryArray::<Int8Type>::try_new(keys, 
Arc::new(values)).unwrap();
+            let string_dict_array = DictionaryArray::<Int8Type>::try_new(keys, 
values).unwrap();
 
             let casted = cast(&string_dict_array, 
&DataType::Utf8View).unwrap();
             assert_eq!(casted.as_ref(), &expected);
diff --git a/arrow-cast/src/cast/run_array.rs b/arrow-cast/src/cast/run_array.rs
index 9878f09772..dfa97296e8 100644
--- a/arrow-cast/src/cast/run_array.rs
+++ b/arrow-cast/src/cast/run_array.rs
@@ -68,7 +68,7 @@ pub(crate) fn run_end_encoded_cast<K: RunEndIndexType>(
                             ));
                         }
                     };
-                    Ok(Arc::new(new_run_array))
+                    Ok(new_run_array)
                 }
 
                 // Expand to logical form
diff --git a/arrow-ipc/src/reader.rs b/arrow-ipc/src/reader.rs
index 4279090dbe..d5cda3e4e5 100644
--- a/arrow-ipc/src/reader.rs
+++ b/arrow-ipc/src/reader.rs
@@ -1954,7 +1954,7 @@ mod tests {
             .len(3)
             .build()
             .unwrap();
-        let array9: ArrayRef = Arc::new(StructArray::from(array9));
+        let array9 = StructArray::from(array9);
 
         let array10_input = vec![Some(1_i32), None, None];
         let mut array10_builder = PrimitiveRunBuilder::<Int16Type, 
Int32Type>::new();
@@ -2995,7 +2995,7 @@ mod tests {
             )
         };
         expect_ipc_validation_error(
-            Arc::new(invalid_struct_arr),
+            invalid_struct_arr,
             "Invalid argument error: Invalid UTF8 sequence at string index 3 
(3..18): invalid utf-8 sequence of 1 bytes from index 11",
         );
     }
diff --git a/arrow-ord/src/sort.rs b/arrow-ord/src/sort.rs
index 39d56f8fe9..f7f553abb6 100644
--- a/arrow-ord/src/sort.rs
+++ b/arrow-ord/src/sort.rs
@@ -1107,7 +1107,7 @@ mod tests {
     ) {
         let output = create_decimal_array::<T>(data, precision, scale);
         let expected = UInt32Array::from(expected_data);
-        let output = sort_to_indices(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap();
+        let output = sort_to_indices(&output, options, limit).unwrap();
         assert_eq!(output, expected)
     }
 
@@ -1119,7 +1119,7 @@ mod tests {
     ) {
         let output = create_decimal256_array(data);
         let expected = UInt32Array::from(expected_data);
-        let output = sort_to_indices(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap();
+        let output = sort_to_indices(&output, options, limit).unwrap();
         assert_eq!(output, expected)
     }
 
@@ -1134,8 +1134,8 @@ mod tests {
         let output = create_decimal_array::<T>(data, p, s);
         let expected = Arc::new(create_decimal_array::<T>(expected_data, p, 
s)) as ArrayRef;
         let output = match limit {
-            Some(_) => sort_limit(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap(),
-            _ => sort(&(Arc::new(output) as ArrayRef), options).unwrap(),
+            Some(_) => sort_limit(&output, options, limit).unwrap(),
+            _ => sort(&output, options).unwrap(),
         };
         assert_eq!(&output, &expected)
     }
@@ -1149,8 +1149,8 @@ mod tests {
         let output = create_decimal256_array(data);
         let expected = Arc::new(create_decimal256_array(expected_data)) as 
ArrayRef;
         let output = match limit {
-            Some(_) => sort_limit(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap(),
-            _ => sort(&(Arc::new(output) as ArrayRef), options).unwrap(),
+            Some(_) => sort_limit(&output, options, limit).unwrap(),
+            _ => sort(&output, options).unwrap(),
         };
         assert_eq!(&output, &expected)
     }
@@ -1163,7 +1163,7 @@ mod tests {
     ) {
         let output = BooleanArray::from(data);
         let expected = UInt32Array::from(expected_data);
-        let output = sort_to_indices(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap();
+        let output = sort_to_indices(&output, options, limit).unwrap();
         assert_eq!(output, expected)
     }
 
@@ -1178,7 +1178,7 @@ mod tests {
     {
         let output = PrimitiveArray::<T>::from(data);
         let expected = UInt32Array::from(expected_data);
-        let output = sort_to_indices(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap();
+        let output = sort_to_indices(&output, options, limit).unwrap();
         assert_eq!(output, expected)
     }
 
@@ -1194,8 +1194,8 @@ mod tests {
         let output = PrimitiveArray::<T>::from(data);
         let expected = Arc::new(PrimitiveArray::<T>::from(expected_data)) as 
ArrayRef;
         let output = match limit {
-            Some(_) => sort_limit(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap(),
-            _ => sort(&(Arc::new(output) as ArrayRef), options).unwrap(),
+            Some(_) => sort_limit(&output, options, limit).unwrap(),
+            _ => sort(&output, options).unwrap(),
         };
         assert_eq!(&output, &expected)
     }
@@ -1208,7 +1208,7 @@ mod tests {
     ) {
         let output = StringArray::from(data);
         let expected = UInt32Array::from(expected_data);
-        let output = sort_to_indices(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap();
+        let output = sort_to_indices(&output, options, limit).unwrap();
         assert_eq!(output, expected)
     }
 
@@ -1222,24 +1222,24 @@ mod tests {
         let output = StringArray::from(data.clone());
         let expected = Arc::new(StringArray::from(expected_data.clone())) as 
ArrayRef;
         let output = match limit {
-            Some(_) => sort_limit(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap(),
-            _ => sort(&(Arc::new(output) as ArrayRef), options).unwrap(),
+            Some(_) => sort_limit(&output, options, limit).unwrap(),
+            _ => sort(&output, options).unwrap(),
         };
         assert_eq!(&output, &expected);
 
         let output = LargeStringArray::from(data.clone());
         let expected = Arc::new(LargeStringArray::from(expected_data.clone())) 
as ArrayRef;
         let output = match limit {
-            Some(_) => sort_limit(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap(),
-            _ => sort(&(Arc::new(output) as ArrayRef), options).unwrap(),
+            Some(_) => sort_limit(&output, options, limit).unwrap(),
+            _ => sort(&output, options).unwrap(),
         };
         assert_eq!(&output, &expected);
 
         let output = StringViewArray::from(data);
         let expected = Arc::new(StringViewArray::from(expected_data)) as 
ArrayRef;
         let output = match limit {
-            Some(_) => sort_limit(&(Arc::new(output) as ArrayRef), options, 
limit).unwrap(),
-            _ => sort(&(Arc::new(output) as ArrayRef), options).unwrap(),
+            Some(_) => sort_limit(&output, options, limit).unwrap(),
+            _ => sort(&output, options).unwrap(),
         };
         assert_eq!(&output, &expected);
     }
@@ -1258,8 +1258,8 @@ mod tests {
             .expect("Unable to get dictionary values");
 
         let sorted = match limit {
-            Some(_) => sort_limit(&(Arc::new(array) as ArrayRef), options, 
limit).unwrap(),
-            _ => sort(&(Arc::new(array) as ArrayRef), options).unwrap(),
+            Some(_) => sort_limit(&array, options, limit).unwrap(),
+            _ => sort(&array, options).unwrap(),
         };
         let sorted = sorted
             .as_any()
@@ -1300,8 +1300,8 @@ mod tests {
         let dict = array_values.as_primitive::<T>();
 
         let sorted = match limit {
-            Some(_) => sort_limit(&(Arc::new(array) as ArrayRef), options, 
limit).unwrap(),
-            _ => sort(&(Arc::new(array) as ArrayRef), options).unwrap(),
+            Some(_) => sort_limit(&array, options, limit).unwrap(),
+            _ => sort(&array, options).unwrap(),
         };
         let sorted = sorted
             .as_any()
diff --git a/arrow-select/src/concat.rs b/arrow-select/src/concat.rs
index a6e3083a6e..19eeeacbfb 100644
--- a/arrow-select/src/concat.rs
+++ b/arrow-select/src/concat.rs
@@ -404,13 +404,13 @@ where
 
 macro_rules! dict_helper {
     ($t:ty, $arrays:expr) => {
-        return Ok(Arc::new(concat_dictionaries::<$t>($arrays)?) as _)
+        return concat_dictionaries::<$t>($arrays)
     };
 }
 
 macro_rules! primitive_concat {
     ($t:ty, $arrays:expr) => {
-        return Ok(Arc::new(concat_primitives::<$t>($arrays)?) as _)
+        return concat_primitives::<$t>($arrays)
     };
 }
 
diff --git a/arrow-select/src/interleave.rs b/arrow-select/src/interleave.rs
index d4303e8d85..6598a5eb0d 100644
--- a/arrow-select/src/interleave.rs
+++ b/arrow-select/src/interleave.rs
@@ -37,7 +37,7 @@ macro_rules! primitive_helper {
 
 macro_rules! dict_helper {
     ($t:ty, $values:expr, $indices:expr) => {
-        Ok(Arc::new(interleave_dictionaries::<$t>($values, $indices)?) as _)
+        interleave_dictionaries::<$t>($values, $indices)
     };
 }
 
diff --git a/arrow/tests/array_cast.rs b/arrow/tests/array_cast.rs
index 0e3b9c597b..b5a8c43cc4 100644
--- a/arrow/tests/array_cast.rs
+++ b/arrow/tests/array_cast.rs
@@ -592,7 +592,7 @@ fn get_all_types() -> Vec<DataType> {
 fn test_timestamp_cast_utf8() {
     let array: PrimitiveArray<TimestampMicrosecondType> =
         vec![Some(37800000000), None, Some(86339000000)].into();
-    let out = cast(&(Arc::new(array) as ArrayRef), &DataType::Utf8).unwrap();
+    let out = cast(&array, &DataType::Utf8).unwrap();
 
     let expected = StringArray::from(vec![
         Some("1970-01-01T10:30:00"),
@@ -608,7 +608,7 @@ fn test_timestamp_cast_utf8() {
     let array: PrimitiveArray<TimestampMicrosecondType> =
         vec![Some(37800000000), None, Some(86339000000)].into();
     let array = array.with_timezone("Australia/Sydney".to_string());
-    let out = cast(&(Arc::new(array) as ArrayRef), &DataType::Utf8).unwrap();
+    let out = cast(&array, &DataType::Utf8).unwrap();
 
     let expected = StringArray::from(vec![
         Some("1970-01-01T20:30:00+10:00"),
diff --git a/parquet-variant-compute/src/variant_get.rs 
b/parquet-variant-compute/src/variant_get.rs
index 16e8738e70..35cd5b4e40 100644
--- a/parquet-variant-compute/src/variant_get.rs
+++ b/parquet-variant-compute/src/variant_get.rs
@@ -180,7 +180,7 @@ fn shredded_get_path(
             ShreddedPathStep::Missing => {
                 let num_rows = input.len();
                 let arr = match as_field.map(|f| f.data_type()) {
-                    Some(data_type) => 
Arc::new(array::new_null_array(data_type, num_rows)) as _,
+                    Some(data_type) => array::new_null_array(data_type, 
num_rows),
                     None => Arc::new(array::NullArray::new(num_rows)) as _,
                 };
                 return Ok(arr);
diff --git a/parquet-variant-compute/src/variant_to_arrow.rs 
b/parquet-variant-compute/src/variant_to_arrow.rs
index 17a750eed2..106e8915be 100644
--- a/parquet-variant-compute/src/variant_to_arrow.rs
+++ b/parquet-variant-compute/src/variant_to_arrow.rs
@@ -636,7 +636,10 @@ macro_rules! define_variant_to_primitive_builder {
             // This is mainly for `FakeNullBuilder`
             #[allow(unused_mut)]
             fn finish(mut self) -> Result<ArrayRef> {
-                Ok(Arc::new(self.builder.finish()))
+                // If the builder produces T: Array, the compiler infers 
`<Arc<T> as From<T>>::from`
+                // (which then coerces to ArrayRef). If the builder produces 
ArrayRef directly, the
+                // compiler infers `<ArrayRef as From<ArrayRef>>::from` 
(no-op, From blanket impl).
+                Ok(Arc::from(self.builder.finish()))
             }
         }
     }
diff --git a/parquet/src/arrow/array_reader/byte_array_dictionary.rs 
b/parquet/src/arrow/array_reader/byte_array_dictionary.rs
index 09de37a80e..f7b93264b7 100644
--- a/parquet/src/arrow/array_reader/byte_array_dictionary.rs
+++ b/parquet/src/arrow/array_reader/byte_array_dictionary.rs
@@ -17,7 +17,6 @@
 
 use std::any::Any;
 use std::marker::PhantomData;
-use std::sync::Arc;
 
 use arrow_array::{Array, ArrayRef, OffsetSizeTrait, new_empty_array};
 use arrow_buffer::ArrowNativeType;
@@ -278,7 +277,7 @@ where
         decoder.read(&mut buffer, usize::MAX)?;
 
         let array = buffer.into_array(None, self.value_type.clone());
-        self.dict = Some(Arc::new(array));
+        self.dict = Some(array);
         Ok(())
     }
 
diff --git a/parquet/tests/arrow_reader/statistics.rs 
b/parquet/tests/arrow_reader/statistics.rs
index 07a9bcc578..2f7859d063 100644
--- a/parquet/tests/arrow_reader/statistics.rs
+++ b/parquet/tests/arrow_reader/statistics.rs
@@ -2357,8 +2357,8 @@ async fn test_struct() {
     .await;
     Test {
         reader: &reader,
-        expected_min: Arc::new(struct_array(vec![(Some(1), Some(6.0), 
Some(12.0))])),
-        expected_max: Arc::new(struct_array(vec![(Some(2), Some(8.5), 
Some(14.0))])),
+        expected_min: struct_array(vec![(Some(1), Some(6.0), Some(12.0))]),
+        expected_max: struct_array(vec![(Some(2), Some(8.5), Some(14.0))]),
         expected_null_counts: UInt64Array::from(vec![0]),
         expected_row_counts: Some(UInt64Array::from(vec![3])),
         expected_max_value_exact: BooleanArray::from(vec![true, true, true]),

Reply via email to