This is an automated email from the ASF dual-hosted git repository.
lihaopeng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new 6f4cf57 [Bug][Vectorized] Fix bug of decimal cast to double loss
precision (#8221)
6f4cf57 is described below
commit 6f4cf57b17f7f7e27282b5fb403e6f7b253a3b66
Author: HappenLee <[email protected]>
AuthorDate: Fri Feb 25 11:04:11 2022 +0800
[Bug][Vectorized] Fix bug of decimal cast to double loss precision (#8221)
Co-authored-by: lihaopeng <[email protected]>
---
be/src/vec/data_types/data_type_decimal.h | 2 +-
be/src/vec/exec/join/vhash_join_node.cpp | 67 +++++++++++++++++--------------
be/src/vec/exec/join/vhash_join_node.h | 2 -
3 files changed, 38 insertions(+), 33 deletions(-)
diff --git a/be/src/vec/data_types/data_type_decimal.h
b/be/src/vec/data_types/data_type_decimal.h
index 8792a95..21cdbed 100644
--- a/be/src/vec/data_types/data_type_decimal.h
+++ b/be/src/vec/data_types/data_type_decimal.h
@@ -290,7 +290,7 @@ convert_from_decimal(const typename
FromDataType::FieldType& value, UInt32 scale
using ToFieldType = typename ToDataType::FieldType;
if constexpr (std::is_floating_point_v<ToFieldType>)
- return static_cast<ToFieldType>(value) /
FromDataType::get_scale_multiplier(scale);
+ return binary_cast<int128_t, DecimalV2Value>(value);
else {
FromFieldType converted_value =
convert_decimals<FromDataType, FromDataType>(value, scale, 0);
diff --git a/be/src/vec/exec/join/vhash_join_node.cpp
b/be/src/vec/exec/join/vhash_join_node.cpp
index eaeeeed..f6a5422 100644
--- a/be/src/vec/exec/join/vhash_join_node.cpp
+++ b/be/src/vec/exec/join/vhash_join_node.cpp
@@ -158,8 +158,6 @@ template <class HashTableContext, class JoinOpType, bool
ignore_null>
struct ProcessHashTableProbe {
ProcessHashTableProbe(HashJoinNode* join_node, int batch_size, int
probe_rows)
: _join_node(join_node),
- _right_col_idx(join_node->_right_col_idx),
- _right_col_len(join_node->_right_col_len),
_batch_size(batch_size),
_probe_rows(probe_rows),
_build_blocks(join_node->_build_blocks),
@@ -180,6 +178,10 @@ struct ProcessHashTableProbe {
using KeyGetter = typename HashTableContext::State;
using Mapped = typename HashTableContext::Mapped;
+ int right_col_idx = _join_node->_is_right_semi_anti ? 0 :
+ _join_node->_left_table_data_types.size();
+ int right_col_len = _join_node->_right_table_data_types.size();
+
KeyGetter key_getter(_probe_raw_ptrs, _join_node->_probe_key_sz,
nullptr);
auto& mcol = mutable_block.mutable_columns();
int current_offset = 0;
@@ -194,6 +196,10 @@ struct ProcessHashTableProbe {
constexpr auto is_right_semi_anti_join = JoinOpType::value ==
TJoinOp::RIGHT_ANTI_JOIN ||
JoinOpType::value ==
TJoinOp::RIGHT_SEMI_JOIN;
+ constexpr auto is_semi_anti_join = is_right_semi_anti_join ||
+ JoinOpType::value ==
TJoinOp::LEFT_ANTI_JOIN ||
+ JoinOpType::value ==
TJoinOp::LEFT_SEMI_JOIN;
+
constexpr auto probe_all = JoinOpType::value ==
TJoinOp::LEFT_OUTER_JOIN ||
JoinOpType::value ==
TJoinOp::FULL_OUTER_JOIN;
@@ -269,34 +275,34 @@ struct ProcessHashTableProbe {
}
// insert all matched build rows
- if constexpr (!is_right_semi_anti_join) {
+ if constexpr (!is_semi_anti_join) {
if (_build_blocks.size() == 1) {
- for (int i = 0; i < _right_col_len; i++) {
+ for (int i = 0; i < right_col_len; i++) {
auto& column = *_build_blocks[0].get_by_position(i).column;
- mcol[i + _right_col_idx]->insert_indices_from(column,
+ mcol[i + right_col_idx]->insert_indices_from(column,
_build_block_rows.data(), _build_block_rows.data()
+ current_offset);
}
} else {
- for (int i = 0; i < _right_col_len; i++) {
+ for (int i = 0; i < right_col_len; i++) {
for (int j = 0; j < current_offset; j++) {
if constexpr (probe_all) {
if (_build_block_offsets[j] == -1) {
- DCHECK(mcol[i +
_right_col_idx]->is_nullable());
- assert_cast<ColumnNullable *>(mcol[i +
_right_col_idx].get())->insert_data(nullptr, 0);
+ DCHECK(mcol[i + right_col_idx]->is_nullable());
+ assert_cast<ColumnNullable *>(mcol[i +
right_col_idx].get())->insert_data(nullptr, 0);
} else {
auto& column =
*_build_blocks[_build_block_offsets[j]].get_by_position(i).column;
- mcol[i + _right_col_idx]->insert_from(column,
_build_block_rows[j]);
+ mcol[i + right_col_idx]->insert_from(column,
_build_block_rows[j]);
}
} else {
auto &column =
*_build_blocks[_build_block_offsets[j]].get_by_position(i).column;
- mcol[i + _right_col_idx]->insert_from(column,
_build_block_rows[j]);
+ mcol[i + right_col_idx]->insert_from(column,
_build_block_rows[j]);
}
}
}
}
}
- for (int i = 0; i < _right_col_idx; ++i) {
+ for (int i = 0; i < right_col_idx; ++i) {
auto& column = _probe_block.get_by_position(i).column;
column->replicate(&_items_counts[0], current_offset, *mcol[i]);
}
@@ -315,6 +321,9 @@ struct ProcessHashTableProbe {
using Mapped = typename HashTableContext::Mapped;
KeyGetter key_getter(_probe_raw_ptrs, _join_node->_probe_key_sz,
nullptr);
+ int right_col_idx = _join_node->_left_table_data_types.size();
+ int right_col_len = _join_node->_right_table_data_types.size();
+
IColumn::Offsets offset_data;
auto& mcol = mutable_block.mutable_columns();
offset_data.assign(_probe_rows, (uint32_t)0);
@@ -350,9 +359,9 @@ struct ProcessHashTableProbe {
for (auto it = mapped.begin(); it.ok(); ++it) {
++current_offset;
const Block& cur_blk = _build_blocks[it->block_offset];
- for (size_t j = 0; j < _right_col_len; ++j) {
+ for (size_t j = 0; j < right_col_len; ++j) {
auto& column = *cur_blk.get_by_position(j).column;
- mcol[j + _right_col_idx]->insert_from(column,
it->row_num);
+ mcol[j + right_col_idx]->insert_from(column,
it->row_num);
}
visited_map.emplace_back(&it->visited);
}
@@ -369,13 +378,13 @@ struct ProcessHashTableProbe {
// only full outer / left outer need insert the data of right
table
if constexpr (JoinOpType::value == TJoinOp::LEFT_OUTER_JOIN ||
JoinOpType::value == TJoinOp::FULL_OUTER_JOIN) {
- for (size_t j = 0; j < _right_col_len; ++j) {
- DCHECK(mcol[j + _right_col_idx]->is_nullable());
- assert_cast<ColumnNullable *>(mcol[j +
_right_col_idx].get())->insert_data(nullptr, 0);
+ for (size_t j = 0; j < right_col_len; ++j) {
+ DCHECK(mcol[j + right_col_idx]->is_nullable());
+ assert_cast<ColumnNullable *>(mcol[j +
right_col_idx].get())->insert_data(nullptr, 0);
}
} else {
- for (size_t j = 0; j < _right_col_len; ++j) {
- mcol[j + _right_col_idx]->insert_default();
+ for (size_t j = 0; j < right_col_len; ++j) {
+ mcol[j + right_col_idx]->insert_default();
}
}
} else {
@@ -394,7 +403,7 @@ struct ProcessHashTableProbe {
}
output_block->swap(mutable_block.to_block());
- for (int i = 0; i < _right_col_idx; ++i) {
+ for (int i = 0; i < right_col_idx; ++i) {
auto& column = _probe_block.get_by_position(i).column;
output_block->get_by_position(i).column =
column->replicate(offset_data);
}
@@ -415,9 +424,9 @@ struct ProcessHashTableProbe {
auto other_hit = column->get_bool(i);
if (!other_hit) {
- for (size_t j = 0; j < _right_col_len; ++j) {
+ for (size_t j = 0; j < right_col_len; ++j) {
typeid_cast<ColumnNullable*>(
- std::move(*output_block->get_by_position(j
+ _right_col_idx)
+ std::move(*output_block->get_by_position(j
+ right_col_idx)
.column)
.mutate()
.get())
@@ -511,14 +520,17 @@ struct ProcessHashTableProbe {
hash_table_ctx.init_once();
auto& mcol = mutable_block.mutable_columns();
+ int right_col_idx = _join_node->_is_right_semi_anti ? 0 :
+ _join_node->_left_table_data_types.size();
+ int right_col_len = _join_node->_right_table_data_types.size();
+
auto& iter = hash_table_ctx.iter;
auto block_size = 0;
-
auto insert_from_hash_table = [&](uint8_t offset, uint32_t row_num) {
block_size++;
- for (size_t j = 0; j < _right_col_len; ++j) {
+ for (size_t j = 0; j < right_col_len; ++j) {
auto& column =
*_build_blocks[offset].get_by_position(j).column;
- mcol[j + _right_col_idx]->insert_from(column, row_num);
+ mcol[j + right_col_idx]->insert_from(column, row_num);
}
};
@@ -540,7 +552,7 @@ struct ProcessHashTableProbe {
JoinOpType::value == TJoinOp::FULL_OUTER_JOIN ||
JoinOpType::value == TJoinOp::RIGHT_OUTER_JOIN ||
JoinOpType::value == TJoinOp::FULL_OUTER_JOIN) {
- for (int i = 0; i < _right_col_idx; ++i) {
+ for (int i = 0; i < right_col_idx; ++i) {
for (int j = 0; j < block_size; ++j) {
assert_cast<ColumnNullable
*>(mcol[i].get())->insert_data(nullptr, 0);
}
@@ -554,8 +566,6 @@ struct ProcessHashTableProbe {
private:
HashJoinNode* _join_node;
- const int _right_col_idx;
- const int _right_col_len;
const int _batch_size;
const size_t _probe_rows;
const std::vector<Block>& _build_blocks;
@@ -703,9 +713,6 @@ Status HashJoinNode::prepare(RuntimeState* state) {
// Hash Table Init
_hash_table_init();
- _right_col_idx = _is_right_semi_anti ? 0 : _left_table_data_types.size();
- _right_col_len = _right_table_data_types.size();
-
_build_block_offsets.resize(state->batch_size());
_build_block_rows.resize(state->batch_size());
return Status::OK();
diff --git a/be/src/vec/exec/join/vhash_join_node.h
b/be/src/vec/exec/join/vhash_join_node.h
index 4fbfc15..b50d11f 100644
--- a/be/src/vec/exec/join/vhash_join_node.h
+++ b/be/src/vec/exec/join/vhash_join_node.h
@@ -223,8 +223,6 @@ private:
bool _have_other_join_conjunct = false;
RowDescriptor _row_desc_for_other_join_conjunt;
- int _right_col_idx = 0;
- int _right_col_len = 0;
std::vector<uint32_t> _items_counts;
std::vector<int8_t> _build_block_offsets;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]