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 b40fc3e61154760dc0db28d0f153b86d917da93d
Author: LiBinfeng <46676950+libinfeng...@users.noreply.github.com>
AuthorDate: Wed Sep 27 16:57:06 2023 +0800

    [Fix](Planner) disable bitmap type in compare expression (#24792)
    
    Problem:
    be core because of bitmap calculation.
    
    Reason:
    when be check failed, it would core directly.
    
    Example:
    SELECT id_bitmap FROM test_bitmap WHERE id_bitmap IN (NULL) LIMIT 20;
    
    Solved:
    Forbidden this kind of expression in fe when analyze. And also forbid 
bitmap type comparing in other unsupported expressions.
---
 .../org/apache/doris/analysis/BinaryPredicate.java |   1 +
 .../java/org/apache/doris/analysis/CaseExpr.java   |   6 ++++
 .../main/java/org/apache/doris/analysis/Expr.java  |  11 +++++++
 .../org/apache/doris/analysis/InPredicate.java     |   1 +
 .../org/apache/doris/planner/QueryPlanTest.java    |   2 +-
 .../data/datatype_p0/bitmap/test_bitmap_int.out    | Bin 315 -> 351 bytes
 .../datatype_p0/bitmap/test_bitmap_int.groovy      |  33 +++++++++++++++++++++
 7 files changed, 53 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
index 11504d9571c..adf579aa99a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
@@ -412,6 +412,7 @@ public class BinaryPredicate extends Predicate implements 
Writable {
     @Override
     public void analyzeImpl(Analyzer analyzer) throws AnalysisException {
         super.analyzeImpl(analyzer);
+        this.checkIncludeBitmap();
 
         for (Expr expr : children) {
             if (expr instanceof Subquery) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
index 83fb77c120b..177c937c0d5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
@@ -187,6 +187,9 @@ public class CaseExpr extends Expr {
             if (caseExpr instanceof Subquery && 
!caseExpr.getType().isScalarType()) {
                 throw new AnalysisException("Subquery in case-when must return 
scala type");
             }
+            if (caseExpr.getType().isBitmapType()) {
+                throw new AnalysisException("Unsupported bitmap type in 
expression: " + toSql());
+            }
             whenType = caseExpr.getType();
             lastCompatibleWhenExpr = children.get(0);
         } else {
@@ -221,6 +224,9 @@ public class CaseExpr extends Expr {
                     && !((hasCaseExpr() && whenExpr instanceof Subquery || 
!checkSubquery(whenExpr)))) {
                 throw new AnalysisException("Only support subquery in binary 
predicate in case statement.");
             }
+            if (whenExpr.getType().isBitmapType()) {
+                throw new AnalysisException("Unsupported bitmap type in 
expression: " + toSql());
+            }
             // Determine maximum compatible type of the then exprs seen so far.
             // We will add casts to them at the very end.
             Expr thenExpr = children.get(i + 1);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
index 8615d3d8037..cdc662502b5 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
@@ -1334,6 +1334,17 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
         }
     }
 
+    /**
+     * Checks whether comparing predicates' children include bitmap type.
+     */
+    public void checkIncludeBitmap() throws AnalysisException {
+        for (int i = 0; i < children.size(); ++i) {
+            if (children.get(i).getType().isBitmapType()) {
+                throw new AnalysisException("Unsupported bitmap type in 
expression: " + toSql());
+            }
+        }
+    }
+
     public Expr checkTypeCompatibility(Type targetType) throws 
AnalysisException {
         if (targetType.getPrimitiveType() != PrimitiveType.ARRAY
                 && targetType.getPrimitiveType() == type.getPrimitiveType()) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
index e041549ab71..349c761f9bd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
@@ -157,6 +157,7 @@ public class InPredicate extends Predicate {
     @Override
     public void analyzeImpl(Analyzer analyzer) throws AnalysisException {
         super.analyzeImpl(analyzer);
+        this.checkIncludeBitmap();
 
         if (contains(Subquery.class)) {
             // An [NOT] IN predicate with a subquery must contain two 
children, the second of
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index d536e66a9fa..d5e0a75c54a 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -492,7 +492,7 @@ public class QueryPlanTest extends TestWithFeService {
 
         assertSQLPlanOrErrorMsgContains(
                 "select count(*) from test.bitmap_table where id2 = 1;",
-                "Bitmap type dose not support operand: `id2` = 1"
+                "Unsupported bitmap type in expression: `id2` = 1"
         );
 
     }
diff --git a/regression-test/data/datatype_p0/bitmap/test_bitmap_int.out 
b/regression-test/data/datatype_p0/bitmap/test_bitmap_int.out
index a8066c8edaf..93c3c065b5c 100644
Binary files a/regression-test/data/datatype_p0/bitmap/test_bitmap_int.out and 
b/regression-test/data/datatype_p0/bitmap/test_bitmap_int.out differ
diff --git a/regression-test/suites/datatype_p0/bitmap/test_bitmap_int.groovy 
b/regression-test/suites/datatype_p0/bitmap/test_bitmap_int.groovy
index 8dccfd3b9b2..0b0d577d197 100644
--- a/regression-test/suites/datatype_p0/bitmap/test_bitmap_int.groovy
+++ b/regression-test/suites/datatype_p0/bitmap/test_bitmap_int.groovy
@@ -44,6 +44,39 @@ suite("test_bitmap_int") {
 
     sql "DROP TABLE test_int_bitmap"
 
+    sql "DROP TABLE IF EXISTS test_bitmap"
+    sql """CREATE TABLE
+    `test_bitmap` (
+    `id` varchar(16) NOT NULL,
+    `id_bitmap` bitmap BITMAP_UNION NOT NULL
+    ) DISTRIBUTED BY HASH (`id`) BUCKETS 1 PROPERTIES ("replication_num" = 
"1");"""
+
+    test {
+        sql """SELECT id_bitmap  FROM test_bitmap  WHERE (id_bitmap NOT IN 
(NULL) OR (1 = 1)) AND id_bitmap IS NOT NULL   LIMIT 20;"""
+        exception "errCode"
+    }
+
+    test {
+        sql """SELECT id_bitmap  FROM test_bitmap  WHERE id_bitmap IN (NULL) 
LIMIT 20;"""
+        exception "errCode"
+    }
+
+    test {
+        sql """SELECT id_bitmap  FROM test_bitmap  WHERE id_bitmap = 1 LIMIT 
20;"""
+        exception "errCode"
+    }
+
+    test {
+        sql """SELECT case id_bitmap when 1 then 1 else 0 FROM test_bitmap;"""
+        exception "errCode"
+    }
+
+    qt_sql64_4 """SELECT id_bitmap  FROM test_bitmap  WHERE id_bitmap is null 
LIMIT 20;"""
+
+    qt_sql64_5 """select case when 1 = 0 then bitmap_from_string('0') else 
bitmap_from_string('0') end as new_bitmap;"""
+
+    sql "DROP TABLE IF EXISTS test_bitmap"
+
 }
 
 


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

Reply via email to