Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

multiply overflow in stats.rs #13775

Open
Tracked by #13811
Omega359 opened this issue Dec 13, 2024 · 5 comments
Open
Tracked by #13811

multiply overflow in stats.rs #13775

Omega359 opened this issue Dec 13, 2024 · 5 comments
Assignees
Labels
bug Something isn't working

Comments

@Omega359
Copy link
Contributor

Omega359 commented Dec 13, 2024

Describe the bug

Seeing this when testing the new sqlite tests in sqllogictest against main. It occurs with the select4.slt test file only. backtrace below:

thread 'tokio-runtime-worker' panicked at datafusion/common/src/stats.rs:151:84:
attempt to multiply with overflow
stack backtrace:
   0: rust_begin_unwind
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:662:5
   1: core::panicking::panic_fmt
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/panicking.rs:74:14
   2: core::panicking::panic_const::panic_const_mul_overflow
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/panicking.rs:181:21
   3: <usize as core::ops::arith::Mul>::mul
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/ops/arith.rs:342:45
   4: <&usize as core::ops::arith::Mul<&usize>>::mul
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/internal_macros.rs:58:17
   5: datafusion_common::stats::Precision<usize>::multiply
             at /apache_datafusion/datafusion/common/src/stats.rs:151:84
   6: datafusion_physical_plan::joins::cross_join::stats_cartesian_product
             at /apache_datafusion/datafusion/physical-plan/src/joins/cross_join.rs:340:27
   7: <datafusion_physical_plan::joins::cross_join::CrossJoinExec as datafusion_physical_plan::execution_plan::ExecutionPlan>::statistics
             at /apache_datafusion/datafusion/physical-plan/src/joins/cross_join.rs:322:12
   8: datafusion::physical_optimizer::enforce_distribution::get_repartition_requirement_status
             at /apache_datafusion/datafusion/core/src/physical_optimizer/enforce_distribution.rs:1103:49
   9: datafusion::physical_optimizer::enforce_distribution::ensure_distribution
             at /apache_datafusion/datafusion/core/src/physical_optimizer/enforce_distribution.rs:1197:9
  10: <datafusion::physical_optimizer::enforce_distribution::EnforceDistribution as datafusion_physical_optimizer::optimizer::PhysicalOptimizerRule>::optimize::{{closure}}
             at /apache_datafusion/datafusion/core/src/physical_optimizer/enforce_distribution.rs:217:17
  11: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/ops/function.rs:305:13
  12: datafusion_common::tree_node::Transformed<T>::transform_parent
             at /apache_datafusion/datafusion/common/src/tree_node.rs:764:44
  13: datafusion_common::tree_node::TreeNode::transform_up::transform_up_impl::{{closure}}
             at /apache_datafusion/datafusion/common/src/tree_node.rs:265:13
  14: stacker::maybe_grow
             at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/stacker-0.1.17/src/lib.rs:55:9
  15: datafusion_common::tree_node::TreeNode::transform_up::transform_up_impl
             at /apache_datafusion/datafusion/common/src/tree_node.rs:260:9
  16: datafusion_common::tree_node::TreeNode::transform_up::transform_up_impl::{{closure}}::{{closure}}
             at /apache_datafusion/datafusion/common/src/tree_node.rs:265:35
  17: <I as datafusion_common::tree_node::TreeNodeIterator>::map_until_stop_and_collect::{{closure}}
             at /apache_datafusion/datafusion/common/src/tree_node.rs:1125:17
  18: core::iter::adapters::map::map_try_fold::{{closure}}
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/adapters/map.rs:95:28
  19: <alloc::vec::into_iter::IntoIter<T,A> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/into_iter.rs:346:25
  20: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/adapters/map.rs:121:9
  21: <core::iter::adapters::GenericShunt<I,R> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/adapters/mod.rs:191:9
  22: <I as alloc::vec::in_place_collect::SpecInPlaceCollect<T,I>>::collect_in_place
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/in_place_collect.rs:378:13
  23: alloc::vec::in_place_collect::from_iter_in_place
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/in_place_collect.rs:269:9
  24: alloc::vec::in_place_collect::<impl alloc::vec::spec_from_iter::SpecFromIter<T,I> for alloc::vec::Vec<T>>::from_iter
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/in_place_collect.rs:245:9
  25: <alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/mod.rs:2985:9
  26: core::iter::traits::iterator::Iterator::collect
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/traits/iterator.rs:2000:9
  27: <core::result::Result<V,E> as core::iter::traits::collect::FromIterator<core::result::Result<A,E>>>::from_iter::{{closure}}
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/result.rs:1958:51
  28: core::iter::adapters::try_process
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/adapters/mod.rs:160:17
  29: <core::result::Result<V,E> as core::iter::traits::collect::FromIterator<core::result::Result<A,E>>>::from_iter
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/result.rs:1958:9
  30: core::iter::traits::iterator::Iterator::collect
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/traits/iterator.rs:2000:9
  31: <I as datafusion_common::tree_node::TreeNodeIterator>::map_until_stop_and_collect
             at /apache_datafusion/datafusion/common/src/tree_node.rs:1123:9
  32: <T as datafusion_common::tree_node::TreeNode>::map_children
             at /apache_datafusion/datafusion/common/src/tree_node.rs:1256:32
  33: datafusion_common::tree_node::TreeNode::transform_up::transform_up_impl::{{closure}}
             at /apache_datafusion/datafusion/common/src/tree_node.rs:265:13
  34: stacker::maybe_grow
             at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/stacker-0.1.17/src/lib.rs:55:9
  35: datafusion_common::tree_node::TreeNode::transform_up::transform_up_impl
             at /apache_datafusion/datafusion/common/src/tree_node.rs:260:9
  36: datafusion_common::tree_node::TreeNode::transform_up::transform_up_impl::{{closure}}::{{closure}}
             at /apache_datafusion/datafusion/common/src/tree_node.rs:265:35
  37: <I as datafusion_common::tree_node::TreeNodeIterator>::map_until_stop_and_collect::{{closure}}
             at /apache_datafusion/datafusion/common/src/tree_node.rs:1125:17
  38: core::iter::adapters::map::map_try_fold::{{closure}}
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/adapters/map.rs:95:28
  39: <alloc::vec::into_iter::IntoIter<T,A> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/into_iter.rs:346:25
  40: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/adapters/map.rs:121:9
  41: <core::iter::adapters::GenericShunt<I,R> as core::iter::traits::iterator::Iterator>::try_fold
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/adapters/mod.rs:191:9
  42: <I as alloc::vec::in_place_collect::SpecInPlaceCollect<T,I>>::collect_in_place
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/in_place_collect.rs:378:13
  43: alloc::vec::in_place_collect::from_iter_in_place
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/in_place_collect.rs:269:9
  44: alloc::vec::in_place_collect::<impl alloc::vec::spec_from_iter::SpecFromIter<T,I> for alloc::vec::Vec<T>>::from_iter
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/in_place_collect.rs:245:9
  45: <alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/alloc/src/vec/mod.rs:2985:9
  46: core::iter::traits::iterator::Iterator::collect
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/traits/iterator.rs:2000:9
  47: <core::result::Result<V,E> as core::iter::traits::collect::FromIterator<core::result::Result<A,E>>>::from_iter::{{closure}}
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/result.rs:1958:51
  48: core::iter::adapters::try_process
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/adapters/mod.rs:160:17
  49: <core::result::Result<V,E> as core::iter::traits::collect::FromIterator<core::result::Result<A,E>>>::from_iter
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/result.rs:1958:9
  50: core::iter::traits::iterator::Iterator::collect
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/iter/traits/iterator.rs:2000:9
  51: <I as datafusion_common::tree_node::TreeNodeIterator>::map_until_stop_and_collect
             at /apache_datafusion/datafusion/common/src/tree_node.rs:1123:9
  52: <T as datafusion_common::tree_node::TreeNode>::map_children
             at /apache_datafusion/datafusion/common/src/tree_node.rs:1256:32
  53: datafusion_common::tree_node::TreeNode::transform_up::transform_up_impl::{{closure}}
             at /apache_datafusion/datafusion/common/src/tree_node.rs:265:13
  54: stacker::maybe_grow
             at /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/stacker-0.1.17/src/lib.rs:55:9
  55: datafusion_common::tree_node::TreeNode::transform_up::transform_up_impl
             at /apache_datafusion/datafusion/common/src/tree_node.rs:260:9
  56: datafusion_common::tree_node::TreeNode::transform_up
             at /apache_datafusion/datafusion/common/src/tree_node.rs:269:9
  57: <datafusion::physical_optimizer::enforce_distribution::EnforceDistribution as datafusion_physical_optimizer::optimizer::PhysicalOptimizerRule>::optimize
             at /apache_datafusion/datafusion/core/src/physical_optimizer/enforce_distribution.rs:215:36
  58: datafusion::physical_planner::DefaultPhysicalPlanner::optimize_physical_plan
             at /apache_datafusion/datafusion/core/src/physical_planner.rs:1878:24
  59: <datafusion::physical_planner::DefaultPhysicalPlanner as datafusion::physical_planner::PhysicalPlanner>::create_physical_plan::{{closure}}
             at /apache_datafusion/datafusion/core/src/physical_planner.rs:184:17
  60: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/future/future.rs:123:9
  61: <datafusion::execution::session_state::DefaultQueryPlanner as datafusion::execution::context::QueryPlanner>::create_physical_plan::{{closure}}
             at /apache_datafusion/datafusion/core/src/execution/session_state.rs:1943:14
  62: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/future/future.rs:123:9
  63: datafusion::execution::session_state::SessionState::create_physical_plan::{{closure}}
             at /apache_datafusion/datafusion/core/src/execution/session_state.rs:735:14
  64: datafusion::dataframe::DataFrame::create_physical_plan::{{closure}}
             at /apache_datafusion/datafusion/core/src/dataframe/mod.rs:219:61
  65: datafusion_sqllogictest::engines::datafusion_engine::runner::run_query::{{closure}}
             at ./src/engines/datafusion_engine/runner.rs:91:42
  66: <datafusion_sqllogictest::engines::datafusion_engine::runner::DataFusion as sqllogictest::runner::AsyncDB>::run::{{closure}}
             at ./src/engines/datafusion_engine/runner.rs:60:48
  67: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/future/future.rs:123:9
  68: sqllogictest::runner::Runner<D,M>::apply_record::{{closure}}
             at /usr/local/cargo/git/checkouts/sqllogictest-rs-417ef58aa74844f4/98ea24e/sqllogictest/src/runner.rs:773:62
  69: sqllogictest::runner::Runner<D,M>::update_test_file::{{closure}}
             at /usr/local/cargo/git/checkouts/sqllogictest-rs-417ef58aa74844f4/98ea24e/sqllogictest/src/runner.rs:1412:75
  70: sqllogictests::run_complete_file::{{closure}}
             at ./bin/sqllogictests.rs:367:10
  71: sqllogictests::run_tests::{{closure}}::{{closure}}::{{closure}}
             at ./bin/sqllogictests.rs:208:83

