[ 
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)

Reply via email to