0.87.0¶
Released 2026-10-02 — GitHub Release
Changes¶
⚠️ Breaks¶
break:
probe_scalarmust resolve validity internally (#10134) @joseph-isaacsMove
BitPackedserde logic from VTable to Plugin (#9937) @mhk197ScalarFnVtable’s validity is parametrized by ReduceNode (#9932) @myrrc
Move the UUID extension dtype into encodings/uuid (#9588) @joseph-isaacs
Register Delta, Zstd and Pco in the compression session, exclude them by builder mode (#10069) @mhk197
Filter compressor schemes by the session’s allowed serialized IDs on build (#10067) @mhk197
Remove unused unbound expression analysis and traversal helpers (#9993) @mhk197
Move compression schemes to
CompressionSessionand constructBtrBlocksCompressorBuilderfromSession(#10066) @mhk197break:
nth_childto return reference instead of clone (#10051) @joseph-isaacsfix(array): honor the execution allocator for RowFn outputs (#10014) @connortsui20
fix(array): require unsafe row initialization evidence (#10013) @connortsui20
Support
i128andi256decimals inDecimalBytePartsencoding (#9834) @mhk197Rework AggregateVTable (#9816) @robert3005
Filter compression schemes by serialized IDs instead of array IDs (#9914) @mhk197
feat(array): scalar probes with one-off and repeated probe types (#9843) @joseph-isaacs
✨ Features¶
bench(statpopgen): run the suite on DataFusion as well as DuckDB (#10212) @joseph-isaacs
Execute FoR iteratively (#10156) @joseph-isaacs
Refine
FoRSchemeto per-chunk references whenfastlanes.for.v2is allowed (#10136) @mhk197Add SQL null semantics to list_contains (#10057) @robert3005
Blocked
FoRwith one reference per 1024-element chunk (#10105) @mhk197Fold and/or constants on Arrays during .optimize() (#9997) @myrrc
feat(row): upstream vendored dtype and list key support (#10031) @gatesn
Add vortex.is_nan expression with stats-based pruning (#9949) @Ecthlion
feat(cmake): forward linker selection to Cargo (#9976) @0ax1
feat(cuda): support column projection and dictionary decoding in file scans (#9934) @0ax1
Add BoolArray::trim_bits, wire it to Canonical::compact that prunes unused bytes in the underlying buffer (#9374) @robert3005
fix: support decimal-to-integer array casts (#9873) @XiangpengHao
refactor(array): allocate execution outputs through context (#9671) @gatesn
🚀 Performance¶
Optimise Patches::filter to better handle sparse masks and sparse patches (#10149) @robert3005
perf(compressor): count narrow integer ranges without hashing (#10041) @robert3005
perf(compressor): run-aware integer stats loop (#10037) @a10y
Reduce lazy masks into arrays with all-valid metadata (#10016) @connortsui20
feat: reduce allocations in Spark Decimal access (#9842) @xiaoh1024
perf(array): pack Boolean output during RowFn dense retry (#9986) @connortsui20
perf: specialize comparison bitmap packing for 8-bit inputs (#9948) @mhk197
perf(array): reduce RowFn UTF-8 decode overhead (#9985) @connortsui20
perf(array): reuse probe state in RLE, RunEnd and PCO (#9844) @joseph-isaacs
Support creating accumulators with already derived dtypes (#9972) @robert3005
perf(cuda): pipeline local file reads through cacheable pinned buffers (#9936) @0ax1
move Buffer/BufferMut panic helpers into separate functions (#9927) @myrrc
Move panic case in vortex_expect/bail/ensure to a cold handler (#9903) @myrrc
Constant canonicalisation uses similar techniques to SparseArray (#9889) @robert3005
perf: specialize whole-array sums for run-end arrays (#9823) @connortsui20
🐛 Bug Fixes¶
37 changes
fix(datafusion): skip projection pushdown for projections with lambdas (#10215) @joseph-isaacs
fix(bench): write random-access Parquet with zstd level 3 (#10157) @joseph-isaacs
Reject get_field pushdown when its source cannot convert (#10083) @RainyPixel
fix(fsst, onpair): validate decoded lengths before allocation (#10110) @lorenzhs
Remove default-features from vortex -> vortex-file dependency (#10117) @robert3005
Fix wasm32-unknown-unknown regression, add a test to cover it (#10108) @robert3005
Canonicalize dictionary take results before downcasting (#10081) @RainyPixel
Make benchmark ingestion conflict-free and validate before transactions (#10073) @connortsui20
fix(python): treat a single-letter URL scheme as a filesystem path (#9957) @jackylee-ch
fix(row): compare fuzz list prefixes by length (#10033) @gatesn
fix(buffer): avoid shrinking allocations through grow (#10030) @connortsui20
fix(layout): reject a zone map whose zone count disagrees with the layout (#9974) @jackylee-ch
Preserve Boolean buffer handles during mask reduction (#10018) @connortsui20
fix: alignment and padding of sliced CUDA Arrow bitmaps (#9926) @0ax1
fix(datafusion): report an unconvertible column statistic as absent (#9973) @jackylee-ch
Remove DeltaScheme from default BtrBlocksCompressor (#9967) @robert3005
fix(layout): reject a zone map whose zones overrun the layout row count (#9963) @jackylee-ch
Remove Delta compression hand-application from RLE and OnPair (#9964) @joseph-isaacs
fix(duckdb): report an error instead of asserting when a decimal precision exceeds 38 (#9961) @jackylee-ch
ci: bypass broken CodSpeed simulation instrument cache (#9959) @0ax1
fix(python): build Decimal scalars from the unscaled integer and an exponent (#9885) @jackylee-ch
fix: honor the embedding project’s CUDA toolchain (#9929) @0ax1
Added support for REE scalars to scalar_from_df (#9931) @thorfour
fix: preserve device buffers when slicing decimal arrays (#9925) @0ax1
Add TPC-DS SLT plan tests (#9861) @joseph-isaacs
fix(buffer): include the bit offset in BitBufferMut::from_buffer’s bounds check (#9879) @jackylee-ch
ZSTDArray::append_to_builder falls back to canonical for non utf8/binary dtypes (#9897) @robert3005
Replace MaybeUninit transmutes with write_copy_of_slice (#9814) @robert3005
fix(array): convert f16 to signed integers instead of always failing (#9862) @jackylee-ch
Fix UB in reinterpreting 8-byte aligned memory range as alignment 1 (#9865) @myrrc
Resolve object-store URLs in the FFI via the cloud registry (#9558) @balicat
fix(python): match Python range semantics for empty and descending ranges (#9781) @jackylee-ch
📖 Documentation¶
5 changes
fix(docs): fix typo in file-format spec section. (#10125) @jiengup
docs: show decimal encoding evolution (#10007) @connortsui20
docs: explain versioning guarantees and format evolution (#9947) @connortsui20
🧰 Maintenance¶
56 changes
Rename r#for and r#const modules to for_ and const_ (#10204) @joseph-isaacs
bench(mask): measure intersect_by_rank on rotating random masks (#10138) @mightsleep
Update dependency urllib3 to v2.8.0 [SECURITY] (#10158) @renovate[bot]
Add
fastlanes.for_v2serialization for blocked FoR (#10135) @mhk197Update CodSpeedHQ/action digest to 373d686 (#9850) @renovate[bot]
Write benchmark Parquet data with zstd level 3 instead of Snappy (#10103) @joseph-isaacs
remove the
vortex-*deps from xtask (#10115) @vortex-claude[bot]Lock file maintenance (#9955) @renovate[bot]
build: check in the FlatBuffers bindings and drop flatc from builds (#10112) @joseph-isaacs
perf(fastlanes): enable runtime dispatch for the bit transposes (#10102) @mightsleep
Refine
DecimalSchemeto the v2 wire format when the allowed serialized IDs permit it (#10076) @mhk197Setup llvm symbolizer and display fuzz stats in jobs (#10099) @robert3005
Update anthropics/claude-code-action digest to 756cc22 (#10087) @renovate[bot]
Update lance benchmark dependencies (major) (#10095) @renovate[bot]
Update taiki-e/install-action digest to 4cef141 (#10091) @renovate[bot]
Update codecov/codecov-action digest to 303a32d (#10089) @renovate[bot]
Update cloudflare/wrangler-action digest to 953926a (#10088) @renovate[bot]
Update rui314/setup-mold digest to 10ca16b (#10090) @renovate[bot]
Remove redundant BtrBlocks tests (#10075) @connortsui20
require deferred Boolean visitor implementations (#10011) @connortsui20
bench: size the decimal kernel benchmarks by bytes rather than rows (#9980) @connortsui20
Fix semantic merge conflit in is_nan pushdown (#9984) @robert3005
Simplify StatsRewriteCtx rules by leveraging BoundExpressions (#9643) @robert3005
Authenticate Claude CI with workload identity (#9966) @robert3005
List::slice doesn’t require list revalidation (#9924) @robert3005
Add missing runs-on action to all fuzzer workflows (#9921) @robert3005
Add runs-on/action to fuzzer build setup (#9920) @robert3005
Add benchmarks for round tripping aggregate partials (#9916) @robert3005
Rebalance CodSpeed shards and build CPU benchmarks off metal (#9899) @robert3005
Fix sqllogictest failure after recent duckdb changes (#9911) @robert3005
Fix fuzzer build by using mold (#9909) @robert3005
Develop correctly runs tests even if duckdb job is skipped (#9898) @robert3005
bench(pco): scalar access baseline for CodSpeed (#9896) @joseph-isaacs
Streamline fuzzer workflow (#9749) @robert3005
Parallelise and merge ci jobs, make sure rust dependencies are shared everywhere (#9752) @robert3005
Update anthropics/claude-code-action digest to bf38e86 (#9848) @renovate[bot]
Skip non-leaf conjunct pairs in find_between (#9764) @robert3005
Update wasmerio/setup-wasmer digest to ba7631c (#9853) @renovate[bot]
Update aws-actions/configure-aws-credentials digest to e125382 (#9849) @renovate[bot]
Update lance benchmark dependencies (major) (#9855) @renovate[bot]
Lock file maintenance (#9858) @renovate[bot]
Update dtolnay/rust-toolchain digest to 6bed076 (#9851) @renovate[bot]
Update actions/setup-java action to v6 (#9854) @renovate[bot]
Update taiki-e/install-action digest to 3f74d7c (#9852) @renovate[bot]
Update Rust crate toml to v1 (#9857) @renovate[bot]
Lock file maintenance (#9859) @renovate[bot]
Broaden the string-to-Arrow benchmarks (#9503) @robert3005
Remove unnecessary slicing from RowFn execute_all_constant (#9874) @robert3005
Try to speed up python wheel validation (#9847) @robert3005
Delegate to datafusion’s
FilePrunerto know if it has any work to do (#9841) @AdamGSMove protobuf and flatbuffer definitions into their owning crates (#9550) @robert3005