You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by pa...@apache.org on 2023/06/11 15:09:03 UTC

[doris] branch master updated: [fix](case expr) fix coredump of case for null value 2 (#20635)

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

panxiaolei 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 a347063390 [fix](case expr) fix coredump of case for null value 2 (#20635)
a347063390 is described below

commit a3470633902a0f42d60017d47d916004312fefe3
Author: Xinyi Zou <zo...@gmail.com>
AuthorDate: Sun Jun 11 23:08:53 2023 +0800

    [fix](case expr) fix coredump of case for null value 2 (#20635)
    
    fix coredump of case for null value 2
---
 be/src/vec/functions/function_case.h               |  8 +--
 .../sql_functions/case_function/case_null2.csv     |  5 ++
 .../case_function/test_case_function_null.out      | 12 +++++
 .../case_function/test_case_function_null.groovy   | 57 +++++++++++++++++++++-
 4 files changed, 77 insertions(+), 5 deletions(-)

diff --git a/be/src/vec/functions/function_case.h b/be/src/vec/functions/function_case.h
index 0b336a4ecd..0c72e98aaf 100644
--- a/be/src/vec/functions/function_case.h
+++ b/be/src/vec/functions/function_case.h
@@ -332,13 +332,13 @@ public:
         bool then_null = false;
         for (int i = 1 + has_case; i < arguments.size() - has_else; i += 2) {
             auto then_column_ptr = block.get_by_position(arguments[i]).column;
-            if (then_column_ptr->is_nullable() || then_column_ptr->only_null()) {
+            if (then_column_ptr->get_data_type() == TypeIndex::Nullable) {
                 then_null = true;
             }
         }
         if constexpr (has_else) {
             auto else_column_ptr = block.get_by_position(arguments[arguments.size() - 1]).column;
-            if (else_column_ptr->is_nullable() || else_column_ptr->only_null()) {
+            if (else_column_ptr->get_data_type() == TypeIndex::Nullable) {
                 then_null = true;
             }
         } else {
@@ -364,13 +364,13 @@ public:
         bool when_null = false;
         if constexpr (has_case) {
             auto case_column_ptr = block.get_by_position(arguments[0]).column;
-            if (case_column_ptr->is_nullable() || case_column_ptr->only_null()) {
+            if (case_column_ptr->get_data_type() == TypeIndex::Nullable) {
                 when_null = true;
             }
         }
         for (int i = has_case; i < arguments.size() - has_else; i += 2) {
             auto when_column_ptr = block.get_by_position(arguments[i]).column;
-            if (when_column_ptr->is_nullable() || when_column_ptr->only_null()) {
+            if (when_column_ptr->get_data_type() == TypeIndex::Nullable) {
                 when_null = true;
             }
         }
diff --git a/regression-test/data/query_p0/sql_functions/case_function/case_null2.csv b/regression-test/data/query_p0/sql_functions/case_function/case_null2.csv
new file mode 100644
index 0000000000..08d0c1e007
--- /dev/null
+++ b/regression-test/data/query_p0/sql_functions/case_function/case_null2.csv
@@ -0,0 +1,5 @@
+1
+1
+1
+0
+-1
diff --git a/regression-test/data/query_p0/sql_functions/case_function/test_case_function_null.out b/regression-test/data/query_p0/sql_functions/case_function/test_case_function_null.out
index e671ae0ee4..de51eb0306 100644
--- a/regression-test/data/query_p0/sql_functions/case_function/test_case_function_null.out
+++ b/regression-test/data/query_p0/sql_functions/case_function/test_case_function_null.out
@@ -4,3 +4,15 @@
 1970-10-29	false
 1970-11-13	true
 
+-- !sql_case1 --
+-2.0
+
+-- !sql_case2 --
+-2
+
+-- !sql_case1 --
+-2.0
+
+-- !sql_case2 --
+-2
+
diff --git a/regression-test/suites/query_p0/sql_functions/case_function/test_case_function_null.groovy b/regression-test/suites/query_p0/sql_functions/case_function/test_case_function_null.groovy
index e625023525..63e67a40f0 100644
--- a/regression-test/suites/query_p0/sql_functions/case_function/test_case_function_null.groovy
+++ b/regression-test/suites/query_p0/sql_functions/case_function/test_case_function_null.groovy
@@ -41,7 +41,19 @@ suite("test_case_function_null", "query,p0") {
         );
     """
 
-    def tables = ["case_null0", "case_null1"]
+    sql """ drop table if exists `case_null2` """
+    sql """
+        CREATE TABLE `case_null2` (
+          `c0` tinyint(4) NULL
+        ) ENGINE=OLAP
+        DUPLICATE KEY(`c0`)
+        DISTRIBUTED BY HASH(`c0`) BUCKETS 20
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1"
+        );
+    """
+
+    def tables = ["case_null0", "case_null1", "case_null2"]
 
     for (String tableName in tables) {
         streamLoad {
@@ -173,4 +185,47 @@ suite("test_case_function_null", "query,p0") {
             c2,
             c1;
     """
+
+    qt_sql_case1 """
+        SELECT SUM(
+            CASE (((NULL BETWEEN NULL AND NULL)) and (CAST(0.4716 AS BOOLEAN)))
+            WHEN ((CAST('-1530390546' AS VARCHAR)) LIKE ('-1678299490'))
+            THEN (- (+ case_null2.c0))
+            WHEN CASE (NULL IN (NULL))
+            WHEN false THEN (case_null2.c0 NOT BETWEEN case_null2.c0 AND 1916517711)
+            END THEN ((((case_null2.c0)*(1309461808)))/((- -267268292)))
+            END)
+        FROM case_null2;
+    """
+
+    qt_sql_case2 """
+        SELECT SUM(CASE (((NULL BETWEEN NULL AND NULL)) and (CAST(0.4716 AS BOOLEAN)))
+            WHEN ((CAST('-1530390546' AS VARCHAR)) LIKE ('-1678299490'))
+            THEN (- (+ case_null2.c0))
+            END)
+        FROM case_null2;
+    """
+
+    sql "SET experimental_enable_nereids_planner=true"
+    sql "SET enable_fallback_to_original_planner=false"
+
+    qt_sql_case1 """
+        SELECT SUM(
+            CASE (((NULL BETWEEN NULL AND NULL)) and (CAST(0.4716 AS BOOLEAN)))
+            WHEN ((CAST('-1530390546' AS VARCHAR)) LIKE ('-1678299490'))
+            THEN (- (+ case_null2.c0))
+            WHEN CASE (NULL IN (NULL))
+            WHEN false THEN (case_null2.c0 NOT BETWEEN case_null2.c0 AND 1916517711)
+            END THEN ((((case_null2.c0)*(1309461808)))/((- -267268292)))
+            END)
+        FROM case_null2;
+    """
+
+    qt_sql_case2 """
+        SELECT SUM(CASE (((NULL BETWEEN NULL AND NULL)) and (CAST(0.4716 AS BOOLEAN)))
+            WHEN ((CAST('-1530390546' AS VARCHAR)) LIKE ('-1678299490'))
+            THEN (- (+ case_null2.c0))
+            END)
+        FROM case_null2;
+    """
 }
\ No newline at end of file


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