Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
703 commits
Select commit Hold shift + click to select a range
ac87fe0
AllInvalid arrays have non empty distinct info (#7369)
robert3005 Apr 10, 2026
a78897f
duckdb: Reset validity instead of filling (#7365)
myrrc Apr 10, 2026
d8c156f
use expect over allow in clippy (#7373)
joseph-isaacs Apr 10, 2026
360b41d
Remove portable_simd take implementation and remove unused cargo flag…
robert3005 Apr 10, 2026
8d9052e
Decompose TurboQuant into 2 `ScalarFnArray`s and `DictArray` (#7374)
connortsui20 Apr 10, 2026
3bdb376
add vector similarity benchmark (#7391)
connortsui20 Apr 10, 2026
4aa1c15
perf: `Arc::ptr_eq` short-circuit to DType eq comparisons (#7398)
0ax1 Apr 11, 2026
cc297a6
Update dependency io.netty:netty-bom to v4.2.12.Final (#7403)
renovate[bot] Apr 13, 2026
15090e8
Update react monorepo to v19.2.5 (#7404)
renovate[bot] Apr 13, 2026
f83a367
Update rust-wasm-bindgen monorepo (#7406)
renovate[bot] Apr 13, 2026
5060020
bump rand to 0.10.1 (#7405)
connortsui20 Apr 13, 2026
93746cf
Update all patch updates (#7402)
renovate[bot] Apr 13, 2026
ceb8638
chore[vortex-array]: add integer casting benchmark (#7400)
asubiotto Apr 13, 2026
75b1062
Ignore dead_code warnings on scalar bit transpose code (#7408)
robert3005 Apr 13, 2026
d4e7dca
support multiple globs in DuckDB and MultiFileDataSource (#7390)
a10y Apr 13, 2026
fbfa072
Optimize math expressions with `Constant` children (#7394)
connortsui20 Apr 13, 2026
a004afa
TurboQuant `InnerProduct` optimizations (#7396)
connortsui20 Apr 13, 2026
44c511d
duckdb: Exit earlier on Validity::AllFalse (#7411)
myrrc Apr 13, 2026
8dc8c96
perf: `Arc::ptr_eq` short-circuit for List & FixedSizeList DType eq (…
0ax1 Apr 13, 2026
71089dd
feat: implement IsNotNull expression in vortex expression library (#6…
xiaoxuandev Apr 13, 2026
fe388a0
More robust types in the compressor (#7415)
connortsui20 Apr 13, 2026
d352612
fix[ci]: bench no fail-fast random access (#7418)
joseph-isaacs Apr 13, 2026
3fd9f26
Remove getrandom feature flag overrides (#7421)
robert3005 Apr 13, 2026
82a6081
perf[vortex-array]: use from_trusted_len_iter in primitive casts (#7401)
asubiotto Apr 14, 2026
0bcd8fa
Update dependency pytest to v9 [SECURITY] (#7419)
renovate[bot] Apr 14, 2026
d222c87
chore[vortex-layout]: allow specifying a set of stats on CompressingS…
asubiotto Apr 14, 2026
d674aa2
fix[vortex-array]: avoid unnecessary checks in check_listview_constan…
asubiotto Apr 14, 2026
d87dfed
Lower days before stale to 14 from 30 (#7425)
robert3005 Apr 14, 2026
1a56560
remove check for ArrayPlugin encoding ID match (#7427)
a10y Apr 14, 2026
3f56b09
chore: benchmark with execution context input (#7429)
joseph-isaacs Apr 14, 2026
3e6834e
fix ALP patch plugin (#7430)
a10y Apr 14, 2026
5330d32
add unstable encodings and patches to benchmarks (#7426)
joseph-isaacs Apr 14, 2026
97b18fb
Add benchmarks for take on a FilterArray (#7420)
robert3005 Apr 14, 2026
6d07a23
Optimize inner product, update boilerplate, remove bad benchmarks (#7…
connortsui20 Apr 14, 2026
646e6be
ScalarFns as Arrays (#7361)
gatesn Apr 14, 2026
59c92ab
Fix lockfiles (#7433)
connortsui20 Apr 14, 2026
8b587bb
perf: intern identifiers (array, layout, etc). (#7412)
joseph-isaacs Apr 14, 2026
c690c2c
binstall for vortex-tui (#7434)
a10y Apr 14, 2026
f747201
Remove metadata from `DynArray` (#7435)
connortsui20 Apr 14, 2026
c4ad4e2
Remove ListViewBuilder scalar_at (#7438)
gatesn Apr 14, 2026
4a5b7d7
Support serializion tensor scalar fns (#7437)
connortsui20 Apr 15, 2026
2f07feb
chore[gpu]: don't inline bitunpack lane impls (#7441)
0ax1 Apr 15, 2026
85f52d8
add BtrBlocksCompressorBuilder::empty() (#7443)
connortsui20 Apr 15, 2026
757bbfc
Update locked rustls-webpki to address sec advisory (#7444)
AdamGS Apr 15, 2026
afcdb9a
chore[gpu]: trim Criterion CUDA benchmarks (#7445)
0ax1 Apr 15, 2026
89de477
Add spark value writers for Date/Timestamp/TimestampNTZ and Struct ty…
robert3005 Apr 15, 2026
0e0401c
Gate scalar fn array plugin for tensor exprs (#7447)
connortsui20 Apr 15, 2026
9406303
chore(ci): workflow cleanup and fixes (#7448)
0ax1 Apr 15, 2026
bff43dc
Vector datasets catalog and downloader (#7446)
connortsui20 Apr 15, 2026
0d143da
fix(ci): restore vortex-compact file size tracking for PR clickbench …
0ax1 Apr 15, 2026
3188e24
expose execution context for validity::to_bool and remove validity ma…
joseph-isaacs Apr 15, 2026
ee2af71
chore: sort and dedup formats in sql engine runner (#7459)
0ax1 Apr 15, 2026
e8374a4
chore: bump duckdb to 1.5.2 (#7461)
0ax1 Apr 16, 2026
17e2801
chore: unify ci timeouts to 4 tiers (#7460)
0ax1 Apr 16, 2026
82c938b
Correct rust version channel (#7463)
robert3005 Apr 16, 2026
216499f
fix: wipe duckdb archive as part of `cargo clean` (#7465)
0ax1 Apr 16, 2026
5e5475a
Unify benchmark file download logic (#7462)
robert3005 Apr 16, 2026
9f9f8f1
Fix web deployment github action (#7467)
robert3005 Apr 16, 2026
f924a34
Unify all runtime env var access to functions wrapping LazyLock (#7468)
AdamGS Apr 16, 2026
d992309
Deprecate scalar_at for execute_scalar (#7457)
gatesn Apr 16, 2026
e4e7667
Demo TurboQuant basic search with serialization (#7451)
connortsui20 Apr 16, 2026
d7f07de
vortex-array: Attempt casting inner array to target for extensions (#…
brancz Apr 16, 2026
3cd74b9
Fix scalar_at in example (#7471)
connortsui20 Apr 16, 2026
8b09d0c
Split up the monster `ci.yml` workflow (#7472)
AdamGS Apr 16, 2026
cd6caff
Update actions/download-artifact action to v8 (#7474)
renovate[bot] Apr 16, 2026
68e5ce2
Update gradle/actions action to v6 (#7478)
renovate[bot] Apr 16, 2026
f9d4feb
Update actions/setup-node action to v6 (#7475)
renovate[bot] Apr 16, 2026
63e5aee
java: use triple-quote strings instead of concat (#7481)
a10y Apr 16, 2026
6813e17
Update octokit/request-action action to v3 (#7479)
renovate[bot] Apr 16, 2026
e34208e
Update actions/upload-pages-artifact action to v5 (#7476)
renovate[bot] Apr 16, 2026
29ad984
Renovate can create unlimited prs during morning monday hours, limit …
robert3005 Apr 16, 2026
01679cd
Update actions/upload-artifact action to v7 (#7477)
renovate[bot] Apr 16, 2026
12f63a4
Add AGENTS.md and some basic skills (#7484)
gatesn Apr 16, 2026
b4dca29
Add new `vector-search-bench` benchmarking crate (#7458)
connortsui20 Apr 16, 2026
61dffa9
Use an unsafe trait to reinterpret packed struct references as bytes …
AdamGS Apr 16, 2026
e03bd1d
Use `vx-bench` to run benchmarks in CI (#7466)
AdamGS Apr 16, 2026
1169d84
Use cargo-zigbuild to link against old libc (#7480)
robert3005 Apr 16, 2026
91b4c75
perf[gpu]: reduce register pressure in dyn dispatch (#7489)
0ax1 Apr 16, 2026
67c1655
fix: add validity no_nulls and fix usage (#7487)
joseph-isaacs Apr 16, 2026
1b2f6ee
perf: correctly try execute parent in the iterative child execute loo…
joseph-isaacs Apr 16, 2026
ba08515
skip: add a changelog deprecation label (#7492)
joseph-isaacs Apr 16, 2026
aca6251
break: remove `try_from` struct array to record batch (#7488)
joseph-isaacs Apr 16, 2026
c69957f
fix: avoid ListView take_reduce rebuild for dense selections (#7339)
dimitarvdimitrov Apr 16, 2026
d441299
depreacte non compute methods without a ctx (e.g. `to_canonical`) (#7…
joseph-isaacs Apr 16, 2026
7e0af3c
Unify download management (#7490)
connortsui20 Apr 16, 2026
34509f2
Optimize L2Norm for ConstantArray (#7495)
connortsui20 Apr 16, 2026
ce52b71
Actual kebab case (#7496)
connortsui20 Apr 16, 2026
869b2d1
Add extension constant pushdown rule and fix `InnerProduct` rule (#7507)
connortsui20 Apr 17, 2026
cd798b3
L2 denorm scheme (#7506)
connortsui20 Apr 17, 2026
6a2d4ad
High level C Scan API (#7212)
myrrc Apr 17, 2026
6ac69e7
Update Rust crate rand to 0.10 [SECURITY] (#7508)
renovate[bot] Apr 17, 2026
6ebb797
chore: speed up CUDA kernel compilation (#7509)
0ax1 Apr 17, 2026
7c32db0
Use dev profile for editable python builds (#7510)
AdamGS Apr 17, 2026
550f351
Revert "chore: speed up CUDA kernel compilation (#7509)" (#7511)
0ax1 Apr 17, 2026
ad087b6
Improve docs for DataFusion integration (#7442)
AdamGS Apr 17, 2026
bd93340
GPU kernel for sorted patches with chunk_offsets (#7440)
a10y Apr 17, 2026
47f1158
Add `unstable_encodings` feature to `vortex-tui` (#7515)
connortsui20 Apr 17, 2026
1ece694
Hack to support forcing normalization (#7517)
connortsui20 Apr 17, 2026
102de51
Propagate min/max/string length statistics to duckdb (#7416)
myrrc Apr 17, 2026
4d73f97
fix potential UB in ByteBool encoding (#7518)
a10y Apr 17, 2026
9b11e57
Fix reduction rule (#7521)
connortsui20 Apr 17, 2026
f308dfe
add unchecked array slot take and put (#7514)
joseph-isaacs Apr 17, 2026
609e9aa
Vector similarity search scan benchmarks (#7499)
connortsui20 Apr 17, 2026
4135209
Fix reduction/execute cycle (#7522)
connortsui20 Apr 17, 2026
ac74f1e
Update dependency @tanstack/react-virtual to v3.13.24 (#7529)
renovate[bot] Apr 20, 2026
e42c135
Update storybook monorepo to v10.3.5 (#7530)
renovate[bot] Apr 20, 2026
7f552b1
Update crate-ci/typos action to v1.45.1 (#7532)
renovate[bot] Apr 20, 2026
c654223
Update dependency com.adobe.testing:s3mock-testcontainers to v4.12.4 …
renovate[bot] Apr 20, 2026
045d3d7
Update dependency eslint-plugin-react-refresh to ^0.5.0 (#7537)
renovate[bot] Apr 20, 2026
7162a10
Update dependency com.google.protobuf:protobuf-java to v4.34.1 (#7536)
renovate[bot] Apr 20, 2026
a6dd776
Update datafusion monorepo to v53.1.0 (#7533)
renovate[bot] Apr 20, 2026
618b688
Update all patch updates (#7528)
renovate[bot] Apr 20, 2026
8dacc51
Update dependency lucide-react to ^0.577.0 (#7538)
renovate[bot] Apr 20, 2026
ea16b26
Update dependency typescript to ~5.9.0 (#7541)
renovate[bot] Apr 20, 2026
c1f6345
Update dependency typescript-eslint to v8.58.2 (#7542)
renovate[bot] Apr 20, 2026
8f86881
Update release-drafter/release-drafter action to v7.2.0 (#7544)
renovate[bot] Apr 20, 2026
b66f9e4
Update dependency com.google.guava:guava to v33.6.0-jre (#7535)
renovate[bot] Apr 20, 2026
92c573b
Update arrow-rs to v58.1.0 (#7531)
renovate[bot] Apr 20, 2026
24fcc56
Update dependency org.testcontainers:junit-jupiter to v1.21.4 (#7539)
renovate[bot] Apr 20, 2026
2c48e57
Update plugin com.google.protobuf to v0.10.0 (#7546)
renovate[bot] Apr 20, 2026
ec439b0
Update Rust crate noodles-vcf to 0.87.0 (#7550)
renovate[bot] Apr 20, 2026
6f8f84d
Update Rust crate taffy to 0.10.0 (#7554)
renovate[bot] Apr 20, 2026
4c41a02
Update Rust crate test-with to 0.16 (#7555)
renovate[bot] Apr 20, 2026
b1bf4ab
Update Rust crate hashbrown to 0.17.0 (#7547)
renovate[bot] Apr 20, 2026
5d10355
Update Rust crate tokio to v1.52.1 (#7556)
renovate[bot] Apr 20, 2026
0e89249
Update Rust crate zip to v8.5.1 (#7558)
renovate[bot] Apr 20, 2026
8dde6d1
Update codecov/codecov-action action to v6 (#7561)
renovate[bot] Apr 20, 2026
dcd7097
Update arrow to v19 (major) (#7559)
renovate[bot] Apr 20, 2026
6995b99
Update Rust crate uuid to v1.23.1 (#7557)
renovate[bot] Apr 20, 2026
d0a6dba
Update Rust crate cudarc to 0.19.0 (#7545)
renovate[bot] Apr 20, 2026
12457aa
Clean up `vortex-tensor` (#7525)
connortsui20 Apr 20, 2026
e8d64af
Update Rust crate reqwest to 0.13.0 (#7552)
renovate[bot] Apr 20, 2026
6d499b9
Update Rust crate sha2 to 0.11 (#7553)
renovate[bot] Apr 20, 2026
f77cf60
Remove weird file (#7568)
connortsui20 Apr 20, 2026
ba90b10
duckdb: define virtual columns on c++ side (#7571)
myrrc Apr 20, 2026
58ed3c2
Fuzzer cloudflare bucket is configured only in store and persist (#7570)
robert3005 Apr 20, 2026
76ccbdf
break: remove deprecated methods and plumb ExecutionCtx (#7512)
joseph-isaacs Apr 20, 2026
09601af
avoid including experimental encoding in footer (#7569)
a10y Apr 20, 2026
36c134c
Implement validity for Between scalar function (#7519)
robert3005 Apr 20, 2026
b213af1
Move tensor types under `types/` submodule (#7573)
connortsui20 Apr 20, 2026
be2a14b
deprecate: execute_mask over to_mask (#7574)
joseph-isaacs Apr 20, 2026
91f1c2f
Remove ScalarFnConstantRule (#7575)
robert3005 Apr 20, 2026
dccfb24
Add `tracing` support to the compressor (#7385)
connortsui20 Apr 20, 2026
6d4a7f8
deprecate: into_arrow (#7577)
joseph-isaacs Apr 20, 2026
9fe20c5
Pass `ExecutionCtx` through the compressor (#7578)
connortsui20 Apr 20, 2026
b66f299
alp CUDA bench (#7579)
a10y Apr 21, 2026
3e00b5a
Make `StatsCache` and `ArrayAndStats` have interior mutability (#7583)
connortsui20 Apr 21, 2026
223d1df
ci: always run all lints (#7584)
blaginin Apr 21, 2026
26a766f
Allow Claude to write (#7294)
gatesn Apr 21, 2026
7324308
Rename duplicated `ScalarFn` types (#7586)
connortsui20 Apr 21, 2026
f152281
Implement smarter sampler (#7585)
connortsui20 Apr 21, 2026
452a4a3
Remove `ExtensionData` (#7587)
connortsui20 Apr 22, 2026
029fb66
feat: GPU dyn dispatch patches support (#7563)
0ax1 Apr 22, 2026
2fe2a69
Use layout file splits when DF re-partitions individual files (#7591)
AdamGS Apr 22, 2026
2e6e163
Skip nightly lance benchmark (#7594)
AdamGS Apr 22, 2026
9e261cc
Try and make the bot-review-action not hang and/or just fail (#7593)
AdamGS Apr 22, 2026
30042ee
data-parallel patched ALP standalone kernel (#7576)
a10y Apr 22, 2026
8f7f6d3
Bump msrv and rust-toolchain to 1.91 (and lance for benchmarks) (#7595)
AdamGS Apr 22, 2026
bfb5dba
Lock file maintenance (#7526)
renovate[bot] Apr 22, 2026
f3e7b3c
perf: faster execution ctx and no opt (#7597)
joseph-isaacs Apr 22, 2026
6302ee8
duckdb to_string: don't copy (#7582)
myrrc Apr 22, 2026
c91d833
Extend DType::least_supertype to cover FixedSizeList, List, and tenso…
palaska Apr 22, 2026
2167e61
remove unused methods from duckdb vtab (#7602)
myrrc Apr 23, 2026
5b0c5f9
Modify renovate config for better experience (#7605)
AdamGS Apr 23, 2026
e06e371
Faster BoolArray::min_max via true_count instead of set_slices (#7599)
robert3005 Apr 23, 2026
75808d5
fix deadlock on unknown policy request (#7606)
myrrc Apr 23, 2026
143fb61
add another oneshot tsan suppression (#7608)
myrrc Apr 23, 2026
dfb9992
Add spans in compressor for perfetto (#7607)
connortsui20 Apr 23, 2026
09ae129
feat(cuda): fuse narrower-than-output Dict codes and RunEnd ends (#7603)
0ax1 Apr 23, 2026
56b0731
Revert #7603 (#7613)
connortsui20 Apr 23, 2026
b6ee27b
Clean up `vortex-tensor` even more (#7610)
connortsui20 Apr 23, 2026
aece3ad
Make java spark tests more resilient (#7612)
robert3005 Apr 23, 2026
e0bbe32
New Java Scan API (#7527)
robert3005 Apr 23, 2026
543dbe7
duckdb: don't copy vtab on function bind (#7616)
myrrc Apr 23, 2026
91a6b57
feat(cuda): fuse narrower-than-output Dict codes and RunEnd ends (#7617)
0ax1 Apr 24, 2026
2ad173d
fix: nested block on, make `materialize` async (#7618)
0ax1 Apr 24, 2026
9d59a8e
Cache available parallelism (#7620)
AdamGS Apr 24, 2026
a83c9b3
Try and improve the perf of natural file splits in DF (#7609)
AdamGS Apr 24, 2026
50531ab
feat: add a runner field to all runners (#7622)
joseph-isaacs Apr 24, 2026
0597991
DuckDB backend for benchmarks website (#7491)
AdamGS Apr 24, 2026
cc06c60
Revert "DuckDB backend for benchmarks website" (#7623)
AdamGS Apr 24, 2026
042e4fb
Improve stats reporting to DF (#7628)
AdamGS Apr 24, 2026
193d655
Validate zoned build (#7627)
connortsui20 Apr 24, 2026
7c2df2c
feat(cuda): make GPU dispatch mode configurable (#7621)
0ax1 Apr 24, 2026
1838a7a
`zoned` cleanup (#7634)
connortsui20 Apr 24, 2026
a1d9493
remove gcs dead code from vortex-bench (#7640)
connortsui20 Apr 26, 2026
a001ba8
Fix dtype mismatch in FileStatsLayoutReader for stat scalars (#7639)
brainhart Apr 26, 2026
f418844
Add ability to override function behaviour via registry in VortexSess…
robert3005 Apr 27, 2026
f58b59a
small metal benchmark runners (#7456)
joseph-isaacs Apr 27, 2026
0660353
C API scan examples (#7564)
myrrc Apr 27, 2026
3d70d43
Update dependency typescript to v6 (#7662)
renovate[bot] Apr 27, 2026
a77c714
Update Rust crate zip to v8.6.0 (#7650)
renovate[bot] Apr 27, 2026
bbfecc8
Update dependency com.adobe.testing:s3mock-testcontainers to v5 (#7655)
renovate[bot] Apr 27, 2026
2d19a65
Update actions/github-script action to v9 (#7652)
renovate[bot] Apr 27, 2026
8309842
Update dependency node to v24 (#7661)
renovate[bot] Apr 27, 2026
20f11d0
Update dorny/paths-filter action to v4 (#7665)
renovate[bot] Apr 27, 2026
74d803b
feat: dict into parts (#7668)
joseph-isaacs Apr 27, 2026
c2ab531
Update all patch updates (#7648)
renovate[bot] Apr 27, 2026
d763ece
perf: zero copy validity export to duckdb (#7371)
joseph-isaacs Apr 27, 2026
e75c62c
Pin dependencies (#7647)
renovate[bot] Apr 27, 2026
85e95fc
Rename `ScalarValue::List` to `ScalarValue::Tuple` (#7672)
connortsui20 Apr 27, 2026
27b1825
make all scalar view types `Copy` (#7673)
connortsui20 Apr 27, 2026
40c2c7f
Upgrade all vortex-web dependencies (#7669)
robert3005 Apr 27, 2026
ea31cc2
Update dependency concurrently to v9 (#7656)
renovate[bot] Apr 27, 2026
69b3fc6
Update dependency ray to v2.55.0 [SECURITY] - abandoned (#7629)
renovate[bot] Apr 27, 2026
c0c6fb9
Update benchmarks-website dependencies (#7676)
robert3005 Apr 27, 2026
1689d7a
feat: `Mean` aggregate (#7201)
blaginin Apr 27, 2026
89cffea
Prunning expressions can reference rowcount (#7589)
robert3005 Apr 27, 2026
645d962
yaml lint enforce no empty values (#7678)
connortsui20 Apr 27, 2026
4f27750
Add epic and tracking issue templates (#7680)
connortsui20 Apr 27, 2026
f71e6f3
Add info email (#7682)
whelanBoyd Apr 27, 2026
f9067c7
Update Rust crate cudarc to 0.19.0 (#7649)
renovate[bot] Apr 28, 2026
6608a71
feat(cuda): prefer standalone kernels in `auto` mode (#7667)
0ax1 Apr 28, 2026
c87bfca
chore: clippy deny `ref_option` and `ref_option_ref` (#7692)
joseph-isaacs Apr 28, 2026
77e9bf0
Update Rust crate similar to v3 (#7689)
renovate[bot] Apr 28, 2026
d036fc1
feat(cuda): support f64 in alp dyn dispatch (#7666)
0ax1 Apr 28, 2026
269cbeb
skip: remove old unneeded benchmark (#7694)
joseph-isaacs Apr 28, 2026
2db4ab1
remove SessionVar blanket impl, replace with type impls (#7695)
a10y Apr 28, 2026
bcb49d4
feat: masked array iterative execution clean up (#7690)
joseph-isaacs Apr 28, 2026
ac8c751
Update Rust crate daachorse to v2 (#7688)
renovate[bot] Apr 28, 2026
b13ba9c
Improve the issue templates (#7700)
connortsui20 Apr 28, 2026
f371819
Java CI is self contained and writes files through java instead of ru…
robert3005 Apr 28, 2026
04159b8
Tell agents to use Cargo Nextest for testing (#7701)
robert3005 Apr 28, 2026
140eec6
Fix java formatting (#7703)
robert3005 Apr 28, 2026
d2d79f0
skip[clippy]: add some more hints (#7713)
joseph-isaacs Apr 29, 2026
b647a21
ci[gpu]: run cuda micro-benchmarks with codspeed (#7696)
0ax1 Apr 29, 2026
ea75e28
Late materialization support for duckdb (#7631)
myrrc Apr 29, 2026
e3a6b62
Revert "Late materialization support for duckdb" (#7719)
joseph-isaacs Apr 29, 2026
6fa3cae
feat: teach Array<Struct> try_from(&[Array<Struct>]) (#7632)
danking Apr 29, 2026
0bb712b
feat(ffi): add literal expression support (#7675)
m7kss1 Apr 29, 2026
260badd
Fix cosine similarity optimization bug (#7724)
connortsui20 Apr 29, 2026
70eee88
feat: iterative execution for DateTimePartsArray (#7698)
joseph-isaacs Apr 30, 2026
e2062a7
feat: add builder execution path with AppendChild step (#7677)
joseph-isaacs Apr 30, 2026
e8c4ae9
Late materialization support for duckdb (#7721)
myrrc Apr 30, 2026
c73dbb2
Validity casting doesn't hide usage of execution context (#7710)
robert3005 Apr 30, 2026
40112f4
Actually wire the pluggable expression convertor (#7730)
AdamGS Apr 30, 2026
128ce5f
Rename fixed shape tensor module and id (#7733)
connortsui20 Apr 30, 2026
573c995
skip: remove parameter names from public api lock files (#7728)
joseph-isaacs Apr 30, 2026
6d2aee8
skip[fuzz]: allow generation of longer arrays (#7729)
joseph-isaacs Apr 30, 2026
deb7de0
Remove unused parameters from vtab functions (#7738)
myrrc Apr 30, 2026
cb9b138
Remove `PartialOrd` implementation for `ScalarValue` (#7742)
connortsui20 Apr 30, 2026
de36b35
Array operations fuzzer operates on smaller arrays (#7743)
robert3005 May 1, 2026
c4feed7
Remove duckdb object cache (#7739)
myrrc May 1, 2026
abb40ef
fix: reduce CUDA benchmark noise on codspeed (#7749)
0ax1 May 1, 2026
4c1ae92
Skip validity dispatch for non-nullable arrays (#7748)
palaska May 1, 2026
6b44b49
Merge upstream Vortex 0.70.0 into spiceai-52
sgrebnov May 14, 2026
e8869db
Merge pull request #47 from spiceai/sgrebnov/spiceai-52-vortex-0.70.0
lukekim May 14, 2026
792193e
Fix decimal casts to primitive arrays
lukekim May 18, 2026
618aee2
Address decimal cast PR feedback
lukekim May 18, 2026
904c65c
Merge retargeted base into decimal cast PR
lukekim May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 147 additions & 4 deletions vortex-array/src/arrays/decimal/compute/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,27 @@
// SPDX-FileCopyrightText: Copyright the Vortex contributors

use vortex_buffer::Buffer;
use vortex_buffer::BufferMut;
use vortex_error::VortexExpect;
use vortex_error::VortexResult;
use vortex_error::vortex_bail;
use vortex_error::vortex_err;
use vortex_error::vortex_panic;
use vortex_mask::AllOr;
use vortex_mask::Mask;

use crate::ArrayRef;
use crate::ExecutionCtx;
use crate::IntoArray;
use crate::arrays::DecimalArray;
use crate::arrays::DecimalVTable;
use crate::arrays::primitive::PrimitiveArray;
use crate::dtype::DType;
use crate::dtype::DecimalType;
use crate::dtype::NativeDecimalType;
use crate::dtype::NativePType;
use crate::match_each_decimal_value_type;
use crate::match_each_native_ptype;
use crate::scalar_fn::fns::cast::CastKernel;
use crate::vtable::ValidityHelper;

Expand All @@ -24,17 +32,39 @@ impl CastKernel for DecimalVTable {
dtype: &DType,
_ctx: &mut ExecutionCtx,
) -> VortexResult<Option<ArrayRef>> {
// Early return if not casting to decimal
let DType::Decimal(to_decimal_dtype, to_nullability) = dtype else {
return Ok(None);
};
let DType::Decimal(from_decimal_dtype, _) = array.dtype() else {
vortex_panic!(
"DecimalArray must have decimal dtype, got {:?}",
array.dtype()
);
};

if let DType::Primitive(to_ptype, to_nullability) = dtype {
let new_validity = array
.validity()
.clone()
.cast_nullability(*to_nullability, array.len())?;
let mask = new_validity.to_mask(array.len());

return Ok(Some(match_each_native_ptype!(*to_ptype, |T| {
match_each_decimal_value_type!(array.values_type(), |F| {
PrimitiveArray::new(
cast_decimal_buffer_to_primitive::<F, T>(
array.buffer::<F>(),
from_decimal_dtype.scale(),
mask,
)?,
new_validity,
)
.into_array()
})
})));
}

let DType::Decimal(to_decimal_dtype, to_nullability) = dtype else {
return Ok(None);
};

// Scale changes are not yet supported
if from_decimal_dtype.scale() != to_decimal_dtype.scale() {
vortex_bail!(
Expand Down Expand Up @@ -139,6 +169,57 @@ fn upcast_decimal_buffer<F: NativeDecimalType, T: NativeDecimalType>(from: Buffe
.collect()
}

fn cast_decimal_buffer_to_primitive<F, T>(
from: Buffer<F>,
scale: i8,
mask: Mask,
) -> VortexResult<Buffer<T>>
where
F: NativeDecimalType,
T: NativePType,
{
let scale_factor = 10_f64.powi(i32::from(scale));

match mask.bit_buffer() {
AllOr::All => {
let mut buffer = BufferMut::<T>::with_capacity(from.len());
for value in from {
let value = cast_decimal_value_to_primitive::<F, T>(value, scale_factor)?;
buffer.push(value);
}
Ok(buffer.freeze())
}
AllOr::None => Ok(Buffer::zeroed(from.len())),
AllOr::Some(validity) => {
let mut buffer = BufferMut::<T>::with_capacity(from.len());
for (value, valid) in from.iter().zip(validity.iter()) {
if valid {
let value = cast_decimal_value_to_primitive::<F, T>(*value, scale_factor)?;
buffer.push(value);
} else {
buffer.push(T::default());
}
}
Ok(buffer.freeze())
}
}
}

fn cast_decimal_value_to_primitive<F, T>(value: F, scale_factor: f64) -> VortexResult<T>
where
F: NativeDecimalType,
T: NativePType,
{
let value = value
.to_f64()
.ok_or_else(|| vortex_err!(Compute: "Failed to cast decimal value {value} to f64"))?
/ scale_factor;

T::from(value).ok_or_else(
|| vortex_err!(Compute: "Failed to cast decimal value {value} to {:?}", T::PTYPE),
)
}

#[cfg(test)]
mod tests {
use rstest::rstest;
Expand All @@ -154,6 +235,7 @@ mod tests {
use crate::dtype::DecimalDType;
use crate::dtype::DecimalType;
use crate::dtype::Nullability;
use crate::dtype::PType;
use crate::validity::Validity;
use crate::vtable::ValidityHelper;

Expand Down Expand Up @@ -282,6 +364,67 @@ mod tests {
assert_eq!(casted.values_type(), DecimalType::I128);
}

#[test]
fn cast_decimal_to_f64_applies_scale() {
let array = DecimalArray::new(
buffer![12345i64, -50, 0],
DecimalDType::new(15, 2),
Validity::NonNullable,
);
let dtype = DType::Primitive(PType::F64, Nullability::NonNullable);

let casted = array.to_array().cast(dtype.clone()).unwrap().to_primitive();

assert_eq!(casted.dtype(), &dtype);
assert_eq!(casted.validity(), &Validity::NonNullable);
let values = casted.as_slice::<f64>();
assert!((values[0] - 123.45).abs() < 0.000000000001);
assert_eq!(values[1], -0.5);
assert_eq!(values[2], 0.0);
}

#[test]
fn cast_nullable_decimal_to_nullable_f64_preserves_validity() {
let array = DecimalArray::from_option_iter(
[Some(12345i64), None, Some(-50)],
DecimalDType::new(15, 2),
);
let dtype = DType::Primitive(PType::F64, Nullability::Nullable);

let casted = array.to_array().cast(dtype.clone()).unwrap().to_primitive();

assert_eq!(casted.dtype(), &dtype);
let mask = casted.validity_mask().unwrap();
assert!(mask.value(0));
assert!(!mask.value(1));
assert!(mask.value(2));
let values = casted.as_slice::<f64>();
assert!((values[0] - 123.45).abs() < 0.000000000001);
assert_eq!(values[2], -0.5);
}

#[test]
fn cast_nullable_decimal_to_non_nullable_f64_fails() {
let array = DecimalArray::from_option_iter(
[Some(12345i64), None, Some(-50)],
DecimalDType::new(15, 2),
);
let dtype = DType::Primitive(PType::F64, Nullability::NonNullable);

let result = array
.to_array()
.cast(dtype)
.and_then(|a| a.to_canonical().map(|c| c.into_array()));

assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("Cannot cast array with invalid values to non-nullable type")
);
}

#[test]
fn cast_to_non_decimal_returns_err() {
let array = DecimalArray::new(
Expand Down
10 changes: 5 additions & 5 deletions vortex-array/src/scalar_fn/fns/list_contains/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,9 +280,10 @@ fn or_arrays_balanced(mut arrays: Vec<ArrayRef>) -> VortexResult<ArrayRef> {
arrays = next;
}

Ok(arrays
.pop()
.expect("or_arrays_balanced must be called with at least one array"))
let Some(array) = arrays.pop() else {
vortex_bail!("or_arrays_balanced must be called with at least one array");
};
Ok(array)
}

/// Returns a [`BoolArray`] where each bit represents if a list contains the scalar.
Expand Down Expand Up @@ -452,15 +453,14 @@ fn list_is_not_empty(
mod tests {
use std::sync::Arc;

use super::or_arrays_balanced;

use itertools::Itertools;
use rstest::rstest;
use vortex_buffer::BitBuffer;
use vortex_buffer::Buffer;
use vortex_utils::aliases::hash_map::HashMap;
use vortex_utils::aliases::hash_set::HashSet;

use super::or_arrays_balanced;
use crate::Array;
use crate::ArrayRef;
use crate::IntoArray;
Expand Down
1 change: 1 addition & 0 deletions vortex-datafusion/src/persistent/opener.rs
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,7 @@ mod tests {
use object_store::memory::InMemory;
use rstest::rstest;
use vortex::VortexSessionDefault;
use vortex::array::ArrayRef;
use vortex::array::arrow::FromArrowArray;
use vortex::buffer::Buffer;
use vortex::file::WriteOptionsSessionExt;
Expand Down
Loading