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/01 03:11:48 UTC

[doris] branch master updated: [fix](nereids)(planner) case when should return NullLiteral when all case result is NullLiteral (#20280)

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 68e593fbf1 [fix](nereids)(planner) case when should return NullLiteral when all case result is NullLiteral (#20280)
68e593fbf1 is described below

commit 68e593fbf1912683f72aa7a009794f7f0e17622d
Author: starocean999 <40...@users.noreply.github.com>
AuthorDate: Thu Jun 1 11:11:41 2023 +0800

    [fix](nereids)(planner) case when should return NullLiteral when all case result is NullLiteral (#20280)
---
 .../java/org/apache/doris/analysis/CaseExpr.java     |  5 +++++
 .../rules/expression/rules/FoldConstantRuleOnFE.java |  8 +++++++-
 .../string_functions/test_string_function_like.out   |  4 ++++
 .../test_string_function_like.groovy                 | 20 ++++++++++++++++++++
 4 files changed, 36 insertions(+), 1 deletion(-)

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 fb6414a1e2..548ceb1f62 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
@@ -311,6 +311,11 @@ public class CaseExpr extends Expr {
     //      but for current LiteralExpr.compareLiteral, `123`' won't be regard as true
     //  the case which two values has different type left to be
     public static Expr computeCaseExpr(CaseExpr expr) {
+        if (expr.getType() == Type.NULL) {
+            // if expr's type is NULL_TYPE, means all possible return values are nulls
+            // it's safe to return null literal here
+            return new NullLiteral();
+        }
         LiteralExpr caseExpr;
         int startIndex = 0;
         int endIndex = expr.getChildren().size();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
index 7c60c8df79..55e86699a9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
@@ -374,7 +374,13 @@ public class FoldConstantRuleOnFE extends AbstractExpressionRewriteRule {
             return defaultResult == null ? new NullLiteral(caseWhen.getDataType()) : defaultResult;
         }
         if (defaultResult == null) {
-            return new CaseWhen(whenClauses);
+            if (caseWhen.getDataType().isNullType()) {
+                // if caseWhen's type is NULL_TYPE, means all possible return values are nulls
+                // it's safe to return null literal here
+                return new NullLiteral();
+            } else {
+                return new CaseWhen(whenClauses);
+            }
         }
         return new CaseWhen(whenClauses, defaultResult);
     }
diff --git a/regression-test/data/nereids_p0/sql_functions/string_functions/test_string_function_like.out b/regression-test/data/nereids_p0/sql_functions/string_functions/test_string_function_like.out
index 0741f7c66a..9d03233513 100644
--- a/regression-test/data/nereids_p0/sql_functions/string_functions/test_string_function_like.out
+++ b/regression-test/data/nereids_p0/sql_functions/string_functions/test_string_function_like.out
@@ -124,3 +124,7 @@ bb
 
 -- !sql --
 
+-- !sql --
+
+-- !sql --
+
diff --git a/regression-test/suites/nereids_p0/sql_functions/string_functions/test_string_function_like.groovy b/regression-test/suites/nereids_p0/sql_functions/string_functions/test_string_function_like.groovy
index 171ec3d27a..05ed019fdf 100644
--- a/regression-test/suites/nereids_p0/sql_functions/string_functions/test_string_function_like.groovy
+++ b/regression-test/suites/nereids_p0/sql_functions/string_functions/test_string_function_like.groovy
@@ -70,5 +70,25 @@ suite("test_string_function_like") {
             CREATE TABLE test_string_function_like_t0 (c0 SMALLINT DEFAULT "1") DISTRIBUTED BY HASH (c0) PROPERTIES ("replication_num" = "1");
         """
     qt_sql "select CASE TRUE WHEN CASE FALSE WHEN ( c0 IS NULL) THEN TRUE END THEN NULL WHEN (('') LIKE c0) THEN '1970-04-17 18:47:49' END from test_string_function_like_t0;"
+
+    qt_sql """select
+                CASE TRUE WHEN
+                CASE FALSE
+                WHEN ( c0 IS NULL) THEN
+                TRUE
+                END THEN
+                NULL
+                END
+            FROM test_string_function_like_t0;"""
+    sql "SET enable_nereids_planner=false"
+    qt_sql """select
+            CASE TRUE WHEN
+            CASE FALSE
+            WHEN ( c0 IS NULL) THEN
+            TRUE
+            END THEN
+            NULL
+            END
+        FROM test_string_function_like_t0;"""
     // sql "DROP TABLE ${tbName};"
 }


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