Skip to content

refactor(coalesce): justify safety and remove some unchecked indexing - #11782

Draft
alamb wants to merge 5 commits into
mainfrom
alamb/coalesce-copy-rows-safe
Draft

alamb wants to merge 5 commits into
mainfrom
alamb/coalesce-copy-rows-safe

Conversation

@alamb

@alamb alamb commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

arrow-rs follows the Rust Soundness Pledge: code must not be able to trigger undefined behavior using safe APIs.

However, the specialized InProgressArray implementations added in this PR have several safe functions whose memory safety depends on their callers:

A caller passing an out of range offset/len, or a filter longer than the source array, would read out of bounds through a safe API.

This came up while reviewing #11174, where the copy_rows pattern was cited as precedent. This PR removes the precedent.

What changes are included in this PR?

  • Fix soundness

Are these changes tested?

CI

Are there any significant user-facing changes?

No.

alamb and others added 2 commits October 21, 2026 15:38
copy_rows is a safe trait method with no documented precondition, but the primitive and byte view implementations used get_unchecked on offset..offset + len, relying on callers for memory safety. Use ordinary bounds-checked slicing instead (one check per call, not per element).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…llers

append_values_by_indices, append_values_by_slices and append_views_by_filter write through raw pointers using indices taken from a FilterPredicate, relying on the predicate matching the source array. Mark them unsafe fn with documented preconditions, and have the safe copy_rows_by_filter callers verify filter_len <= source len before calling them, returning an error otherwise.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@alamb alamb changed the title Remove unchecked indexing from InProgressArray::copy_rows Remove unchecked indexing from safe InProgressArray coalesce methods Oct 21, 2026
alamb and others added 3 commits October 21, 2026 16:48
@alamb

alamb commented Oct 21, 2026

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing alamb/coalesce-copy-rows-safe (209188f) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@github-actions github-actions Bot added the arrow-kernels Crates that transform arrow data (e.g. compute, cast) label Oct 21, 2026
@alamb alamb changed the title Remove unchecked indexing from safe InProgressArray coalesce methods refactor(coalesce): justify safety and remove some unchecked indexing Oct 21, 2026

@mbutrovich mbutrovich left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @alamb for cleaning this up.

One more spot outside the diff has the pattern this PR removes. append_views_and_copy_strings_inner is a safe function that calls get_unchecked on buffers at the buffer index and offset read from each view (byte_view.rs L352-L357). It's sound only when the caller passes views that are valid for buffers, which its one caller chain from copy_rows does today (L433).

