You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/01/22 15:41:25 UTC

[doris] 01/02: [fix](planner) extract common factor rule should consider not only where predicate (#16110)

This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 2ab07e515343c2da0ac6a0818ea72acda8431b4a
Author: Mingyu Chen <mo...@163.com>
AuthorDate: Fri Jan 20 14:53:48 2023 +0800

    [fix](planner) extract common factor rule should consider not only where predicate (#16110)
    
    This PR #14381 limit the `ExtractCommonFactorsRule` to handle only `WHERE` predicate,
    but the predicate in `ON` clause should also be considered. Such as:
    
    ```
    CREATE TABLE `nation` (
      `n_nationkey` int(11) NOT NULL,
      `n_name` varchar(25) NOT NULL,
      `n_regionkey` int(11) NOT NULL,
      `n_comment` varchar(152) NULL
    )
    DUPLICATE KEY(`n_nationkey`)
    DISTRIBUTED BY HASH(`n_nationkey`) BUCKETS 1
    PROPERTIES (
    "replication_allocation" = "tag.location.default: 1"
    );
    
    
    select * from
    nation n1 join nation n2
    on (n1.n_name = 'FRANCE' and n2.n_name = 'GERMANY')
    or (n1.n_name = 'GERMANY' and n2.n_name = 'FRANCE')
    ```
    
    There should be predicates:
    ```
    PREDICATES: `n1`.`n_name` IN ('FRANCE', 'GERMANY')
    PREDICATES: `n2`.`n_name` IN ('FRANCE', 'GERMANY')
    ```
    On each scan node.
    
    This PR fix this issue by removing the limit of `ExtractCommonFactorsRule`
---
 .../doris/rewrite/ExtractCommonFactorsRule.java    |  3 +--
 .../ExtractCommonFactorsRuleFunctionTest.java      | 24 ++++++++++++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExtractCommonFactorsRule.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExtractCommonFactorsRule.java
index 3c808c6100..74130d52af 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExtractCommonFactorsRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExtractCommonFactorsRule.java
@@ -29,7 +29,6 @@ import org.apache.doris.analysis.TableName;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.planner.PlanNode;
 import org.apache.doris.qe.ConnectContext;
-import org.apache.doris.rewrite.ExprRewriter.ClauseType;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.BoundType;
@@ -169,7 +168,7 @@ public class ExtractCommonFactorsRule implements ExprRewriteRule {
         }
 
         // 3. find merge cross the clause
-        if (analyzer.getContext() != null && clauseType == ClauseType.WHERE_CLAUSE
+        if (analyzer.getContext() != null
                 && analyzer.getContext().getSessionVariable().isExtractWideRangeExpr()) {
             Expr wideCommonExpr = findWideRangeExpr(clearExprs);
             if (wideCommonExpr != null && !(wideCommonExpr instanceof CompoundPredicate
diff --git a/fe/fe-core/src/test/java/org/apache/doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java b/fe/fe-core/src/test/java/org/apache/doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java
index 588df5c6a6..2f994be85b 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java
@@ -41,6 +41,7 @@ public class ExtractCommonFactorsRuleFunctionTest {
     private static final String TABLE_NAME_1 = "tb1";
     private static final String TABLE_NAME_2 = "tb2";
     private static final String TABLE_NAME_3 = "tb3";
+    private static final String TABLE_NAME_4 = "nation";
 
     @BeforeClass
     public static void beforeClass() throws Exception {
@@ -61,6 +62,18 @@ public class ExtractCommonFactorsRuleFunctionTest {
                 + " (k1 tinyint, k2 smallint, k3 int, k4 bigint, k5 largeint, k6 date, k7 datetime, k8 float, k9 double) "
                 + "distributed by hash(k1) buckets 3 properties('replication_num' = '1');";
         dorisAssert.withTable(createTableSQL);
+        createTableSQL = "CREATE TABLE " + DB_NAME + "." + TABLE_NAME_4 + "(\n"
+                + "  `n_nationkey` int(11) NOT NULL,\n"
+                + "  `n_name` varchar(25) NOT NULL,\n"
+                + "  `n_regionkey` int(11) NOT NULL,\n"
+                + "  `n_comment` varchar(152) NULL\n"
+                + ")\n"
+                + "DUPLICATE KEY(`n_nationkey`)\n"
+                + "DISTRIBUTED BY HASH(`n_nationkey`) BUCKETS 1\n"
+                + "PROPERTIES (\n"
+                + "\"replication_allocation\" = \"tag.location.default: 1\"\n"
+                + ");";
+        dorisAssert.withTable(createTableSQL);
     }
 
     @AfterClass
@@ -311,4 +324,15 @@ public class ExtractCommonFactorsRuleFunctionTest {
         String sql = "select * from tb3 where k9 like '%4%';";
         LOG.info("EXPLAIN:{}", dorisAssert.query(sql).explainQuery());
     }
+
+    @Test
+    public void testExtractCommonFactorsWithOnClause() throws Exception {
+        String sql = "select * from\n"
+                + "db1.nation n1 join db1.nation n2\n"
+                + "on (n1.n_name = 'FRANCE' and n2.n_name = 'GERMANY')\n"
+                + "or (n1.n_name = 'GERMANY' and n2.n_name = 'FRANCE')";
+        String explainStr = dorisAssert.query(sql).explainQuery();
+        Assert.assertTrue(explainStr.contains("PREDICATES: `n1`.`n_name` IN ('FRANCE', 'GERMANY')"));
+        Assert.assertTrue(explainStr.contains("PREDICATES: `n2`.`n_name` IN ('FRANCE', 'GERMANY')"));
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org