databend icon indicating copy to clipboard operation
databend copied to clipboard

bug: fatal runtime error: stack overflow

Open BohuTANG opened this issue 1 year ago • 3 comments

Summary

Version

https://github.com/datafuselabs/databend/releases/tag/v1.2.531-nightly

How to produce

create database selects;
use selects;

CREATE OR REPLACE TABLE customers (
    customer_id INT UNSIGNED NOT NULL,
    customer_name VARCHAR NOT NULL,
    segment VARCHAR NOT NULL,
    create_timestamp DATE NOT NULL,
    active BOOLEAN NOT NULL
) row_per_block=51113;

CREATE OR REPLACE TABLE date_dim (
    date_key DATE NOT NULL,
    day_of_week TINYINT UNSIGNED NOT NULL,
    month TINYINT UNSIGNED NOT NULL,
    year SMALLINT UNSIGNED NOT NULL
) row_per_block=53;

CREATE OR REPLACE TABLE products
(
    product_id   INT UNSIGNED NOT NULL,
    product_name VARCHAR        NOT NULL,
    price        DECIMAL(10, 2) NOT NULL,
    category     VARCHAR        NOT NULL
) row_per_block=5113;

CREATE OR REPLACE TABLE sales (
    sale_id INT UNSIGNED NOT NULL,
    product_id INT UNSIGNED NOT NULL,
    customer_id INT UNSIGNED NOT NULL,
    sale_date DATE NOT NULL,
    quantity INT NOT NULL,
    net_paid DECIMAL(10, 2) NOT NULL
) row_per_block=51113;

Query

WITH InitialSales AS (
    SELECT
        c.customer_id,
        c.customer_name,
        s.sale_date,
        YEAR(s.sale_date) AS sale_year,
        s.net_paid,
        s.net_paid AS cumulative_sales,
        s.net_paid AS yearly_sales,
        s.sale_id,
        1 AS level
    FROM sales s
    JOIN customers c ON s.customer_id = c.customer_id
    WHERE s.sale_date = (SELECT MIN(sale_date) FROM sales WHERE customer_id = c.customer_id)
),
CustomerSales AS (
    SELECT * FROM InitialSales
    UNION ALL
    SELECT
        s.customer_id,
        c.customer_name,
        s.sale_date,
        YEAR(s.sale_date) AS sale_year,
        s.net_paid,
        cs.cumulative_sales + s.net_paid AS cumulative_sales,
        CASE 
            WHEN YEAR(s.sale_date) = cs.sale_year THEN cs.yearly_sales + s.net_paid
            ELSE s.net_paid
        END AS yearly_sales,
        s.sale_id,
        cs.level + 1
    FROM sales s
    JOIN customers c ON s.customer_id = c.customer_id
    JOIN CustomerSales cs ON s.customer_id = cs.customer_id AND s.sale_date > cs.sale_date
    WHERE cs.level < 100
)
SELECT
    customer_id,
    customer_name,
    sale_year,
    sale_date,
    net_paid,
    cumulative_sales,
    yearly_sales
FROM CustomerSales
ORDER BY customer_id, sale_date, net_paid, cumulative_sales, sale_id
LIMIT 10;

Panic

databend-query panic stack:

Thread 37 "g-query-worker" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fff517ff640 (LWP 977341)]
0x000055555bfca1d5 in async_backtrace::frame::Frame::new () at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/frame.rs:113
113	/opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/frame.rs: No such file or directory.
(gdb) bt
#0  0x000055555bfca1d5 in async_backtrace::frame::Frame::new () at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/frame.rs:113
#1  async_backtrace::framed::Framed::new<databend_common_sql::planner::binder::bind_table_reference::bind::{impl#0}::bind_table_reference::{async_block#0}::{async_block_env#0}> ()
    at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/framed.rs:32
#2  async_backtrace::location::Location::frame<databend_common_sql::planner::binder::bind_table_reference::bind::{impl#0}::bind_table_reference::{async_block#0}::{async_block_env#0}>
    () at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/location.rs:149
#3  databend_common_sql::planner::binder::bind_table_reference::bind::{impl#0}::bind_table_reference::{async_block#0} ()
    at src/query/sql/src/planner/binder/bind_table_reference/bind.rs:25
#4  0x000055555bdc9eda in core::future::future::{impl#1}::poll<alloc::boxed::Box<(dyn core::future::future::Future<Output=core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>> + core::marker::Send), alloc::alloc::Global>> ()
    at /rustc/8ace7ea1f7cbba7b4f031e66c54ca237a0d65de6/library/core/src/future/future.rs:124
#5  databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0}::{async_block#0} ()
    at src/query/sql/src/planner/binder/bind_table_reference/bind_join.rs:71
