This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 9f8753ffd2 [bugfix](vertical_compaction) fix base_compaction 
delete_sign handler (#16469)
9f8753ffd2 is described below

commit 9f8753ffd2863dc34f721d17092184dd058f2f37
Author: yixiutt <[email protected]>
AuthorDate: Thu Feb 9 10:13:41 2023 +0800

    [bugfix](vertical_compaction) fix base_compaction delete_sign handler 
(#16469)
    
    In vertical base compaction, same rows will be filtered in 
vertical_merge_iterator,
    we should skip these filtered rows when set agg flag of delete sign.
    For example, schema is a,b,delete_sign, and data is
    1,1,1
    1,1,0
    1,1,0
    2,2,1
    2,2
    and Block we get in VerticalBlockReader is
    1,1,1
    2,2,1
    and we should set agg flag idex 0,4 to true when handle delete sign, so
    we add a function continuous_agg_count to skip same rows filtered in
    VerticalMergeIterator.
---
 be/src/vec/olap/vertical_block_reader.cpp   |  4 +++-
 be/src/vec/olap/vertical_merge_iterator.cpp | 15 +++++++++++++++
 be/src/vec/olap/vertical_merge_iterator.h   |  3 +++
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/be/src/vec/olap/vertical_block_reader.cpp 
b/be/src/vec/olap/vertical_block_reader.cpp
index c4848708c6..0bc1b98da2 100644
--- a/be/src/vec/olap/vertical_block_reader.cpp
+++ b/be/src/vec/olap/vertical_block_reader.cpp
@@ -393,8 +393,10 @@ Status VerticalBlockReader::_unique_key_next_block(Block* 
block, bool* eof) {
                 bool sign = (delete_data[i] == 0);
                 filter_data[i] = sign;
                 if (UNLIKELY(!sign)) {
-                    _row_sources_buffer->set_agg_flag(row_source_idx + i, 
true);
+                    _row_sources_buffer->set_agg_flag(row_source_idx, true);
                 }
+                // skip same rows filtered in vertical_merge_iterator
+                row_source_idx += 
_row_sources_buffer->continuous_agg_count(row_source_idx);
             }
 
             ColumnWithTypeAndName column_with_type_and_name 
{_delete_filter_column,
diff --git a/be/src/vec/olap/vertical_merge_iterator.cpp 
b/be/src/vec/olap/vertical_merge_iterator.cpp
index 605e110e06..f173c6b3da 100644
--- a/be/src/vec/olap/vertical_merge_iterator.cpp
+++ b/be/src/vec/olap/vertical_merge_iterator.cpp
@@ -98,6 +98,21 @@ void RowSourcesBuffer::set_agg_flag(uint64_t index, bool 
agg) {
     _buffer->get_data()[index] = ori.data();
 }
 
+size_t RowSourcesBuffer::continuous_agg_count(uint64_t index) {
+    size_t result = 1;
+    int start = index + 1;
+    int end = _buffer->size();
+    while (index < end) {
+        RowSource next(_buffer->get_element(start++));
+        if (next.agg_flag()) {
+            ++result;
+        } else {
+            break;
+        }
+    }
+    return result;
+}
+
 size_t RowSourcesBuffer::same_source_count(uint16_t source, size_t limit) {
     int result = 1;
     int start = _buf_idx + 1;
diff --git a/be/src/vec/olap/vertical_merge_iterator.h 
b/be/src/vec/olap/vertical_merge_iterator.h
index 11da3cf43c..822000a2bc 100644
--- a/be/src/vec/olap/vertical_merge_iterator.h
+++ b/be/src/vec/olap/vertical_merge_iterator.h
@@ -103,6 +103,9 @@ public:
 
     size_t same_source_count(uint16_t source, size_t limit);
 
+    // return continous agg_flag=true count from index
+    size_t continuous_agg_count(uint64_t index);
+
 private:
     Status _create_buffer_file();
     Status _serialize();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to