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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 0845153  [Bug] Fix constant In Predicate result error (#3511)
0845153 is described below

commit 084515317f56827b59e6d24de86a763a9e83928a
Author: Mingyu Chen <morningman....@gmail.com>
AuthorDate: Fri May 8 11:30:11 2020 +0800

    [Bug] Fix constant In Predicate result error (#3511)
    
    `select 1 not in (2, NULL, 1);` should return `0`
---
 .../org/apache/doris/analysis/InPredicate.java     | 20 ++++----
 .../apache/doris/planner/ConstantExpressTest.java  | 55 ++++++++++++++++++++++
 .../org/apache/doris/planner/QueryPlanTest.java    |  2 -
 3 files changed, 67 insertions(+), 10 deletions(-)

diff --git a/fe/src/main/java/org/apache/doris/analysis/InPredicate.java 
b/fe/src/main/java/org/apache/doris/analysis/InPredicate.java
index 50ecfd0..0b65469 100644
--- a/fe/src/main/java/org/apache/doris/analysis/InPredicate.java
+++ b/fe/src/main/java/org/apache/doris/analysis/InPredicate.java
@@ -54,6 +54,8 @@ public class InPredicate extends Predicate {
     private static final String IN = "in";
     private static final String NOT_IN = "not_in";
 
+    private static final NullLiteral NULL_LITERAL = new NullLiteral();
+
     public static void initBuiltins(FunctionSet functionSet) {
         for (Type t: Type.getSupportedTypes()) {
             if (t.isNull()) continue;
@@ -262,15 +264,17 @@ public class InPredicate extends Predicate {
         }
 
         List<Expr> inListChildren = children.subList(1, children.size());
-        if (inListChildren.contains(leftChildValue)) {
-            return new BoolLiteral(true);
-        } else {
-            final NullLiteral nullLiteral = new NullLiteral();
-            if (inListChildren.contains(nullLiteral)) {
-                return nullLiteral;
-            }
-            return new BoolLiteral(false);
+        boolean containsLeftChild = inListChildren.contains(leftChildValue);
+
+        // See QueryPlanTest.java testConstantInPredicate() for examples.
+        // This logic should be same as logic in in_predicate.cpp: 
get_boolean_val()
+        if (containsLeftChild) {
+            return new BoolLiteral(!isNotIn);
+        }
+        if (inListChildren.contains(NULL_LITERAL)) {
+            return new NullLiteral();
         }
+        return new BoolLiteral(isNotIn);
     }
 
     @Override
diff --git a/fe/src/test/java/org/apache/doris/planner/ConstantExpressTest.java 
b/fe/src/test/java/org/apache/doris/planner/ConstantExpressTest.java
index 3d1f6c9..a8c1889 100644
--- a/fe/src/test/java/org/apache/doris/planner/ConstantExpressTest.java
+++ b/fe/src/test/java/org/apache/doris/planner/ConstantExpressTest.java
@@ -19,6 +19,7 @@ package org.apache.doris.planner;
 
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.utframe.UtFrameUtils;
+
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -158,4 +159,58 @@ public class ConstantExpressTest {
                 "select 1 = 1",
                 "TRUE");
     }
+
+    @Test
+    public void testConstantInPredicate() throws Exception {
+        connectContext.setDatabase("default_cluster:test");
+        // for constant NOT IN PREDICATE
+        String sql = "select 1 not in (1, 2);";
+        String explainString = 
UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "explain " + sql);
+        Assert.assertTrue(explainString.contains("FALSE"));
+
+        sql = "select 1 not in (2, 3);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("TRUE"));
+
+        sql = "select 1 not in (2, null);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("NULL"));
+
+        sql = "select 1 not in (1, 2, null);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("FALSE"));
+
+        sql = "select null not in (1, 2);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("NULL"));
+
+        sql = "select null not in (null);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("NULL"));
+
+        // for constant IN PREDICATE
+        sql = "select 1 in (1, 2);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("TRUE"));
+
+        sql = "select 1 in (2, 3);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("FALSE"));
+
+        sql = "select 1 in (1, 2, NULL);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("TRUE"));
+
+        sql = "select 1 in (2, NULL);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("NULL"));
+
+        sql = "select null in (2);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("NULL"));
+
+        sql = "select null in (null);";
+        explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, 
"explain " + sql);
+        Assert.assertTrue(explainString.contains("NULL"));
+    }
 }
diff --git a/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java 
b/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index 759d85d..15c2de3 100644
--- a/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -825,6 +825,4 @@ public class QueryPlanTest {
         Assert.assertTrue(explainString.contains("CROSS JOIN"));
         Assert.assertTrue(!explainString.contains("PREDICATES"));
     }
-
-
 }


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

Reply via email to