Comment on lines +130 to 131
unsafe fn append_views_by_filter(&mut self, views: &[u128], filter: &FilterPredicate) {
let selected_count = filter.count();

@mbutrovich mbutrovich Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this check its precondition with a debug_assert?

Suggested change
unsafe fn append_views_by_filter(&mut self, views: &[u128], filter: &FilterPredicate) {
let selected_count = filter.count();
unsafe fn append_views_by_filter(&mut self, views: &[u128], filter: &FilterPredicate) {
debug_assert!(filter.filter_len() <= views.len());
let selected_count = filter.count();

I don't see this as a pattern in the repo currently (enforcing unsafe invariants with debug_assert) so more of a question than a suggestion.

Comment on lines +71 to +72
/// additional elements
unsafe fn append_values_by_indices(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about having append_values_by_indices and append_values_by_slices call current.reserve(selected_count) themselves, the way append_views_by_filter does (byte_view.rs L133)? That drops the capacity precondition from both # Safety sections, and the callers at L200 and L220 no longer need their own reserve.

};
Ok(())
}
// Other selection shapes reuse the generic copy_rows path.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should check_filter_len run once before the match? An all-true filter longer than the source takes this fallback to copy_rows. That was UB on main (L169), and this PR makes it a panic (L187). The other two arms and the byte view impl return the new error. A case for this shape in test_copy_rows_by_filter_rejects_filter_longer_than_source would cover it.

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark failed or incomplete (GKE) | trigger

Target: coalesce_kernels

Comparing alamb/coalesce-copy-rows-safe (209188f) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
shards: 1
Errors / missing shards
coalesce_kernels — shard 1/1: Benchmark for [this request](https://github.com/apache/arrow-rs/pull/11782#issuecomment-6326278145) hit the 7200s job deadline before finishing.

Benchmarks requested: `coalesce_kernels`

<details><summary>Kubernetes message</summary>

```
Job was active longer than specified deadline
```

</details>

---
[File an issue](https://github.com/adriangb/datafusion-benchmarking/issues) against this benchmark runner
Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-15xf2ybh-e962690e-6s4t

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

uname:

Linux bench-c6326278145-3738-smbdm 6.12.94+ #1 SMP Fri Aug 21 08:00:16 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Resource Usage

base (merge-base)

Metric Value
Wall time 5226.2s
Peak memory 84.2 MiB
Avg memory 45.8 MiB
CPU user 5110.7s
CPU sys 108.3s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid

Copy link
Copy Markdown
Contributor

run benchmark coalesce_kernels
env:
BENCH_FILTER: filter

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing alamb/coalesce-copy-rows-safe (209188f) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: filter
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing alamb/coalesce-copy-rows-safe (209188f) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: filter
shards: 1
Details
group                                                                                  base                                   changed
-----                                                                                  ----                                   -------
filter: mixed_binaryview (max_string_len=128), 8192, nulls: 0, selectivity: 0.001      1.00     14.8±0.06ms        ? ?/sec    1.03     15.3±0.19ms        ? ?/sec
filter: mixed_binaryview (max_string_len=128), 8192, nulls: 0, selectivity: 0.01       1.00      2.2±0.01ms        ? ?/sec    1.07      2.4±0.02ms        ? ?/sec
filter: mixed_binaryview (max_string_len=128), 8192, nulls: 0, selectivity: 0.1        1.00      2.2±0.02ms        ? ?/sec    1.01      2.2±0.01ms        ? ?/sec
filter: mixed_binaryview (max_string_len=128), 8192, nulls: 0, selectivity: 0.8        1.00  1648.0±26.67µs        ? ?/sec    1.18  1952.4±92.74µs        ? ?/sec
filter: mixed_binaryview (max_string_len=128), 8192, nulls: 0.1, selectivity: 0.001    1.00     24.1±0.13ms        ? ?/sec    1.03     24.9±0.21ms        ? ?/sec
filter: mixed_binaryview (max_string_len=128), 8192, nulls: 0.1, selectivity: 0.01     1.00      4.0±0.01ms        ? ?/sec    1.04      4.1±0.03ms        ? ?/sec
filter: mixed_binaryview (max_string_len=128), 8192, nulls: 0.1, selectivity: 0.1      1.00      2.6±0.02ms        ? ?/sec    1.03      2.7±0.02ms        ? ?/sec
filter: mixed_binaryview (max_string_len=128), 8192, nulls: 0.1, selectivity: 0.8      1.00    671.4±3.36µs        ? ?/sec    1.06    713.8±8.55µs        ? ?/sec
filter: mixed_binaryview (max_string_len=20), 8192, nulls: 0, selectivity: 0.001       1.00     13.7±0.07ms        ? ?/sec    1.03     14.0±0.18ms        ? ?/sec
filter: mixed_binaryview (max_string_len=20), 8192, nulls: 0, selectivity: 0.01        1.00      2.1±0.01ms        ? ?/sec    1.07      2.2±0.02ms        ? ?/sec
filter: mixed_binaryview (max_string_len=20), 8192, nulls: 0, selectivity: 0.1         1.00   1279.5±5.28µs        ? ?/sec    1.03   1314.0±8.83µs        ? ?/sec
filter: mixed_binaryview (max_string_len=20), 8192, nulls: 0, selectivity: 0.8         1.00   1034.7±7.90µs        ? ?/sec    1.10  1136.2±24.17µs        ? ?/sec
filter: mixed_binaryview (max_string_len=20), 8192, nulls: 0.1, selectivity: 0.001     1.00     22.9±0.15ms        ? ?/sec    1.04     23.8±0.20ms        ? ?/sec
filter: mixed_binaryview (max_string_len=20), 8192, nulls: 0.1, selectivity: 0.01      1.00      3.9±0.01ms        ? ?/sec    1.04      4.0±0.02ms        ? ?/sec
filter: mixed_binaryview (max_string_len=20), 8192, nulls: 0.1, selectivity: 0.1       1.00   1764.8±5.78µs        ? ?/sec    1.02  1797.8±15.11µs        ? ?/sec
filter: mixed_binaryview (max_string_len=20), 8192, nulls: 0.1, selectivity: 0.8       1.00    670.3±3.54µs        ? ?/sec    1.06    711.0±8.56µs        ? ?/sec
filter: mixed_binaryview (max_string_len=8), 8192, nulls: 0, selectivity: 0.001        1.00      8.5±0.06ms        ? ?/sec    1.08      9.1±0.17ms        ? ?/sec
filter: mixed_binaryview (max_string_len=8), 8192, nulls: 0, selectivity: 0.01         1.00   1794.8±5.77µs        ? ?/sec    1.14      2.0±0.02ms        ? ?/sec
filter: mixed_binaryview (max_string_len=8), 8192, nulls: 0, selectivity: 0.1          1.00    820.9±2.50µs        ? ?/sec    1.05    863.8±5.71µs        ? ?/sec
filter: mixed_binaryview (max_string_len=8), 8192, nulls: 0, selectivity: 0.8          1.00    426.2±2.54µs        ? ?/sec    1.13    482.3±7.10µs        ? ?/sec
filter: mixed_binaryview (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.001      1.00     18.7±0.11ms        ? ?/sec    1.02     19.1±0.15ms        ? ?/sec
filter: mixed_binaryview (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.01       1.00      3.6±0.01ms        ? ?/sec    1.03      3.8±0.02ms        ? ?/sec
filter: mixed_binaryview (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.1        1.00   1341.5±2.30µs        ? ?/sec    1.04   1394.1±6.68µs        ? ?/sec
filter: mixed_binaryview (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.8        1.00    544.6±2.78µs        ? ?/sec    1.07    583.6±8.14µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001                                 1.00    119.2±4.51ms        ? ?/sec    1.03    122.7±2.76ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01                                  1.00      4.7±0.01ms        ? ?/sec    1.02      4.8±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1                                   1.00      2.8±0.02ms        ? ?/sec    1.00      2.8±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8                                   1.00      2.3±0.02ms        ? ?/sec    1.05      2.4±0.05ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001                               1.00    167.7±3.56ms        ? ?/sec    1.05    176.3±1.78ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01                                1.02      5.8±0.01ms        ? ?/sec    1.00      5.7±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1                                 1.00      2.9±0.02ms        ? ?/sec    1.02      3.0±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8                                 1.00      2.3±0.02ms        ? ?/sec    1.04      2.3±0.02ms        ? ?/sec
filter: mixed_utf8, 8192, nulls: 0, selectivity: 0.001                                 1.00     36.6±0.25ms        ? ?/sec    1.01     37.0±0.29ms        ? ?/sec
filter: mixed_utf8, 8192, nulls: 0, selectivity: 0.01                                  1.00      7.3±0.01ms        ? ?/sec    1.02      7.4±0.01ms        ? ?/sec
filter: mixed_utf8, 8192, nulls: 0, selectivity: 0.1                                   1.00      4.2±0.04ms        ? ?/sec    1.01      4.3±0.03ms        ? ?/sec
filter: mixed_utf8, 8192, nulls: 0, selectivity: 0.8                                   1.00      3.0±0.14ms        ? ?/sec    1.30      3.9±0.17ms        ? ?/sec
filter: mixed_utf8, 8192, nulls: 0.1, selectivity: 0.001                               1.00     46.9±0.36ms        ? ?/sec    1.05     49.0±0.41ms        ? ?/sec
filter: mixed_utf8, 8192, nulls: 0.1, selectivity: 0.01                                1.00      8.8±0.02ms        ? ?/sec    1.01      8.9±0.03ms        ? ?/sec
filter: mixed_utf8, 8192, nulls: 0.1, selectivity: 0.1                                 1.00      4.6±0.02ms        ? ?/sec    1.04      4.7±0.07ms        ? ?/sec
filter: mixed_utf8, 8192, nulls: 0.1, selectivity: 0.8                                 1.00      2.9±0.12ms        ? ?/sec    1.18      3.5±0.11ms        ? ?/sec
filter: mixed_utf8view (max_string_len=128), 8192, nulls: 0, selectivity: 0.001        1.00     14.8±0.07ms        ? ?/sec    1.02     15.1±0.16ms        ? ?/sec
filter: mixed_utf8view (max_string_len=128), 8192, nulls: 0, selectivity: 0.01         1.00      2.2±0.01ms        ? ?/sec    1.05      2.3±0.02ms        ? ?/sec
filter: mixed_utf8view (max_string_len=128), 8192, nulls: 0, selectivity: 0.1          1.00      2.2±0.02ms        ? ?/sec    1.01      2.2±0.01ms        ? ?/sec
filter: mixed_utf8view (max_string_len=128), 8192, nulls: 0, selectivity: 0.8          1.00  1410.4±25.74µs        ? ?/sec    1.26  1771.9±102.38µs        ? ?/sec
filter: mixed_utf8view (max_string_len=128), 8192, nulls: 0.1, selectivity: 0.001      1.00     23.8±0.14ms        ? ?/sec    1.02     24.4±0.18ms        ? ?/sec
filter: mixed_utf8view (max_string_len=128), 8192, nulls: 0.1, selectivity: 0.01       1.00      4.0±0.01ms        ? ?/sec    1.03      4.1±0.02ms        ? ?/sec
filter: mixed_utf8view (max_string_len=128), 8192, nulls: 0.1, selectivity: 0.1        1.00      2.6±0.01ms        ? ?/sec    1.04      2.7±0.04ms        ? ?/sec
filter: mixed_utf8view (max_string_len=128), 8192, nulls: 0.1, selectivity: 0.8        1.00    671.5±3.61µs        ? ?/sec    1.05    705.8±9.94µs        ? ?/sec
filter: mixed_utf8view (max_string_len=20), 8192, nulls: 0, selectivity: 0.001         1.00     13.1±0.06ms        ? ?/sec    1.02     13.4±0.16ms        ? ?/sec
filter: mixed_utf8view (max_string_len=20), 8192, nulls: 0, selectivity: 0.01          1.00      2.1±0.01ms        ? ?/sec    1.05      2.2±0.02ms        ? ?/sec
filter: mixed_utf8view (max_string_len=20), 8192, nulls: 0, selectivity: 0.1           1.00   1231.9±2.70µs        ? ?/sec    1.03   1264.3±4.58µs        ? ?/sec
filter: mixed_utf8view (max_string_len=20), 8192, nulls: 0, selectivity: 0.8           1.00    551.2±3.18µs        ? ?/sec    1.07    590.2±9.02µs        ? ?/sec
filter: mixed_utf8view (max_string_len=20), 8192, nulls: 0.1, selectivity: 0.001       1.00     22.5±0.15ms        ? ?/sec    1.03     23.2±0.18ms        ? ?/sec
filter: mixed_utf8view (max_string_len=20), 8192, nulls: 0.1, selectivity: 0.01        1.00      3.9±0.01ms        ? ?/sec    1.02      4.0±0.02ms        ? ?/sec
filter: mixed_utf8view (max_string_len=20), 8192, nulls: 0.1, selectivity: 0.1         1.00  1734.3±33.54µs        ? ?/sec    1.03  1794.8±17.19µs        ? ?/sec
filter: mixed_utf8view (max_string_len=20), 8192, nulls: 0.1, selectivity: 0.8         1.00    673.7±4.88µs        ? ?/sec    1.04    700.1±8.43µs        ? ?/sec
filter: mixed_utf8view (max_string_len=8), 8192, nulls: 0, selectivity: 0.001          1.00      8.6±0.06ms        ? ?/sec    1.03      8.9±0.18ms        ? ?/sec
filter: mixed_utf8view (max_string_len=8), 8192, nulls: 0, selectivity: 0.01           1.00   1793.3±6.53µs        ? ?/sec    1.13      2.0±0.02ms        ? ?/sec
filter: mixed_utf8view (max_string_len=8), 8192, nulls: 0, selectivity: 0.1            1.00    823.1±2.26µs        ? ?/sec    1.04    859.8±1.61µs        ? ?/sec
filter: mixed_utf8view (max_string_len=8), 8192, nulls: 0, selectivity: 0.8            1.00    423.0±2.11µs        ? ?/sec    1.13    478.9±8.09µs        ? ?/sec
filter: mixed_utf8view (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.001        1.00     19.3±0.10ms        ? ?/sec    1.01     19.5±0.16ms        ? ?/sec
filter: mixed_utf8view (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.01         1.00      3.6±0.01ms        ? ?/sec    1.03      3.7±0.01ms        ? ?/sec
filter: mixed_utf8view (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.1          1.00   1337.7±3.02µs        ? ?/sec    1.04   1394.2±5.46µs        ? ?/sec
filter: mixed_utf8view (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.8          1.00    545.4±3.06µs        ? ?/sec    1.04    568.3±4.67µs        ? ?/sec
filter: primitive, 8192, nulls: 0, selectivity: 0.001                                  1.00     21.6±0.13ms        ? ?/sec    1.05     22.7±0.45ms        ? ?/sec
filter: primitive, 8192, nulls: 0, selectivity: 0.01                                   1.00      4.6±0.02ms        ? ?/sec    1.10      5.0±0.05ms        ? ?/sec
filter: primitive, 8192, nulls: 0, selectivity: 0.1                                    1.00   1726.3±3.91µs        ? ?/sec    1.07   1841.6±3.19µs        ? ?/sec
filter: primitive, 8192, nulls: 0, selectivity: 0.8                                    1.00    975.7±2.06µs        ? ?/sec    1.01    985.5±2.18µs        ? ?/sec
filter: primitive, 8192, nulls: 0.1, selectivity: 0.001                                1.00     46.8±0.20ms        ? ?/sec    1.03     48.2±0.45ms        ? ?/sec
filter: primitive, 8192, nulls: 0.1, selectivity: 0.01                                 1.00      9.0±0.05ms        ? ?/sec    1.02      9.2±0.07ms        ? ?/sec
filter: primitive, 8192, nulls: 0.1, selectivity: 0.1                                  1.00      3.0±0.01ms        ? ?/sec    1.02      3.1±0.01ms        ? ?/sec
filter: primitive, 8192, nulls: 0.1, selectivity: 0.8                                  1.00   1274.5±3.10µs        ? ?/sec    1.02   1304.8±6.94µs        ? ?/sec
filter: single_binary, 8192, nulls: 0, selectivity: 0.001                              1.00     61.7±0.33ms        ? ?/sec    1.00     61.8±0.26ms        ? ?/sec
filter: single_binary, 8192, nulls: 0, selectivity: 0.01                               1.00      7.6±0.01ms        ? ?/sec    1.01      7.7±0.03ms        ? ?/sec
filter: single_binary, 8192, nulls: 0, selectivity: 0.1                                1.00      3.8±0.06ms        ? ?/sec    1.01      3.8±0.08ms        ? ?/sec
filter: single_binary, 8192, nulls: 0, selectivity: 0.8                                1.00  1797.6±15.24µs        ? ?/sec    1.04  1865.2±19.08µs        ? ?/sec
filter: single_binary, 8192, nulls: 0.1, selectivity: 0.001                            1.00     77.5±0.22ms        ? ?/sec    1.00     77.7±0.31ms        ? ?/sec
filter: single_binary, 8192, nulls: 0.1, selectivity: 0.01                             1.00      9.4±0.01ms        ? ?/sec    1.00      9.4±0.04ms        ? ?/sec
filter: single_binary, 8192, nulls: 0.1, selectivity: 0.1                              1.00      4.1±0.06ms        ? ?/sec    1.02      4.2±0.07ms        ? ?/sec
filter: single_binary, 8192, nulls: 0.1, selectivity: 0.8                              1.00  1872.6±14.63µs        ? ?/sec    1.03  1928.0±18.77µs        ? ?/sec
filter: single_binaryview (max_string_len=8), 8192, nulls: 0, selectivity: 0.001       1.00     20.2±0.08ms        ? ?/sec    1.02     20.6±0.54ms        ? ?/sec
filter: single_binaryview (max_string_len=8), 8192, nulls: 0, selectivity: 0.01        1.00   1973.3±7.00µs        ? ?/sec    1.01  1989.3±27.89µs        ? ?/sec
filter: single_binaryview (max_string_len=8), 8192, nulls: 0, selectivity: 0.1         1.00    696.8±1.96µs        ? ?/sec    1.05    731.6±3.15µs        ? ?/sec
filter: single_binaryview (max_string_len=8), 8192, nulls: 0, selectivity: 0.8         1.00    414.6±0.57µs        ? ?/sec    1.04    429.7±1.55µs        ? ?/sec
filter: single_binaryview (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.001     1.00     30.9±0.13ms        ? ?/sec    1.02     31.4±0.49ms        ? ?/sec
filter: single_binaryview (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.01      1.02      3.4±0.02ms        ? ?/sec    1.00      3.3±0.03ms        ? ?/sec
filter: single_binaryview (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.1       1.00   1056.9±1.49µs        ? ?/sec    1.05   1106.2±3.40µs        ? ?/sec
filter: single_binaryview (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.8       1.00    513.4±0.82µs        ? ?/sec    1.01    520.4±1.46µs        ? ?/sec
filter: single_binaryview, 8192, nulls: 0, selectivity: 0.001                          1.00     33.2±0.08ms        ? ?/sec    1.03     34.3±0.44ms        ? ?/sec
filter: single_binaryview, 8192, nulls: 0, selectivity: 0.01                           1.00      3.5±0.01ms        ? ?/sec    1.04      3.6±0.02ms        ? ?/sec
filter: single_binaryview, 8192, nulls: 0, selectivity: 0.1                            1.01   1948.2±5.33µs        ? ?/sec    1.00   1935.8±5.39µs        ? ?/sec
filter: single_binaryview, 8192, nulls: 0, selectivity: 0.8                            1.00    740.4±1.03µs        ? ?/sec    1.00    739.5±2.74µs        ? ?/sec
filter: single_binaryview, 8192, nulls: 0.1, selectivity: 0.001                        1.00     45.2±0.21ms        ? ?/sec    1.02     46.3±0.28ms        ? ?/sec
filter: single_binaryview, 8192, nulls: 0.1, selectivity: 0.01                         1.00      4.8±0.02ms        ? ?/sec    1.03      4.9±0.02ms        ? ?/sec
filter: single_binaryview, 8192, nulls: 0.1, selectivity: 0.1                          1.00      2.3±0.01ms        ? ?/sec    1.01      2.3±0.01ms        ? ?/sec
filter: single_binaryview, 8192, nulls: 0.1, selectivity: 0.8                          1.00    836.9±1.21µs        ? ?/sec    1.00    838.3±1.70µs        ? ?/sec
filter: single_boolean, 8192, nulls: 0, selectivity: 0.001                             1.00     34.0±0.25ms        ? ?/sec    1.02     34.6±0.29ms        ? ?/sec
filter: single_boolean, 8192, nulls: 0, selectivity: 0.01                              1.02      3.1±0.02ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
filter: single_boolean, 8192, nulls: 0, selectivity: 0.1                               1.00    544.4±1.68µs        ? ?/sec    1.01    547.3±1.60µs        ? ?/sec
filter: single_boolean, 8192, nulls: 0, selectivity: 0.8                               1.00    113.9±0.21µs        ? ?/sec    1.00    114.2±0.30µs        ? ?/sec
filter: single_boolean, 8192, nulls: 0.1, selectivity: 0.001                           1.00     47.0±0.18ms        ? ?/sec    1.01     47.4±0.14ms        ? ?/sec
filter: single_boolean, 8192, nulls: 0.1, selectivity: 0.01                            1.04      4.8±0.02ms        ? ?/sec    1.00      4.6±0.01ms        ? ?/sec
filter: single_boolean, 8192, nulls: 0.1, selectivity: 0.1                             1.01    947.1±1.40µs        ? ?/sec    1.00    940.5±1.34µs        ? ?/sec
filter: single_boolean, 8192, nulls: 0.1, selectivity: 0.8                             1.00    203.1±0.14µs        ? ?/sec    1.00    203.1±0.26µs        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001                                1.00   404.6±10.86ms        ? ?/sec    1.03   418.7±11.19ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01                                 1.03     10.5±0.04ms        ? ?/sec    1.00     10.2±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1                                  1.00      5.9±0.06ms        ? ?/sec    1.01      5.9±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8                                  1.00      5.2±0.03ms        ? ?/sec    1.04      5.4±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001                              1.00    392.1±8.01ms        ? ?/sec    1.08    423.3±5.72ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01                               1.02     10.8±0.03ms        ? ?/sec    1.00     10.6±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1                                1.00      5.9±0.05ms        ? ?/sec    1.01      5.9±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8                                1.00      5.0±0.03ms        ? ?/sec    1.03      5.2±0.04ms        ? ?/sec
filter: single_fsb16, 8192, nulls: 0, selectivity: 0.001                               1.00     37.0±0.23ms        ? ?/sec    1.02     37.7±0.28ms        ? ?/sec
filter: single_fsb16, 8192, nulls: 0, selectivity: 0.01                                1.04      4.2±0.05ms        ? ?/sec    1.00      4.0±0.02ms        ? ?/sec
filter: single_fsb16, 8192, nulls: 0, selectivity: 0.1                                 1.10   1140.8±2.42µs        ? ?/sec    1.00   1038.4±2.54µs        ? ?/sec
filter: single_fsb16, 8192, nulls: 0, selectivity: 0.8                                 1.00    437.4±0.56µs        ? ?/sec    1.02    444.1±1.55µs        ? ?/sec
filter: single_fsb16, 8192, nulls: 0.1, selectivity: 0.001                             1.00     49.5±0.22ms        ? ?/sec    1.02     50.6±0.36ms        ? ?/sec
filter: single_fsb16, 8192, nulls: 0.1, selectivity: 0.01                              1.03      5.6±0.02ms        ? ?/sec    1.00      5.5±0.03ms        ? ?/sec
filter: single_fsb16, 8192, nulls: 0.1, selectivity: 0.1                               1.05   1516.4±2.18µs        ? ?/sec    1.00   1446.7±2.97µs        ? ?/sec
filter: single_fsb16, 8192, nulls: 0.1, selectivity: 0.8                               1.00    539.2±0.51µs        ? ?/sec    1.01    542.7±2.55µs        ? ?/sec
filter: single_fsb32, 8192, nulls: 0, selectivity: 0.001                               1.00     37.8±0.29ms        ? ?/sec    1.01     38.3±0.29ms        ? ?/sec
filter: single_fsb32, 8192, nulls: 0, selectivity: 0.01                                1.07      4.1±0.03ms        ? ?/sec    1.00      3.9±0.01ms        ? ?/sec
filter: single_fsb32, 8192, nulls: 0, selectivity: 0.1                                 1.07   1335.0±2.43µs        ? ?/sec    1.00   1246.5±5.07µs        ? ?/sec
filter: single_fsb32, 8192, nulls: 0, selectivity: 0.8                                 1.00    652.6±5.07µs        ? ?/sec    1.02    668.1±6.42µs        ? ?/sec
filter: single_fsb32, 8192, nulls: 0.1, selectivity: 0.001                             1.00     50.2±0.31ms        ? ?/sec    1.03     51.7±0.34ms        ? ?/sec
filter: single_fsb32, 8192, nulls: 0.1, selectivity: 0.01                              1.02      5.6±0.01ms        ? ?/sec    1.00      5.5±0.03ms        ? ?/sec
filter: single_fsb32, 8192, nulls: 0.1, selectivity: 0.1                               1.05   1747.0±3.40µs        ? ?/sec    1.00   1668.9±3.71µs        ? ?/sec
filter: single_fsb32, 8192, nulls: 0.1, selectivity: 0.8                               1.00    755.6±6.30µs        ? ?/sec    1.01   766.4±10.68µs        ? ?/sec
filter: single_fsl4, 8192, nulls: 0, selectivity: 0.001                                1.00    118.0±0.40ms        ? ?/sec    1.01    119.2±0.28ms        ? ?/sec
filter: single_fsl4, 8192, nulls: 0, selectivity: 0.01                                 1.00     15.7±0.03ms        ? ?/sec    1.00     15.7±0.03ms        ? ?/sec
filter: single_fsl4, 8192, nulls: 0, selectivity: 0.1                                  1.00      6.7±0.02ms        ? ?/sec    1.01      6.8±0.01ms        ? ?/sec
filter: single_fsl4, 8192, nulls: 0, selectivity: 0.8                                  1.00   1494.5±5.91µs        ? ?/sec    1.00   1494.0±3.87µs        ? ?/sec
filter: single_fsl4, 8192, nulls: 0.1, selectivity: 0.001                              1.00    143.1±0.38ms        ? ?/sec    1.02    145.9±0.40ms        ? ?/sec
filter: single_fsl4, 8192, nulls: 0.1, selectivity: 0.01                               1.00     22.3±0.02ms        ? ?/sec    1.01     22.5±0.08ms        ? ?/sec
filter: single_fsl4, 8192, nulls: 0.1, selectivity: 0.1                                1.00     10.9±0.02ms        ? ?/sec    1.00     11.0±0.03ms        ? ?/sec
filter: single_fsl4, 8192, nulls: 0.1, selectivity: 0.8                                1.02      3.8±0.03ms        ? ?/sec    1.00      3.7±0.02ms        ? ?/sec
filter: single_list, 8192, nulls: 0, selectivity: 0.001                                1.00    151.9±0.52ms        ? ?/sec    1.00    152.5±0.62ms        ? ?/sec
filter: single_list, 8192, nulls: 0, selectivity: 0.01                                 1.00     21.5±0.04ms        ? ?/sec    1.00     21.6±0.04ms        ? ?/sec
filter: single_list, 8192, nulls: 0, selectivity: 0.1                                  1.00      9.9±0.02ms        ? ?/sec    1.00      9.9±0.04ms        ? ?/sec
filter: single_list, 8192, nulls: 0, selectivity: 0.8                                  1.01      3.5±0.01ms        ? ?/sec    1.00      3.4±0.01ms        ? ?/sec
filter: single_list, 8192, nulls: 0.1, selectivity: 0.001                              1.00    196.9±0.58ms        ? ?/sec    1.03    202.5±1.33ms        ? ?/sec
filter: single_list, 8192, nulls: 0.1, selectivity: 0.01                               1.00     30.1±0.03ms        ? ?/sec    1.00     30.1±0.05ms        ? ?/sec
filter: single_list, 8192, nulls: 0.1, selectivity: 0.1                                1.03     17.7±0.05ms        ? ?/sec    1.00     17.2±0.04ms        ? ?/sec
filter: single_list, 8192, nulls: 0.1, selectivity: 0.8                                1.00      6.5±0.04ms        ? ?/sec    1.00      6.5±0.03ms        ? ?/sec
filter: single_ree, 8192, nulls: 0, selectivity: 0.001                                 1.00    369.0±2.28ms        ? ?/sec    1.00    369.7±2.50ms        ? ?/sec
filter: single_ree, 8192, nulls: 0, selectivity: 0.01                                  1.00     27.6±0.02ms        ? ?/sec    1.00     27.5±0.01ms        ? ?/sec
filter: single_ree, 8192, nulls: 0, selectivity: 0.1                                   1.00      2.7±0.00ms        ? ?/sec    1.00      2.7±0.00ms        ? ?/sec
filter: single_ree, 8192, nulls: 0, selectivity: 0.8                                   1.00    329.0±0.71µs        ? ?/sec    1.01    331.1±0.79µs        ? ?/sec
filter: single_ree, 8192, nulls: 0.1, selectivity: 0.001                               1.00    374.1±2.18ms        ? ?/sec    1.02    380.6±0.71ms        ? ?/sec
filter: single_ree, 8192, nulls: 0.1, selectivity: 0.01                                1.00     28.3±0.02ms        ? ?/sec    1.00     28.4±0.02ms        ? ?/sec
filter: single_ree, 8192, nulls: 0.1, selectivity: 0.1                                 1.00      2.8±0.00ms        ? ?/sec    1.00      2.8±0.00ms        ? ?/sec
filter: single_ree, 8192, nulls: 0.1, selectivity: 0.8                                 1.00    339.3±0.71µs        ? ?/sec    1.00    339.8±0.80µs        ? ?/sec
filter: single_utf8, 8192, nulls: 0, selectivity: 0.001                                1.00     73.5±0.39ms        ? ?/sec    1.01     74.0±0.43ms        ? ?/sec
filter: single_utf8, 8192, nulls: 0, selectivity: 0.01                                 1.00     16.1±0.04ms        ? ?/sec    1.04     16.7±0.06ms        ? ?/sec
filter: single_utf8, 8192, nulls: 0, selectivity: 0.1                                  1.02     10.4±0.07ms        ? ?/sec    1.00     10.1±0.08ms        ? ?/sec
filter: single_utf8, 8192, nulls: 0, selectivity: 0.8                                  1.00      6.7±0.29ms        ? ?/sec    1.07      7.1±0.31ms        ? ?/sec
filter: single_utf8, 8192, nulls: 0.1, selectivity: 0.001                              1.00     84.9±0.46ms        ? ?/sec    1.03     87.1±1.06ms        ? ?/sec
filter: single_utf8, 8192, nulls: 0.1, selectivity: 0.01                               1.03     16.6±0.11ms        ? ?/sec    1.00     16.1±0.07ms        ? ?/sec
filter: single_utf8, 8192, nulls: 0.1, selectivity: 0.1                                1.00     10.3±0.34ms        ? ?/sec    1.00     10.3±0.10ms        ? ?/sec
filter: single_utf8, 8192, nulls: 0.1, selectivity: 0.8                                1.00      6.1±0.28ms        ? ?/sec    1.27      7.8±0.48ms        ? ?/sec
filter: single_utf8view (max_string_len=8), 8192, nulls: 0, selectivity: 0.001         1.00     20.2±0.07ms        ? ?/sec    1.02     20.5±0.53ms        ? ?/sec
filter: single_utf8view (max_string_len=8), 8192, nulls: 0, selectivity: 0.01          1.00   1972.8±7.33µs        ? ?/sec    1.00  1974.4±28.64µs        ? ?/sec
filter: single_utf8view (max_string_len=8), 8192, nulls: 0, selectivity: 0.1           1.00    693.6±1.88µs        ? ?/sec    1.02    708.6±2.82µs        ? ?/sec
filter: single_utf8view (max_string_len=8), 8192, nulls: 0, selectivity: 0.8           1.00    414.3±0.74µs        ? ?/sec    1.03    424.8±1.40µs        ? ?/sec
filter: single_utf8view (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.001       1.00     32.1±0.16ms        ? ?/sec    1.01     32.5±0.44ms        ? ?/sec
filter: single_utf8view (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.01        1.03      3.4±0.02ms        ? ?/sec    1.00      3.3±0.03ms        ? ?/sec
filter: single_utf8view (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.1         1.00   1069.2±1.98µs        ? ?/sec    1.05   1124.1±3.59µs        ? ?/sec
filter: single_utf8view (max_string_len=8), 8192, nulls: 0.1, selectivity: 0.8         1.00    513.5±0.75µs        ? ?/sec    1.00    515.1±1.39µs        ? ?/sec
filter: single_utf8view, 8192, nulls: 0, selectivity: 0.001                            1.00     32.9±0.13ms        ? ?/sec    1.03     33.8±0.40ms        ? ?/sec
filter: single_utf8view, 8192, nulls: 0, selectivity: 0.01                             1.00      3.5±0.01ms        ? ?/sec    1.03      3.6±0.02ms        ? ?/sec
filter: single_utf8view, 8192, nulls: 0, selectivity: 0.1                              1.00   1940.7±4.83µs        ? ?/sec    1.01   1950.6±4.51µs        ? ?/sec
filter: single_utf8view, 8192, nulls: 0, selectivity: 0.8                              1.00    738.0±0.73µs        ? ?/sec    1.00    734.3±1.91µs        ? ?/sec
filter: single_utf8view, 8192, nulls: 0.1, selectivity: 0.001                          1.00     43.6±0.12ms        ? ?/sec    1.02     44.5±0.44ms        ? ?/sec
filter: single_utf8view, 8192, nulls: 0.1, selectivity: 0.01                           1.00      4.8±0.04ms        ? ?/sec    1.03      4.9±0.02ms        ? ?/sec
filter: single_utf8view, 8192, nulls: 0.1, selectivity: 0.1                            1.01      2.3±0.01ms        ? ?/sec    1.00      2.3±0.01ms        ? ?/sec
filter: single_utf8view, 8192, nulls: 0.1, selectivity: 0.8                            1.00    836.0±1.15µs        ? ?/sec    1.01    844.4±2.91µs        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-vaa38lox-de4a402e-cxsz

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

uname:

Linux bench-c6332488641-3742-7zgdg 6.12.94+ #1 SMP Fri Aug 21 08:00:16 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Resource Usage

base (merge-base)

Metric Value
Wall time 2110.5s
Peak memory 63.8 MiB
Avg memory 21.6 MiB
CPU user 2003.1s
CPU sys 101.2s
Peak spill 0 B

branch

Metric Value
Wall time 2125.5s
Peak memory 61.9 MiB
Avg memory 21.5 MiB
CPU user 2013.8s
CPU sys 106.8s
Peak spill 0 B

File an issue against this benchmark runner

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arrow-kernels Crates that transform arrow data (e.g. compute, cast)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants