From 99212a385588030f9cdd4f08c16f24c75e2d4cc2 Mon Sep 17 00:00:00 2001 From: BiteTheDDDDt Date: Tue, 21 Nov 2023 17:11:39 +0800 Subject: [PATCH] do not ppush down agg on aggregate column when query match mv --- 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 34659211bac981..acfe4d2b20f2b8 100644 --- a/be/src/olap/rowset/segment_v2/column_reader.cpp +++ b/be/src/olap/rowset/segment_v2/column_reader.cpp @@ -289,6 +289,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 1f0fabea7f5ea9..e232e448ff6df3 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 686b63a9de7175..d7dcc7d0c7422e 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 @@ class ZoneMapIndexWriter { 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 @@ class TypedZoneMapIndexWriter final : public ZoneMapIndexWriter { 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 b72812de1515d9..27916cfee6176c 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 6521929f164c13..89373cc95c3e49 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 @@ private LogicalAggregate storageLayerAggregate( 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 7e16ad74c33287..96d8c08f129090 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 boolean pushDownAggNoGroupingCheckCol(FunctionCallExpr aggExpr, Column co 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 ceec2c123596c8..f402c4e2cc3305 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 e671f118233fce..59d4fbcede6860 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;""" }