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/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new 9f224cd [Bug] Fix bug of Partition prune of constant in predicate
(#3476)
9f224cd is described below
commit 9f224cdd8a7770045646c0da1d7723952976bacb
Author: wutiangan <[email protected]>
AuthorDate: Thu May 14 11:46:13 2020 +0800
[Bug] Fix bug of Partition prune of constant in predicate (#3476)
**1. phenomenon:**
The following two statements are the same, but a query has results and the
other query has no results
mysql> select * from (select '积极' as kk1, sum(k2) from table_range where k1
= '2013-01-01' group by kk1)tt where kk1 = '积极';
+--------+-----------+
| kk1 | sum(`k2`) |
+--------+-----------+
| 积极 | 1 |
+--------+-----------+
1 row in set (0.01 sec)
mysql> select * from (select '积极' as kk1, sum(k2) from table_range where k1
= '2013-01-01' group by kk1)tt where kk1 in ('积极');
Empty set (0.01 sec)
**2. reason:**
In partition prune, constant in predicate(‘积极’ in ‘积极’) is mistakenly
considered to meet partition prune conditions, and mistakenly regarded as
partition prune column. Then in partition prune , no partition is considered to
meet the requirements, so it is planned to be 0 partition in query planning
---
fe/src/main/java/org/apache/doris/catalog/Partition.java | 8 +++++++-
fe/src/main/java/org/apache/doris/planner/OlapScanNode.java | 5 +----
.../main/java/org/apache/doris/planner/SingleNodePlanner.java | 6 ++++++
fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java | 10 ++++++++++
4 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/fe/src/main/java/org/apache/doris/catalog/Partition.java
b/fe/src/main/java/org/apache/doris/catalog/Partition.java
index 51b4e9f..447555a 100644
--- a/fe/src/main/java/org/apache/doris/catalog/Partition.java
+++ b/fe/src/main/java/org/apache/doris/catalog/Partition.java
@@ -20,6 +20,7 @@ package org.apache.doris.catalog;
import org.apache.doris.catalog.DistributionInfo.DistributionInfoType;
import org.apache.doris.catalog.MaterializedIndex.IndexExtState;
import org.apache.doris.catalog.MaterializedIndex.IndexState;
+import org.apache.doris.common.FeConstants;
import org.apache.doris.common.FeMetaVersion;
import org.apache.doris.common.io.Text;
import org.apache.doris.common.io.Writable;
@@ -285,7 +286,12 @@ public class Partition extends MetaObject implements
Writable {
}
public boolean hasData() {
- return !(visibleVersion == PARTITION_INIT_VERSION &&
visibleVersionHash == PARTITION_INIT_VERSION_HASH);
+ // The fe unit test need to check the selected index id without any
data.
+ // So if set FeConstants.runningUnitTest, we can ensure that the
number of partitions is not empty,
+ // And the test case can continue to execute the logic of 'select best
roll up'
+ return ((visibleVersion != PARTITION_INIT_VERSION)
+ || (visibleVersionHash != PARTITION_INIT_VERSION_HASH)
+ || FeConstants.runningUnitTest);
}
/*
diff --git a/fe/src/main/java/org/apache/doris/planner/OlapScanNode.java
b/fe/src/main/java/org/apache/doris/planner/OlapScanNode.java
index 2c06372..9d7c88d 100644
--- a/fe/src/main/java/org/apache/doris/planner/OlapScanNode.java
+++ b/fe/src/main/java/org/apache/doris/planner/OlapScanNode.java
@@ -45,7 +45,6 @@ import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.Config;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
-import org.apache.doris.common.FeConstants;
import org.apache.doris.common.UserException;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.qe.SessionVariable;
@@ -428,9 +427,7 @@ public class OlapScanNode extends ScanNode {
selectedPartitionNum = selectedPartitionIds.size();
LOG.debug("partition prune cost: {} ms, partitions: {}",
(System.currentTimeMillis() - start), selectedPartitionIds);
- // The fe unit test need to check the selected index id without any
data.
- // So the step2 needs to be continued although selectedPartitionIds is
0.
- if (selectedPartitionIds.size() == 0 && !FeConstants.runningUnitTest) {
+ if (selectedPartitionIds.size() == 0) {
return;
}
diff --git a/fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
b/fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
index 8c0727d..59f3a20 100644
--- a/fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
+++ b/fe/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
@@ -928,6 +928,12 @@ public class SingleNodePlanner {
if (!inPredicate.isLiteralChildren() || inPredicate.isNotIn())
{
continue;
}
+ if (inPredicate.getChild(0).unwrapExpr(false) instanceof
LiteralExpr) {
+ // If child(0) of the in predicate is a constant
expression,
+ // then other children of in predicate should not be used
as a condition for partition prune.
+ // Such as "where 'Hi' in ('Hi', 'hello') and ... "
+ continue;
+ }
if (null == partitionColumnFilter) {
partitionColumnFilter = new PartitionColumnFilter();
}
diff --git a/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
b/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index 15c2de3..0398e8a 100644
--- a/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -27,6 +27,7 @@ import org.apache.doris.analysis.SelectStmt;
import org.apache.doris.analysis.ShowCreateDbStmt;
import org.apache.doris.analysis.StatementBase;
import org.apache.doris.catalog.Catalog;
+import org.apache.doris.common.FeConstants;
import org.apache.doris.catalog.Type;
import org.apache.doris.load.EtlJobType;
import org.apache.doris.qe.ConnectContext;
@@ -825,4 +826,13 @@ public class QueryPlanTest {
Assert.assertTrue(explainString.contains("CROSS JOIN"));
Assert.assertTrue(!explainString.contains("PREDICATES"));
}
+
+ @Test
+ public void testConstInParitionPrune() throws Exception {
+ FeConstants.runningUnitTest = true;
+ String queryStr = "explain select * from (select 'aa' as kk1, sum(id)
from test.join1 where dt = 9 group by kk1)tt where kk1 in ('aa');";
+ String explainString =
UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr);
+ FeConstants.runningUnitTest = false;
+ Assert.assertTrue(explainString.contains("partitions=1/1"));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]