90degs2infty opened a new issue, #16736:
URL: https://github.com/apache/datafusion/issues/16736

   ### Describe the bug
   
   I'm trying to implement a "poor-man's" `any` function to check for rows 
matching a predicate in a dataframe:
   
   ```rust
   async fn any(df: DataFrame, predicate: Expr) -> Result<bool, 
DataFusionError> {
       Ok(df.filter(predicate)?.limit(0, Some(1))?.count().await? > 0)
   }
   ```
   
   Depending on the predicate, this sometimes causes a panic because of an 
`attempt to subtract with overflow` somewhere in `interval_arithmetic.rs` in 
`datafusion-expr-common`:
   
   ```rust
   #[tokio::main]
   async fn main() -> Result<(), DataFusionError> {
       let ctx = SessionContext::new();
       let df = ctx
           .read_parquet("value.parquet", ParquetReadOptions::new())
           .await?;
       df.clone().describe().await?.show().await?;
   
       // Works - comparing against negative 0
       let flag = any(df.clone(), col("value").lt(lit(-0f64))).await?;
       println!("{flag}");
   
       // Panics - comparing against positive 0
       let flag = any(df, col("value").lt(lit(0f64))).await?;
       println!("{flag}");
   
       Ok(())
   }
   ```
   
   `value.parquet` is a file containing a single column (`value` of datatype 
`f64`, non-nullable) with a bunch of `0.0` and `1.0` rows.
   
   Find the backtrace below.
   
   ### To Reproduce
   
   I've set up a minimal example to reproduce the bug at 
