2017-06-05 1 views
1

Der obige Code ist von RelBuilderTest.java. Warum erzeugt Calcit LogicalJoin(condition=[true], joinType=[inner]) Node? wenn ich RelToSqlConverter verwenden, um die RelNode zu SQL zu konvertieren, ist es eine Fehlermeldung über die filter 'condition=[true]'Join Plan Knoten mit Bedingung = true einen Fehler zu finden

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 

begegnen, warum dies geschehen ist?

Antwort

1

RelBuilder tut, was gesagt wird: Aufbau einer Verbindung ohne Bedingung. Dies ist analog zu, wie Sie

SELECT ... 
FROM Emp, Dept 

schreiben könnte und später die Bedingung in der WHERE Join-Klausel angeben:

WHERE Emp.deptno = Dept.deptno 

RelBuilder nicht versucht, Optimierungen zu machen (abgesehen von ein paar Mikro Optimierungen wie Entfernen von Trivial Project s). Die Filter auf die Join zu falten ist die Aufgabe von FilterIntoJoinRule und wird ordnungsgemäß während der Abfrageoptimierungsphase geschehen. Der Fehler in RelToSqlConverter ist ein known issue und wird in der nächsten Version (1.13.0) behoben.

Verwandte Themen