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/06/10 14:56:38 UTC

[doris] 07/10: [fix](case expr) fix coredump of case for null value (#20564)

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 82a0d918eb9706c815c5d9582ce7f03527e681b0
Author: TengJianPing <18...@users.noreply.github.com>
AuthorDate: Thu Jun 8 20:05:23 2023 +0800

    [fix](case expr) fix coredump of case for null value (#20564)
    
    be coredump when when expr is null:
---
 be/src/vec/functions/function_case.h               |   8 +-
 .../sql_functions/case_function/case_null0.csv     |   3 +
 .../sql_functions/case_function/case_null1.csv     |  11 ++
 .../case_function/test_case_function_null.out      |   6 +
 .../case_function/test_case_function_null.groovy   | 176 +++++++++++++++++++++
 5 files changed, 200 insertions(+), 4 deletions(-)

diff --git a/be/src/vec/functions/function_case.h b/be/src/vec/functions/function_case.h
index 5c2b39d7f8..a4049f7840 100644
--- a/be/src/vec/functions/function_case.h
+++ b/be/src/vec/functions/function_case.h
@@ -301,13 +301,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()) {
+            if (then_column_ptr->is_nullable() || then_column_ptr->only_null()) {
                 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()) {
+            if (else_column_ptr->is_nullable() || else_column_ptr->only_null()) {
                 then_null = true;
             }
         } else {
@@ -333,13 +333,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()) {
+            if (case_column_ptr->is_nullable() || case_column_ptr->only_null()) {
                 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()) {
+            if (when_column_ptr->is_nullable() || when_column_ptr->only_null()) {
                 when_null = true;
             }
         }
diff --git a/regression-test/data/query_p0/sql_functions/case_function/case_null0.csv b/regression-test/data/query_p0/sql_functions/case_function/case_null0.csv
new file mode 100644
index 0000000000..5275e77971
--- /dev/null
+++ b/regression-test/data/query_p0/sql_functions/case_function/case_null0.csv
@@ -0,0 +1,3 @@
+1.0	1	1970-11-13
+0.7	0	1970-01-04
+\N	0	1970-10-29
diff --git a/regression-test/data/query_p0/sql_functions/case_function/case_null1.csv b/regression-test/data/query_p0/sql_functions/case_function/case_null1.csv
new file mode 100644
index 0000000000..3b211b2d1f
--- /dev/null
+++ b/regression-test/data/query_p0/sql_functions/case_function/case_null1.csv
@@ -0,0 +1,11 @@
+
+kejc8^H
+
+
+
+
+)ꪁ
+
+
+
+kꪁNhR
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
new file mode 100644
index 0000000000..e671ae0ee4
--- /dev/null
+++ b/regression-test/data/query_p0/sql_functions/case_function/test_case_function_null.out
@@ -0,0 +1,6 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !sql_case0 --
+1970-01-04	false
+1970-10-29	false
+1970-11-13	true
+
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
new file mode 100644
index 0000000000..e625023525
--- /dev/null
+++ b/regression-test/suites/query_p0/sql_functions/case_function/test_case_function_null.groovy
@@ -0,0 +1,176 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_case_function_null", "query,p0") {
+    sql """ drop table if exists case_null0 """
+    sql """ create table case_null0 (
+                `c0` decimalv3(17, 1) NULL,
+                `c1` boolean NOT NULL,
+                `c2` date NOT NULL
+            ) ENGINE=OLAP
+            DUPLICATE KEY(`c0`, `c1`, `c2`)
+            DISTRIBUTED BY RANDOM BUCKETS 10
+            PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1"
+            );
+    """
+
+    sql """ drop table if exists `case_null1` """
+    sql """
+        CREATE TABLE `case_null1` (
+          `c0` varchar(7) NOT NULL DEFAULT ""
+        ) ENGINE=OLAP
+        AGGREGATE KEY(`c0`)
+        DISTRIBUTED BY RANDOM BUCKETS 24
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1"
+        );
+    """
+
+    def tables = ["case_null0", "case_null1"]
+
+    for (String tableName in tables) {
+        streamLoad {
+            // a default db 'regression_test' is specified in
+            // ${DORIS_HOME}/conf/regression-conf.groovy
+            table tableName
+
+            // default label is UUID:
+            // set 'label' UUID.randomUUID().toString()
+
+            // default column_separator is specify in doris fe config, usually is '\t'.
+            // this line change to ','
+            set 'column_separator', '\t'
+            // relate to ${DORIS_HOME}/regression-test/data/demo/streamload_input.csv.
+            // also, you can stream load a http stream, e.g. http://xxx/some.csv
+            file """${tableName}.csv"""
+
+            time 10000 // limit inflight 10s
+
+            // stream load action will check result, include Success status, and NumberTotalRows == NumberLoadedRows
+
+            // if declared a check callback, the default check condition will ignore.
+            // So you must check all condition
+            check { result, exception, startTime, endTime ->
+                if (exception != null) {
+                    throw exception
+                }
+                log.info("Stream load result: ${result}".toString())
+                def json = parseJson(result)
+                assertEquals("success", json.Status.toLowerCase())
+                assertEquals(json.NumberTotalRows, json.NumberLoadedRows)
+            }
+        }
+    }
+
+    qt_sql_case0 """
+    SELECT * FROM (
+        SELECT
+            case_null0.c2 c2,
+            case_null0.c1 c1
+        FROM
+            case_null0,
+            case_null1
+        WHERE
+            CASE
+                (
+                    CAST(TIMESTAMP '1970-10-27 14:44:27' AS DATE) BETWEEN DATE '1970-08-05'
+                    AND DATE '1970-07-12'
+                )
+                WHEN CAST(NULL AS BOOLEAN) THEN (NULL IN (NULL))
+                WHEN (('쬊o') !=('Sf^M7mir')) THEN (
+                    ('0.24865') LIKE (
+                        CASE
+                            false
+                            WHEN case_null0.c1 THEN case_null1.c0
+                            WHEN case_null0.c1 THEN case_null1.c0
+                        END
+                    )
+                )
+            END
+        GROUP BY
+            case_null0.c2,
+            case_null0.c1,
+            case_null1.c0
+        UNION
+        SELECT
+            case_null0.c2 c2,
+            case_null0.c1 c1
+        FROM
+            case_null0,
+            case_null1
+        WHERE
+            (
+                NOT CASE
+                    (
+                        CAST(TIMESTAMP '1970-10-27 14:44:27' AS DATE) BETWEEN DATE '1970-08-05'
+                        AND DATE '1970-07-12'
+                    )
+                    WHEN CAST(NULL AS BOOLEAN) THEN (NULL IN (NULL))
+                    WHEN (('쬊o') !=('Sf^M7mir')) THEN (
+                        ('0.24865') LIKE (
+                            CASE
+                                false
+                                WHEN case_null0.c1 THEN case_null1.c0
+                                WHEN case_null0.c1 THEN case_null1.c0
+                            END
+                        )
+                    )
+                END
+            )
+        GROUP BY
+            case_null0.c2,
+            case_null0.c1,
+            case_null1.c0
+        UNION
+        SELECT
+            case_null0.c2 c2,
+            case_null0.c1 c1
+        FROM
+            case_null0,
+            case_null1
+        WHERE
+            (
+                (
+                    CASE
+                        (
+                            CAST(TIMESTAMP '1970-10-27 14:44:27' AS DATE) BETWEEN DATE '1970-08-05'
+                            AND DATE '1970-07-12'
+                        )
+                        WHEN CAST(NULL AS BOOLEAN) THEN (NULL IN (NULL))
+                        WHEN (('쬊o') !=('Sf^M7mir')) THEN (
+                            ('0.24865') like (
+                                CASE
+                                    false
+                                    WHEN case_null0.c1 THEN case_null1.c0
+                                    WHEN case_null0.c1 THEN case_null1.c0
+                                END
+                            )
+                        )
+                    END
+                ) IS NULL
+            )
+        GROUP BY
+            case_null0.c2,
+            case_null0.c1,
+            case_null1.c0
+        ) a
+        order BY
+            c2,
+            c1;
+    """
+}
\ 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