v0.4.0
The headline themes for this release are a security-hardening sweep of the file-format
parser, a public-API cleanup of the Array hierarchy (the heap-allocated buffer(int) /
segment() accessors are gone from the interface), and cascading writer features that
close the compression gap with the Rust reference implementation on real-world workloads.
Security
Every malformed input now surfaces as VortexException rather than a JDK exception
(IndexOutOfBoundsException, ArrayIndexOutOfBoundsException, StackOverflowError, raw
FlatBuffer/Protobuf runtime exceptions). Regression suite lives under
reader/src/test/java/.../*SecurityTest.
- Zip-bomb protection —
ConstantEncodingand dict-layout decode no longer pre-allocate
O(rowCount)memory; a 150-byte crafted file claiming 10⁹ rows is now constant-cost.
(10a7776) - Trailer + postscript validation —
VortexReaderandVortexHttpReaderreject unknown
fileversion,postscriptLen == 0, andpostscriptLen > fileSize - 8. Footer/layout/dtype
blob offsets andLayout.encodingindex are bounds-checked at parse time.
(f8f89fe) - Footer
segmentSpecsbounds — every spec is validated againstfileSizethe moment
the footer is materialised, eliminating laterIndexOutOfBoundsExceptionon
MemorySegment.asSlice.
(03845ac) - PType ordinal bounds-check —
PType.fromOrdinal(int)replaces all 22PType.values()[idx]
call sites across encodings; crafted Protobuf ptype fields are rejected up front.
(b4988c3) - Layout-tree depth cap —
PostscriptParser.convertLayoutis capped at depth 64,
preventing both unbounded nesting and self-referential FlatBuffer cycles (a ~120-byte
cycle attack previously triggeredStackOverflowError).
(29adbe0) - Layout metadata size cap — per-layout
metadataAsByteBuffer()is capped at 4 MiB
(above any real encoding's footprint; FSST's symbol table is the largest at ~32 KiB).
(ebbe644) - Decimal field validation —
DType.Decimalis rejected unlessprecision ∈ [1, 38]
andscale ∈ [0, precision], matching IEEE 754-2008 decimal128.
(ebbe644) readFlatStatsbounds-check — zone-map stats reads now validate the trailing
little-endianfbLenfield against the segment size, returning empty stats on malformed
input rather than throwingIndexOutOfBoundsExceptionfromMemorySegment.asSlice.
(ebbe644)
Added
vortex.sequenceF16 encode/decode — half-precision floats now round-trip through the
sequence encoding.
(7b3d7a9)- Writer: cascading with global dict layout — low-cardinality columns (≤ 256 distinct
values in the chunk sample) are now emitted as avortex.dictlayout, with the dict
candidate detection tightened to avoid false positives.
(53b2a19,
d383765) - Writer: opt-in Zstd compression —
WriteOptions.withZstd(boolean)exposes the
size/throughput trade-off. Off by default; turn on for archival workloads.
(ea10d37) Encoding.decodeSegmentextension point — added as part of the typed-segment migration
(see Changed below). Provides a typed alternative toArray.segment().
(ed4a0ae)DecodeContext.decodeChild(int, DType, long)— typed child-decode helper that replaces
the per-encodingdecodeChildAs(...)private utilities.
(d07faf0,
a1512da)- Typed accessors on concrete array types —
LongArray.segment(),VarBinArray.offsetsSegment(),
MaskedArray.inner(), and friends now live on the concrete types where they fit cleanly,
rather than on theArrayinterface.
(84a34f4) *SecurityTesttest-naming convention — adversarial / robustness tests are now grouped
under the*SecurityTestsuffix, mirroring the existing*IntegrationTestconvention.
Run with./mvnw test -Dtest='*SecurityTest'.
(76ba67c)FlatSegmentDecoder— extracted fromEncodingRegistry; the registry is now pure
dispatch.
(4a08356)
Changed
Arrayinterface slimmed down.buffer(int),child(int), andsegment()are no
longer part of theArrayinterface; consumers should use the typed accessors on the
concrete subtype (e.g.LongArray.segment()) orArraySegments.of(arr)for a generic
fallback.buffer(int)is now package-private on the concrete array types.
(bdb4e7d,
1283168,
ba5957c,
df6ab3f,
bb7b656)VarBinArrayno longer keeps a redundantoffsetsArrfield; consumers read offsets
viaoffsetsSegment().
(96687f8)ArrayStatsis no longer eagerly stored on decoded array types; statistics are now
read on demand from the FlatBuffer node, matching the Rust reference implementation.
(9237e28)
Fixed
MaskedArray.segment()delegates correctly to its inner array (regression introduced
during the typed-accessor migration).
(8a16119)- Constant-encoded array indexing broadcasts the index correctly when scanning multiple
rows from a single stored value.
(ed658b7) - Performance benchmark (
RustWritesJavaReadsBigFileBenchmark) migrated off the removed
Array.buffer(int)accessor, unblocking./mvnw verifyand./bench.
(977a529)
Removed
Array.buffer(int),Array.child(int), andArray.segment()from the publicArray
interface (see Changed). Callers should migrate to the concrete-type accessors or
ArraySegments.of(arr).
(bdb4e7d,
1283168)Encoding.decodeSegment(...)is removed after the migration toDecodeContext.decodeChild.
(977a529)ArrayStatsfield on decoded array types (statistics are now lazy).
(9237e28)
Documentation
- Added
CONTRIBUTING.mdcovering trunk-based workflow, commit conventions, and the
three-touch-point rule for adding encodings.
(d9825cf) - Added an internal-architecture diagram set covering the file format, layout tree, and
scan path.
(75f4cea) - Added a "Vortex vs Parquet" comparison section to the README.
(886bb80) - Expanded the
## Securitysection inTODO.mdwith the open hardening roadmap (resource
caps, per-encoding adversarial tests, Jazzer fuzz harness, OSS-Fuzz submission).
(1bb1465)
Build & Tooling
- Dependabot enabled for Maven and GitHub Actions.
(dd118a7) - Numerous dependency bumps: JUnit Jupiter (5.11.4 → 6.1.0, tests now require JUnit 6),
Mockito, FastCSV (3 → 4), H2 (2.3 → 2.4), Checkstyle, Zstd-JNI,
maven-compiler/surefire/failsafe/javadoc/source/shade/gpg/antrun/exec/build-helper plugins,
actions/checkout(4 → 6),actions/setup-java(4 → 5),actions/cache(4 → 5),
Sonatype central-publishing plugin.
(81be668,
2c8319f,
f6dbcf1,
dfabd8c,
7b4a718,
fb9b404,
7b67000,
fd1ea7e) pom.xmlfiles now group dependencies underproduction/testingcomment sections
with a consistent project-internal-first ordering.
(bcbbbfd)- Checkstyle scope tightened to exclude generated
fbs/protopackages.
(f5ab433)