From b541de7a031af277351ce7228e42ea483536c559 Mon Sep 17 00:00:00 2001 From: Pxl Date: Wed, 22 Nov 2023 10:53:29 +0800 Subject: [PATCH] do not push down agg on aggregate column (#27356) do not push down agg on aggregate column --- be/src/olap/rowset/segment_v2/column_reader.cpp | 3 +++ be/src/olap/rowset/segment_v2/zone_map_index.cpp | 5 ----- be/src/olap/rowset/segment_v2/zone_map_index.h | 2 -- be/src/vec/olap/vgeneric_iterators.cpp | 2 +- .../nereids/rules/implementation/AggregateStrategies.java | 7 ++----- .../main/java/org/apache/doris/planner/OlapScanNode.java | 7 +++++++ .../data/mv_p0/ssb/multiple_no_where/multiple_no_where.out | 3 +++ .../mv_p0/ssb/multiple_no_where/multiple_no_where.groovy | 1 + 8 files changed, 17 insertions(+), 13 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/column_reader.cpp b/be/src/olap/rowset/segment_v2/column_reader.cpp index 76affaa03b..1432d51eb1 100644 --- a/be/src/olap/rowset/segment_v2/column_reader.cpp +++ b/be/src/olap/rowset/segment_v2/column_reader.cpp @@ -288,6 +288,9 @@ Status ColumnReader::get_row_ranges_by_zone_map( } Status ColumnReader::next_batch_of_zone_map(size_t* n, vectorized::MutableColumnPtr& dst) const { + if (_segment_zone_map == nullptr) { + return Status::InternalError("segment zonemap not exist"); + } // TODO: this work to get min/max value seems should only do once FieldType type = _type_info->type(); std::unique_ptr min_value(WrapperField::create_by_type(type, _meta_length)); diff --git a/be/src/olap/rowset/segment_v2/zone_map_index.cpp b/be/src/olap/rowset/segment_v2/zone_map_index.cpp index 1f0fabea7f..e232e448ff 100644 --- a/be/src/olap/rowset/segment_v2/zone_map_index.cpp +++ b/be/src/olap/rowset/segment_v2/zone_map_index.cpp @@ -80,11 +80,6 @@ void TypedZoneMapIndexWriter::reset_page_zone_map() { _page_zone_map.pass_all = true; } -template -void TypedZoneMapIndexWriter::reset_segment_zone_map() { - _segment_zone_map.pass_all = true; -} - template Status TypedZoneMapIndexWriter::flush() { // Update segment zone map. diff --git a/be/src/olap/rowset/segment_v2/zone_map_index.h b/be/src/olap/rowset/segment_v2/zone_map_index.h index 686b63a9de..d7dcc7d0c7 100644 --- a/be/src/olap/rowset/segment_v2/zone_map_index.h +++ b/be/src/olap/rowset/segment_v2/zone_map_index.h @@ -94,7 +94,6 @@ public: virtual uint64_t size() const = 0; virtual void reset_page_zone_map() = 0; - virtual void reset_segment_zone_map() = 0; }; // Zone map index is represented by an IndexedColumn with ordinal index. @@ -120,7 +119,6 @@ public: uint64_t size() const override { return _estimated_size; } void reset_page_zone_map() override; - void reset_segment_zone_map() override; private: void _reset_zone_map(ZoneMap* zone_map) { diff --git a/be/src/vec/olap/vgeneric_iterators.cpp b/be/src/vec/olap/vgeneric_iterators.cpp index b72812de15..27916cfee6 100644 --- a/be/src/vec/olap/vgeneric_iterators.cpp +++ b/be/src/vec/olap/vgeneric_iterators.cpp @@ -79,7 +79,7 @@ Status VStatisticsIterator::next_batch(Block* block) { } } else { for (int i = 0; i < block->columns(); ++i) { - static_cast(_column_iterators[i]->next_batch_of_zone_map(&size, columns[i])); + RETURN_IF_ERROR(_column_iterators[i]->next_batch_of_zone_map(&size, columns[i])); } } _output_rows += size; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java index 6521929f16..89373cc95c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java @@ -436,11 +436,8 @@ public class AggregateStrategies implements ImplementationRuleFactory { for (SlotReference slot : usedSlotInTable) { Column column = slot.getColumn().get(); - if (logicalScan instanceof LogicalOlapScan) { - KeysType keysType = ((LogicalOlapScan) logicalScan).getTable().getKeysType(); - if (keysType == KeysType.AGG_KEYS && !column.isKey()) { - return canNotPush; - } + if (column.isAggregated()) { + return canNotPush; } // The zone map max length of CharFamily is 512, do not // over the length: https://github.com/apache/doris/pull/6293 diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java index 7e16ad74c3..96d8c08f12 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java @@ -1668,6 +1668,13 @@ public class OlapScanNode extends ScanNode { return false; } + if (aggExpr.getChild(0) instanceof SlotRef) { + SlotRef slot = (SlotRef) aggExpr.getChild(0); + if (CreateMaterializedViewStmt.isMVColumn(slot.getColumnName()) && slot.getColumn().isAggregated()) { + return false; + } + } + return true; } } diff --git a/regression-test/data/mv_p0/ssb/multiple_no_where/multiple_no_where.out b/regression-test/data/mv_p0/ssb/multiple_no_where/multiple_no_where.out index ceec2c1235..f402c4e2cc 100644 --- a/regression-test/data/mv_p0/ssb/multiple_no_where/multiple_no_where.out +++ b/regression-test/data/mv_p0/ssb/multiple_no_where/multiple_no_where.out @@ -26,3 +26,6 @@ ASIA ASIA 1992 1 1 4 1 1 2 8 2 2 +-- !select -- +1 2 + diff --git a/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy b/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy index e671f11823..59d4fbcede 100644 --- a/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy +++ b/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy @@ -231,4 +231,5 @@ suite ("multiple_no_where") { contains "(temp_2)" } qt_select_temp_2 """SELECT lo_orderkey, sum(lo_extendedprice),max(lo_extendedprice), min(lo_extendedprice) from lineorder_flat group by lo_orderkey order by lo_orderkey;""" + qt_select """ select min(lo_extendedprice),max(lo_extendedprice) from lineorder_flat;""" }