#429 fix alignment for compressed data (#430)
Closes #429. Related to #345.
diff --git a/src/table.jl b/src/table.jl
index db5184f..5f4678d 100644
--- a/src/table.jl
+++ b/src/table.jl
@@ -534,27 +534,27 @@
function reinterp(::Type{T}, batch, buf, compression) where {T}
ptr = pointer(batch.bytes, batch.pos + buf.offset)
- if compression === nothing
- # it would be technically more correct to check that T.layout->alignment > 8
- # but the datatype alignment isn't officially exported, so we're using
- # primitive types w/ sizeof(T) >= 16 as a proxy for types that need 16-byte alignment
- if sizeof(T) >= 16 && (UInt(ptr) & 15) != 0
- # https://github.com/apache/arrow-julia/issues/345
- # https://github.com/JuliaLang/julia/issues/42326
- # need to ensure that the data/pointers are aligned to 16 bytes
- # so we can't use unsafe_wrap here, but do an extra allocation
- # to avoid the allocation, user needs to ensure input buffer is
- # 16-byte aligned (somehow, it's not super straightforward how to ensure that)
- A = Vector{T}(undef, div(buf.length, sizeof(T)))
- unsafe_copyto!(Ptr{UInt8}(pointer(A)), ptr, buf.length)
- return batch.bytes, A
- else
- return batch.bytes, unsafe_wrap(Array, convert(Ptr{T}, ptr), div(buf.length, sizeof(T)))
- end
+ bytes = batch.bytes
+ len = buf.length
+ if compression !== nothing
+ len, bytes = uncompress(ptr, buf, compression)
+ ptr = pointer(bytes)
+ end
+ # it would be technically more correct to check that T.layout->alignment > 8
+ # but the datatype alignment isn't officially exported, so we're using
+ # primitive types w/ sizeof(T) >= 16 as a proxy for types that need 16-byte alignment
+ if sizeof(T) >= 16 && (UInt(ptr) & 15) != 0
+ # https://github.com/apache/arrow-julia/issues/345
+ # https://github.com/JuliaLang/julia/issues/42326
+ # need to ensure that the data/pointers are aligned to 16 bytes
+ # so we can't use unsafe_wrap here, but do an extra allocation
+ # to avoid the allocation, user needs to ensure input buffer is
+ # 16-byte aligned (somehow, it's not super straightforward how to ensure that)
+ A = Vector{T}(undef, div(len, sizeof(T)))
+ unsafe_copyto!(Ptr{UInt8}(pointer(A)), ptr, len)
+ return bytes, A
else
- # compressed
- len, decodedbytes = uncompress(ptr, buf, compression)
- return decodedbytes, unsafe_wrap(Array, convert(Ptr{T}, pointer(decodedbytes)), div(len, sizeof(T)))
+ return bytes, unsafe_wrap(Array, convert(Ptr{T}, ptr), div(len, sizeof(T)))
end
end