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

Le code ci-dessus est de RelBuilderTest.java .Pourquoi ne génère le LogicalJoin(condition=[true], joinType=[inner]) Calcite nœud? quand j'utilise RelToSqlConverter pour convertir le RelNode à SQL, il rencontre une erreur sur le filter 'condition=[true]'Rejoignez nœud du plan avec la condition = true rencontre une erreur

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 

pourquoi cela se produit?

Répondre

1

RelBuilder fait ce qui est dit: construire une jointure sans condition. Ceci est analogue à la façon dont vous pouvez écrire

SELECT ... 
FROM Emp, Dept 

et préciser plus tard, la condition de jointure dans la clause WHERE:

WHERE Emp.deptno = Dept.deptno 

RelBuilder ne cherche pas à faire des optimisations (en dehors de quelques micro-optimisations comme suppression trivial Project s). Pliant le Filter sur le Join est le travail de FilterIntoJoinRule, et se produira correctement au cours de la phase d'optimisation des requêtes.

L'erreur dans RelToSqlConverter est un known issue et sera corrigée dans la prochaine version (1.13.0).