From ff18aeb73076aa57dc8f2a0381415af3672b76ad Mon Sep 17 00:00:00 2001 From: HappenLee Date: Fri, 2 Aug 2024 11:49:17 +0800 Subject: [PATCH] [Bug](fix) fix coredump case in (not null, null) execpt (not null, not null) case --- be/src/pipeline/exec/set_sink_operator.cpp | 8 ++++++-- be/src/pipeline/pipeline_x/dependency.h | 4 +++- be/src/vec/exec/vset_operation_node.cpp | 6 ++++-- .../data/query_p0/except/test_query_except.out | 2 ++ .../suites/query_p0/except/test_query_except.groovy | 3 +++ 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/be/src/pipeline/exec/set_sink_operator.cpp b/be/src/pipeline/exec/set_sink_operator.cpp index aceeac25596213..1851519138865d 100644 --- a/be/src/pipeline/exec/set_sink_operator.cpp +++ b/be/src/pipeline/exec/set_sink_operator.cpp @@ -140,9 +140,13 @@ Status SetSinkOperatorX::_extract_build_column( block.get_by_position(result_col_id).column = block.get_by_position(result_col_id).column->convert_to_full_column_if_const(); + // Do make nullable should not change the origin column and type in origin block + // which may cause coredump problem if (local_state._shared_state->build_not_ignore_null[i]) { - block.get_by_position(result_col_id).column = - make_nullable(block.get_by_position(result_col_id).column); + auto column_ptr = make_nullable(block.get_by_position(result_col_id).column, false); + block.insert( + {column_ptr, make_nullable(block.get_by_position(result_col_id).type), ""}); + result_col_id = block.columns() - 1; } const auto* column = block.get_by_position(result_col_id).column.get(); diff --git a/be/src/pipeline/pipeline_x/dependency.h b/be/src/pipeline/pipeline_x/dependency.h index b60b3e9ae3b7f3..9d13593cd2e978 100644 --- a/be/src/pipeline/pipeline_x/dependency.h +++ b/be/src/pipeline/pipeline_x/dependency.h @@ -701,10 +701,12 @@ struct SetSharedState : public BasicSharedState { // (select 0) intersect (select null) the build side hash table should not // ignore null value. std::vector data_types; + int i = 0; for (const auto& ctx : child_exprs_lists[0]) { - data_types.emplace_back(build_not_ignore_null[0] + data_types.emplace_back(build_not_ignore_null[i] ? make_nullable(ctx->root()->data_type()) : ctx->root()->data_type()); + i++; } if (!try_get_hash_map_context_fixed( *hash_table_variants, data_types)) { diff --git a/be/src/vec/exec/vset_operation_node.cpp b/be/src/vec/exec/vset_operation_node.cpp index afc3273f4595c9..2f3c9b2bab3d0c 100644 --- a/be/src/vec/exec/vset_operation_node.cpp +++ b/be/src/vec/exec/vset_operation_node.cpp @@ -421,8 +421,10 @@ Status VSetOperationNode::extract_build_column(Block& block, block.get_by_position(result_col_id).column = block.get_by_position(result_col_id).column->convert_to_full_column_if_const(); if (_build_not_ignore_null[i]) { - block.get_by_position(result_col_id).column = - make_nullable(block.get_by_position(result_col_id).column); + auto column_ptr = make_nullable(block.get_by_position(result_col_id).column, false); + block.insert( + {column_ptr, make_nullable(block.get_by_position(result_col_id).type), ""}); + result_col_id = block.columns() - 1; } const auto* column = block.get_by_position(result_col_id).column.get(); raw_ptrs[i] = column; diff --git a/regression-test/data/query_p0/except/test_query_except.out b/regression-test/data/query_p0/except/test_query_except.out index 7aea45fde18a71..763cb44c7f8558 100644 --- a/regression-test/data/query_p0/except/test_query_except.out +++ b/regression-test/data/query_p0/except/test_query_except.out @@ -14,3 +14,5 @@ 14 15 +-- !select_except2 -- + diff --git a/regression-test/suites/query_p0/except/test_query_except.groovy b/regression-test/suites/query_p0/except/test_query_except.groovy index a13fd76e7a91ad..410e24f89b92de 100644 --- a/regression-test/suites/query_p0/except/test_query_except.groovy +++ b/regression-test/suites/query_p0/except/test_query_except.groovy @@ -22,4 +22,7 @@ suite("test_query_except", "arrow_flight_sql") { SELECT * FROM (SELECT k1 FROM test_query_db.baseall EXCEPT SELECT k1 FROM test_query_db.test) a ORDER BY k1 """ + qt_select_except2 """ + select not_null_k1, not_null_k1 from (SELECT non_nullable(k1) as not_null_k1 FROM test_query_db.baseall where k1 is not null) b1 except select non_nullable(k1), k1 from test_query_db.baseall where k1 is not null order by 1, 2; + """ }