You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Wang Yanlin (Jira)" <ji...@apache.org> on 2019/10/15 07:05:00 UTC

[jira] [Created] (CALCITE-3413) AssertionError for interpertering union/intersect/minus with null value

Wang Yanlin created CALCITE-3413:
------------------------------------

             Summary: AssertionError for interpertering union/intersect/minus with null value
                 Key: CALCITE-3413
                 URL: https://issues.apache.org/jira/browse/CALCITE-3413
             Project: Calcite
          Issue Type: New Feature
            Reporter: Wang Yanlin


Add the following test case in *InterpreterTest*

{code:java}
@Test public void testInterpretUnionWithNullValue() throws Exception {
    final String sql = "select * from\n"
        + "(select x, y from (values (cast(NULL as int), cast(NULL as varchar(1))),\n"
        + "(cast(NULL as int), cast(NULL as varchar(1)))) as t(x, y))\n"
        + "union\n"
        + "(select x, y from (values (cast(NULL as int), cast(NULL as varchar(1)))) as t2(x, y))\n";
    SqlNode validate = planner.validate(planner.parse(sql));
    RelNode convert = planner.rel(validate).rel;
    final Interpreter interpreter = new Interpreter(dataContext, convert);
    assertRows(interpreter, "[null, null]");
  }

  @Test public void testInterpretUnionAllWithNullValue() throws Exception {
    final String sql = "select * from\n"
        + "(select x, y from (values (cast(NULL as int), cast(NULL as varchar(1))),\n"
        + "(cast(NULL as int), cast(NULL as varchar(1)))) as t(x, y))\n"
        + "union all\n"
        + "(select x, y from (values (cast(NULL as int), cast(NULL as varchar(1)))) as t2(x, y))\n";
    SqlNode validate = planner.validate(planner.parse(sql));
    RelNode convert = planner.rel(validate).rel;
    final Interpreter interpreter = new Interpreter(dataContext, convert);
    assertRows(interpreter, "[null, null]", "[null, null]", "[null, null]");
  }
{code}

got

{code:java}
java.lang.AssertionError
	at org.apache.calcite.interpreter.Interpreter$CompilerImpl.source(Interpreter.java:510)
	at org.apache.calcite.interpreter.Nodes$CoreCompiler.source(Nodes.java:46)
	at org.apache.calcite.interpreter.AbstractSingleNode.<init>(AbstractSingleNode.java:33)
	at org.apache.calcite.interpreter.ProjectNode.<init>(ProjectNode.java:31)
	at org.apache.calcite.interpreter.Nodes$CoreCompiler.visit(Nodes.java:60)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.calcite.util.ReflectUtil.invokeVisitorInternal(ReflectUtil.java:257)
	at org.apache.calcite.util.ReflectUtil.invokeVisitor(ReflectUtil.java:214)
	at org.apache.calcite.util.ReflectUtil$1.invokeVisitor(ReflectUtil.java:464)
	at org.apache.calcite.interpreter.Interpreter$CompilerImpl.visit(Interpreter.java:451)
	at org.apache.calcite.interpreter.Nodes$CoreCompiler.visit(Nodes.java:46)
	at org.apache.calcite.rel.AbstractRelNode.childrenAccept(AbstractRelNode.java:265)
	at org.apache.calcite.interpreter.Interpreter$CompilerImpl.visit(Interpreter.java:447)
	at org.apache.calcite.interpreter.Nodes$CoreCompiler.visit(Nodes.java:46)
	at org.apache.calcite.interpreter.Interpreter$CompilerImpl.visitRoot(Interpreter.java:405)
	at org.apache.calcite.interpreter.Interpreter.<init>(Interpreter.java:88)
	at org.apache.calcite.test.InterpreterTest.testInterpretMinusWithNullValue(InterpreterTest.java:418)
{code}

The cause lies in the optimize of [Interpreter|https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java#L85]
before optimize, the relnode tree is as follows, no renode with same id exists

{code:java}
LogicalUnion(all=[false]), id = 19
  LogicalProject(X=[$0], Y=[$1]), id = 16
    LogicalUnion(all=[true]), id = 15
      LogicalProject(EXPR$0=[null:INTEGER], EXPR$1=[null:VARCHAR(1)]), id = 12
        LogicalValues(tuples=[[{ 0 }]]), id = 11
      LogicalProject(EXPR$0=[null:INTEGER], EXPR$1=[null:VARCHAR(1)]), id = 14
        LogicalValues(tuples=[[{ 0 }]]), id = 13
  LogicalProject(X=[null:INTEGER], Y=[null:VARCHAR(1)]), id = 18
    LogicalValues(tuples=[[{ 0 }]]), id = 17
{code}

after optimize, the relnode tree is as follows,

{code:java}
LogicalUnion(all=[false]), id = 30
  LogicalProject(X=[$0], Y=[$1]), id = 26
    LogicalUnion(all=[true]), id = 24
      LogicalProject(EXPR$0=[null:INTEGER], EXPR$1=[null:VARCHAR(1)]), id = 21
        LogicalValues(tuples=[[{ 0 }]]), id = 11
      LogicalProject(EXPR$0=[null:INTEGER], EXPR$1=[null:VARCHAR(1)]), id = 21
        LogicalValues(tuples=[[{ 0 }]]), id = 11
  LogicalProject(X=[null:INTEGER], Y=[null:VARCHAR(1)]), id = 28
    LogicalValues(tuples=[[{ 0 }]]), id = 11
{code}

there exists relnodes with same id, thus breaking the inner structure of [CompilerImpl|https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java#L381]




--
This message was sent by Atlassian Jira
(v8.3.4#803005)