[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.
This commit is contained in:
@ -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 {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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); });
|
||||
|
||||
@ -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]);
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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); });
|
||||
|
||||
@ -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]);
|
||||
|
||||
@ -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); });
|
||||
|
||||
@ -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); });
|
||||
|
||||
@ -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); });
|
||||
|
||||
@ -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(
|
||||
|
||||
Reference in New Issue
Block a user