Skip to content

Commit

Permalink
branch-3.0: [Fix](multi-catalog) Fix column mutate() crash replace it…
Browse files Browse the repository at this point in the history
… by assume_mutable(). #46151 (#46197)

Cherry-picked from #46151

Co-authored-by: Qi Chen <[email protected]>
  • Loading branch information
github-actions[bot] and kaka11chen authored Jan 1, 2025
1 parent a211da6 commit 5c68b77
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 21 deletions.
7 changes: 4 additions & 3 deletions be/src/vec/exec/format/orc/vorc_reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1211,8 +1211,8 @@ Status OrcReader::_fill_missing_columns(
for (auto& kv : missing_columns) {
if (kv.second == nullptr) {
// no default column, fill with null
auto nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(
(*std::move(block->get_by_name(kv.first).column)).mutate().get());
auto mutable_column = block->get_by_name(kv.first).column->assume_mutable();
auto* nullable_column = static_cast<vectorized::ColumnNullable*>(mutable_column.get());
nullable_column->insert_many_defaults(rows);
} else {
// fill with default value
Expand All @@ -1226,8 +1226,9 @@ Status OrcReader::_fill_missing_columns(
// call resize because the first column of _src_block_ptr may not be filled by reader,
// so _src_block_ptr->rows() may return wrong result, cause the column created by `ctx->execute()`
// has only one row.
std::move(*block->get_by_position(result_column_id).column).mutate()->resize(rows);
auto result_column_ptr = block->get_by_position(result_column_id).column;
auto mutable_column = result_column_ptr->assume_mutable();
mutable_column->resize(rows);
// result_column_ptr maybe a ColumnConst, convert it to a normal column
result_column_ptr = result_column_ptr->convert_to_full_column_if_const();
auto origin_column_type = block->get_by_name(kv.first).type;
Expand Down
16 changes: 8 additions & 8 deletions be/src/vec/exec/format/parquet/vparquet_column_reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -679,8 +679,8 @@ Status ArrayColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr&
MutableColumnPtr data_column;
NullMap* null_map_ptr = nullptr;
if (doris_column->is_nullable()) {
auto* nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(
(*std::move(doris_column)).mutate().get());
auto mutable_column = doris_column->assume_mutable();
auto* nullable_column = static_cast<vectorized::ColumnNullable*>(mutable_column.get());
null_map_ptr = &nullable_column->get_null_map_data();
data_column = nullable_column->get_nested_column_ptr();
} else {
Expand Down Expand Up @@ -730,8 +730,8 @@ Status MapColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr& t
MutableColumnPtr data_column;
NullMap* null_map_ptr = nullptr;
if (doris_column->is_nullable()) {
auto* nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(
(*std::move(doris_column)).mutate().get());
auto mutable_column = doris_column->assume_mutable();
auto* nullable_column = static_cast<vectorized::ColumnNullable*>(mutable_column.get());
null_map_ptr = &nullable_column->get_null_map_data();
data_column = nullable_column->get_nested_column_ptr();
} else {
Expand Down Expand Up @@ -799,8 +799,8 @@ Status StructColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr
MutableColumnPtr data_column;
NullMap* null_map_ptr = nullptr;
if (doris_column->is_nullable()) {
auto* nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(
(*std::move(doris_column)).mutate().get());
auto mutable_column = doris_column->assume_mutable();
auto* nullable_column = static_cast<vectorized::ColumnNullable*>(mutable_column.get());
null_map_ptr = &nullable_column->get_null_map_data();
data_column = nullable_column->get_nested_column_ptr();
} else {
Expand Down Expand Up @@ -880,8 +880,8 @@ Status StructColumnReader::read_column_data(ColumnPtr& doris_column, DataTypePtr
auto& doris_field = doris_struct.get_column_ptr(idx);
auto& doris_type = const_cast<DataTypePtr&>(doris_struct_type->get_element(idx));
DCHECK(doris_type->is_nullable());
auto* nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(
(*std::move(doris_field)).mutate().get());
auto mutable_column = doris_field->assume_mutable();
auto* nullable_column = static_cast<vectorized::ColumnNullable*>(mutable_column.get());
nullable_column->insert_null_elements(missing_column_sz);
}

Expand Down
7 changes: 4 additions & 3 deletions be/src/vec/exec/format/parquet/vparquet_group_reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -684,8 +684,8 @@ Status RowGroupReader::_fill_missing_columns(
for (auto& kv : missing_columns) {
if (kv.second == nullptr) {
// no default column, fill with null
auto nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(
(*std::move(block->get_by_name(kv.first).column)).mutate().get());
auto mutable_column = block->get_by_name(kv.first).column->assume_mutable();
auto* nullable_column = static_cast<vectorized::ColumnNullable*>(mutable_column.get());
nullable_column->insert_many_defaults(rows);
} else {
// fill with default value
Expand All @@ -699,8 +699,9 @@ Status RowGroupReader::_fill_missing_columns(
// call resize because the first column of _src_block_ptr may not be filled by reader,
// so _src_block_ptr->rows() may return wrong result, cause the column created by `ctx->execute()`
// has only one row.
std::move(*block->get_by_position(result_column_id).column).mutate()->resize(rows);
auto result_column_ptr = block->get_by_position(result_column_id).column;
auto mutable_column = result_column_ptr->assume_mutable();
mutable_column->resize(rows);
// result_column_ptr maybe a ColumnConst, convert it to a normal column
result_column_ptr = result_column_ptr->convert_to_full_column_if_const();
auto origin_column_type = block->get_by_name(kv.first).type;
Expand Down
2 changes: 1 addition & 1 deletion be/src/vec/exec/scan/new_es_scanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ Status NewEsScanner::_get_block_impl(RuntimeState* state, Block* block, bool* eo
columns.resize(column_size);
for (auto i = 0; i < column_size; i++) {
if (mem_reuse) {
columns[i] = std::move(*block->get_by_position(i).column).mutate();
columns[i] = block->get_by_position(i).column->assume_mutable();
} else {
columns[i] = _tuple_desc->slots()[i]->get_empty_mutable_column();
}
Expand Down
9 changes: 4 additions & 5 deletions be/src/vec/exec/scan/vfile_scanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -475,8 +475,8 @@ Status VFileScanner::_fill_missing_columns(size_t rows) {
for (auto& kv : _missing_col_descs) {
if (kv.second == nullptr) {
// no default column, fill with null
auto nullable_column = reinterpret_cast<vectorized::ColumnNullable*>(
(*std::move(_src_block_ptr->get_by_name(kv.first).column)).mutate().get());
auto mutable_column = _src_block_ptr->get_by_name(kv.first).column->assume_mutable();
auto* nullable_column = static_cast<vectorized::ColumnNullable*>(mutable_column.get());
nullable_column->insert_many_defaults(rows);
} else {
// fill with default value
Expand All @@ -490,10 +490,9 @@ Status VFileScanner::_fill_missing_columns(size_t rows) {
// call resize because the first column of _src_block_ptr may not be filled by reader,
// so _src_block_ptr->rows() may return wrong result, cause the column created by `ctx->execute()`
// has only one row.
std::move(*_src_block_ptr->get_by_position(result_column_id).column)
.mutate()
->resize(rows);
auto result_column_ptr = _src_block_ptr->get_by_position(result_column_id).column;
auto mutable_column = result_column_ptr->assume_mutable();
mutable_column->resize(rows);
// result_column_ptr maybe a ColumnConst, convert it to a normal column
result_column_ptr = result_column_ptr->convert_to_full_column_if_const();
auto origin_column_type = _src_block_ptr->get_by_name(kv.first).type;
Expand Down
2 changes: 1 addition & 1 deletion be/src/vec/exec/scan/vmeta_scanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ Status VMetaScanner::_get_block_impl(RuntimeState* state, Block* block, bool* eo
columns.resize(column_size);
for (auto i = 0; i < column_size; i++) {
if (mem_reuse) {
columns[i] = std::move(*block->get_by_position(i).column).mutate();
columns[i] = block->get_by_position(i).column->assume_mutable();
} else {
columns[i] = _tuple_desc->slots()[i]->get_empty_mutable_column();
}
Expand Down

0 comments on commit 5c68b77

Please sign in to comment.