You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/03/09 15:53:44 UTC
[doris] 06/10: [fix](scanner) remove useless _src_block_mem_reuse to avoid core dump while loading (#17559)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 796d42b4c117f2f3908da7c7b4150cb0c222d89a
Author: zhannngchen <48...@users.noreply.github.com>
AuthorDate: Thu Mar 9 09:26:32 2023 +0800
[fix](scanner) remove useless _src_block_mem_reuse to avoid core dump while loading (#17559)
The _src_block_mem_reuse variable actually not work, since the _src_block is cleared each time when we call get_block.
But current code may cause core dump, see issue #17587. Because we insert some result column generated by expr into dest block, and such a column holds a pointer to some column in original schema. When clearing the data of _src_block, some column's data in dest block is also cleared.
e.g. coalesce will return a result column which holds a pointer to some original column, see issue #17588
---
be/src/vec/exec/scan/vfile_scanner.cpp | 14 ++------------
be/src/vec/exec/scan/vfile_scanner.h | 1 -
2 files changed, 2 insertions(+), 13 deletions(-)
diff --git a/be/src/vec/exec/scan/vfile_scanner.cpp b/be/src/vec/exec/scan/vfile_scanner.cpp
index 8e8d48148c..e2de08e74f 100644
--- a/be/src/vec/exec/scan/vfile_scanner.cpp
+++ b/be/src/vec/exec/scan/vfile_scanner.cpp
@@ -80,7 +80,6 @@ Status VFileScanner::prepare(
}
if (_is_load) {
- _src_block_mem_reuse = true;
_src_row_desc.reset(new RowDescriptor(_state->desc_tbl(),
std::vector<TupleId>({_input_tuple_desc->id()}),
std::vector<bool>({false})));
@@ -369,7 +368,6 @@ Status VFileScanner::_convert_to_output_block(Block* block) {
size_t rows = _src_block.rows();
auto filter_column = vectorized::ColumnUInt8::create(rows, 1);
auto& filter_map = filter_column->get_data();
- auto origin_column_num = _src_block.columns();
for (auto slot_desc : _output_tuple_desc->slots()) {
if (!slot_desc->is_materialized()) {
@@ -381,11 +379,7 @@ Status VFileScanner::_convert_to_output_block(Block* block) {
int result_column_id = -1;
// PT1 => dest primitive type
RETURN_IF_ERROR(ctx->execute(&_src_block, &result_column_id));
- bool is_origin_column = result_column_id < origin_column_num;
- auto column_ptr =
- is_origin_column && _src_block_mem_reuse
- ? _src_block.get_by_position(result_column_id).column->clone_resized(rows)
- : _src_block.get_by_position(result_column_id).column;
+ column_ptr = _src_block.get_by_position(result_column_id).column;
// column_ptr maybe a ColumnConst, convert it to a normal column
column_ptr = column_ptr->convert_to_full_column_if_const();
@@ -450,11 +444,7 @@ Status VFileScanner::_convert_to_output_block(Block* block) {
}
// after do the dest block insert operation, clear _src_block to remove the reference of origin column
- if (_src_block_mem_reuse) {
- _src_block.clear_column_data(origin_column_num);
- } else {
- _src_block.clear();
- }
+ _src_block.clear();
size_t dest_size = block->columns();
// do filter
diff --git a/be/src/vec/exec/scan/vfile_scanner.h b/be/src/vec/exec/scan/vfile_scanner.h
index aec6e776ab..993e472576 100644
--- a/be/src/vec/exec/scan/vfile_scanner.h
+++ b/be/src/vec/exec/scan/vfile_scanner.h
@@ -110,7 +110,6 @@ protected:
int _rows = 0;
int _num_of_columns_from_file;
- bool _src_block_mem_reuse = false;
bool _strict_mode;
bool _src_block_init = false;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org