2017-06-05 1 views
1
final RelBuilder builder = RelBuilder.create(config().build()); 
    RelNode root = 
     builder.scan("EMP") 
      .as("e") 
      .scan("EMP") 
      .as("m") 
      .scan("DEPT") 
      .join(JoinRelType.INNER) 
      .join(JoinRelType.INNER) 
      .filter(
       builder.equals(builder.field("e", "DEPTNO"), 
        builder.field("DEPT", "DEPTNO")), 
       builder.equals(builder.field("m", "EMPNO"), 
        builder.field("e", "MGR"))) 
      .build(); 
    final String expected = "" 
     + "LogicalFilter(condition=[AND(=($7, $16), =($8, $3))])\n" 
     + " LogicalJoin(condition=[true], joinType=[inner])\n" 
     + " LogicalTableScan(table=[[scott, EMP]])\n" 
     + " LogicalJoin(condition=[true], joinType=[inner])\n" 
     + "  LogicalTableScan(table=[[scott, EMP]])\n" 
     + "  LogicalTableScan(table=[[scott, DEPT]])\n"; 
    assertThat(str(root), is(expected)); 

上記のコードはRelBuilderTest.javaの.whyからである方解石はLogicalJoin(condition=[true], joinType=[inner])ノードを生成していますか?私はSQLにRelNodeを変換するRelToSqlConverterを使用する場合、それはfilter 'condition=[true]'条件とプランノードに参加=真出会いエラー

ava.lang.AssertionError: Internal error: While invoking method 'public org.apache.calcite.rel.rel2sql.SqlImplementor$Result org.apache.calcite.rel.rel2sql.RelToSqlConverter.visit(org.apache.calcite.rel.core.Filter) 
at org.apache.calcite.util.Util.newInternal(Util.java:792) 
at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:535) 
at org.apache.calcite.rel.rel2sql.RelToSqlConverter.dispatch(RelToSqlConverter.java:80 

に関するエラーが発生した理由はこれが起こるのでしょうか?

答えて

1

RelBuilderは何を言っているのですか:条件なしで結合を作成する。これは、あなたが

SELECT ... 
FROM Emp, Dept 

を書いて、後でWHERE句で結合条件を指定することができますどのように似ている:

WHERE Emp.deptno = Dept.deptno 
RelBuilderのようないくつかのマイクロ最適化とは別に(最適化をしようとしません

簡単なProjectを削除してください)。 FilterJoinにフォールバックすると、FilterIntoJoinRuleというジョブが実行され、クエリ最適化フェーズで正常に実行されます。

RelToSqlConverterのエラーはknown issueであり、次のリリース(1.13.0)で修正される予定です。

関連する問題