diff --git a/arrow-array/src/array/boolean_array.rs b/arrow-array/src/array/boolean_array.rs index 641983700334..7e5c1feb39e0 100644 --- a/arrow-array/src/array/boolean_array.rs +++ b/arrow-array/src/array/boolean_array.rs @@ -286,9 +286,8 @@ impl BooleanArray { } } -impl super::private::Sealed for BooleanArray {} - -impl Array for BooleanArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for BooleanArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/byte_array.rs b/arrow-array/src/array/byte_array.rs index 8e8ad91ceaeb..a54e9a5fc781 100644 --- a/arrow-array/src/array/byte_array.rs +++ b/arrow-array/src/array/byte_array.rs @@ -462,9 +462,8 @@ impl std::fmt::Debug for GenericByteArray { } } -impl super::private::Sealed for GenericByteArray {} - -impl Array for GenericByteArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for GenericByteArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/byte_view_array.rs b/arrow-array/src/array/byte_view_array.rs index c517129a1750..ea8b801a49de 100644 --- a/arrow-array/src/array/byte_view_array.rs +++ b/arrow-array/src/array/byte_view_array.rs @@ -885,9 +885,8 @@ impl Debug for GenericByteViewArray { } } -impl super::private::Sealed for GenericByteViewArray {} - -impl Array for GenericByteViewArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for GenericByteViewArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/dictionary_array.rs b/arrow-array/src/array/dictionary_array.rs index 190a5038a064..54f8c42dd84b 100644 --- a/arrow-array/src/array/dictionary_array.rs +++ b/arrow-array/src/array/dictionary_array.rs @@ -692,9 +692,8 @@ impl<'a, T: ArrowDictionaryKeyType> FromIterator<&'a str> for DictionaryArray } } -impl super::private::Sealed for DictionaryArray {} - -impl Array for DictionaryArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for DictionaryArray { fn as_any(&self) -> &dyn Any { self } @@ -853,9 +852,7 @@ impl<'a, K: ArrowDictionaryKeyType, V> TypedDictionaryArray<'a, K, V> { } } -impl super::private::Sealed for TypedDictionaryArray<'_, K, V> {} - -impl Array for TypedDictionaryArray<'_, K, V> { +unsafe impl Array for TypedDictionaryArray<'_, K, V> { fn as_any(&self) -> &dyn Any { self.dictionary } diff --git a/arrow-array/src/array/fixed_size_binary_array.rs b/arrow-array/src/array/fixed_size_binary_array.rs index b94e168cfe7c..18757fc6aceb 100644 --- a/arrow-array/src/array/fixed_size_binary_array.rs +++ b/arrow-array/src/array/fixed_size_binary_array.rs @@ -602,9 +602,8 @@ impl std::fmt::Debug for FixedSizeBinaryArray { } } -impl super::private::Sealed for FixedSizeBinaryArray {} - -impl Array for FixedSizeBinaryArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for FixedSizeBinaryArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/fixed_size_list_array.rs b/arrow-array/src/array/fixed_size_list_array.rs index f53b042f873b..5a25c4f0a259 100644 --- a/arrow-array/src/array/fixed_size_list_array.rs +++ b/arrow-array/src/array/fixed_size_list_array.rs @@ -462,9 +462,8 @@ impl From for ArrayData { } } -impl super::private::Sealed for FixedSizeListArray {} - -impl Array for FixedSizeListArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for FixedSizeListArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/list_array.rs b/arrow-array/src/array/list_array.rs index ae1b77895deb..53e1db1e155a 100644 --- a/arrow-array/src/array/list_array.rs +++ b/arrow-array/src/array/list_array.rs @@ -527,9 +527,8 @@ impl GenericListArray { } } -impl super::private::Sealed for GenericListArray {} - -impl Array for GenericListArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for GenericListArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/list_view_array.rs b/arrow-array/src/array/list_view_array.rs index 4c50a32de532..b8d427d829c8 100644 --- a/arrow-array/src/array/list_view_array.rs +++ b/arrow-array/src/array/list_view_array.rs @@ -415,9 +415,8 @@ impl ArrayAccessor for &GenericListViewArray super::private::Sealed for GenericListViewArray {} - -impl Array for GenericListViewArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for GenericListViewArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/map_array.rs b/arrow-array/src/array/map_array.rs index 02f9a35eb627..07758d59bb14 100644 --- a/arrow-array/src/array/map_array.rs +++ b/arrow-array/src/array/map_array.rs @@ -362,9 +362,8 @@ impl MapArray { } } -impl super::private::Sealed for MapArray {} - -impl Array for MapArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for MapArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/mod.rs b/arrow-array/src/array/mod.rs index c51917ad5813..abc4091fe3f4 100644 --- a/arrow-array/src/array/mod.rs +++ b/arrow-array/src/array/mod.rs @@ -78,18 +78,17 @@ pub use list_view_array::*; use crate::iterator::ArrayIter; -mod private { - /// Private marker trait to ensure [`super::Array`] can not be implemented outside this crate - pub trait Sealed {} - - impl Sealed for &T {} -} - /// An array in the [arrow columnar format](https://arrow.apache.org/docs/format/Columnar.html) /// -/// This trait is sealed as it is not intended for custom array types, rather only -/// those defined in this crate. -pub trait Array: std::fmt::Debug + Send + Sync + private::Sealed { +/// # Safety +/// +/// Implementations of this trait must ensure that all methods implementations comply with +/// the Arrow specification. No safety guards are placed and failing to comply with it can +/// translate into panics or undefined behavior. For example, a value computed based on `len` +/// may be used as a direct index into memory regions without checks. +/// +/// Use it at your own risk knowing that this trait might be sealed in the future. +pub unsafe trait Array: std::fmt::Debug + Send + Sync { /// Returns the array as [`Any`] so that it can be /// downcasted to a specific implementation. /// @@ -351,10 +350,8 @@ pub trait Array: std::fmt::Debug + Send + Sync + private::Sealed { /// A reference-counted reference to a generic `Array` pub type ArrayRef = Arc; -impl private::Sealed for ArrayRef {} - /// Ergonomics: Allow use of an ArrayRef as an `&dyn Array` -impl Array for ArrayRef { +unsafe impl Array for ArrayRef { fn as_any(&self) -> &dyn Any { self.as_ref().as_any() } @@ -433,7 +430,7 @@ impl Array for ArrayRef { } } -impl Array for &T { +unsafe impl Array for &T { fn as_any(&self) -> &dyn Any { T::as_any(self) } diff --git a/arrow-array/src/array/null_array.rs b/arrow-array/src/array/null_array.rs index 18c155b78bf4..00b30935d425 100644 --- a/arrow-array/src/array/null_array.rs +++ b/arrow-array/src/array/null_array.rs @@ -76,9 +76,8 @@ impl NullArray { } } -impl super::private::Sealed for NullArray {} - -impl Array for NullArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for NullArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/primitive_array.rs b/arrow-array/src/array/primitive_array.rs index d49db8a7b2f6..573677dc60c8 100644 --- a/arrow-array/src/array/primitive_array.rs +++ b/arrow-array/src/array/primitive_array.rs @@ -1186,9 +1186,8 @@ impl From> for ArrayData { } } -impl super::private::Sealed for PrimitiveArray {} - -impl Array for PrimitiveArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for PrimitiveArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/run_array.rs b/arrow-array/src/array/run_array.rs index 9ca1af943d27..bdab01d7a24b 100644 --- a/arrow-array/src/array/run_array.rs +++ b/arrow-array/src/array/run_array.rs @@ -270,9 +270,8 @@ impl From> for ArrayData { } } -impl super::private::Sealed for RunArray {} - -impl Array for RunArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for RunArray { fn as_any(&self) -> &dyn Any { self } @@ -531,9 +530,8 @@ impl<'a, R: RunEndIndexType, V> TypedRunArray<'a, R, V> { } } -impl super::private::Sealed for TypedRunArray<'_, R, V> {} - -impl Array for TypedRunArray<'_, R, V> { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for TypedRunArray<'_, R, V> { fn as_any(&self) -> &dyn Any { self.run_array } diff --git a/arrow-array/src/array/struct_array.rs b/arrow-array/src/array/struct_array.rs index a738a733218a..b5f25fff181c 100644 --- a/arrow-array/src/array/struct_array.rs +++ b/arrow-array/src/array/struct_array.rs @@ -402,9 +402,8 @@ impl TryFrom> for StructArray { } } -impl super::private::Sealed for StructArray {} - -impl Array for StructArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for StructArray { fn as_any(&self) -> &dyn Any { self } diff --git a/arrow-array/src/array/union_array.rs b/arrow-array/src/array/union_array.rs index 7bb9162b57f2..03d69a584524 100644 --- a/arrow-array/src/array/union_array.rs +++ b/arrow-array/src/array/union_array.rs @@ -742,9 +742,8 @@ impl From for ArrayData { } } -impl super::private::Sealed for UnionArray {} - -impl Array for UnionArray { +/// SAFETY: Correctly implements the contract of Arrow Arrays +unsafe impl Array for UnionArray { fn as_any(&self) -> &dyn Any { self }