Skip to content

Commit 8a16119

Browse files
dfa1claude
andcommitted
fix: restore MaskedArray.segment() delegation to inner array
Removed buffer(0) delegation when dropping Array interface methods; segment() on MaskedArray now throws, breaking AlpEncoding, ChunkedEncoding, and RunEndEncoding when decoding nullable columns. Restore delegation via deprecated segment() override on MaskedArray and unwrap in ScanIterator. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 94582dd commit 8a16119

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

core/src/main/java/io/github/dfa1/vortex/core/array/MaskedArray.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import io.github.dfa1.vortex.core.DType;
44

5+
import java.lang.foreign.MemorySegment;
6+
57
/// Decoded {@code vortex.masked} array: a non-nullable child paired with an optional validity bitmap.
68
///
79
/// <p>Invariant: {@code child} has no actual nulls — nullability is expressed solely via
@@ -40,6 +42,17 @@ public Array inner() {
4042
return child;
4143
}
4244

45+
/// Delegates to {@link #inner()}'s segment; validity is not surfaced here.
46+
///
47+
/// @return the primary segment of the inner array
48+
/// @deprecated inherited from {@link Array#segment()}; validity silently dropped — prefer {@link #inner()} directly
49+
@Override
50+
@Deprecated(forRemoval = true)
51+
@SuppressWarnings("deprecation")
52+
public MemorySegment segment() {
53+
return child.segment();
54+
}
55+
4356
/// Returns the validity bitmap, or {@code null} if all positions are valid.
4457
///
4558
/// @return the validity bitmap, or {@code null} when all values are valid

reader/src/main/java/io/github/dfa1/vortex/scan/ScanIterator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,8 @@ private Array decodeConcatPrimitive(List<Layout> flats, DType dtype, long totalR
388388
long byteOffset = 0;
389389
for (Layout flat : flats) {
390390
Array chunk = decodeFlat(flat, dtype, arena);
391-
MemorySegment src = chunk.segment();
391+
Array chunkData = chunk instanceof MaskedArray m ? m.inner() : chunk;
392+
MemorySegment src = chunkData.segment();
392393
MemorySegment.copy(src, 0, combined, byteOffset, src.byteSize());
393394
byteOffset += src.byteSize();
394395
}

0 commit comments

Comments
 (0)