Repository navigation
Closed
Labels
Description
Fuzzing Crash Report
Analysis
Crash Location: fuzz/fuzz_targets/array_ops.rs:109 (in assert_scalar_eq call)
Error Message:
called `Result::unwrap()` on an `Err` value: Scalar mismatch: expected decimal256(11889627148328415379143820023197151235308090443334808325992488287690709109156, precision=76, scale=75), got null in step 1
Stack Trace:
0: std::backtrace_rs::backtrace::libunwind::trace
1: std::backtrace_rs::backtrace::trace_unsynchronized
2: <std::backtrace::Backtrace>::create
3: assert_scalar_eq at ./fuzz/fuzz_targets/array_ops.rs:203:13
4: __libfuzzer_sys_run at ./fuzz/fuzz_targets/array_ops.rs:109:17
5: rust_fuzzer_test_input
Root Cause:
The fuzzer discovered a bug where the sum() operation on a ChunkedArray containing DecimalArrays returns null instead of the expected decimal sum value.
The issue occurs with:
- Array type: ChunkedArray containing DecimalArrays
- Decimal dtype:
Decimal(precision=76, scale=75, Nullable) - Values type: I256 (decimal256)
- Array length: 7 elements across 2 chunks (4 + 3 elements)
- Operation: Sum
- Expected result: A decimal256 scalar with value
11889627148328415379143820023197151235308090443334808325992488287690709109156 - Actual result: null scalar
The debug output shows:
- Chunk 1: DecimalArray with 4 elements, all valid (validity: AllValid)
- Chunk 2: DecimalArray with 3 elements, all valid (validity: AllValid)
Since all elements are valid (non-null), the sum operation should produce a valid decimal value, not null. This suggests a bug in the decimal sum implementation, possibly:
- Incorrect handling of chunked decimal arrays in the sum operation
- Loss of validity information when summing across chunks
- Overflow detection incorrectly returning null
- Decimal256 (I256) specific handling issues
Debug Output
FuzzArrayAction {
array: ChunkedArray {
dtype: Decimal(
DecimalDType {
precision: 76,
scale: 75,
},
Nullable,
),
len: 7,
chunk_offsets: PrimitiveArray {
dtype: Primitive(
U64,
NonNullable,
),
buffer: Buffer<u8> {
length: 24,
alignment: Alignment(
8,
),
as_slice: [0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, ...],
},
validity: NonNullable,
},
chunks: [
DecimalArray {
dtype: Decimal(
DecimalDType {
precision: 76,
scale: 75,
},
Nullable,
),
values: Buffer<u8> {
length: 128,
alignment: Alignment(
16,
),
as_slice: [3, 0, 0, 0, 0, 0, 0, 0, 0, 144, 236, 228, 101, 118, 200, 187, ...],
},
values_type: I256,
validity: AllValid,
},
DecimalArray {
dtype: Decimal(
DecimalDType {
precision: 76,
scale: 75,
},
Nullable,
),
values: Buffer<u8> {
length: 96,
alignment: Alignment(
16,
),
as_slice: [157, 151, 151, 151, 151, 151, 151, 151, 163, 79, 152, 30, 160, 222, 241, 221, ...],
},
values_type: I256,
validity: AllValid,
},
],
},
actions: [
(
Sum,
Scalar(
Scalar {
dtype: Decimal(
DecimalDType {
precision: 76,
scale: 75,
},
Nullable,
),
value: ScalarValue(
Decimal(
I256(
i256(
11889627148328415379143820023197151235308090443334808325992488287690709109156,
),
),
),
),
},
),
),
],
}
Summary
- Target:
array_ops - Crash File:
crash-53ca215f3a66dba3da06d3ff49a29e324e83d8bd - Branch: develop
- Commit: 91a62f3
- Crash Artifact: https://github.com/vortex-data/vortex/actions/runs/19791355227/artifacts/4714910600
Reproduction
-
Download the crash artifact:
- Direct download: https://github.com/vortex-data/vortex/actions/runs/19791355227/artifacts/4714910600
- Or find
operations-fuzzing-crash-artifactsat: https://github.com/vortex-data/vortex/actions/runs/19791355227 - Extract the zip file
-
Reproduce locally:
# The artifact contains array_ops/crash-53ca215f3a66dba3da06d3ff49a29e324e83d8bd
cargo +nightly fuzz run --sanitizer=none array_ops array_ops/crash-53ca215f3a66dba3da06d3ff49a29e324e83d8bd- Get full backtrace:
RUST_BACKTRACE=full cargo +nightly fuzz run --sanitizer=none array_ops array_ops/crash-53ca215f3a66dba3da06d3ff49a29e324e83d8bdAuto-created by fuzzing workflow with Claude analysis
Activity
github-actions commentedon Dec 7, 2025
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/src/array/mod.rs:assert_scalar_eqError Message:
Stack Trace:
Similarities to Original Issue:
Sumon decimal256 ChunkedArrayassert_scalar_eqDifferences:
Analysis: The presence of an empty chunk may be triggering the same underlying bug, or could indicate that empty chunks specifically cause the Sum operation to return null incorrectly. Both cases suggest the decimal sum implementation has issues with ChunkedArrays.
Debug Output
Occurrence Details
crash-b193ad5142630a4d57e48b9dae3ac0630761fd30Reproduction
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Dec 15, 2025
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/fuzz_targets/array_ops.rs:18(panic handler) →fuzz/src/array/mod.rs:701(assert_scalar_eq)Error Message:
Stack Trace:
Similarities to Original Issue:
Differences:
Note: These differences are purely due to different fuzzer-generated input data. The root cause is identical.
Debug Output
Occurrence Details
crash-2781aa34129bc6bd450b5f5197c1be667098b0a1Reproduction
Auto-detected by fuzzing workflow with Claude analysis
connortsui20 commentedon Dec 17, 2025
This is almost certainly has the same root problem as #5744 (comment).
github-actions commentedon Dec 18, 2025
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/src/array/mod.rs:587(inassert_scalar_eqcall)Error Message:
Stack Trace:
Similarities to Original Issue:
array_opsDecimal(precision=76, scale=75, Nullable)with I256 valuesDifferences:
Additional Context:
The debug output shows the fuzzer runs multiple operations in sequence:
This suggests the bug may be consistently present in the Sum operation for decimal256 ChunkedArrays, regardless of prior operations.
Debug Output
Occurrence Details
crash-c1ea8eff6747b5fb3f13e6e42c48e18a1609ae0dReproduction
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Dec 18, 2025
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/src/array/mod.rs:705(assert_scalar_eq) called fromfuzz/src/array/mod.rs:587(Sum operation)Error Message:
Stack Trace:
Similarities to Original Issue:
assert_scalar_eqat line 705Differences:
Note: These differences are purely due to different fuzzer-generated input data and operation sequences. The root cause appears identical.
Debug Output
Occurrence Details
crash-a9e1233784edc1e141075fdb2cf11a0a048b20dfReproduction
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Dec 18, 2025
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/src/array/mod.rs:705:assert_scalar_eqError Message:
Stack Trace:
Similarities to Original Issue:
Differences:
Debug Output
Occurrence Details
crash-35c8868faa4059721cc61d52636e364c9fa3585bReproduction
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Dec 19, 2025
Related Crash Detected
A similar crash was detected in the `array_ops` target.
Crash Details
Crash Location: `fuzz/src/array/mod.rs:587` (in Sum action, calling `assert_scalar_eq`)
Error Message:
```
Scalar mismatch: expected -7i64, got null in step 2
```
Stack Trace:
```
0: std::backtrace_rs::backtrace::libunwind::trace
1: std::backtrace_rs::backtrace::trace_unsynchronized
2: std::backtrace::Backtrace::create
3: <vortex_fuzz::error::VortexFuzzError as core::fmt::Display>::fmt
4: vortex_error::vortex_panic
5: run_fuzz_action (fuzz/src/array/mod.rs)
```
Similarities to Original Issue:
Differences:
This strongly suggests the same underlying bug in the Sum implementation for ChunkedArray, affecting multiple data types (not just decimal256).
Debug Output
```
FuzzArrayAction {
array: ChunkedArray {
dtype: Primitive(
I64,
Nullable,
),
len: 175,
chunk_offsets: PrimitiveArray {
dtype: Primitive(
U64,
NonNullable,
),
buffer: Buffer {
length: 24,
alignment: Alignment(
8,
),
as_slice: [0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, ...],
},
validity: NonNullable,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
chunks: [
PrimitiveArray {
dtype: Primitive(
I64,
Nullable,
),
buffer: Buffer {
length: 1400,
alignment: Alignment(
8,
),
as_slice: [4, 0, 0, 8, 0, 0, 244, 97, 255, 255, 255, 255, 255, 255, 255, 255, ...],
},
validity: AllValid,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
PrimitiveArray {
dtype: Primitive(
I64,
Nullable,
),
buffer: Buffer {
length: 0,
alignment: Alignment(
8,
),
as_slice: [],
},
validity: AllInvalid,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
],
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [],
},
},
},
},
actions: [
(
Sum,
Scalar(
Scalar {
dtype: Primitive(
I64,
Nullable,
),
value: ScalarValue(
Null,
),
},
),
),
(
Mask(
Values(
MaskValues {
buffer: BitBuffer {
buffer: Buffer {
length: 22,
alignment: Alignment(
1,
),
as_slice: [255, 255, 255, 29, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ...],
},
offset: 0,
len: 175,
},
indices: OnceLock(
,
),
slices: OnceLock(
,
),
true_count: 168,
density: 0.96,
},
),
),
Array(
PrimitiveArray {
dtype: Primitive(
I64,
Nullable,
),
buffer: Buffer {
length: 1400,
alignment: Alignment(
8,
),
as_slice: [4, 0, 0, 8, 0, 0, 244, 97, 255, 255, 255, 255, 255, 255, 255, 255, ...],
},
validity: Array(
BoolArray {
dtype: Bool(
NonNullable,
),
bits: BitBuffer {
buffer: Buffer {
length: 22,
alignment: Alignment(
1,
),
as_slice: [0, 0, 0, 226, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...],
},
offset: 0,
len: 175,
},
validity: NonNullable,
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [
(
Sum,
Exact(
ScalarValue(
Primitive(
U64(
7,
),
),
),
),
),
],
},
},
},
},
),
stats_set: ArrayStats {
inner: RwLock {
data: StatsSet {
values: [
(
Sum,
Exact(
ScalarValue(
Primitive(
I64(
-7,
),
),
),
),
),
],
},
},
},
},
),
),
(
Sum,
Scalar(
Scalar {
dtype: Primitive(
I64,
Nullable,
),
value: ScalarValue(
Primitive(
I64(
-7,
),
),
),
},
),
),
(
Sum,
Scalar(
Scalar {
dtype: Primitive(
I64,
Nullable,
),
value: ScalarValue(
Primitive(
I64(
-7,
),
),
),
},
),
),
],
}
```
Occurrence Details
Reproduction
```bash
cargo +nightly fuzz run -D --sanitizer=none array_ops array_ops/crash-0fffb8cb324640b5d243ed27f0884800eaa59e49 -- -rss_limit_mb=0
```
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Dec 21, 2025
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/src/array/mod.rs:587:assert_scalar_eqError Message:
Stack Trace:
Similarities to Original Issue:
Differences:
Debug Output
Occurrence Details
crash-aff805a79fba3c7708e5fdb76f5ba2a0532b55a1Reproduction
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Dec 23, 2025
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/fuzz_targets/array_ops.rs:18(assertion in fuzzer validation)Error Message:
Stack Trace:
Similarities to Original Issue:
Differences:
These differences likely indicate the same root cause manifesting under different operation sequences. The Mask operation may be affecting the array state in a way that triggers the same underlying sum bug.
Debug Output
Occurrence Details
crash-8995d88a12427f3d5dc0b83bbf4406a149558691Reproduction
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Jan 9, 2026
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/fuzz_targets/array_ops.rs:18(vortex_panic call)Error Message:
Stack Trace:
Similarities to Original Issue:
Differences:
These differences suggest the same root cause manifesting in different scenarios - likely the decimal sum implementation has issues handling ChunkedArrays with all-valid DecimalArray chunks, possibly related to:
Debug Output
Occurrence Details
crash-83fbc72197d0cf5aaeb63bd484a7792ae9149270Reproduction
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Jan 9, 2026
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/src/array/mod.rs:assert_scalar_eq(line 708-725, called fromrun_fuzz_actionline 600)Error Message:
Stack Trace:
Similarities to Original Issue:
assert_scalar_eqcalled from Sum action inrun_fuzz_actionDifferences:
19175742123380526396665589903927030405549308669851265837758445301729318804788vs original11889627148328415379143820023197151235308090443334808325992488287690709109156Note: These differences are superficial - same root cause manifesting with different fuzz-generated input data.
Debug Output
Occurrence Details
crash-2edd1f83f79a4c8e6da34f99d15fa3eb24d99d35Reproduction
Auto-detected by fuzzing workflow with Claude analysis
connortsui20 commentedon Jan 15, 2026
Closing in favor of #5820
github-actions commentedon Jan 17, 2026
Potential Regression Detected
A very similar crash was detected in the
array_opstarget on commita30298b(Jan 16, 2026), which is AFTER this issue was closed (Jan 15, 2026).Crash Details
Crash Location:
fuzz/src/array/mod.rs:740(assert_scalar_eq function)Error Message:
Stack Trace:
Similarities to Original Issue:
AllValidvalidity (no nulls in input)Differences:
Occurrence Details
crash-343129ee219a1621211668756ba60d4fd349a615Reproduction
Debug Output
Auto-detected by fuzzing workflow with Claude analysis
Recommendation: This appears to be either a regression of the fix that closed this issue, or the fix didn't fully address all cases. The fuzzer is performing multiple Sum operations sequentially (step 1 is the second sum), which may indicate the issue manifests after the first sum operation.
github-actions commentedon Jan 18, 2026
Related Crash Detected
A similar crash was detected in the
array_opstarget.Crash Details
Crash Location:
fuzz/fuzz_targets/array_ops.rs:18(invortex_panic!call within error handler)Error Message:
Stack Trace:
Similarities to Original Issue:
Differences:
Debug Output
Occurrence Details
crash-558ab62c7f3c335269d786e18eb474706eab3871Reproduction
Auto-detected by fuzzing workflow with Claude analysis
github-actions commentedon Jan 18, 2026
Regression Detected - Same Crash Occurred Again
A crash with the exact same root cause was detected in the
array_opstarget on a newer commit. This appears to be a regression since the issue was closed on 2026-01-15.Crash Details
Crash Location:
fuzz/src/array/mod.rs:740(inassert_scalar_eqfunction)Error Message:
Stack Trace:
Similarities to Original Issue:
Key Difference - This is a Regression:
Debug Output
Occurrence Details
crash-088e500a267b152507e37624cfe58d8cb0d3d83cReproduction
Recommendation: This issue should be reopened as the bug is still present on the current develop branch. The fix applied earlier may have been incomplete or a regression was introduced.
Auto-detected by fuzzing workflow with Claude analysis