Repository navigation
concat_elements_utf8view panics with large buffer on 64bit machines #17857
Copy link
Copy link
Open
Labels
bugSomething isn't workingSomething isn't working
Description
Describe the bug
It is possible to cause a panic in Datafusion on 64-bit machines. Datafusion does not handle the panic caused by the underlying append_value method in the GenericByteViewBuilder. (See affected line)
See the To Reproduce section for the recursive concat query.
Few notes/thoughts:
- The panic is reproducible in the latest version of Data Fusion, but it was also there in the previous versions.
- The panic originates in
arrow-rsas on 64-bit systems,usizecan be up tou64::MAX, but everything is assumed to beu32::MAX. The panic is already declared in the doc of theappend_valuemethod, but never handled by the consumer (DataFusion). Is there a reason for that? - I understand the panic happens in
arrow-rs, but should datafusion handle the panic coming from Arrow? (e.g. in theappend_valuecall ofconcat_elements_utf8view) to prevent the panic from happening - Should datafusion limit somehow the
append_valuecalls to prevent the panic from happening?
cc @comphead
To Reproduce
Sample repository: https://github.com/samueleresca/datafusion-byte-view-builder-issue
- Run on a 64-bit machine.
- Include some dummy data (I attached an example):
ctx.register_parquet("users","./data/users_shorten.parquet", ParquetReadOptions::default()).await?;
- Run a recursive string concatenation query (see query in
main.rs) - Observe the panic
Expected behavior
- Should Data Fusion handle the panic?
- (maybe) restrictions on the builder view calls from datafusion
- (maybe) arrow-rs handling this more gracefully
Additional context
Truncated panic trace happening on my local machine:
thread 'tokio-runtime-worker' (38043518) panicked at /Users/samuele/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/arrow-array-56.2.0/src/builder/generic_bytes_view_builder.rs:310:46:
called `Result::unwrap()` on an `Err` value: TryFromIntError(())
stack backtrace:
0: __rustc::rust_begin_unwind
at /rustc/a454fccb02df9d361f1201b747c01257f58a8b37/library/std/src/panicking.rs:698:5
1: core::panicking::panic_fmt
at /rustc/a454fccb02df9d361f1201b747c01257f58a8b37/library/core/src/panicking.rs:75:14
2: core::result::unwrap_failed
at /rustc/a454fccb02df9d361f1201b747c01257f58a8b37/library/core/src/result.rs:1855:5
3: core::result::Result<T,E>::unwrap
at /Users/samuele/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/result.rs:1226:23
4: arrow_array::builder::generic_bytes_view_builder::GenericByteViewBuilder<T>::append_value
at /Users/samuele/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/arrow-array-56.2.0/src/builder/generic_bytes_view_builder.rs:310:46
5: datafusion_physical_expr::expressions::binary::kernels::concat_elements_utf8view
at /Users/samuele/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-expr-50.0.0/src/expressions/binary/kernels.rs:159:20
6: datafusion_physical_expr::expressions::binary::concat_elements
at /Users/samuele/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-expr-50.0.0/src/expressions/binary.rs:1078:40
7: datafusion_physical_expr::expressions::binary::BinaryExpr::evaluate_with_resolved_args
at /Users/samuele/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-expr-50.0.0/src/expressions/binary.rs:848:29
8: <datafusion_physical_expr::expressions::binary::BinaryExpr as datafusion_physical_expr_common::physical_expr::PhysicalExpr>::evaluate
at /Users/samuele/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-expr-50.0.0/src/expressions/binary.rs:479:14
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working
Activity
alamb commentedon Oct 1, 2025
Finding some way to check for string overflow sounds like a good idea to me. Panics aren't good in general
comphead commentedon Oct 1, 2025
arrow-rs method is supposed to panic in case of overflow
we probably can come up with safer variant in arrow-rs and use it in DF
samueleresca commentedon Oct 2, 2025
I'm taking a look at possible ways to fix this.
alamb commentedon Oct 2, 2025
the key will be to figure out how to avoid slowing things down -- one idea is to see if you can check for overflow once per batch (rather than once per row) 🤔
samueleresca commentedon Oct 4, 2025
Could you please double-check my understanding for the following? Can't be the capacity calculation replaced with
left.len()(assumingleft.len()andright.len()are the same)? As thewith_capacityrefer to the length of the views (or strings), not to the length of the bytes?datafusion/datafusion/physical-expr/src/expressions/binary/kernels.rs
Lines 136 to 146 in 182d5dc
samueleresca commentedon Oct 4, 2025
Do you mean something like adding a
try_append_valuein arrow-rs?samueleresca commentedon Oct 4, 2025
Do you mean checking the overflow at
left: StringViewArray combined right: StringViewArrayinstead of iterating in every single string of the view array?alamb commentedon Oct 6, 2025
Yeah, I was thinking something like this where you could figure out how much you could be extending the the array in one check
That being said, adding a
try_append_valuein arrow-rs seems very reasonable to me as wellFix `concat_elements_utf8view` capacity initialization. (#18003)
Adding `try_append_value` implementation to `ByteViewBuilder` (#8594)
Using `try_append_value` from arrow-rs 57.0.0 (#18313)
Update fork (#12)
Fix `concat_elements_utf8view` capacity initialization. (apache#18003)
Using `try_append_value` from arrow-rs 57.0.0 (apache#18313)
Using `try_append_value` from arrow-rs 57.0.0 (apache#18313)
Fix `concat_elements_utf8view` capacity initialization. (apache#18003)