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]

Reply via email to