#6  async_backtrace::framed::{impl#2}::poll::{closure#0}<databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0}::{async_block_env#0}> () at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/framed.rs:49
#7  async_backtrace::frame::{impl#1}::in_scope::{closure#0}<async_backtrace::framed::{impl#2}::poll::{closure_env#0}<databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0}::{async_block_env#0}>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>> ()
    at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/frame.rs:184
#8  std::thread::local::LocalKey::try_with<core::cell::Cell<core::option::Option<core::ptr::non_null::NonNull<async_backtrace::frame::Frame>>>, async_backtrace::frame::{impl#1}::in_scope::{closure_env#0}<async_backtrace::framed::{impl#2}::poll::{closure_env#0}<databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0}::{async_block_env#0}>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>> ()
    at /rustc/8ace7ea1f7cbba7b4f031e66c54ca237a0d65de6/library/std/src/thread/local.rs:286
#9  std::thread::local::LocalKey::with<core::cell::Cell<core::option::Option<core::ptr::non_null::NonNull<async_backtrace::frame::Frame>>>, async_backtrace::frame::{impl#1}::in_scope::{closure_env#0}<async_backtrace::framed::{impl#2}::poll::{closure_env#0}<databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0}::{async_block_env#0}>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>> () at /rustc/8ace7ea1f7cbba7b4f031e66c54ca237a0d65de6/library/std/src/thread/local.rs:262
#10 0x000055555bfca47f in async_backtrace::frame::active_frame::with<async_backtrace::frame::{impl#1}::in_scope::{closure_env#0}<async_backtrace::framed::{impl#2}::poll::{closure_env#0}<databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0}::{async_block_env#0}>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>> () at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/frame.rs:81
#11 async_backtrace::frame::Frame::in_scope<async_backtrace::framed::{impl#2}::poll::{closure_env#0}<databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0}::{async_block_env#0}>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>> ()
    at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/frame.rs:180
#12 async_backtrace::framed::{impl#2}::poll<databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0}::{async_block_env#0}> ()
    at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/framed.rs:49
#13 databend_common_sql::planner::binder::bind_table_reference::bind_join::{impl#0}::bind_join::{async_block#0} ()
    at src/query/sql/src/planner/binder/bind_table_reference/bind_join.rs:64
#14 0x000055555bde8909 in core::future::future::{impl#1}::poll<alloc::boxed::Box<(dyn core::future::future::Future<Output=core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>> + core::marker::Send), alloc::alloc::Global>> ()
    at /rustc/8ace7ea1f7cbba7b4f031e66c54ca237a0d65de6/library/core/src/future/future.rs:124
#15 databend_common_sql::planner::binder::bind_table_reference::bind::{impl#0}::bind_table_reference::{async_block#0}::{async_block#0} ()
    at src/query/sql/src/planner/binder/bind_table_reference/bind.rs:84
#16 async_backtrace::framed::{impl#2}::poll::{closure#0}<databend_common_sql::planner::binder::bind_table_reference::bind::{impl#0}::bind_table_reference::{async_block#0}::{async_block_env#0}> () at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/framed.rs:49
#17 async_backtrace::frame::{impl#1}::in_scope::{closure#0}<async_backtrace::framed::{impl#2}::poll::{closure_env#0}<databend_common_sql::planner::binder::bind_table_reference::bind::{impl#0}::bind_table_reference::{async_block#0}::{async_block_env#0}>, core::task::poll::Poll<core::result::Result<(databend_common_sql::planner::optimizer::s_expr::SExpr, databend_common_sql::planner::binder::bind_context::BindContext), databend_common_exception::exception::ErrorCode>>> ()
    at /opt/rust/cargo/git/checkouts/async-backtrace-dc8b2c67d0719549-shallow/dea4553/backtrace/src/frame.rs:184
#18 std::thread::local::LocalKey::try_with<core::cell::Cell<core::option::Option<core::ptr::non_null::NonNull<async_backtrace::frame::Frame>>>, async_backtrace::frame::{impl#1}::in_scope::{closure_env#0}<async_backtrace::framed::{impl#2}::poll::{closure_env#0}<databend_common_sql::planner::binder::bind_table_reference::bind::{impl#0}::bind_table_reference::{async_--Type <RET> for more, q to quit, c to continue without paging--

BohuTANG avatar Jun 16 '24 01:06 BohuTANG

FYI @zhang2014

BohuTANG avatar Jun 16 '24 01:06 BohuTANG

unstop recursion in binder with recursive cte. cc: @xudong963

image

zhang2014 avatar Jun 28 '24 04:06 zhang2014

The query is wrong. The second cte is recursive. I'll give an error info not stack overflow.

xudong963 avatar Jun 28 '24 07:06 xudong963