Commit 7d3e6c5
fix: read string-dict offsets at their true ptype width (#215)
A `vortex.dict` string column whose values are FSST-compressed crashed the
scan with a raw `IndexOutOfBoundsException` in `VarBinArray$DictMode.dictReadOff`.
Root cause: `DictEncodingDecoder.decodeUtf8DictProto` ran the decoded values
through `VarBinArray.toOffsetMode` and then hardcoded `PType.I64` as the
offsets ptype of the resulting `DictMode`. But `toOffsetMode` only builds fresh
I64 offsets on its slow path — on the fast path it returns the already-decoded
`OffsetMode` unchanged, keeping its own ptype. FSST decompresses its values to
a child with I32 offsets (Rust: FSST's `codes_offsets_ptype` is a narrow wire
ptype read during decompression — see encodings/fsst/src/array.rs — while the
canonicalized value offsets are freshly built and independent of it). The
DictMode carrier thus claimed an 8-byte stride over a 4-byte-stride buffer
(12 bytes for 3 offsets), so reading offset 1 as an 8-byte long walked off the
segment.
Fix: carry `dictValues.offsetsPtype()` so the carrier matches the buffer it
actually materialized (parse-don't-validate). Additionally harden `dictReadOff`
to read every signed/unsigned offset width at its true stride and to throw a
helpful `VortexException` on out-of-range indices rather than a bare
`IndexOutOfBoundsException` (ADR 0003 bounds discipline).
Corpus evidence: uci-magic-gamma-telescope (Raincloud, vortex-data 0.69.0) — its
utf8 `class` column is a `vortex.dict` over `vortex.fsst` values. Export now
completes and matches the Parquet sibling on all 19020 rows x 11 cols.
Closes #215
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>1 parent 26df9ab commit 7d3e6c5
5 files changed
Lines changed: 108 additions & 5 deletions
File tree
- integration/src/test/resources/raincloud
- reader/src
- main/java/io/github/dfa1/vortex/reader
- array
- decode
- test/java/io/github/dfa1/vortex/reader/array
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
217 | 217 | | |
218 | 218 | | |
219 | 219 | | |
220 | | - | |
| 220 | + | |
221 | 221 | | |
222 | 222 | | |
223 | 223 | | |
| |||
Lines changed: 29 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
326 | 326 | | |
327 | 327 | | |
328 | 328 | | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
329 | 341 | | |
330 | | - | |
331 | | - | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
332 | 348 | | |
333 | | - | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
334 | 360 | | |
335 | 361 | | |
336 | 362 | | |
| |||
Lines changed: 6 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
254 | 254 | | |
255 | 255 | | |
256 | 256 | | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
257 | 262 | | |
258 | | - | |
| 263 | + | |
259 | 264 | | |
260 | 265 | | |
261 | 266 | | |
| |||
Lines changed: 71 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
| 8 | + | |
| 9 | + | |
7 | 10 | | |
8 | 11 | | |
9 | 12 | | |
| |||
13 | 16 | | |
14 | 17 | | |
15 | 18 | | |
| 19 | + | |
16 | 20 | | |
17 | 21 | | |
18 | 22 | | |
| |||
182 | 186 | | |
183 | 187 | | |
184 | 188 | | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
185 | 256 | | |
186 | 257 | | |
0 commit comments