Skip to content

Panic in approx_percentile_cont #19086

Description

@mpurins-coralogix

Describe the bug

In some cases ApproxPercentileAccumulator panics when hi arg happen to be lower than lo arg for TDigest::clamp

Example when this can happen:

❯ RUST_BACKTRACE=full datafusion-cli
DataFusion CLI v51.0.0
> select approx_percentile_cont(0.99) within group (order by value) from (select 15.699999988079073 as value from generate_series(1,215));
thread 'main' (22014348) panicked at /Users/mpurins/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/num/f64.rs:1413:9:
min > max, or either was NaN. min = 15.699999988079075, max = 15.699999988079073
stack backtrace:
0: 0x104fa171c - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h616cb314f2809ae5
1: 0x104fb291c - core::fmt::write::h18ff235c5756333a
2: 0x104f79a14 - std::io::Write::write_fmt::h08b80747d0efe8cf
3: 0x104f83020 - std::sys::backtrace::BacktraceLock::print::h96f00828e06745e0
4: 0x104f85ecc - std::panicking::default_hook::{{closure}}::h662f695cb162c645
5: 0x104f85d80 - std::panicking::default_hook::hdc5171bc2654f38e
6: 0x104f866c4 - std::panicking::panic_with_hook::hc216de099a2fe04e
7: 0x104f863ac - std::panicking::panic_handler::{{closure}}::hc0a7f90b1247e042
8: 0x104f83138 - std::sys::backtrace::__rust_end_short_backtrace::he22d41b92463e575
9: 0x104f71864 - __rustc[de0091b922c53d7e]::rust_begin_unwind
10: 0x1050517d0 - core::panicking::panic_fmt::h9ec18d20141b7425
11: 0x105050fdc - core::f64::<impl f64>::clamp::do_panic::runtime::h4890885dd7724ff7
12: 0x103901d94 - datafusion_functions_aggregate_common::tdigest::TDigest::estimate_quantile::h41f5b5cfa69805cf
13: 0x102e14294 - <datafusion_functions_aggregate::approx_percentile_cont::ApproxPercentileAccumulator as datafusion_expr_common::accumulator::Accumulator>::evaluate::hf3e2ad20d4d4a45c
14: 0x1028e4584 - <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold::h7ed9527332c74a7f
15: 0x10289e7c0 - <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter::he877276b543ed9f6
16: 0x102a4917c - core::iter::adapters::try_process::h89d89571eacd8dd6
17: 0x1028a12d8 - <futures_util::stream::unfold::Unfold<T,F,Fut> as futures_core::stream::Stream>::poll_next::h9e2e832f95d7f22d
18: 0x102a3b7b0 - <futures_util::stream::stream::fuse::Fuse<S> as futures_core::stream::Stream>::poll_next::he052d17a3074693c
19: 0x100ecee78 - datafusion_cli::exec::exec_and_print::{{closure}}::hb32729059f77c12c
20: 0x100ef81dc - <core::future::poll_fn::PollFn<F> as core::future::future::Future>::poll::h7a1d3bd4613693fb
21: 0x100e65534 - datafusion_cli::main_inner::{{closure}}::h9cd9904ca29a9554
22: 0x100e6dc90 - datafusion_cli::main::{{closure}}::ha77c2a6086bf3d00
23: 0x100eb8418 - tokio::runtime::park::CachedParkThread::block_on::ha1d171ac48cf85c5
24: 0x100e918b0 - tokio::runtime::runtime::Runtime::block_on::h7ee4d8f507b1e4da
25: 0x100eff95c - datafusion_cli::main::hf6585ab65f6712f1
26: 0x100dfe318 - std::sys::backtrace::__rust_begin_short_backtrace::h954b183a227018e8
27: 0x100e24d60 - std::rt::lang_start::{{closure}}::h6e080d9484671413
28: 0x104f7b624 - std::rt::lang_start_internal::h7e788da8c79e20dc
29: 0x100f3bc18 - _main

To Reproduce

Run following query in datafusion-cli

select approx_percentile_cont(0.99) within group (order by value) from (select 15.699999988079073 as value from generate_series(1,215));

Expected behavior

No response

Additional context

No response

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions