This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 596fb6f327ecafa7aeb43132c2d284e34d60dce4 Author: zhangstar333 <87313068+zhangstar...@users.noreply.github.com> AuthorDate: Mon May 27 14:14:33 2024 +0800 [improve](ub) fix some runtime error of ubsan when downcast (#35343) those code could work well, but it will be report some runtime error under UBSAN, so refactor it to let's ubsan could running happy. --- be/src/pipeline/exec/aggregation_sink_operator.cpp | 6 ++---- .../pipeline/exec/aggregation_source_operator.cpp | 5 ++--- .../exec/streaming_aggregation_operator.cpp | 6 ++---- .../vec/aggregate_functions/aggregate_function.h | 22 +++++++++++++--------- .../aggregate_functions/aggregate_function_avg.h | 4 ++-- .../aggregate_function_bitmap.h | 12 ++++++------ .../aggregate_function_bitmap_agg.h | 12 ++++++------ .../aggregate_function_collect.h | 10 ++++------ .../aggregate_functions/aggregate_function_count.h | 8 ++++---- .../aggregate_functions/aggregate_function_map.h | 8 ++++---- .../aggregate_function_min_max.h | 4 ++-- .../aggregate_functions/aggregate_function_sum.h | 4 ++-- .../aggregate_function_uniq_distribute_key.h | 4 ++-- be/src/vec/exec/vaggregation_node.h | 8 ++++---- 14 files changed, 55 insertions(+), 58 deletions(-) diff --git a/be/src/pipeline/exec/aggregation_sink_operator.cpp b/be/src/pipeline/exec/aggregation_sink_operator.cpp index 869685f02e5..5e28af6e7e1 100644 --- a/be/src/pipeline/exec/aggregation_sink_operator.cpp +++ b/be/src/pipeline/exec/aggregation_sink_operator.cpp @@ -300,8 +300,7 @@ Status AggSinkLocalState::_merge_with_serialized_key_helper(vectorized::Block* b _places.data(), Base::_parent->template cast<AggSinkOperatorX>() ._offsets_of_aggregate_states[i], - _deserialize_buffer.data(), - (vectorized::ColumnString*)(column.get()), _agg_arena_pool, + _deserialize_buffer.data(), column.get(), _agg_arena_pool, rows); } } else { @@ -345,8 +344,7 @@ Status AggSinkLocalState::_merge_with_serialized_key_helper(vectorized::Block* b _places.data(), Base::_parent->template cast<AggSinkOperatorX>() ._offsets_of_aggregate_states[i], - _deserialize_buffer.data(), - (vectorized::ColumnString*)(column.get()), _agg_arena_pool, + _deserialize_buffer.data(), column.get(), _agg_arena_pool, rows); } } else { diff --git a/be/src/pipeline/exec/aggregation_source_operator.cpp b/be/src/pipeline/exec/aggregation_source_operator.cpp index cff6f9fec42..e7648e09e0d 100644 --- a/be/src/pipeline/exec/aggregation_source_operator.cpp +++ b/be/src/pipeline/exec/aggregation_source_operator.cpp @@ -490,8 +490,7 @@ Status AggLocalState::merge_with_serialized_key_helper(vectorized::Block* block) ->function() ->deserialize_and_merge_vec_selected( _places.data(), _shared_state->offsets_of_aggregate_states[i], - _deserialize_buffer.data(), - (vectorized::ColumnString*)(column.get()), + _deserialize_buffer.data(), column.get(), _shared_state->agg_arena_pool.get(), rows); } } else { @@ -522,7 +521,7 @@ Status AggLocalState::merge_with_serialized_key_helper(vectorized::Block* block) SCOPED_TIMER(_deserialize_data_timer); Base::_shared_state->aggregate_evaluators[i]->function()->deserialize_and_merge_vec( _places.data(), _shared_state->offsets_of_aggregate_states[i], - _deserialize_buffer.data(), (vectorized::ColumnString*)(column.get()), + _deserialize_buffer.data(), column.get(), _shared_state->agg_arena_pool.get(), rows); } } diff --git a/be/src/pipeline/exec/streaming_aggregation_operator.cpp b/be/src/pipeline/exec/streaming_aggregation_operator.cpp index cccf29d3aa0..83952411f46 100644 --- a/be/src/pipeline/exec/streaming_aggregation_operator.cpp +++ b/be/src/pipeline/exec/streaming_aggregation_operator.cpp @@ -255,8 +255,7 @@ Status StreamingAggLocalState::_merge_with_serialized_key_helper(vectorized::Blo _places.data(), Base::_parent->template cast<StreamingAggOperatorX>() ._offsets_of_aggregate_states[i], - _deserialize_buffer.data(), (vectorized::ColumnString*)(column.get()), - _agg_arena_pool.get(), rows); + _deserialize_buffer.data(), column.get(), _agg_arena_pool.get(), rows); } } else { RETURN_IF_ERROR(_aggregate_evaluators[i]->execute_batch_add_selected( @@ -293,8 +292,7 @@ Status StreamingAggLocalState::_merge_with_serialized_key_helper(vectorized::Blo _places.data(), Base::_parent->template cast<StreamingAggOperatorX>() ._offsets_of_aggregate_states[i], - _deserialize_buffer.data(), (vectorized::ColumnString*)(column.get()), - _agg_arena_pool.get(), rows); + _deserialize_buffer.data(), column.get(), _agg_arena_pool.get(), rows); } } else { RETURN_IF_ERROR(_aggregate_evaluators[i]->execute_batch_add( diff --git a/be/src/vec/aggregate_functions/aggregate_function.h b/be/src/vec/aggregate_functions/aggregate_function.h index c24cd70ebea..c74e22bdbcd 100644 --- a/be/src/vec/aggregate_functions/aggregate_function.h +++ b/be/src/vec/aggregate_functions/aggregate_function.h @@ -22,6 +22,8 @@ #include "util/defer_op.h" #include "vec/columns/column_complex.h" +#include "vec/columns/column_string.h" +#include "vec/common/assert_cast.h" #include "vec/common/hash_table/phmap_fwd_decl.h" #include "vec/common/string_buffer.hpp" #include "vec/core/block.h" @@ -144,13 +146,12 @@ public: size_t num_rows) const = 0; virtual void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const = 0; virtual void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, - const ColumnString* column, Arena* arena, - const size_t num_rows) const = 0; + AggregateDataPtr rhs, const IColumn* column, + Arena* arena, const size_t num_rows) const = 0; virtual void deserialize_from_column(AggregateDataPtr places, const IColumn& column, Arena* arena, size_t num_rows) const = 0; @@ -375,13 +376,14 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { const auto size_of_data = assert_cast<const Derived*>(this)->size_of_data(); + const auto* column_string = assert_cast<const ColumnString*>(column); for (size_t i = 0; i != num_rows; ++i) { try { auto rhs_place = rhs + size_of_data * i; - VectorBufferReader buffer_reader(column->get_data_at(i)); + VectorBufferReader buffer_reader(column_string->get_data_at(i)); assert_cast<const Derived*>(this)->create(rhs_place); assert_cast<const Derived*>(this)->deserialize_and_merge( places[i] + offset, rhs_place, buffer_reader, arena); @@ -397,17 +399,19 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { const auto size_of_data = assert_cast<const Derived*>(this)->size_of_data(); + const auto* column_string = assert_cast<const ColumnString*>(column); for (size_t i = 0; i != num_rows; ++i) { try { auto rhs_place = rhs + size_of_data * i; - VectorBufferReader buffer_reader(column->get_data_at(i)); + VectorBufferReader buffer_reader(column_string->get_data_at(i)); assert_cast<const Derived*>(this)->create(rhs_place); - if (places[i]) + if (places[i]) { assert_cast<const Derived*>(this)->deserialize_and_merge( places[i] + offset, rhs_place, buffer_reader, arena); + } } catch (...) { for (int j = 0; j < i; ++j) { auto place = rhs + size_of_data * j; diff --git a/be/src/vec/aggregate_functions/aggregate_function_avg.h b/be/src/vec/aggregate_functions/aggregate_function_avg.h index ca155f9d72c..13d6440b964 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_avg.h +++ b/be/src/vec/aggregate_functions/aggregate_function_avg.h @@ -244,7 +244,7 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); @@ -252,7 +252,7 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); diff --git a/be/src/vec/aggregate_functions/aggregate_function_bitmap.h b/be/src/vec/aggregate_functions/aggregate_function_bitmap.h index d3db5257b45..dd7af71de06 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_bitmap.h +++ b/be/src/vec/aggregate_functions/aggregate_function_bitmap.h @@ -222,11 +222,11 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { if (version >= BITMAP_SERDE) { - auto& col = assert_cast<const ColumnBitmap&>(*assert_cast<const IColumn*>(column)); - auto* data = col.get_data().data(); + const auto& col = assert_cast<const ColumnBitmap&>(*column); + const auto* data = col.get_data().data(); for (size_t i = 0; i != num_rows; ++i) { this->data(places[i] + offset).merge(data[i]); } @@ -236,11 +236,11 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { if (version >= BITMAP_SERDE) { - auto& col = assert_cast<const ColumnBitmap&>(*assert_cast<const IColumn*>(column)); - auto* data = col.get_data().data(); + const auto& col = assert_cast<const ColumnBitmap&>(*column); + const auto* data = col.get_data().data(); for (size_t i = 0; i != num_rows; ++i) { if (places[i]) { this->data(places[i] + offset).merge(data[i]); diff --git a/be/src/vec/aggregate_functions/aggregate_function_bitmap_agg.h b/be/src/vec/aggregate_functions/aggregate_function_bitmap_agg.h index 000a6dab36b..ce80b38d091 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_bitmap_agg.h +++ b/be/src/vec/aggregate_functions/aggregate_function_bitmap_agg.h @@ -185,20 +185,20 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { - auto& col = assert_cast<const ColumnBitmap&>(*assert_cast<const IColumn*>(column)); - auto* data = col.get_data().data(); + const auto& col = assert_cast<const ColumnBitmap&>(*column); + const auto* data = col.get_data().data(); for (size_t i = 0; i != num_rows; ++i) { this->data(places[i] + offset).value |= data[i]; } } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { - auto& col = assert_cast<const ColumnBitmap&>(*assert_cast<const IColumn*>(column)); - auto* data = col.get_data().data(); + const auto& col = assert_cast<const ColumnBitmap&>(*column); + const auto* data = col.get_data().data(); for (size_t i = 0; i != num_rows; ++i) { if (places[i]) { this->data(places[i] + offset).value |= data[i]; diff --git a/be/src/vec/aggregate_functions/aggregate_function_collect.h b/be/src/vec/aggregate_functions/aggregate_function_collect.h index ac555982461..4da6e023eb3 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_collect.h +++ b/be/src/vec/aggregate_functions/aggregate_function_collect.h @@ -634,12 +634,11 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { if constexpr (ShowNull::value) { for (size_t i = 0; i != num_rows; ++i) { - this->data(places[i] + offset) - .deserialize_and_merge(*assert_cast<const IColumn*>(column), i); + this->data(places[i] + offset).deserialize_and_merge(*column, i); } } else { return BaseHelper::deserialize_and_merge_vec(places, offset, rhs, column, arena, @@ -674,13 +673,12 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { if constexpr (ShowNull::value) { for (size_t i = 0; i != num_rows; ++i) { if (places[i]) { - this->data(places[i] + offset) - .deserialize_and_merge(*assert_cast<const IColumn*>(column), i); + this->data(places[i] + offset).deserialize_and_merge(*column, i); } } } else { diff --git a/be/src/vec/aggregate_functions/aggregate_function_count.h b/be/src/vec/aggregate_functions/aggregate_function_count.h index bf44b944bda..7449c949cb9 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_count.h +++ b/be/src/vec/aggregate_functions/aggregate_function_count.h @@ -146,7 +146,7 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); @@ -154,7 +154,7 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); @@ -284,7 +284,7 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); @@ -292,7 +292,7 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); diff --git a/be/src/vec/aggregate_functions/aggregate_function_map.h b/be/src/vec/aggregate_functions/aggregate_function_map.h index d8eb031c5e5..0f1a298aed1 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_map.h +++ b/be/src/vec/aggregate_functions/aggregate_function_map.h @@ -300,9 +300,9 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { - auto& col = assert_cast<const ColumnMap&>(*assert_cast<const IColumn*>(column)); + const auto& col = assert_cast<const ColumnMap&>(*column); for (size_t i = 0; i != num_rows; ++i) { auto map = doris::vectorized::get<Map>(col[i]); this->data(places[i] + offset).add(map[0], map[1]); @@ -310,9 +310,9 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { - auto& col = assert_cast<const ColumnMap&>(*assert_cast<const IColumn*>(column)); + const auto& col = assert_cast<const ColumnMap&>(*column); for (size_t i = 0; i != num_rows; ++i) { if (places[i]) { auto map = doris::vectorized::get<Map>(col[i]); diff --git a/be/src/vec/aggregate_functions/aggregate_function_min_max.h b/be/src/vec/aggregate_functions/aggregate_function_min_max.h index dfc0cbae7f4..0d724e7ee5f 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_min_max.h +++ b/be/src/vec/aggregate_functions/aggregate_function_min_max.h @@ -624,7 +624,7 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); @@ -632,7 +632,7 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); diff --git a/be/src/vec/aggregate_functions/aggregate_function_sum.h b/be/src/vec/aggregate_functions/aggregate_function_sum.h index b53d011e5f1..376b6ece4aa 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_sum.h +++ b/be/src/vec/aggregate_functions/aggregate_function_sum.h @@ -183,7 +183,7 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); @@ -191,7 +191,7 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); diff --git a/be/src/vec/aggregate_functions/aggregate_function_uniq_distribute_key.h b/be/src/vec/aggregate_functions/aggregate_function_uniq_distribute_key.h index 0fa66e34230..3eaa6418f0b 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_uniq_distribute_key.h +++ b/be/src/vec/aggregate_functions/aggregate_function_uniq_distribute_key.h @@ -215,7 +215,7 @@ public: } void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, Arena* arena, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); @@ -223,7 +223,7 @@ public: } void deserialize_and_merge_vec_selected(const AggregateDataPtr* places, size_t offset, - AggregateDataPtr rhs, const ColumnString* column, + AggregateDataPtr rhs, const IColumn* column, Arena* arena, const size_t num_rows) const override { this->deserialize_from_column(rhs, *column, arena, num_rows); DEFER({ this->destroy_vec(rhs, num_rows); }); diff --git a/be/src/vec/exec/vaggregation_node.h b/be/src/vec/exec/vaggregation_node.h index 1b337e2c985..2bd2c811111 100644 --- a/be/src/vec/exec/vaggregation_node.h +++ b/be/src/vec/exec/vaggregation_node.h @@ -642,8 +642,8 @@ private: SCOPED_TIMER(_deserialize_data_timer); _aggregate_evaluators[i]->function()->deserialize_and_merge_vec_selected( _places.data(), _offsets_of_aggregate_states[i], - _deserialize_buffer.data(), (ColumnString*)(column.get()), - _agg_arena_pool.get(), rows); + _deserialize_buffer.data(), column.get(), _agg_arena_pool.get(), + rows); } } else { RETURN_IF_ERROR(_aggregate_evaluators[i]->execute_batch_add_selected( @@ -677,8 +677,8 @@ private: SCOPED_TIMER(_deserialize_data_timer); _aggregate_evaluators[i]->function()->deserialize_and_merge_vec( _places.data(), _offsets_of_aggregate_states[i], - _deserialize_buffer.data(), (ColumnString*)(column.get()), - _agg_arena_pool.get(), rows); + _deserialize_buffer.data(), column.get(), _agg_arena_pool.get(), + rows); } } else { RETURN_IF_ERROR(_aggregate_evaluators[i]->execute_batch_add( --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org