This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/dev-1.0.1 by this push:
new 04a7bf0 [fix](vectorized) Agg/Unique not null column outer join
coredump (#8461)
04a7bf0 is described below
commit 04a7bf08b24dd4c8acdb6b7dc82c6ddd58efc551
Author: HappenLee <[email protected]>
AuthorDate: Mon Mar 14 10:52:17 2022 +0800
[fix](vectorized) Agg/Unique not null column outer join coredump (#8461)
---
be/src/exec/olap_scanner.cpp | 4 ++++
be/src/exec/olap_scanner.h | 1 +
be/src/olap/reader.cpp | 2 ++
be/src/olap/reader.h | 4 ++++
be/src/olap/tablet_schema.cpp | 7 +++++--
be/src/olap/tablet_schema.h | 3 ++-
be/src/vec/olap/vcollect_iterator.cpp | 2 +-
7 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/be/src/exec/olap_scanner.cpp b/be/src/exec/olap_scanner.cpp
index b78fba7..6db7774 100644
--- a/be/src/exec/olap_scanner.cpp
+++ b/be/src/exec/olap_scanner.cpp
@@ -180,6 +180,8 @@ Status OlapScanner::_init_tablet_reader_params(
!_tablet_reader_params.rs_readers[1]->rowset()->rowset_meta()->is_segments_overlapping());
_tablet_reader_params.origin_return_columns = &_return_columns;
+ _tablet_reader_params.tablet_columns_convert_to_null_set =
&_tablet_columns_convert_to_null_set;
+
if (_aggregation || single_version) {
_tablet_reader_params.return_columns = _return_columns;
_tablet_reader_params.direct_mode = true;
@@ -230,6 +232,8 @@ Status OlapScanner::_init_return_columns() {
return Status::InternalError(ss.str());
}
_return_columns.push_back(index);
+ if (slot->is_nullable() &&
!_tablet->tablet_schema().column(index).is_nullable())
+ _tablet_columns_convert_to_null_set.emplace(index);
_query_slots.push_back(slot);
}
diff --git a/be/src/exec/olap_scanner.h b/be/src/exec/olap_scanner.h
index 0c684d9..8c173c2 100644
--- a/be/src/exec/olap_scanner.h
+++ b/be/src/exec/olap_scanner.h
@@ -128,6 +128,7 @@ protected:
int64_t _version;
std::vector<uint32_t> _return_columns;
+ std::unordered_set<uint32_t> _tablet_columns_convert_to_null_set;
RowCursor _read_row_cursor;
diff --git a/be/src/olap/reader.cpp b/be/src/olap/reader.cpp
index ec0f4fa..4542ae3 100644
--- a/be/src/olap/reader.cpp
+++ b/be/src/olap/reader.cpp
@@ -281,6 +281,8 @@ OLAPStatus TabletReader::_init_params(const ReaderParams&
read_params) {
OLAPStatus TabletReader::_init_return_columns(const ReaderParams& read_params)
{
if (read_params.reader_type == READER_QUERY) {
_return_columns = read_params.return_columns;
+ _tablet_columns_convert_to_null_set =
read_params.tablet_columns_convert_to_null_set;
+
if (!_delete_handler.empty()) {
// We need to fetch columns which there are deletion conditions on
them.
set<uint32_t> column_set(_return_columns.begin(),
_return_columns.end());
diff --git a/be/src/olap/reader.h b/be/src/olap/reader.h
index 3137e06..f3245b0 100644
--- a/be/src/olap/reader.h
+++ b/be/src/olap/reader.h
@@ -96,6 +96,7 @@ public:
// use only in vec exec engine
std::vector<uint32_t>* origin_return_columns = nullptr;
+ std::unordered_set<uint32_t>* tablet_columns_convert_to_null_set =
nullptr;
void check_validation() const;
@@ -190,6 +191,9 @@ protected:
std::set<uint32_t> _load_bf_columns;
std::set<uint32_t> _load_bf_all_columns;
std::vector<uint32_t> _return_columns;
+ // only use in outer join which change the column nullable which must keep
same in
+ // vec query engine
+ std::unordered_set<uint32_t>* _tablet_columns_convert_to_null_set =
nullptr;
std::vector<uint32_t> _seek_columns;
TabletSharedPtr _tablet;
diff --git a/be/src/olap/tablet_schema.cpp b/be/src/olap/tablet_schema.cpp
index 9ad710d..afafd25 100644
--- a/be/src/olap/tablet_schema.cpp
+++ b/be/src/olap/tablet_schema.cpp
@@ -492,11 +492,14 @@ void TabletSchema::init_field_index_for_test() {
}
}
-vectorized::Block TabletSchema::create_block(const std::vector<uint32_t>&
return_columns) const {
+vectorized::Block TabletSchema::create_block(const std::vector<uint32_t>&
return_columns,
+ const std::unordered_set<uint32_t>* tablet_columns_need_convert_null)
const {
vectorized::Block block;
for (int i = 0; i < return_columns.size(); ++i) {
const auto& col = _cols[return_columns[i]];
- auto data_type = vectorized::IDataType::from_olap_engine(col.type(),
col.is_nullable());
+ auto data_type = vectorized::IDataType::from_olap_engine(col.type(),
+ col.is_nullable() || (tablet_columns_need_convert_null !=
nullptr &&
+ tablet_columns_need_convert_null->find(return_columns[i]) !=
tablet_columns_need_convert_null->end()));
auto column = data_type->create_column();
block.insert({std::move(column), data_type, col.name()});
}
diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h
index becee2e..f7cd3ca 100644
--- a/be/src/olap/tablet_schema.h
+++ b/be/src/olap/tablet_schema.h
@@ -143,7 +143,8 @@ public:
inline void set_delete_sign_idx(int32_t delete_sign_idx) {
_delete_sign_idx = delete_sign_idx; }
inline bool has_sequence_col() const { return _sequence_col_idx != -1; }
inline int32_t sequence_col_idx() const { return _sequence_col_idx; }
- vectorized::Block create_block(const std::vector<uint32_t>&
return_columns) const;
+ vectorized::Block create_block(const std::vector<uint32_t>& return_columns,
+ const std::unordered_set<uint32_t>*
tablet_columns_need_convert_null) const;
private:
// Only for unit test
diff --git a/be/src/vec/olap/vcollect_iterator.cpp
b/be/src/vec/olap/vcollect_iterator.cpp
index fc5d696..18d8022 100644
--- a/be/src/vec/olap/vcollect_iterator.cpp
+++ b/be/src/vec/olap/vcollect_iterator.cpp
@@ -171,7 +171,7 @@ OLAPStatus VCollectIterator::next(Block* block) {
VCollectIterator::Level0Iterator::Level0Iterator(RowsetReaderSharedPtr
rs_reader, TabletReader* reader)
: LevelIterator(reader), _rs_reader(rs_reader), _reader(reader) {
DCHECK_EQ(RowsetTypePB::BETA_ROWSET, rs_reader->type());
- _block =
std::make_shared<Block>(_schema.create_block(_reader->_return_columns));
+ _block =
std::make_shared<Block>(_schema.create_block(_reader->_return_columns,
_reader->_tablet_columns_convert_to_null_set));
_ref.block = _block;
_ref.row_pos = 0;
_ref.is_same = false;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]