You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Nullable low-cardinality columns previously bypassed the writer's
shared global dictionary, re-emitting a per-chunk vortex.dict for
every chunk instead of one shared dict for the whole file. Nullable
primitive/Utf8 columns now pass the same cardinality/ratio gate
(skipping null slots) and their per-chunk codes are wrapped in
vortex.masked.
Also fixes two reader gaps this surfaced: DictLayoutDecoder's
Utf8/VarBin branch didn't unwrap masked codes/pool (only the
primitive branch did), and ChunkedLayoutDecoder silently dropped
per-chunk validity when concatenating masked chunks — a pre-existing
bug for any nullable column spanning multiple chunks through that
decode path.
200k-row nullable low-card Utf8 test: 232KB -> 107KB (54% smaller),
Java/JNI ratio 4x -> 1.45x.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
### Fixed
11
+
12
+
- Nullable low-cardinality columns now use the shared global dictionary across chunks instead of re-emitting a per-chunk dictionary. The writer previously excluded any nullable column from global-dict candidacy, so a nullable low-cardinality string/numeric column (extremely common in real data — most Raincloud categorical columns have nulls) re-wrote its dictionary in every chunk. Nullable columns now run the same cardinality/ratio gate against their non-null values and emit one shared `vortex.dict` layout with per-chunk masked codes; the reader combines codes-side and pool-side validity per row. On a 200k-row, 10-chunk nullable low-cardinality Utf8 column this shrinks the file 54% (232 KB → 107 KB) and closes the gap to the Rust reference from ~4× to ~1.5×. (internal)
13
+
10
14
## [0.12.2] — 2026-07-12
11
15
12
16
**Registry cleanup, schema fidelity, and list-column support** are the three themes of this
0 commit comments