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 02d035466b [refactor] remove partition pruner v1 (#15552) 02d035466b is described below commit 02d035466b39fd08e03542b491f1be16b156ec68 Author: Mingyu Chen <morning...@163.com> AuthorDate: Tue Jan 3 11:35:30 2023 +0800 [refactor] remove partition pruner v1 (#15552) partition pruner v1 is no longer used. Also remove session variable partition_prune_algorithm_version --- .../java/org/apache/doris/analysis/Analyzer.java | 9 - .../java/org/apache/doris/analysis/SetVar.java | 9 - .../planner/BackendPartitionedSchemaScanNode.java | 11 +- .../java/org/apache/doris/planner/EsScanNode.java | 4 +- .../apache/doris/planner/ListPartitionPruner.java | 252 --------------------- .../org/apache/doris/planner/OlapScanNode.java | 18 +- .../apache/doris/planner/RangePartitionPruner.java | 194 ---------------- .../java/org/apache/doris/planner/ScanNode.java | 18 +- .../apache/doris/planner/StreamLoadPlanner.java | 19 +- .../java/org/apache/doris/qe/SessionVariable.java | 9 - .../doris/analysis/ListPartitionPrunerTest.java | 56 ++--- .../doris/analysis/PartitionPruneTestBase.java | 21 +- .../doris/analysis/RangePartitionPruneTest.java | 95 ++++---- 13 files changed, 111 insertions(+), 604 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java index 6dac70dbe9..b3e21d6c38 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -2129,15 +2129,6 @@ public class Analyzer { return globalState.context.getSessionVariable().isEnableInferPredicate(); } - // Use V2 version as default implementation. - public boolean partitionPruneV2Enabled() { - if (globalState.context == null) { - return true; - } else { - return globalState.context.getSessionVariable().getPartitionPruneAlgorithmVersion() == 2; - } - } - // The cost based join reorder is turned on // when 'enable_join_reorder_based_cost = true' and 'disable_join_reorder = false' // Load plan and query plan are the same framework diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetVar.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetVar.java index b49423b002..9b80734bc0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetVar.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetVar.java @@ -150,15 +150,6 @@ public class SetVar { if (getVariable().equalsIgnoreCase("is_report_success")) { variable = SessionVariable.ENABLE_PROFILE; } - - if (getVariable().equalsIgnoreCase(SessionVariable.PARTITION_PRUNE_ALGORITHM_VERSION)) { - String value = getValue().getStringValue(); - if (!"1".equals(value) && !"2".equals(value)) { - throw new AnalysisException("Value of " - + SessionVariable.PARTITION_PRUNE_ALGORITHM_VERSION + " should be " - + "either 1 or 2, but meet " + value); - } - } } public String toSql() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/BackendPartitionedSchemaScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/BackendPartitionedSchemaScanNode.java index 5bc7417f28..8889373af3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/BackendPartitionedSchemaScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/BackendPartitionedSchemaScanNode.java @@ -127,15 +127,10 @@ public class BackendPartitionedSchemaScanNode extends SchemaScanNode { } } createPartitionInfo(partitionColumns); - PartitionPruner partitionPruner = null; Map<Long, PartitionItem> keyItemMap = backendPartitionInfo.getIdToItem(false); - if (analyzer.partitionPruneV2Enabled()) { - partitionPruner = new ListPartitionPrunerV2(keyItemMap, backendPartitionInfo.getPartitionColumns(), - columnNameToRange); - } else { - partitionPruner = new ListPartitionPruner(keyItemMap, - backendPartitionInfo.getPartitionColumns(), columnFilters); - } + PartitionPruner partitionPruner = new ListPartitionPrunerV2(keyItemMap, + backendPartitionInfo.getPartitionColumns(), + columnNameToRange); selectedPartitionIds = partitionPruner.prune(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java index 157c85047b..a57ee755f3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/EsScanNode.java @@ -316,8 +316,8 @@ public class EsScanNode extends ScanNode { case RANGE: { RangePartitionInfo rangePartitionInfo = (RangePartitionInfo) partitionInfo; Map<Long, PartitionItem> keyRangeById = rangePartitionInfo.getIdToItem(false); - partitionPruner = new RangePartitionPruner(keyRangeById, rangePartitionInfo.getPartitionColumns(), - columnFilters); + partitionPruner = new RangePartitionPrunerV2(keyRangeById, rangePartitionInfo.getPartitionColumns(), + columnNameToRange); return partitionPruner.prune(); } case UNPARTITIONED: { diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ListPartitionPruner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ListPartitionPruner.java deleted file mode 100644 index 64b7650045..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/ListPartitionPruner.java +++ /dev/null @@ -1,252 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package org.apache.doris.planner; - -import org.apache.doris.analysis.InPredicate; -import org.apache.doris.analysis.LiteralExpr; -import org.apache.doris.catalog.Column; -import org.apache.doris.catalog.PartitionItem; -import org.apache.doris.catalog.PartitionKey; -import org.apache.doris.catalog.Type; -import org.apache.doris.common.AnalysisException; - -import com.google.common.collect.BoundType; -import com.google.common.collect.Lists; -import com.google.common.collect.Range; -import com.google.common.collect.Sets; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * list partition pruner - */ -public class ListPartitionPruner implements PartitionPruner { - - private Map<Long, PartitionItem> partitionListMap; - private List<Column> partitionColumns; - private Map<String, PartitionColumnFilter> partitionColumnFilters; - - public ListPartitionPruner(Map<Long, PartitionItem> listMap, - List<Column> columns, - Map<String, PartitionColumnFilter> filters) { - partitionListMap = listMap; - partitionColumns = columns; - partitionColumnFilters = filters; - } - - private Collection<Long> pruneListMap(Map<Long, PartitionItem> listMap, - Range<PartitionKey> range, - int columnId) { - Set<Long> resultSet = Sets.newHashSet(); - for (Map.Entry<Long, PartitionItem> entry : listMap.entrySet()) { - List<PartitionKey> partitionKeys = entry.getValue().getItems(); - for (PartitionKey partitionKey : partitionKeys) { - LiteralExpr expr = partitionKey.getKeys().get(columnId); - if (contain(range, expr, columnId)) { - resultSet.add(entry.getKey()); - } - } - } - return resultSet; - } - - /** - * check literal expr exist in partition range - * @param range the partition key range - * @param literalExpr expr to be checked - * @param columnId expr column index in partition key - * @return - */ - private boolean contain(Range<PartitionKey> range, LiteralExpr literalExpr, int columnId) { - LiteralExpr lowerExpr = range.lowerEndpoint().getKeys().get(columnId); - LiteralExpr upperExpr = range.upperEndpoint().getKeys().get(columnId); - BoundType lType = range.lowerBoundType(); - BoundType uType = range.upperBoundType(); - int ret1 = PartitionKey.compareLiteralExpr(literalExpr, lowerExpr); - int ret2 = PartitionKey.compareLiteralExpr(literalExpr, upperExpr); - - if (lType == BoundType.CLOSED && uType == BoundType.CLOSED) { - if (ret1 >= 0 && ret2 <= 0) { - return true; - } - } else if (lType == BoundType.CLOSED && uType == BoundType.OPEN) { - if (ret1 >= 0 && ret2 < 0) { - return true; - } - } else if (lType == BoundType.OPEN && uType == BoundType.CLOSED) { - if (ret1 > 0 && ret2 <= 0) { - return true; - } - } else if (lType == BoundType.OPEN && uType == BoundType.OPEN) { - if (ret1 > 0 && ret2 < 0) { - return true; - } - } - return false; - } - - /** - * get min literal expr from partition key list map by partition key column id. - * @param columnId - * @return - */ - private LiteralExpr getMinLiteral(int columnId) { - LiteralExpr minLiteral = null; - for (Map.Entry<Long, PartitionItem> entry : partitionListMap.entrySet()) { - List<PartitionKey> partitionKeys = entry.getValue().getItems(); - for (PartitionKey partitionKey : partitionKeys) { - minLiteral = getMinExpr(partitionKey.getKeys().get(columnId), minLiteral); - } - } - return minLiteral; - } - - private LiteralExpr getMinExpr(LiteralExpr expr, LiteralExpr minLiteral) { - if (minLiteral == null) { - minLiteral = expr; - return minLiteral; - } - if (expr.compareLiteral(minLiteral) < 0) { - minLiteral = expr; - } - return minLiteral; - } - - private Collection<Long> prune( - Map<Long, PartitionItem> listMap, - int columnId, - PartitionKey minKey, - PartitionKey maxKey, - int complex) - throws AnalysisException { - // if partition item map is empty, no need to prune. - if (listMap.size() == 0) { - return Lists.newArrayList(); - } - - if (columnId == partitionColumns.size()) { - try { - return pruneListMap(listMap, Range.closed(minKey, maxKey), columnId - 1); - } catch (IllegalArgumentException e) { - return Lists.newArrayList(); - } - } - Column keyColumn = partitionColumns.get(columnId); - PartitionColumnFilter filter = partitionColumnFilters.get(keyColumn.getName()); - // no filter in this column - if (null == filter) { - minKey.pushColumn(getMinLiteral(columnId), keyColumn.getDataType()); - maxKey.pushColumn(LiteralExpr.createInfinity(Type.fromPrimitiveType(keyColumn.getDataType()), true), - keyColumn.getDataType()); - Collection<Long> result = null; - try { - // prune next partition column - result = prune(listMap, columnId + 1, minKey, maxKey, complex); - } catch (IllegalArgumentException e) { - result = Lists.newArrayList(); - } - minKey.popColumn(); - maxKey.popColumn(); - return result; - } - InPredicate inPredicate = filter.getInPredicate(); - if (null == inPredicate || inPredicate.getChildren().size() * complex > 100) { - // case: where k1 = 1; - if (filter.lowerBoundInclusive && filter.upperBoundInclusive - && filter.lowerBound != null && filter.upperBound != null - && 0 == filter.lowerBound.compareLiteral(filter.upperBound)) { - minKey.pushColumn(filter.lowerBound, keyColumn.getDataType()); - maxKey.pushColumn(filter.upperBound, keyColumn.getDataType()); - // handle like in predicate - Collection<Long> result = pruneListMap(listMap, Range.closed(minKey, maxKey), columnId); - // prune next partition column - if (partitionColumns.size() > 1) { - result.retainAll(prune(listMap, columnId + 1, minKey, maxKey, complex)); - } - minKey.popColumn(); - maxKey.popColumn(); - return result; - } - // no in predicate - BoundType lowerType = filter.lowerBoundInclusive ? BoundType.CLOSED : BoundType.OPEN; - BoundType upperType = filter.upperBoundInclusive ? BoundType.CLOSED : BoundType.OPEN; - boolean isPushMin = false; - boolean isPushMax = false; - if (filter.lowerBound != null) { - minKey.pushColumn(filter.lowerBound, keyColumn.getDataType()); - } else { - minKey.pushColumn(getMinLiteral(columnId), - keyColumn.getDataType()); - isPushMin = true; - } - if (filter.upperBound != null) { - maxKey.pushColumn(filter.upperBound, keyColumn.getDataType()); - } else { - maxKey.pushColumn(LiteralExpr.createInfinity(Type.fromPrimitiveType(keyColumn.getDataType()), true), - keyColumn.getDataType()); - isPushMax = true; - } - - Collection<Long> result = null; - try { - result = pruneListMap(listMap, Range.range(minKey, lowerType, maxKey, upperType), columnId); - // prune next partition column - if (partitionColumns.size() > 1) { - result.retainAll(prune(listMap, columnId + 1, minKey, maxKey, complex)); - } - return result; - } catch (IllegalArgumentException e) { - result = Lists.newArrayList(); - } - if (isPushMin) { - minKey.popColumn(); - } - if (isPushMax) { - maxKey.popColumn(); - } - return result; - } - Set<Long> resultSet = Sets.newHashSet(); - int childrenNum = inPredicate.getChildren().size(); - complex = inPredicate.getChildren().size() * complex; - for (int i = 1; i < childrenNum; ++i) { - LiteralExpr expr = (LiteralExpr) inPredicate.getChild(i); - minKey.pushColumn(expr, keyColumn.getDataType()); - maxKey.pushColumn(expr, keyColumn.getDataType()); - Collection<Long> result = pruneListMap(listMap, Range.closed(minKey, maxKey), columnId); - // prune next partition column - if (partitionColumns.size() > 1) { - // Take the intersection - result.retainAll(prune(listMap, columnId + 1, minKey, maxKey, complex)); - } - resultSet.addAll(result); - minKey.popColumn(); - maxKey.popColumn(); - } - return resultSet; - } - - public Collection<Long> prune() throws AnalysisException { - PartitionKey minKey = new PartitionKey(); - PartitionKey maxKey = new PartitionKey(); - return prune(partitionListMap, 0, minKey, maxKey, 1); - } -} 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 6edf3fc023..f7c823aaaf 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 @@ -565,21 +565,11 @@ public class OlapScanNode extends ScanNode { } if (partitionInfo.getType() == PartitionType.RANGE) { - if (analyzer.partitionPruneV2Enabled()) { - partitionPruner = new RangePartitionPrunerV2(keyItemMap, - partitionInfo.getPartitionColumns(), columnNameToRange); - } else { - partitionPruner = new RangePartitionPruner(keyItemMap, - partitionInfo.getPartitionColumns(), columnFilters); - } + partitionPruner = new RangePartitionPrunerV2(keyItemMap, + partitionInfo.getPartitionColumns(), columnNameToRange); } else if (partitionInfo.getType() == PartitionType.LIST) { - if (analyzer.partitionPruneV2Enabled()) { - partitionPruner = new ListPartitionPrunerV2(keyItemMap, partitionInfo.getPartitionColumns(), - columnNameToRange); - } else { - partitionPruner = new ListPartitionPruner(keyItemMap, - partitionInfo.getPartitionColumns(), columnFilters); - } + partitionPruner = new ListPartitionPrunerV2(keyItemMap, partitionInfo.getPartitionColumns(), + columnNameToRange); } return partitionPruner.prune(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/RangePartitionPruner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/RangePartitionPruner.java deleted file mode 100644 index c61d312e91..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/RangePartitionPruner.java +++ /dev/null @@ -1,194 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package org.apache.doris.planner; - -import org.apache.doris.analysis.InPredicate; -import org.apache.doris.analysis.LiteralExpr; -import org.apache.doris.analysis.NullLiteral; -import org.apache.doris.catalog.Column; -import org.apache.doris.catalog.PartitionItem; -import org.apache.doris.catalog.PartitionKey; -import org.apache.doris.catalog.Type; -import org.apache.doris.common.AnalysisException; - -import com.google.common.collect.BoundType; -import com.google.common.collect.Lists; -import com.google.common.collect.Range; -import com.google.common.collect.RangeMap; -import com.google.common.collect.Sets; -import com.google.common.collect.TreeRangeMap; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class RangePartitionPruner implements PartitionPruner { - private static final Logger LOG = LogManager.getLogger(RangePartitionPruner.class); - - private Map<Long, PartitionItem> partitionRangeMap; - private List<Column> partitionColumns; - private Map<String, PartitionColumnFilter> partitionColumnFilters; - - public RangePartitionPruner(Map<Long, PartitionItem> rangeMap, - List<Column> columns, - Map<String, PartitionColumnFilter> filters) { - partitionRangeMap = rangeMap; - partitionColumns = columns; - partitionColumnFilters = filters; - } - - private Collection<Long> prune(RangeMap<PartitionKey, Long> rangeMap, - int columnIdx, - PartitionKey minKey, - PartitionKey maxKey, - int complex) - throws AnalysisException { - LOG.debug("column idx {}, column filters {}", columnIdx, partitionColumnFilters); - // the last column in partition Key - if (columnIdx == partitionColumns.size()) { - try { - return Lists.newArrayList(rangeMap.subRangeMap(Range.closed(minKey, maxKey)).asMapOfRanges().values()); - } catch (IllegalArgumentException e) { - return Lists.newArrayList(); - } - } - // no filter in this column - Column keyColumn = partitionColumns.get(columnIdx); - PartitionColumnFilter filter = partitionColumnFilters.get(keyColumn.getName()); - if (null == filter) { - minKey.pushColumn(LiteralExpr.createInfinity(Type.fromPrimitiveType(keyColumn.getDataType()), false), - keyColumn.getDataType()); - maxKey.pushColumn(LiteralExpr.createInfinity(Type.fromPrimitiveType(keyColumn.getDataType()), true), - keyColumn.getDataType()); - Collection<Long> result = null; - try { - result = Lists.newArrayList( - rangeMap.subRangeMap(Range.closed(minKey, maxKey)).asMapOfRanges().values()); - } catch (IllegalArgumentException e) { - result = Lists.newArrayList(); - } - minKey.popColumn(); - maxKey.popColumn(); - return result; - } - InPredicate inPredicate = filter.getInPredicate(); - if (null == inPredicate || inPredicate.getChildren().size() * complex > 100) { - if (filter.lowerBoundInclusive && filter.upperBoundInclusive - && filter.lowerBound != null && filter.upperBound != null - && 0 == filter.lowerBound.compareLiteral(filter.upperBound)) { - - // eg: [10, 10], [null, null] - if (filter.lowerBound instanceof NullLiteral && filter.upperBound instanceof NullLiteral) { - // replace Null with min value - LiteralExpr minKeyValue = LiteralExpr.createInfinity( - Type.fromPrimitiveType(keyColumn.getDataType()), false); - minKey.pushColumn(minKeyValue, keyColumn.getDataType()); - maxKey.pushColumn(minKeyValue, keyColumn.getDataType()); - } else { - minKey.pushColumn(filter.lowerBound, keyColumn.getDataType()); - maxKey.pushColumn(filter.upperBound, keyColumn.getDataType()); - } - Collection<Long> result = prune(rangeMap, columnIdx + 1, minKey, maxKey, complex); - minKey.popColumn(); - maxKey.popColumn(); - return result; - } - - // no in predicate - BoundType lowerType = filter.lowerBoundInclusive ? BoundType.CLOSED : BoundType.OPEN; - BoundType upperType = filter.upperBoundInclusive ? BoundType.CLOSED : BoundType.OPEN; - int pushMinCount = 0; - int pushMaxCount = 0; - int lastColumnId = partitionColumns.size() - 1; - if (filter.lowerBound != null) { - minKey.pushColumn(filter.lowerBound, keyColumn.getDataType()); - pushMinCount++; - if (filter.lowerBoundInclusive && columnIdx != lastColumnId) { - Column column = partitionColumns.get(columnIdx + 1); - Type type = Type.fromPrimitiveType(column.getDataType()); - minKey.pushColumn(LiteralExpr.createInfinity(type, false), column.getDataType()); - pushMinCount++; - } - } else { - Type type = Type.fromPrimitiveType(keyColumn.getDataType()); - minKey.pushColumn(LiteralExpr.createInfinity(type, false), keyColumn.getDataType()); - pushMinCount++; - } - if (filter.upperBound != null) { - maxKey.pushColumn(filter.upperBound, keyColumn.getDataType()); - pushMaxCount++; - if (filter.upperBoundInclusive && columnIdx != lastColumnId) { - Column column = partitionColumns.get(columnIdx + 1); - maxKey.pushColumn(LiteralExpr.createInfinity(Type.fromPrimitiveType(column.getDataType()), true), - column.getDataType()); - pushMaxCount++; - } - } else { - maxKey.pushColumn(LiteralExpr.createInfinity(Type.fromPrimitiveType(keyColumn.getDataType()), true), - keyColumn.getDataType()); - pushMaxCount++; - } - - Collection<Long> result = null; - try { - result = Lists.newArrayList(rangeMap.subRangeMap( - Range.range(minKey, lowerType, maxKey, upperType)).asMapOfRanges().values()); - } catch (IllegalArgumentException e) { - result = Lists.newArrayList(); - } - - for (; pushMinCount > 0; pushMinCount--) { - minKey.popColumn(); - } - for (; pushMaxCount > 0; pushMaxCount--) { - maxKey.popColumn(); - } - return result; - } - Set<Long> resultSet = Sets.newHashSet(); - int childrenNum = inPredicate.getChildren().size(); - int newComplex = inPredicate.getChildren().size() * complex; - for (int i = 1; i < childrenNum; ++i) { - LiteralExpr expr = (LiteralExpr) inPredicate.getChild(i); - minKey.pushColumn(expr, keyColumn.getDataType()); - maxKey.pushColumn(expr, keyColumn.getDataType()); - Collection<Long> subList = prune(rangeMap, columnIdx + 1, minKey, maxKey, newComplex); - for (long partId : subList) { - resultSet.add(partId); - } - minKey.popColumn(); - maxKey.popColumn(); - } - - return resultSet; - } - - public Collection<Long> prune() throws AnalysisException { - PartitionKey minKey = new PartitionKey(); - PartitionKey maxKey = new PartitionKey(); - // Map to RangeMapTree - RangeMap<PartitionKey, Long> rangeMap = TreeRangeMap.create(); - for (Map.Entry<Long, PartitionItem> entry : partitionRangeMap.entrySet()) { - rangeMap.put(entry.getValue().getItems(), entry.getKey()); - } - return prune(rangeMap, 0, minKey, maxKey, 1); - } -} diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java index 460ea01b7b..7733917087 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java @@ -59,7 +59,7 @@ import java.util.Set; public abstract class ScanNode extends PlanNode { private static final Logger LOG = LogManager.getLogger(ScanNode.class); protected final TupleDescriptor desc; - // Use this if partition_prune_algorithm_version is 1. + // for distribution prunner protected Map<String, PartitionColumnFilter> columnFilters = Maps.newHashMap(); // Use this if partition_prune_algorithm_version is 2. protected Map<String, ColumnRange> columnNameToRange = Maps.newHashMap(); @@ -137,17 +137,15 @@ public abstract class ScanNode extends PlanNode { columnFilters.put(column.getName(), keyFilter); } - if (analyzer.partitionPruneV2Enabled()) { - ColumnRange columnRange = createColumnRange(slotDesc, conjuncts); - if (columnRange != null) { - columnNameToRange.put(column.getName(), columnRange); - } + ColumnRange columnRange = createColumnRange(slotDesc, conjuncts); + if (columnRange != null) { + columnNameToRange.put(column.getName(), columnRange); } } } - private ColumnRange createColumnRange(SlotDescriptor desc, - List<Expr> conjuncts) { + public static ColumnRange createColumnRange(SlotDescriptor desc, + List<Expr> conjuncts) { ColumnRange result = ColumnRange.create(); for (Expr expr : conjuncts) { if (!expr.isBound(desc.getId())) { @@ -202,8 +200,8 @@ public abstract class ScanNode extends PlanNode { return result; } - private ColumnRanges expressionToRanges(Expr expr, - SlotDescriptor desc) { + public static ColumnRanges expressionToRanges(Expr expr, + SlotDescriptor desc) { if (expr instanceof IsNullPredicate) { IsNullPredicate isNullPredicate = (IsNullPredicate) expr; if (isNullPredicate.isSlotRefChildren() && !isNullPredicate.isNotNull()) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java index 6aa9b4c66d..86a06980ef 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/StreamLoadPlanner.java @@ -303,27 +303,28 @@ public class StreamLoadPlanner { if (destTable.getPartitionInfo().getType() != PartitionType.UNPARTITIONED && !conjuncts.isEmpty()) { PartitionInfo partitionInfo = destTable.getPartitionInfo(); Map<Long, PartitionItem> itemById = partitionInfo.getIdToItem(false); - Map<String, PartitionColumnFilter> columnFilters = Maps.newHashMap(); + Map<String, ColumnRange> columnNameToRange = Maps.newHashMap(); for (Column column : partitionInfo.getPartitionColumns()) { SlotDescriptor slotDesc = tupleDesc.getColumnSlot(column.getName()); if (null == slotDesc) { continue; } - PartitionColumnFilter keyFilter = SingleNodePlanner.createPartitionFilter(slotDesc, conjuncts); - if (null != keyFilter) { - columnFilters.put(column.getName(), keyFilter); + ColumnRange columnRange = ScanNode.createColumnRange(slotDesc, conjuncts); + if (columnRange != null) { + columnNameToRange.put(column.getName(), columnRange); } } - if (columnFilters.isEmpty()) { + if (columnNameToRange.isEmpty()) { return null; } + PartitionPruner partitionPruner = null; if (destTable.getPartitionInfo().getType() == PartitionType.RANGE) { - partitionPruner = new RangePartitionPruner(itemById, - partitionInfo.getPartitionColumns(), columnFilters); + partitionPruner = new RangePartitionPrunerV2(itemById, + partitionInfo.getPartitionColumns(), columnNameToRange); } else if (destTable.getPartitionInfo().getType() == PartitionType.LIST) { - partitionPruner = new ListPartitionPruner(itemById, - partitionInfo.getPartitionColumns(), columnFilters); + partitionPruner = new ListPartitionPrunerV2(itemById, + partitionInfo.getPartitionColumns(), columnNameToRange); } partitionIds.addAll(partitionPruner.prune()); return partitionIds; diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java index 813a47e6c0..e87e247207 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java @@ -162,8 +162,6 @@ public class SessionVariable implements Serializable, Writable { public static final String EXTRACT_WIDE_RANGE_EXPR = "extract_wide_range_expr"; - public static final String PARTITION_PRUNE_ALGORITHM_VERSION = "partition_prune_algorithm_version"; - // If user set a very small value, use this value instead. public static final long MIN_INSERT_VISIBLE_TIMEOUT_MS = 1000; @@ -469,9 +467,6 @@ public class SessionVariable implements Serializable, Writable { @VariableMgr.VarAttr(name = EXTRACT_WIDE_RANGE_EXPR, needForward = true) public boolean extractWideRangeExpr = true; - @VariableMgr.VarAttr(name = PARTITION_PRUNE_ALGORITHM_VERSION, needForward = true) - public int partitionPruneAlgorithmVersion = 2; - @VariableMgr.VarAttr(name = ENABLE_VECTORIZED_ENGINE) public boolean enableVectorizedEngine = true; @@ -1201,10 +1196,6 @@ public class SessionVariable implements Serializable, Writable { return extractWideRangeExpr; } - public int getPartitionPruneAlgorithmVersion() { - return partitionPruneAlgorithmVersion; - } - public int getCpuResourceLimit() { return cpuResourceLimit; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ListPartitionPrunerTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ListPartitionPrunerTest.java index a377ef0d68..6d2cf7aa59 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ListPartitionPrunerTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ListPartitionPrunerTest.java @@ -79,40 +79,40 @@ public class ListPartitionPrunerTest extends PartitionPruneTestBase { private void initTestCases() { // Select by partition name - addCase("select * from test.t1 partition p1;", "partitions=1/2", "partitions=1/2"); - addCase("select * from test.t2 partition (p2, p3);", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t3 partition (p1, p2);", "partitions=2/2", "partitions=2/2"); - addCase("select * from test.t4 partition p2;", "partitions=1/3", "partitions=1/3"); + addCase("select * from test.t1 partition p1;", "partitions=1/2"); + addCase("select * from test.t2 partition (p2, p3);", "partitions=2/3"); + addCase("select * from test.t3 partition (p1, p2);", "partitions=2/2"); + addCase("select * from test.t4 partition p2;", "partitions=1/3"); // Single partition column - addCase("select * from test.t2 where k1 < 7", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t2 where k1 = 1;", "partitions=1/3", "partitions=1/3"); - addCase("select * from test.t2 where k1 in (1, 2);", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t2 where k1 >= 6;", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t2 where k1 < 8 and k1 > 6;", "partitions=1/3", "partitions=1/3"); - addCase("select * from test.t2 where k2 = \"beijing\";", "partitions=3/3", "partitions=3/3"); - addCase("select * from test.t1 where k1 != 1", "partitions=2/2", "partitions=1/2"); - addCase("select * from test.t4 where k2 != \"beijing\"", "partitions=3/3", "partitions=2/3"); + addCase("select * from test.t2 where k1 < 7", "partitions=2/3"); + addCase("select * from test.t2 where k1 = 1;", "partitions=1/3"); + addCase("select * from test.t2 where k1 in (1, 2);", "partitions=2/3"); + addCase("select * from test.t2 where k1 >= 6;", "partitions=2/3"); + addCase("select * from test.t2 where k1 < 8 and k1 > 6;", "partitions=1/3"); + addCase("select * from test.t2 where k2 = \"beijing\";", "partitions=3/3"); + addCase("select * from test.t1 where k1 != 1", "partitions=1/2"); + addCase("select * from test.t4 where k2 != \"beijing\"", "partitions=2/3"); // Multiple partition columns - addCase("select * from test.t4 where k1 = 2;", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t4 where k2 = \"tianjin\";", "partitions=1/3", "partitions=1/3"); - addCase("select * from test.t4 where k1 = 1 and k2 = \"shanghai\";", "partitions=2/3", "partitions=1/3"); - addCase("select * from test.t4 where k1 in (1, 3) and k2 in (\"tianjin\", \"shanghai\");", "partitions=2/3", "partitions=1/3"); - addCase("select * from test.t4 where k1 in (1, 3);", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t4 where k2 in (\"tianjin\", \"shanghai\");", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t4 where k1 < 3;", "partitions=3/3", "partitions=3/3"); - addCase("select * from test.t4 where k1 > 2;", "partitions=1/3", "partitions=1/3"); - addCase("select * from test.t4 where k2 <\"shanghai\";", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t4 where k2 >=\"shanghai\";", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t4 where k1 > 1 and k2 < \"shanghai\";", "partitions=2/3", "partitions=1/3"); - addCase("select * from test.t4 where k1 >= 2 and k2 = \"shanghai\";", "partitions=2/3", "partitions=1/3"); + addCase("select * from test.t4 where k1 = 2;", "partitions=2/3"); + addCase("select * from test.t4 where k2 = \"tianjin\";", "partitions=1/3"); + addCase("select * from test.t4 where k1 = 1 and k2 = \"shanghai\";", "partitions=1/3"); + addCase("select * from test.t4 where k1 in (1, 3) and k2 in (\"tianjin\", \"shanghai\");", "partitions=1/3"); + addCase("select * from test.t4 where k1 in (1, 3);", "partitions=2/3"); + addCase("select * from test.t4 where k2 in (\"tianjin\", \"shanghai\");", "partitions=2/3"); + addCase("select * from test.t4 where k1 < 3;", "partitions=3/3"); + addCase("select * from test.t4 where k1 > 2;", "partitions=1/3"); + addCase("select * from test.t4 where k2 <\"shanghai\";", "partitions=2/3"); + addCase("select * from test.t4 where k2 >=\"shanghai\";", "partitions=2/3"); + addCase("select * from test.t4 where k1 > 1 and k2 < \"shanghai\";", "partitions=1/3"); + addCase("select * from test.t4 where k1 >= 2 and k2 = \"shanghai\";", "partitions=1/3"); // Disjunctive predicates - addCase("select * from test.t2 where k1=1 or k1=4", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t4 where k1=1 or k1=3", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t4 where k2=\"tianjin\" or k2=\"shanghai\"", "partitions=2/3", "partitions=2/3"); - addCase("select * from test.t4 where k1 > 1 or k2 < \"shanghai\"", "partitions=3/3", "partitions=3/3"); + addCase("select * from test.t2 where k1=1 or k1=4", "partitions=2/3"); + addCase("select * from test.t4 where k1=1 or k1=3", "partitions=2/3"); + addCase("select * from test.t4 where k2=\"tianjin\" or k2=\"shanghai\"", "partitions=2/3"); + addCase("select * from test.t4 where k1 > 1 or k2 < \"shanghai\"", "partitions=3/3"); } @Test diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/PartitionPruneTestBase.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/PartitionPruneTestBase.java index 95c4790bea..162a81ccb8 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/PartitionPruneTestBase.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/PartitionPruneTestBase.java @@ -29,31 +29,26 @@ public abstract class PartitionPruneTestBase extends TestWithFeService { protected void doTest() throws Exception { for (RangePartitionPruneTest.TestCase testCase : cases) { - connectContext.getSessionVariable().partitionPruneAlgorithmVersion = 1; - assertExplainContains(1, testCase.sql, testCase.v1Result); - connectContext.getSessionVariable().partitionPruneAlgorithmVersion = 2; - assertExplainContains(2, testCase.sql, testCase.v2Result); + assertExplainContains(testCase.sql, testCase.result); } } - private void assertExplainContains(int version, String sql, String subString) throws Exception { - Assert.assertTrue(String.format("version=%d, sql=%s, expectResult=%s", version, sql, subString), + private void assertExplainContains(String sql, String subString) throws Exception { + Assert.assertTrue(String.format("sql=%s, expectResult=%s", sql, subString), getSQLPlanOrErrorMsg("explain " + sql).contains(subString)); } - protected void addCase(String sql, String v1Result, String v2Result) { - cases.add(new TestCase(sql, v1Result, v2Result)); + protected void addCase(String sql, String result) { + cases.add(new TestCase(sql, result)); } protected static class TestCase { final String sql; - final String v1Result; - final String v2Result; + final String result; - public TestCase(String sql, String v1Result, String v2Result) { + public TestCase(String sql, String v2Result) { this.sql = sql; - this.v1Result = v1Result; - this.v2Result = v2Result; + this.result = v2Result; } } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/RangePartitionPruneTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/RangePartitionPruneTest.java index f1bbc3ba91..e8d05e3095 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/RangePartitionPruneTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/RangePartitionPruneTest.java @@ -113,85 +113,86 @@ public class RangePartitionPruneTest extends PartitionPruneTestBase { private void initTestCases() { // 1. Single partition column // no filters - addCase("select * from test.t1", "partitions=8/8", "partitions=8/8"); + addCase("select * from test.t1", "partitions=8/8"); // equal to - addCase("select * from test.t1 where dt=20211122", "partitions=1/8", "partitions=1/8"); + addCase("select * from test.t1 where dt=20211122", "partitions=1/8"); // less than - addCase("select * from test.t1 where dt<20211122", "partitions=2/8", "partitions=2/8"); + addCase("select * from test.t1 where dt<20211122", "partitions=2/8"); // less than or equal - addCase("select * from test.t1 where dt<=20211122", "partitions=3/8", "partitions=3/8"); + addCase("select * from test.t1 where dt<=20211122", "partitions=3/8"); // greater than - addCase("select * from test.t1 where dt>20211122", "partitions=6/8", "partitions=6/8"); + addCase("select * from test.t1 where dt>20211122", "partitions=6/8"); // greater than or equal - addCase("select * from test.t1 where dt>=20211122", "partitions=6/8", "partitions=6/8"); + addCase("select * from test.t1 where dt>=20211122", "partitions=6/8"); // in - addCase("select * from test.t1 where dt in (20211124, 20211126, 20211122)", "partitions=3/8", "partitions=3/8"); + addCase("select * from test.t1 where dt in (20211124, 20211126, 20211122)", "partitions=3/8"); // is null - addCase("select * from test.t1 where dt is null", "partitions=1/8", "partitions=1/8"); - addCase("select * from test.`single_not_null` where dt is null", "partitions=0/7", "partitions=0/7"); + addCase("select * from test.t1 where dt is null", "partitions=1/8"); + addCase("select * from test.`single_not_null` where dt is null", "partitions=0/7"); // not equal to - addCase("select * from test.t1 where dt!=20211122", "partitions=8/8", "partitions=8/8"); + addCase("select * from test.t1 where dt!=20211122", "partitions=8/8"); // 2. Multiple partition columns // no filters - addCase("select * from test.t2", "partitions=9/9", "partitions=9/9"); + addCase("select * from test.t2", "partitions=9/9"); // equal to - addCase("select * from test.t2 where k1=7", "partitions=2/9", "partitions=2/9"); - addCase("select * from test.t2 where k2=7", "partitions=9/9", "partitions=9/9"); + addCase("select * from test.t2 where k1=7", "partitions=2/9"); + addCase("select * from test.t2 where k2=7", "partitions=9/9"); // less than - addCase("select * from test.t2 where k1<7", "partitions=2/9", "partitions=2/9"); - addCase("select * from test.t2 where k2<7", "partitions=9/9", "partitions=9/9"); + addCase("select * from test.t2 where k1<7", "partitions=2/9"); + addCase("select * from test.t2 where k2<7", "partitions=9/9"); // less than or equal - addCase("select * from test.t2 where k1<=7", "partitions=3/9", "partitions=3/9"); - addCase("select * from test.t2 where k2>7", "partitions=9/9", "partitions=9/9"); + addCase("select * from test.t2 where k1<=7", "partitions=3/9"); + addCase("select * from test.t2 where k2>7", "partitions=9/9"); // greater than or equal - addCase("select * from test.t2 where k1>=7", "partitions=8/9", "partitions=8/9"); - addCase("select * from test.t2 where k2>=7", "partitions=9/9", "partitions=9/9"); + addCase("select * from test.t2 where k1>=7", "partitions=8/9"); + addCase("select * from test.t2 where k2>=7", "partitions=9/9"); // in - addCase("select * from test.t2 where k1 in (7,9,16)", "partitions=3/9", "partitions=3/9"); - addCase("select * from test.t2 where k2 in (7,9,16)", "partitions=9/9", "partitions=9/9"); + addCase("select * from test.t2 where k1 in (7,9,16)", "partitions=3/9"); + addCase("select * from test.t2 where k2 in (7,9,16)", "partitions=9/9"); // is null - addCase("select * from test.t2 where k1 is null", "partitions=1/9", "partitions=1/9"); - addCase("select * from test.t2 where k2 is null", "partitions=9/9", "partitions=9/9"); - addCase("select * from test.multi_not_null where k1 is null", "partitions=0/2", "partitions=0/2"); - addCase("select * from test.multi_not_null where k2 is null", "partitions=2/2", "partitions=2/2"); + addCase("select * from test.t2 where k1 is null", "partitions=1/9"); + addCase("select * from test.t2 where k2 is null", "partitions=9/9"); + addCase("select * from test.multi_not_null where k1 is null", "partitions=0/2"); + addCase("select * from test.multi_not_null where k2 is null", "partitions=2/2"); // not equal to - addCase("select * from test.t2 where k1!=23", "partitions=9/9", "partitions=9/9"); - addCase("select * from test.t2 where k2!=23", "partitions=9/9", "partitions=9/9"); + addCase("select * from test.t2 where k1!=23", "partitions=9/9"); + addCase("select * from test.t2 where k2!=23", "partitions=9/9"); // 3. Conjunctive predicates // equal to and other predicates - addCase("select * from test.t2 where k1=23 and k2=5", "partitions=1/9", "partitions=1/9"); - addCase("select * from test.t2 where k1=23 and k2>5", "partitions=1/9", "partitions=1/9"); + addCase("select * from test.t2 where k1=23 and k2=5", "partitions=1/9"); + addCase("select * from test.t2 where k1=23 and k2>5", "partitions=1/9"); // in and other equal predicates - addCase("select * from test.t2 where k1 in (3, 10, 13) and k2>10", "partitions=2/9", "partitions=2/9"); + addCase("select * from test.t2 where k1 in (3, 10, 13) and k2>10", "partitions=2/9"); // is null and other predicates - addCase("select * from test.t2 where k1 > 10 and k1 is null", "partitions=1/9", "partitions=0/9"); - addCase("select * from test.t2 where k1 is null and k1 > 10", "partitions=1/9", "partitions=0/9"); - addCase("select * from test.multi_not_null where k1 > 10 and k1 is null", "partitions=0/2", "partitions=0/2"); + addCase("select * from test.t2 where k1 > 10 and k1 is null", "partitions=0/9"); + addCase("select * from test.t2 where k1 is null and k1 > 10", "partitions=0/9"); + addCase("select * from test.multi_not_null where k1 > 10 and k1 is null", "partitions=0/2"); // others predicates combination - addCase("select * from test.t2 where k1 > 10 and k2 < 4", "partitions=6/9", "partitions=6/9"); - addCase("select * from test.t2 where k1 >10 and k1 < 10 and (k1=11 or k1=12)", "partitions=1/9", "partitions=0/9"); - addCase("select * from test.t2 where k1 > 20 and k1 < 7 and k1 = 10", "partitions=0/9", "partitions=0/9"); + addCase("select * from test.t2 where k1 > 10 and k2 < 4", "partitions=6/9"); + addCase("select * from test.t2 where k1 >10 and k1 < 10 and (k1=11 or k1=12)", "partitions=0/9"); + addCase("select * from test.t2 where k1 > 20 and k1 < 7 and k1 = 10", "partitions=0/9"); // 4. Disjunctive predicates - addCase("select * from test.t2 where k1=10 or k1=23", "partitions=3/9", "partitions=3/9"); - addCase("select * from test.t2 where (k1=10 or k1=23) and (k2=4 or k2=5)", "partitions=1/9", "partitions=1/9"); - addCase("select * from test.t2 where (k1=10 or k1=23) and (k2=4 or k2=11)", "partitions=2/9", "partitions=2/9"); - addCase("select * from test.t2 where (k1=10 or k1=23) and (k2=3 or k2=4 or k2=11)", "partitions=3/9", "partitions=3/9"); - addCase("select * from test.t1 where dt=20211123 or dt=20211124", "partitions=2/8", "partitions=2/8"); - addCase("select * from test.t1 where ((dt=20211123 and k1=1) or (dt=20211125 and k1=3))", "partitions=8/8", "partitions=2/8"); + addCase("select * from test.t2 where k1=10 or k1=23", "partitions=3/9"); + addCase("select * from test.t2 where (k1=10 or k1=23) and (k2=4 or k2=5)", "partitions=1/9"); + addCase("select * from test.t2 where (k1=10 or k1=23) and (k2=4 or k2=11)", "partitions=2/9"); + addCase("select * from test.t2 where (k1=10 or k1=23) and (k2=3 or k2=4 or k2=11)", "partitions=3/9"); + addCase("select * from test.t1 where dt=20211123 or dt=20211124", "partitions=2/8"); + addCase("select * from test.t1 where ((dt=20211123 and k1=1) or (dt=20211125 and k1=3))", "partitions=2/8"); // TODO: predicates are "PREDICATES: ((`dt` = 20211123 AND `k1` = 1) OR (`dt` = 20211125 AND `k1` = 3)), `k2` > ", // maybe something goes wrong with ExtractCommonFactorsRule. - addCase("select * from test.t1 where ((dt=20211123 and k1=1) or (dt=20211125 and k1=3)) and k2>0", "partitions=8/8", "partitions=2/8"); - addCase("select * from test.t2 where k1 > 10 or k2 < 1", "partitions=9/9", "partitions=9/9"); + addCase("select * from test.t1 where ((dt=20211123 and k1=1) or (dt=20211125 and k1=3)) and k2>0", + "partitions=2/8"); + addCase("select * from test.t2 where k1 > 10 or k2 < 1", "partitions=9/9"); // add some cases for CompoundPredicate addCase("select * from test.t1 where (dt >= 20211121 and dt <= 20211122) or (dt >= 20211123 and dt <= 20211125)", - "partitions=8/8", "partitions=5/8"); + "partitions=5/8"); addCase("select * from test.t1 where (dt between 20211121 and 20211122) or (dt between 20211123 and 20211125)", - "partitions=8/8", "partitions=5/8"); + "partitions=5/8"); addCase("select * from test.t1 where (dt between 20211121 and 20211122) or dt is null or (dt between 20211123 and 20211125)", - "partitions=8/8", "partitions=6/8"); + "partitions=6/8"); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org