Julian Hyde created CALCITE-6824:
------------------------------------
Summary: FieldTrimmer corrupts plan if query compares two boolean
subqueries
Key: CALCITE-6824
URL: https://issues.apache.org/jira/browse/CALCITE-6824
Project: Calcite
Issue Type: Bug
Reporter: Julian Hyde
Consider a query that asks whether a BOOLEAN value generated by one subquery is
in the result set produced by another subquery. This is valid unless you think
subqueries should not be allowed to return BOOLEAN values.
{noformat}
SELECT empno
FROM emp
WHERE (empno NOT IN (SELECT deptno FROM dept))
IN (SELECT deptno = 0 FROM dept)
{noformat}
During planning an AssertionError occurs. I believe this occurs just after
{{Programs.TrimFieldsProgram}} has been invoked.
{noformat}
java.lang.AssertionError: type mismatch:
ref:
SMALLINT NOT NULL
input:
BOOLEAN NOT NULL
at org.apache.calcite.util.Litmus.lambda$static$0(Litmus.java:31)
at
org.apache.calcite.plan.RelOptUtil.eqUpToNullability(RelOptUtil.java:2261)
at org.apache.calcite.rex.RexChecker.visitInputRef(RexChecker.java:131)
at org.apache.calcite.rex.RexChecker.visitInputRef(RexChecker.java:62)
at org.apache.calcite.rex.RexInputRef.accept(RexInputRef.java:125)
at org.apache.calcite.rex.RexChecker.visitCall(RexChecker.java:148)
at org.apache.calcite.rex.RexChecker.visitCall(RexChecker.java:62)
at org.apache.calcite.rex.RexCall.accept(RexCall.java:208)
at org.apache.calcite.rel.core.Join.isValid(Join.java:178)
at
org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:287)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1289)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:600)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:615)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:97)
at
org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1289)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:600)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:615)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:97)
at
org.apache.calcite.rel.AbstractRelNode.onRegister(AbstractRelNode.java:274)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.registerImpl(VolcanoPlanner.java:1289)
at
org.apache.calcite.plan.volcano.VolcanoPlanner.setRoot(VolcanoPlanner.java:276)
at
org.apache.calcite.tools.Programs.lambda$standard$4(Programs.java:298)
at
org.apache.calcite.tools.Programs$SequenceProgram.run(Programs.java:373)
at org.apache.calcite.prepare.Prepare.optimize(Prepare.java:178)
{noformat}
The following patch to JdbcTest reproduces; also
[RelToSqlConverterTest.testMissingParenthesesWithSubquery3|https://github.com/apache/calcite/blob/f1c370a0cb57675b6e5a442b3d98e29d75a64043/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java#L1544]:
{noformat}
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 053d7595e..975e67f88 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -6955,6 +6955,17 @@ private void checkGetTimestamp(Connection con) throws
SQLException {
.returnsUnordered("EMPNO=7876", "EMPNO=7499", "EMPNO=7698");
}
+ @Test void testFoo() {
+ final String sql = "SELECT empno\n"
+ + "FROM emp\n"
+ + "WHERE (empno NOT IN (SELECT deptno FROM dept))\n"
+ + " IN (SELECT deptno = 0 FROM dept)";
+ CalciteAssert.that()
+ .with(CalciteAssert.Config.JDBC_SCOTT)
+ .query(sql)
+ .returnsUnordered("EMPNO=7876", "EMPNO=7499", "EMPNO=7698");
+ }
+
@Test void testTimestampEqualsComparison() {
CalciteAssert.that()
.query("select time0 = time1, time0 <> time1"
{noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)