To Reproduce

I can reproduce repeatable in my branch @ https://github.com/Omega359/arrow-datafusion/tree/feature/sqllogictest_add_sqlite when running the sqlite complete

cargo test --features postgres --test sqllogictests -- --complete --postgres-runner --include-sqlite

It does seem to be any particular sql in that file that is causing the issue but rather the complete number of them.

Correction - it's always failing on a particular sql however running the equivalent sql in datafusion-cli does not cause the issue. That is possibly because of a difference in how things are run - in sqllogictests the DF queries are run via:

async fn run_query(ctx: &SessionContext, sql: impl Into<String>) -> Result<DFOutput> {
    let df = ctx.sql(sql.into().as_str()).await?;
    let task_ctx = Arc::new(df.task_ctx());
    let plan = df.create_physical_plan().await?; 
#   ^-- the above line is triggering the code that panics

    let stream = execute_stream(plan, task_ctx)?;
    let types = normalize::convert_schema_to_types(stream.schema().fields());
    let results: Vec<RecordBatch> = collect(stream).await?;
    let rows = normalize::convert_batches(results)?;

Expected behavior

No overflow :)

Additional context

No response

@Omega359 Omega359 added the bug Something isn't working label Dec 13, 2024
@alamb alamb changed the title attempt to multiple with overflow in stats.rs attempt to multiply with overflow in stats.rs Dec 16, 2024
@alamb alamb changed the title attempt to multiply with overflow in stats.rs multiply overflow in stats.rs Dec 17, 2024
@LindaSummer
Copy link

Hi @Omega359 ,

I'm a newbie of datafusion and would like to try to make some contribution. 😊

Could this issue be assigned to me?

Best Regards,
Edward

@Omega359
Copy link
Contributor Author

Omega359 commented Jan 7, 2025

Hi Edward - Thanks for taking a look at this! I do not have the ability to do that however if you add a comment here with just the word 'take' a github action will assign it to you

@LindaSummer
Copy link

Hi Edward - Thanks for taking a look at this! I do not have the ability to do that however if you add a comment here with just the word 'take' a github action will assign it to you

Got it!

Thanks very much! 😊

Best Regards,
Edward

@LindaSummer
Copy link

take

@LindaSummer
Copy link

Hi,

Sorry for delay on this issue.

I will try to work on it now. 😊

Best Regards,
Edward

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants