diff --git a/arrow-array/src/array/boolean_array.rs b/arrow-array/src/array/boolean_array.rs index 31dde3a3dda..2c0718afb94 100644 --- a/arrow-array/src/array/boolean_array.rs +++ b/arrow-array/src/array/boolean_array.rs @@ -63,6 +63,7 @@ use std::any::Any; /// assert!(arr.is_valid(3)); /// assert_eq!(true, arr.value(3)); /// ``` +#[derive(Clone)] pub struct BooleanArray { data: ArrayData, /// Pointer to the value array. The lifetime of this must be <= to the value buffer diff --git a/arrow-array/src/array/byte_array.rs b/arrow-array/src/array/byte_array.rs index 8c2616624c0..f846499eefb 100644 --- a/arrow-array/src/array/byte_array.rs +++ b/arrow-array/src/array/byte_array.rs @@ -42,6 +42,16 @@ pub struct GenericByteArray { value_data: RawPtrBox, } +impl Clone for GenericByteArray { + fn clone(&self) -> Self { + Self { + data: self.data.clone(), + value_offsets: self.value_offsets, + value_data: self.value_data, + } + } +} + impl GenericByteArray { /// Data type of the array. pub const DATA_TYPE: DataType = T::DATA_TYPE; diff --git a/arrow-array/src/array/dictionary_array.rs b/arrow-array/src/array/dictionary_array.rs index 002ee6f4782..6cff5bfdc9f 100644 --- a/arrow-array/src/array/dictionary_array.rs +++ b/arrow-array/src/array/dictionary_array.rs @@ -222,6 +222,17 @@ pub struct DictionaryArray { is_ordered: bool, } +impl Clone for DictionaryArray { + fn clone(&self) -> Self { + Self { + data: self.data.clone(), + keys: self.keys.clone(), + values: self.values.clone(), + is_ordered: self.is_ordered, + } + } +} + impl DictionaryArray { /// Attempt to create a new DictionaryArray with a specified keys /// (indexes into the dictionary) and values (dictionary) diff --git a/arrow-array/src/array/fixed_size_binary_array.rs b/arrow-array/src/array/fixed_size_binary_array.rs index 245cf522810..0d63fdded13 100644 --- a/arrow-array/src/array/fixed_size_binary_array.rs +++ b/arrow-array/src/array/fixed_size_binary_array.rs @@ -47,6 +47,7 @@ use std::any::Any; /// /// ``` /// +#[derive(Clone)] pub struct FixedSizeBinaryArray { data: ArrayData, value_data: RawPtrBox, diff --git a/arrow-array/src/array/fixed_size_list_array.rs b/arrow-array/src/array/fixed_size_list_array.rs index ca1dee35c41..e9ceb556c64 100644 --- a/arrow-array/src/array/fixed_size_list_array.rs +++ b/arrow-array/src/array/fixed_size_list_array.rs @@ -60,6 +60,7 @@ use std::any::Any; /// /// For non generic lists, you may wish to consider using /// [crate::array::FixedSizeBinaryArray] +#[derive(Clone)] pub struct FixedSizeListArray { data: ArrayData, values: ArrayRef, diff --git a/arrow-array/src/array/list_array.rs b/arrow-array/src/array/list_array.rs index 54699749f2f..3634d20549b 100644 --- a/arrow-array/src/array/list_array.rs +++ b/arrow-array/src/array/list_array.rs @@ -66,6 +66,16 @@ pub struct GenericListArray { value_offsets: RawPtrBox, } +impl Clone for GenericListArray { + fn clone(&self) -> Self { + Self { + data: self.data.clone(), + values: self.values.clone(), + value_offsets: self.value_offsets, + } + } +} + impl GenericListArray { /// The data type constructor of list array. /// The input is the schema of the child array and diff --git a/arrow-array/src/array/map_array.rs b/arrow-array/src/array/map_array.rs index 0f3ae2e689a..c3e6cf82248 100644 --- a/arrow-array/src/array/map_array.rs +++ b/arrow-array/src/array/map_array.rs @@ -28,6 +28,7 @@ use std::sync::Arc; /// /// [MapArray] is physically a [crate::array::ListArray] that has a /// [crate::array::StructArray] with 2 child fields. +#[derive(Clone)] pub struct MapArray { data: ArrayData, values: ArrayRef, diff --git a/arrow-array/src/array/null_array.rs b/arrow-array/src/array/null_array.rs index d796324f663..a5ba953c220 100644 --- a/arrow-array/src/array/null_array.rs +++ b/arrow-array/src/array/null_array.rs @@ -36,6 +36,7 @@ use std::any::Any; /// assert_eq!(array.len(), 10); /// assert_eq!(array.null_count(), 10); /// ``` +#[derive(Clone)] pub struct NullArray { data: ArrayData, } diff --git a/arrow-array/src/array/primitive_array.rs b/arrow-array/src/array/primitive_array.rs index bd68b9698ce..90d000c51ff 100644 --- a/arrow-array/src/array/primitive_array.rs +++ b/arrow-array/src/array/primitive_array.rs @@ -230,6 +230,15 @@ pub struct PrimitiveArray { raw_values: RawPtrBox, } +impl Clone for PrimitiveArray { + fn clone(&self) -> Self { + Self { + data: self.data.clone(), + raw_values: self.raw_values, + } + } +} + impl PrimitiveArray { /// Returns the length of this array. #[inline] diff --git a/arrow-array/src/array/struct_array.rs b/arrow-array/src/array/struct_array.rs index 841d3235f64..fcbda600f68 100644 --- a/arrow-array/src/array/struct_array.rs +++ b/arrow-array/src/array/struct_array.rs @@ -50,6 +50,7 @@ use std::any::Any; /// assert_eq!(0, struct_array.null_count()); /// assert_eq!(0, struct_array.offset()); /// ``` +#[derive(Clone)] pub struct StructArray { data: ArrayData, pub(crate) boxed_fields: Vec, diff --git a/arrow-array/src/array/union_array.rs b/arrow-array/src/array/union_array.rs index c8ccfdc073f..092f538bf45 100644 --- a/arrow-array/src/array/union_array.rs +++ b/arrow-array/src/array/union_array.rs @@ -104,6 +104,7 @@ use std::any::Any; /// let value = array.value(2).as_any().downcast_ref::().unwrap().value(0); /// assert_eq!(34, value); /// ``` +#[derive(Clone)] pub struct UnionArray { data: ArrayData, boxed_fields: Vec, diff --git a/arrow-array/src/raw_pointer.rs b/arrow-array/src/raw_pointer.rs index 3e4233ea1b2..0fea8c186d4 100644 --- a/arrow-array/src/raw_pointer.rs +++ b/arrow-array/src/raw_pointer.rs @@ -25,6 +25,14 @@ pub(super) struct RawPtrBox { ptr: NonNull, } +impl Clone for RawPtrBox { + fn clone(&self) -> Self { + Self { ptr: self.ptr } + } +} + +impl Copy for RawPtrBox {} + impl RawPtrBox { /// # Safety /// The user must guarantee that: