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/03 09:07:03 UTC

[doris] branch master updated: [Fix](Nereids) fix except and intersect error for statsCalculator (#15557)

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

morrysnow 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 1dabcb0111 [Fix](Nereids) fix except and intersect error for statsCalculator (#15557)
1dabcb0111 is described below

commit 1dabcb01115783f6edb7d23ef771decb4d28ad2b
Author: zhengshiJ <32...@users.noreply.github.com>
AuthorDate: Tue Jan 3 17:06:57 2023 +0800

    [Fix](Nereids) fix except and intersect error for statsCalculator (#15557)
    
    When calculating the statsCalculator of except and intersect, the slotId of the corresponding column was not replaced with the slotId of output, resulting in NPE.
---
 .../doris/nereids/stats/StatsCalculator.java       | 25 ++++++++++++++-----
 .../data/nereids_syntax_p0/set_operation.out       | 13 ++++++++++
 .../suites/nereids_syntax_p0/set_operation.groovy  | 28 ++++++++++++++++++++++
 3 files changed, 60 insertions(+), 6 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
index e464fd45ac..9e8eaa46df 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
@@ -220,7 +220,7 @@ public class StatsCalculator extends DefaultPlanVisitor<StatsDeriveResult, Void>
     @Override
     public StatsDeriveResult visitLogicalExcept(
             LogicalExcept except, Void context) {
-        return computeExcept();
+        return computeExcept(except);
     }
 
     @Override
@@ -339,7 +339,7 @@ public class StatsCalculator extends DefaultPlanVisitor<StatsDeriveResult, Void>
 
     @Override
     public StatsDeriveResult visitPhysicalExcept(PhysicalExcept except, Void context) {
-        return computeExcept();
+        return computeExcept(except);
     }
 
     @Override
@@ -564,8 +564,10 @@ public class StatsCalculator extends DefaultPlanVisitor<StatsDeriveResult, Void>
                 : newColumnStatsMap.get(leftSlot.getExprId());
     }
 
-    private StatsDeriveResult computeExcept() {
-        return groupExpression.childStatistics(0);
+    private StatsDeriveResult computeExcept(SetOperation setOperation) {
+        StatsDeriveResult leftStatsResult = groupExpression.childStatistics(0);
+        return new StatsDeriveResult(leftStatsResult.getRowCount(),
+                replaceExprIdWithCurrentOutput(setOperation, leftStatsResult));
     }
 
     private StatsDeriveResult computeIntersect(SetOperation setOperation) {
@@ -574,8 +576,19 @@ public class StatsCalculator extends DefaultPlanVisitor<StatsDeriveResult, Void>
         for (int i = 1; i < setOperation.getArity(); ++i) {
             rowCount = Math.min(rowCount, groupExpression.childStatistics(i).getRowCount());
         }
-        return new StatsDeriveResult(
-                rowCount, leftStatsResult.getSlotIdToColumnStats());
+        return new StatsDeriveResult(rowCount, replaceExprIdWithCurrentOutput(setOperation, leftStatsResult));
+    }
+
+    private Map<Id, ColumnStatistic> replaceExprIdWithCurrentOutput(
+            SetOperation setOperation, StatsDeriveResult leftStatsResult) {
+        Map<Id, ColumnStatistic> newColumnStatsMap = new HashMap<>();
+        for (int i = 0; i < setOperation.getOutputs().size(); i++) {
+            NamedExpression namedExpression = setOperation.getOutputs().get(i);
+            Slot childSlot = setOperation.getChildOutput(0).get(i);
+            newColumnStatsMap.put(namedExpression.getExprId(),
+                    leftStatsResult.getSlotIdToColumnStats().get(childSlot.getExprId()));
+        }
+        return newColumnStatsMap;
     }
 
     private StatsDeriveResult computeGenerate(Generate generate) {
diff --git a/regression-test/data/nereids_syntax_p0/set_operation.out b/regression-test/data/nereids_syntax_p0/set_operation.out
index 8e83e3adc5..2e62101146 100644
--- a/regression-test/data/nereids_syntax_p0/set_operation.out
+++ b/regression-test/data/nereids_syntax_p0/set_operation.out
@@ -464,3 +464,16 @@ hell0
 3
 3
 3
+
+-- !union40 --
+1
+2
+
+-- !union41 --
+1
+2
+
+-- !union42 --
+1
+2
+
diff --git a/regression-test/suites/nereids_syntax_p0/set_operation.groovy b/regression-test/suites/nereids_syntax_p0/set_operation.groovy
index ee1915b9b0..757430c46e 100644
--- a/regression-test/suites/nereids_syntax_p0/set_operation.groovy
+++ b/regression-test/suites/nereids_syntax_p0/set_operation.groovy
@@ -214,4 +214,32 @@ suite("test_nereids_set_operation") {
         }
     }
     qt_union39 """(select  k1 from setOperationTable order by k1) union all (select k1 from setOperationTableNotNullable order by k1) order by k1;"""
+
+    qt_union40 """
+        SELECT k1 FROM setOperationTable WHERE k2 = 2 
+        INTERSECT 
+        SELECT k1 FROM setOperationTable WHERE k1 = 1 
+        UNION 
+        SELECT k1 FROM setOperationTable WHERE k3 = 2
+    """
+
+    qt_union41 """
+    SELECT k1 FROM setOperationTable WHERE k2 = 1
+    EXCEPT
+    SELECT k1 FROM setOperationTable WHERE k3 = 2
+    UNION
+    (SELECT k1 FROM setOperationTable WHERE k3 = 2
+    INTERSECT
+    SELECT k1 FROM setOperationTable WHERE k2 > 0)
+    """
+
+    qt_union42 """
+    SELECT k1 FROM setOperationTable WHERE k2 = 1
+    EXCEPT
+    SELECT k1 FROM setOperationTable WHERE k3 = 2
+    UNION ALL
+    (SELECT k1 FROM setOperationTable WHERE k3 = 2
+    INTERSECT
+    SELECT k1 FROM setOperationTable WHERE k2 > 0)
+    """
 }


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