diff --git a/crates/polars-io/src/mmap.rs b/crates/polars-io/src/mmap.rs index 4d20492c9ba7..95c997fc6ac7 100644 --- a/crates/polars-io/src/mmap.rs +++ b/crates/polars-io/src/mmap.rs @@ -82,12 +82,14 @@ impl std::ops::Deref for ReaderBytes<'_> { } } -/// Require 'static to force the caller to do any transmute as it's usually much -/// clearer to see there whether it's sound. +/// There are some places that perform manual lifetime management after transmuting `ReaderBytes` +/// to have a `'static` inner lifetime. The advantage to doing this is that it lets you construct a +/// `MemSlice` from the `ReaderBytes` in a zero-copy manner regardless of the underlying enum +/// variant. impl ReaderBytes<'static> { - pub fn to_static_slice(&self) -> MemSlice { - // This function isn't marked as unsafe, since you can only call it after transmuting - // `ReaderBytes` to have a `'static` inner lifetime. + /// # Safety + /// `Self` outlives the returned `MemSlice` if this enum variant is an `Owned(Vec<u8>)`. + pub unsafe fn to_static_slice(&self) -> MemSlice { match self { ReaderBytes::Borrowed(v) => MemSlice::from_static(v), ReaderBytes::Owned(v) => MemSlice::from_static(unsafe { @@ -98,14 +100,6 @@ impl ReaderBytes<'static> { }, } } - - pub fn into_mem_slice(self) -> MemSlice { - match self { - ReaderBytes::Borrowed(v) => MemSlice::from_static(v), - ReaderBytes::Owned(v) => MemSlice::from_vec(v), - ReaderBytes::Mapped(v, _) => MemSlice::from_mmap(Arc::new(v)), - } - } } impl<'a, T: 'a + MmapBytesReader> From<&'a mut T> for ReaderBytes<'a> { diff --git a/crates/polars-io/src/parquet/read/read_impl.rs b/crates/polars-io/src/parquet/read/read_impl.rs index a9c17ea2d200..88a6a8c52c9e 100644 --- a/crates/polars-io/src/parquet/read/read_impl.rs +++ b/crates/polars-io/src/parquet/read/read_impl.rs @@ -908,10 +908,9 @@ pub fn read_parquet<R: MmapBytesReader>( } let reader = ReaderBytes::from(&mut reader); - let store = mmap::ColumnStore::Local( - unsafe { std::mem::transmute::<ReaderBytes<'_>, ReaderBytes<'static>>(reader) } - .into_mem_slice(), - ); + let store = mmap::ColumnStore::Local(unsafe { + std::mem::transmute::<ReaderBytes<'_>, ReaderBytes<'static>>(reader).to_static_slice() + }); let dfs = rg_to_dfs( &store, @@ -959,7 +958,9 @@ impl FetchRowGroupsFromMmapReader { fn fetch_row_groups(&mut self, _row_groups: Range<usize>) -> PolarsResult<ColumnStore> { // @TODO: we can something smarter here with mmap - Ok(mmap::ColumnStore::Local(self.0.to_static_slice())) + Ok(mmap::ColumnStore::Local(unsafe { + self.0.to_static_slice() + })) } }