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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]