[
https://issues.apache.org/jira/browse/CALCITE-2080?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16283217#comment-16283217
]
Volodymyr Vysotskyi commented on CALCITE-2080:
----------------------------------------------
I did not find a sentence in SQL spec. that explicitly answers your question,
but according to *8.4 <in predicate>*.*Syntax Rules*
{quote}
4) The expression
RVC NOT IN IPV
is equivalent to
NOT ( RVC IN IPV )
{quote}
According to {{NOTE 259}} in *8.4 <in predicate>*.*Conformance Rules*
{quote}
NOTE 259 — Since <in predicate> is an equality operation, the Conformance Rules
of Subclause 9.11, “Equality operations”,
also apply.
{quote}
So, I suppose that validator get the type right.
This happens only for those cases when the left operand has a nullable type and
the right operand has non-nullable.
> Query with NOT IN operator and literal fails with error
> java.lang.AssertionError: Cast for just nullability not allowed
> -----------------------------------------------------------------------------------------------------------------------
>
> Key: CALCITE-2080
> URL: https://issues.apache.org/jira/browse/CALCITE-2080
> Project: Calcite
> Issue Type: Bug
> Reporter: Volodymyr Vysotskyi
> Assignee: Julian Hyde
>
> This test
> {code:java}
> @Test
> public void testNotInWithLiteral() {
> final String sql = "SELECT *\n"
> + "FROM SALES.NATION\n"
> + "WHERE n_name NOT IN\n"
> + " (SELECT ''\n"
> + " FROM SALES.NATION)";
> sql(sql).with(getTesterWithDynamicTable()).ok();
> }
> {code}
> fails with error:
> {noformat}
> java.lang.AssertionError: Cast for just nullability not allowed
> at org.apache.calcite.util.Litmus$1.fail(Litmus.java:31)
> at org.apache.calcite.rel.core.Filter.isValid(Filter.java:116)
> at
> org.apache.calcite.test.SqlToRelConverterTest$RelValidityChecker.visit(SqlToRelConverterTest.java:2753)
> at org.apache.calcite.rel.SingleRel.childrenAccept(SingleRel.java:72)
> at org.apache.calcite.rel.RelVisitor.visit(RelVisitor.java:44)
> at
> org.apache.calcite.test.SqlToRelConverterTest$RelValidityChecker.visit(SqlToRelConverterTest.java:2756)
> at org.apache.calcite.rel.RelVisitor.go(RelVisitor.java:61)
> at
> org.apache.calcite.test.SqlToRelTestBase.assertValid(SqlToRelTestBase.java:129)
> at
> org.apache.calcite.test.SqlToRelTestBase$TesterImpl.assertConvertsTo(SqlToRelTestBase.java:693)
> at
> org.apache.calcite.test.SqlToRelConverterTest$Sql.convertsTo(SqlToRelConverterTest.java:2790)
> at
> org.apache.calcite.test.SqlToRelConverterTest$Sql.ok(SqlToRelConverterTest.java:2786)
> at
> org.apache.calcite.test.SqlToRelConverterTest.testNotInWithLiteral(SqlToRelConverterTest.java:1299)
> {noformat}
> In [this
> line|https://github.com/apache/calcite/blob/c7d9b3d561243c3cb97595f4fe9a0ccf05ce85ac/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java#L4502]
> cast which just changes types nullability was made. The ending type is taken
> form validator and it [was made
> nullable|https://github.com/apache/calcite/blob/f47465236b7650f2280092b708fa39062fe79ffd/core/src/main/java/org/apache/calcite/sql/fun/SqlInOperator.java#L163]
> because right operand has a nullable type.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)