From 45013c83d61e9703bceb3aa432de35b36c0a3c60 Mon Sep 17 00:00:00 2001 From: Robert Kruszewski Date: Fri, 20 Mar 2026 15:53:57 -0400 Subject: [PATCH 1/3] Ensure that serialized arrays have 0 offset Signed-off-by: Robert Kruszewski --- encodings/fastlanes/src/bitpacking/vtable/mod.rs | 12 ++++++++++++ encodings/fastlanes/src/delta/vtable/mod.rs | 5 +++++ encodings/fastlanes/src/rle/vtable/mod.rs | 5 +++++ encodings/runend/src/array.rs | 5 +++++ vortex-array/src/arrays/bool/vtable/mod.rs | 6 +++++- 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/encodings/fastlanes/src/bitpacking/vtable/mod.rs b/encodings/fastlanes/src/bitpacking/vtable/mod.rs index c414dfa5cc0..99edcdd93f3 100644 --- a/encodings/fastlanes/src/bitpacking/vtable/mod.rs +++ b/encodings/fastlanes/src/bitpacking/vtable/mod.rs @@ -247,6 +247,18 @@ impl VTable for BitPacked { } fn serialize(metadata: Self::Metadata) -> VortexResult>> { + vortex_ensure!( + metadata.offset == 0, + "BitPackedArray offset must be 0 for serialization, got {}", + metadata.offset + ); + if let Some(ref patches) = metadata.patches { + vortex_ensure!( + patches.offset()? == 0, + "BitPackedArray patches offset must be 0 for serialization, got {}", + patches.offset()? + ); + } Ok(Some(metadata.serialize())) } diff --git a/encodings/fastlanes/src/delta/vtable/mod.rs b/encodings/fastlanes/src/delta/vtable/mod.rs index 790dedc6873..05bf04d8dcc 100644 --- a/encodings/fastlanes/src/delta/vtable/mod.rs +++ b/encodings/fastlanes/src/delta/vtable/mod.rs @@ -152,6 +152,11 @@ impl VTable for Delta { } fn serialize(metadata: Self::Metadata) -> VortexResult>> { + vortex_ensure!( + metadata.offset == 0, + "DeltaArray offset must be 0 for serialization, got {}", + metadata.offset + ); Ok(Some(metadata.0.encode_to_vec())) } diff --git a/encodings/fastlanes/src/rle/vtable/mod.rs b/encodings/fastlanes/src/rle/vtable/mod.rs index 0df4126cbf5..2e8c1607580 100644 --- a/encodings/fastlanes/src/rle/vtable/mod.rs +++ b/encodings/fastlanes/src/rle/vtable/mod.rs @@ -171,6 +171,11 @@ impl VTable for RLE { } fn serialize(metadata: Self::Metadata) -> VortexResult>> { + vortex_ensure!( + metadata.offset == 0, + "RLEArray offset must be 0 for serialization, got {}", + metadata.offset + ); Ok(Some(metadata.0.encode_to_vec())) } diff --git a/encodings/runend/src/array.rs b/encodings/runend/src/array.rs index 6dd3fdc521d..a4b790a78f5 100644 --- a/encodings/runend/src/array.rs +++ b/encodings/runend/src/array.rs @@ -137,6 +137,11 @@ impl VTable for RunEnd { } fn serialize(metadata: Self::Metadata) -> VortexResult>> { + vortex_ensure!( + metadata.offset == 0, + "RunEndArray offset must be 0 for serialization, got {}", + metadata.offset + ); Ok(Some(metadata.serialize())) } diff --git a/vortex-array/src/arrays/bool/vtable/mod.rs b/vortex-array/src/arrays/bool/vtable/mod.rs index d439ecf0e78..591caafdb2f 100644 --- a/vortex-array/src/arrays/bool/vtable/mod.rs +++ b/vortex-array/src/arrays/bool/vtable/mod.rs @@ -123,13 +123,17 @@ impl VTable for Bool { } fn metadata(array: &BoolArray) -> VortexResult { - assert!(array.offset < 8, "Offset must be <8, got {}", array.offset); Ok(ProstMetadata(BoolMetadata { offset: u32::try_from(array.offset).vortex_expect("checked"), })) } fn serialize(metadata: Self::Metadata) -> VortexResult>> { + vortex_ensure!( + metadata.offset == 0, + "BoolArray offset must be 0 for serialization, got {}", + metadata.offset + ); Ok(Some(metadata.serialize())) } From 455c1105b4bea537d49752f7510d88c20a95e419 Mon Sep 17 00:00:00 2001 From: Robert Kruszewski Date: Fri, 20 Mar 2026 15:56:55 -0400 Subject: [PATCH 2/3] less Signed-off-by: Robert Kruszewski --- vortex-array/src/arrays/bool/vtable/mod.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/vortex-array/src/arrays/bool/vtable/mod.rs b/vortex-array/src/arrays/bool/vtable/mod.rs index 591caafdb2f..d439ecf0e78 100644 --- a/vortex-array/src/arrays/bool/vtable/mod.rs +++ b/vortex-array/src/arrays/bool/vtable/mod.rs @@ -123,17 +123,13 @@ impl VTable for Bool { } fn metadata(array: &BoolArray) -> VortexResult { + assert!(array.offset < 8, "Offset must be <8, got {}", array.offset); Ok(ProstMetadata(BoolMetadata { offset: u32::try_from(array.offset).vortex_expect("checked"), })) } fn serialize(metadata: Self::Metadata) -> VortexResult>> { - vortex_ensure!( - metadata.offset == 0, - "BoolArray offset must be 0 for serialization, got {}", - metadata.offset - ); Ok(Some(metadata.serialize())) } From 60daa397adc9f57aaa2f8d40fbfd0cf3f5d811cc Mon Sep 17 00:00:00 2001 From: Robert Kruszewski Date: Sat, 21 Mar 2026 15:08:06 -0400 Subject: [PATCH 3/3] testchange Signed-off-by: Robert Kruszewski --- encodings/fastlanes/src/rle/array/mod.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/encodings/fastlanes/src/rle/array/mod.rs b/encodings/fastlanes/src/rle/array/mod.rs index 77c584ce331..cdca49809eb 100644 --- a/encodings/fastlanes/src/rle/array/mod.rs +++ b/encodings/fastlanes/src/rle/array/mod.rs @@ -504,18 +504,16 @@ mod tests { let concat = concat.freeze(); let parts = ArrayParts::try_from(concat).unwrap(); - let decoded = parts - .decode( - sliced.dtype(), - sliced.len(), - &ReadContext::new(ctx.to_ids()), - &SESSION, - ) - .unwrap(); - - let original_data = sliced.to_primitive(); - let decoded_data = decoded.to_primitive(); + let decoded = parts.decode( + sliced.dtype(), + sliced.len(), + &ReadContext::new(ctx.to_ids()), + &SESSION, + ); - assert_arrays_eq!(original_data, decoded_data); + assert_eq!( + decoded.err().unwrap().to_string(), + "Other error: RLEArray offset must be 0 for serialization, got 100" + ); } }