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