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 22fce33fb2 [fix](nereids) fix bitmap function nullable trait and 
dphyper bugs (#18041)
22fce33fb2 is described below

commit 22fce33fb21daf50de51627eaf6794b0d1e1f656
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Fri Mar 24 10:53:45 2023 +0800

    [fix](nereids) fix bitmap function nullable trait and dphyper bugs (#18041)
    
    1. some bitmap functions like bitmap_or, bitmap_and_count, bitmap_or_count 
etc shouldn't follow constant fold rule for PropagateNullable functions. So 
remove PropagateNullable property and these functions would use their own 
constant fold logic correctly
    2. dphyper's PlanReceiver class shouldn't change hyperGraph's complex 
project info. So make PlanReceiver use its own copy of complex project info now.
---
 .../joinorder/hypergraph/receiver/PlanReceiver.java    | 12 +++++++-----
 .../expressions/functions/scalar/BitmapAndCount.java   |  8 ++++++--
 .../functions/scalar/BitmapAndNotCount.java            |  8 ++++++--
 .../trees/expressions/functions/scalar/BitmapOr.java   |  8 ++++++--
 .../expressions/functions/scalar/BitmapOrCount.java    |  7 +++++--
 .../expressions/functions/scalar/BitmapXorCount.java   |  8 ++++++--
 .../bitmap_functions/test_bitmap_function.groovy       | 18 ++++++------------
 7 files changed, 42 insertions(+), 27 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
index 1079f4a6d2..6a6828f5b1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java
@@ -56,7 +56,6 @@ import java.util.BitSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -69,6 +68,7 @@ public class PlanReceiver implements AbstractReceiver {
     HashMap<Long, Group> planTable = new HashMap<>();
     HashMap<Long, BitSet> usdEdges = new HashMap<>();
     HashMap<Long, List<NamedExpression>> projectsOnSubgraph = new HashMap<>();
+    HashMap<Long, List<NamedExpression>> complexProjectMap = new HashMap<>();
     int limit;
     int emitCount = 0;
 
@@ -293,10 +293,13 @@ public class PlanReceiver implements AbstractReceiver {
 
     @Override
     public void reset() {
+        Preconditions.checkArgument(complexProjectMap.isEmpty(),
+                "complexProjectMap should be empty when call reset()");
         planTable.clear();
         projectsOnSubgraph.clear();
         usdEdges.clear();
         emitCount = 0;
+        complexProjectMap.putAll(hyperGraph.getComplexProject());
     }
 
     @Override
@@ -360,13 +363,12 @@ public class PlanReceiver implements AbstractReceiver {
         if (!projectsOnSubgraph.containsKey(fullKey)) {
             List<NamedExpression> projects = new ArrayList<>();
             // Calculate complex expression
-            Map<Long, List<NamedExpression>> complexExpressionMap = 
hyperGraph.getComplexProject();
-            List<Long> bitmaps = complexExpressionMap.keySet().stream()
+            List<Long> bitmaps = complexProjectMap.keySet().stream()
                     .filter(bitmap -> LongBitmap.isSubset(bitmap, 
fullKey)).collect(Collectors.toList());
 
             for (long bitmap : bitmaps) {
-                projects.addAll(complexExpressionMap.get(bitmap));
-                complexExpressionMap.remove(bitmap);
+                projects.addAll(complexProjectMap.get(bitmap));
+                complexProjectMap.remove(bitmap);
             }
 
             // calculate required columns
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapAndCount.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapAndCount.java
index 24f1333fb7..dd9b43f76f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapAndCount.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapAndCount.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
 import org.apache.doris.nereids.types.BitmapType;
@@ -35,7 +34,7 @@ import java.util.List;
  * ScalarFunction 'bitmap_and_count'. This class is generated by 
GenerateFunction.
  */
 public class BitmapAndCount extends ScalarFunction
-        implements ExplicitlyCastableSignature, PropagateNullable {
+        implements ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BitmapType.INSTANCE, 
BitmapType.INSTANCE)
@@ -67,4 +66,9 @@ public class BitmapAndCount extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitBitmapAndCount(this, context);
     }
+
+    @Override
+    public boolean nullable() {
+        return children().stream().anyMatch(Expression::nullable);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapAndNotCount.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapAndNotCount.java
index c4968f0e07..95a03407b3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapAndNotCount.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapAndNotCount.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -35,7 +34,7 @@ import java.util.List;
  * ScalarFunction 'bitmap_and_not_count'. This class is generated by 
GenerateFunction.
  */
 public class BitmapAndNotCount extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullable {
+        implements BinaryExpression, ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(BigIntType.INSTANCE).args(BitmapType.INSTANCE, 
BitmapType.INSTANCE)
@@ -66,4 +65,9 @@ public class BitmapAndNotCount extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitBitmapAndNotCount(this, context);
     }
+
+    @Override
+    public boolean nullable() {
+        return children().stream().anyMatch(Expression::nullable);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapOr.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapOr.java
index aea7e7b497..883a0ffbfb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapOr.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapOr.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BitmapType;
 import org.apache.doris.nereids.util.ExpressionUtils;
@@ -34,7 +33,7 @@ import java.util.List;
  * ScalarFunction 'bitmap_or'. This class is generated by GenerateFunction.
  */
 public class BitmapOr extends ScalarFunction
-        implements ExplicitlyCastableSignature, PropagateNullable {
+        implements ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(BitmapType.INSTANCE).varArgs(BitmapType.INSTANCE, 
BitmapType.INSTANCE)
@@ -66,4 +65,9 @@ public class BitmapOr extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitBitmapOr(this, context);
     }
+
+    @Override
+    public boolean nullable() {
+        return children().stream().anyMatch(Expression::nullable);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapOrCount.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapOrCount.java
index 352538644a..a7b6e716ea 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapOrCount.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapOrCount.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
 import org.apache.doris.nereids.types.BitmapType;
@@ -35,7 +34,7 @@ import java.util.List;
  * ScalarFunction 'bitmap_or_count'. This class is generated by 
GenerateFunction.
  */
 public class BitmapOrCount extends ScalarFunction
-        implements ExplicitlyCastableSignature, PropagateNullable {
+        implements ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BitmapType.INSTANCE, 
BitmapType.INSTANCE)
@@ -67,4 +66,8 @@ public class BitmapOrCount extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitBitmapOrCount(this, context);
     }
+
+    public boolean nullable() {
+        return children().stream().anyMatch(Expression::nullable);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapXorCount.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapXorCount.java
index 4cbe9cde9a..93d8d43045 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapXorCount.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/BitmapXorCount.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
 import org.apache.doris.nereids.types.BitmapType;
@@ -35,7 +34,7 @@ import java.util.List;
  * ScalarFunction 'bitmap_xor_count'. This class is generated by 
GenerateFunction.
  */
 public class BitmapXorCount extends ScalarFunction
-        implements ExplicitlyCastableSignature, PropagateNullable {
+        implements ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(BigIntType.INSTANCE).varArgs(BitmapType.INSTANCE, 
BitmapType.INSTANCE)
@@ -67,4 +66,9 @@ public class BitmapXorCount extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitBitmapXorCount(this, context);
     }
+
+    @Override
+    public boolean nullable() {
+        return children().stream().anyMatch(Expression::nullable);
+    }
 }
diff --git 
a/regression-test/suites/nereids_p0/sql_functions/bitmap_functions/test_bitmap_function.groovy
 
b/regression-test/suites/nereids_p0/sql_functions/bitmap_functions/test_bitmap_function.groovy
index 4f8d6416dd..53f08d6ce5 100644
--- 
a/regression-test/suites/nereids_p0/sql_functions/bitmap_functions/test_bitmap_function.groovy
+++ 
b/regression-test/suites/nereids_p0/sql_functions/bitmap_functions/test_bitmap_function.groovy
@@ -60,12 +60,10 @@ suite("test_bitmap_function") {
     qt_sql_bitmap_or1 """ select bitmap_count(bitmap_or(to_bitmap(1), 
to_bitmap(2))) cnt """
     qt_sql_bitmap_or2 """ select bitmap_count(bitmap_or(to_bitmap(1), 
to_bitmap(1))) cnt """
     qt_sql_bitmap_or3 """ select bitmap_to_string(bitmap_or(to_bitmap(1), 
to_bitmap(2))) """
-    // TODO: fix constant fold of bitmap_or and enable this case
-    // qt_sql_bitmap_or4 """ select bitmap_to_string(bitmap_or(to_bitmap(1), 
to_bitmap(2), to_bitmap(10), to_bitmap(0), NULL)) """
+    qt_sql_bitmap_or4 """ select bitmap_to_string(bitmap_or(to_bitmap(1), 
to_bitmap(2), to_bitmap(10), to_bitmap(0), NULL)) """
     qt_sql_bitmap_or5 """ select bitmap_to_string(bitmap_or(to_bitmap(1), 
to_bitmap(2), to_bitmap(10), to_bitmap(0), bitmap_empty())) """
     qt_sql_bitmap_or6 """ select bitmap_to_string(bitmap_or(to_bitmap(10), 
bitmap_from_string('1,2'), bitmap_from_string('1,2,3,4,5'))) """
-    // TODO: fix constant fold of bitmap_or and enable this case
-    // qt_sql_bitmap_or7 """ select bitmap_count(bitmap_or(to_bitmap(1), 
null)) cnt """
+    qt_sql_bitmap_or7 """ select bitmap_count(bitmap_or(to_bitmap(1), null)) 
cnt """
 
     // bitmap_or of all nullable column
     sql """ DROP TABLE IF EXISTS test_bitmap1 """
@@ -297,16 +295,14 @@ suite("test_bitmap_function") {
     qt_sql_bitmap_and_count3 """ select 
bitmap_and_count(bitmap_from_string('1,2,3'),bitmap_from_string('3,4,5')) """
     qt_sql_bitmap_and_count4 """ select 
bitmap_and_count(bitmap_from_string('1,2,3'), bitmap_from_string('1,2'), 
bitmap_from_string('1,2,3,4,5')) """
     qt_sql_bitmap_and_count5 """ select 
bitmap_and_count(bitmap_from_string('1,2,3'), bitmap_from_string('1,2'), 
bitmap_from_string('1,2,3,4,5'),bitmap_empty()) """
-    // TODO: fix constant fold and enable this case
-    // qt_sql_bitmap_and_count6 """ select 
bitmap_and_count(bitmap_from_string('1,2,3'), bitmap_from_string('1,2'), 
bitmap_from_string('1,2,3,4,5'), NULL) """
+    qt_sql_bitmap_and_count6 """ select 
bitmap_and_count(bitmap_from_string('1,2,3'), bitmap_from_string('1,2'), 
bitmap_from_string('1,2,3,4,5'), NULL) """
 
     // bitmap_or_count
     qt_sql_bitmap_or_count1 """ select 
bitmap_or_count(bitmap_from_string('1,2,3'),bitmap_empty()) """
     qt_sql_bitmap_or_count2 """ select 
bitmap_or_count(bitmap_from_string('1,2,3'),bitmap_from_string('1,2,3'))"""
     qt_sql_bitmap_or_count3 """ select 
bitmap_or_count(bitmap_from_string('1,2,3'),bitmap_from_string('3,4,5')) """
     qt_sql_bitmap_or_count4 """ select 
bitmap_or_count(bitmap_from_string('1,2,3'), bitmap_from_string('3,4,5'), 
to_bitmap(100), bitmap_empty()) """
-    // TODO: fix constant fold of bitmap_or and enable this case
-    // qt_sql_bitmap_or_count5 """ select 
bitmap_or_count(bitmap_from_string('1,2,3'), bitmap_from_string('3,4,5'), 
to_bitmap(100), NULL) """
+    qt_sql_bitmap_or_count5 """ select 
bitmap_or_count(bitmap_from_string('1,2,3'), bitmap_from_string('3,4,5'), 
to_bitmap(100), NULL) """
 
     // BITMAP_XOR
     qt_sql """ select 
bitmap_count(bitmap_xor(bitmap_from_string('2,3'),bitmap_from_string('1,2,3,4')))
 cnt """
@@ -321,8 +317,7 @@ suite("test_bitmap_function") {
     qt_sql_bitmap_xor_count3 """ select 
bitmap_xor_count(bitmap_from_string('1,2,3'),bitmap_from_string('4,5,6')) """
     qt_sql_bitmap_xor_count4 """ select 
(bitmap_xor_count(bitmap_from_string('2,3'),bitmap_from_string('1,2,3,4'),bitmap_from_string('3,4,5')))
 """
     qt_sql_bitmap_xor_count5 """ select 
(bitmap_xor_count(bitmap_from_string('2,3'),bitmap_from_string('1,2,3,4'),bitmap_from_string('3,4,5'),bitmap_empty()))
 """
-    // TODO: fix constant fold and enable this case
-    // qt_sql_bitmap_xor_count6 """ select 
(bitmap_xor_count(bitmap_from_string('2,3'),bitmap_from_string('1,2,3,4'),bitmap_from_string('3,4,5'),NULL))
 """
+    qt_sql_bitmap_xor_count6 """ select 
(bitmap_xor_count(bitmap_from_string('2,3'),bitmap_from_string('1,2,3,4'),bitmap_from_string('3,4,5'),NULL))
 """
 
     // bitmap_and_count, bitmap_xor_count, bitmap_and_not_count of all 
nullable column
     sql """ DROP TABLE IF EXISTS test_bitmap1 """
@@ -529,8 +524,7 @@ suite("test_bitmap_function") {
 
     // BITMAP_AND_NOT_COUNT
     qt_sql_bitmap_and_not_count1 """ select 
bitmap_and_not_count(bitmap_from_string('1,2,3'),bitmap_from_string('3,4,5')) 
cnt """
-    // TODO: fix constant fold and enable this case
-    // qt_sql_bitmap_and_not_count2 """ select 
bitmap_and_not_count(bitmap_from_string('1,2,3'),null) cnt """
+    qt_sql_bitmap_and_not_count2 """ select 
bitmap_and_not_count(bitmap_from_string('1,2,3'),null) cnt """
 
     // BITMAP_SUBSET_IN_RANGE
     qt_sql """ select 
bitmap_to_string(bitmap_subset_in_range(bitmap_from_string('1,2,3,4,5'), 0, 9)) 
value """


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

Reply via email to