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]

Reply via email to