https://github.com/90degs2infty/datafusion-bug
   
   ### Expected behavior
   
   No panics. `any` should simply output `true` or `false`.
   
   ### Additional context
   
   Backtrace:
   
   ```console
   > RUST_BACKTRACE=1 cargo run
       Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.13s
        Running `target/debug/datafusion_bug`
   +------------+---------------------+
   | describe   | value               |
   +------------+---------------------+
   | count      | 1736.0              |
   | null_count | 0.0                 |
   | mean       | 0.46543778801843316 |
   | std        | 0.4989477499924608  |
   | min        | -0.0                |
   | max        | 1.0                 |
   | median     | 0.0                 |
   +------------+---------------------+
   false
   
   thread 'main' panicked at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-expr-common-48.0.1/src/interval_arithmetic.rs:921:33:
   attempt to subtract with overflow
   stack backtrace:
      0: rust_begin_unwind
                at 
/rustc/05f9846f893b09a1be1fc8560e33fc3c815cfecb/library/std/src/panicking.rs:695:5
      1: core::panicking::panic_fmt
                at 
/rustc/05f9846f893b09a1be1fc8560e33fc3c815cfecb/library/core/src/panicking.rs:75:14
      2: core::panicking::panic_const::panic_const_sub_overflow
                at 
/rustc/05f9846f893b09a1be1fc8560e33fc3c815cfecb/library/core/src/panicking.rs:178:21
      3: datafusion_expr_common::interval_arithmetic::Interval::cardinality
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-expr-common-48.0.1/src/interval_arithmetic.rs:921:33
      4: datafusion_expr_common::interval_arithmetic::cardinality_ratio
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-expr-common-48.0.1/src/interval_arithmetic.rs:1630:12
      5: datafusion_physical_expr::analysis::calculate_selectivity
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-expr-48.0.1/src/analysis.rs:286:24
      6: datafusion_physical_expr::analysis::shrink_boundaries
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-expr-48.0.1/src/analysis.rs:258:23
      7: datafusion_physical_expr::analysis::analyze
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-expr-48.0.1/src/analysis.rs:221:17
      8: datafusion_physical_plan::filter::FilterExec::statistics_helper
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-plan-48.0.1/src/filter.rs:206:28
      9: datafusion_physical_plan::filter::FilterExec::compute_properties
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-plan-48.0.1/src/filter.rs:269:21
     10: datafusion_physical_plan::filter::FilterExec::try_new
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-physical-plan-48.0.1/src/filter.rs:99:29
     11: 
datafusion::physical_planner::DefaultPhysicalPlanner::map_logical_node_to_physical::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/physical_planner.rs:783:30
     12: 
datafusion::physical_planner::DefaultPhysicalPlanner::task_helper::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/physical_planner.rs:393:26
     13: <futures_util::stream::futures_unordered::FuturesUnordered<Fut> as 
futures_core::stream::Stream>::poll_next
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/futures-util-0.3.31/src/stream/futures_unordered/mod.rs:528:17
     14: futures_util::stream::stream::StreamExt::poll_next_unpin
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/futures-util-0.3.31/src/stream/stream/mod.rs:1638:9
     15: <futures_util::stream::stream::buffer_unordered::BufferUnordered<St> 
as futures_core::stream::Stream>::poll_next
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/futures-util-0.3.31/src/stream/stream/buffer_unordered.rs:75:15
     16: <S as futures_core::stream::TryStream>::try_poll_next
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/futures-core-0.3.31/src/stream.rs:206:9
     17: <futures_util::stream::try_stream::try_collect::TryCollect<St,C> as 
core::future::future::Future>::poll
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/futures-util-0.3.31/src/stream/try_stream/try_collect.rs:46:26
     18: 
datafusion::physical_planner::DefaultPhysicalPlanner::create_initial_plan::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/physical_planner.rs:339:14
     19: <datafusion::physical_planner::DefaultPhysicalPlanner as 
datafusion::physical_planner::PhysicalPlanner>::create_physical_plan::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/physical_planner.rs:189:14
     20: <core::pin::Pin<P> as core::future::future::Future>::poll
                at 
~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/future.rs:124:9
     21: <datafusion::execution::session_state::DefaultQueryPlanner as 
datafusion::execution::context::QueryPlanner>::create_physical_plan::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/execution/session_state.rs:1923:14
     22: <core::pin::Pin<P> as core::future::future::Future>::poll
                at 
~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/future.rs:124:9
     23: 
datafusion::execution::session_state::SessionState::create_physical_plan::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/execution/session_state.rs:659:14
     24: datafusion::dataframe::DataFrame::create_physical_plan::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/dataframe/mod.rs:278:61
     25: datafusion::dataframe::DataFrame::collect::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/dataframe/mod.rs:1378:48
     26: datafusion::dataframe::DataFrame::count::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/datafusion-48.0.1/src/dataframe/mod.rs:1345:14
     27: datafusion_bug::any::{{closure}}
                at ./src/main.rs:4:57
     28: datafusion_bug::main::{{closure}}
                at ./src/main.rs:20:60
     29: <core::pin::Pin<P> as core::future::future::Future>::poll
                at 
~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/future.rs:124:9
     30: tokio::runtime::park::CachedParkThread::block_on::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/runtime/park.rs:285:60
     31: tokio::task::coop::with_budget
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/task/coop/mod.rs:167:5
     32: tokio::task::coop::budget
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/task/coop/mod.rs:133:5
     33: tokio::runtime::park::CachedParkThread::block_on
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/runtime/park.rs:285:31
     34: tokio::runtime::context::blocking::BlockingRegionGuard::block_on
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/runtime/context/blocking.rs:66:9
     35: 
tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/runtime/scheduler/multi_thread/mod.rs:87:13
     36: tokio::runtime::context::runtime::enter_runtime
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/runtime/context/runtime.rs:65:16
     37: tokio::runtime::scheduler::multi_thread::MultiThread::block_on
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/runtime/scheduler/multi_thread/mod.rs:86:9
     38: tokio::runtime::runtime::Runtime::block_on_inner
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/runtime/runtime.rs:358:45
     39: tokio::runtime::runtime::Runtime::block_on
                at 
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.46.1/src/runtime/runtime.rs:328:13
     40: datafusion_bug::main
                at ./src/main.rs:23:5
     41: core::ops::function::FnOnce::call_once
                at 
~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
   note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose 
backtrace.
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org
For additional commands, e-mail: github-h...@datafusion.apache.org

Reply via email to