[
https://issues.apache.org/jira/browse/CALCITE-7239?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
weihua zhang updated CALCITE-7239:
----------------------------------
Summary: If no trim() after SqlToRelConverter.convertQuery(), maybe throw
Exception in some cases (was: if no trim() after
SqlToRelConverter.convertQuery(), maybe throw Exception in some cases)
> If no trim() after SqlToRelConverter.convertQuery(), maybe throw Exception in
> some cases
> ----------------------------------------------------------------------------------------
>
> Key: CALCITE-7239
> URL: https://issues.apache.org/jira/browse/CALCITE-7239
> Project: Calcite
> Issue Type: Bug
> Reporter: weihua zhang
> Priority: Major
>
> {code:sql}
> SELECT e1.*, d.deptno
> FROM emp e1
> LEFT JOIN dept d
> ON e1.deptno = d.deptno
> AND d.deptno IN (
> SELECT e3.deptno
> FROM emp e3
> WHERE d.deptno > e3.comm
> )
> ORDER BY e1.empno;
> {code}
> when https://issues.apache.org/jira/browse/CALCITE-7034 fixed, I want to
> check this fix in impala (I use 1.41.0-snapshot locally), but throw a
> RuntimeException:
> {code:java}
> Could not find a matching signature for call =($7, $9) {code}
> [https://github.com/apache/impala/blob/master/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteRelNodeConverter.java#L129]
> Impala's convert() do not have trimmer.trim()
> if I change convert() as following:
> {code:java}
> public RelNode convert(SqlNode validatedNode) {
> SqlToRelConverter relConverter = new SqlToRelConverter(
> viewExpander_,
> sqlValidator_,
> reader_,
> cluster_,
> ImpalaConvertletTable.INSTANCE,
> SqlToRelConverter.config().withCreateValuesRel(false));
> // Convert the valid AST into a logical plan
> RelRoot root = relConverter.convertQuery(validatedNode, false, true);
> RelNode relNode = root.project();
> LogUtil.logDebug(relNode, "Plan after conversion from Abstract Syntax
> Tree");
> RelBuilder relBuilder = RelFactories.LOGICAL_BUILDER.create(cluster_,
> reader_);
> RelFieldTrimmer trimmer = new RelFieldTrimmer(sqlValidator_, relBuilder);
> RelNode trimmedPlan = trimmer.trim(relNode);
> RelNode subQueryRemovedPlan =
> runProgram(
> ImmutableList.of(
> CoreRules.JOIN_SUB_QUERY_TO_CORRELATE,
> CoreRules.PROJECT_SUB_QUERY_TO_CORRELATE,
> CoreRules.FILTER_SUB_QUERY_TO_CORRELATE
> ),
> trimmedPlan);
> LogUtil.logDebug(subQueryRemovedPlan, "Plan after subquery removal
> phase");
> RelNode decorrelatedPlan =
> RelDecorrelator.decorrelateQuery(subQueryRemovedPlan, relBuilder);
> LogUtil.logDebug(decorrelatedPlan, "Plan after subquery decorrelation
> phase");
> return decorrelatedPlan;
> }
> {code}
> Impala can produce right result too.
> but I think it's a bug in RelDecorrelator,
> https://github.com/apache/calcite/blob/3543c3b7ad39a2aa6920e8e32a06d178b31971b5/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java#L1763
> following plans is no trim in convert()
> {code:java}
> [Plan after conversion from Abstract Syntax Tree]
> LogicalSort(sort0=[$0], dir0=[ASC]), id = 13
> LogicalProject(empno=[$0], ename=[$1], job=[$2], mgr=[$3], hiredate=[$4],
> sal=[$5], comm=[$6], deptno=[$7], DEPTNO0=[$8]), id = 12
> LogicalJoin(condition=[AND(=($7, $8), IN($8, {
> LogicalProject(DEPTNO=[$7])
> LogicalFilter(condition=[>(CAST($cor0.deptno0):DOUBLE, $6)])
> LogicalTableScan(table=[[testdb, emp]])
> }))], joinType=[left]), id = 9
> LogicalTableScan(table=[[testdb, emp]]), id = 1
> LogicalTableScan(table=[[testdb, dept]]), id = 3
> {code}
> {code:java}
> [Plan after subquery removal phase]
> LogicalSort(sort0=[$0], dir0=[ASC]), id = 20
> LogicalProject(empno=[$0], ename=[$1], job=[$2], mgr=[$3], hiredate=[$4],
> sal=[$5], comm=[$6], deptno=[$7], DEPTNO0=[$8]), id = 18
> LogicalProject(empno=[$0], ename=[$1], job=[$2], mgr=[$3], hiredate=[$4],
> sal=[$5], comm=[$6], deptno=[$7], deptno0=[$8], dname=[$9], loc=[$10]), id =
> 41
> LogicalJoin(condition=[=($7, $8)], joinType=[left]), id = 39
> LogicalTableScan(table=[[testdb, emp]]), id = 1
> LogicalFilter(condition=[=($0, $3)]), id = 37
> LogicalCorrelate(correlation=[$cor0], joinType=[inner],
> requiredColumns=[{0}]), id = 35
> LogicalTableScan(table=[[testdb, dept]]), id = 3
> LogicalAggregate(group=[{0}]), id = 33
> LogicalProject(DEPTNO=[$7]), id = 31
> LogicalFilter(condition=[>(CAST($cor0.deptno):DOUBLE, $6)]),
> id = 29
> LogicalTableScan(table=[[testdb, emp]]), id = 1
> {code}
> {code:java}
> Plan after removing Correlator
> LogicalSort(sort0=[$0], dir0=[ASC])
> LogicalProject(empno=[$0], ename=[$1], job=[$2], mgr=[$3], hiredate=[$4],
> sal=[$5], comm=[$6], deptno=[$7], DEPTNO0=[$8])
> LogicalProject(empno=[$0], ename=[$1], job=[$2], mgr=[$3], hiredate=[$4],
> sal=[$5], comm=[$6], deptno=[$7], deptno0=[$8], dname=[$9], loc=[$10])
> LogicalJoin(condition=[=($7, $8)], joinType=[left])
> LogicalTableScan(table=[[testdb, emp]])
> LogicalFilter(condition=[=($0, $3)])
> LogicalCorrelate(correlation=[$cor0], joinType=[inner],
> requiredColumns=[{0}])
> LogicalTableScan(table=[[testdb, dept]])
> LogicalAggregate(group=[{0}])
> LogicalProject(DEPTNO=[$7])
> LogicalFilter(condition=[>(CAST($cor0.deptno):DOUBLE, $6)])
> LogicalTableScan(table=[[testdb, emp]])
> {code}
> {code:java}
> [Plan after subquery decorrelation phase]
> LogicalSort(sort0=[$0], dir0=[ASC]), id = 140
> LogicalProject(empno=[$0], ename=[$1], job=[$2], mgr=[$3], hiredate=[$4],
> sal=[$5], comm=[$6], deptno=[$7], DEPTNO0=[$8]), id = 138
> LogicalJoin(condition=[=($7, $9)], joinType=[left]), id = 136
> LogicalTableScan(table=[[testdb, emp]]), id = 1
> LogicalFilter(condition=[=($0, $3)]), id = 134
> LogicalProject(deptno=[$0], dname=[$1], loc=[$2], DEPTNO0=[$4]), id =
> 132
> LogicalJoin(condition=[=($3, $5)], joinType=[inner]), id = 130
> LogicalProject(deptno=[$0], dname=[$1], loc=[$2],
> deptno0=[CAST($0):DOUBLE]), id = 114
> LogicalTableScan(table=[[testdb, dept]]), id = 3
> LogicalAggregate(group=[{0, 1}]), id = 128
> LogicalProject(DEPTNO=[$7], deptno0=[$8]), id = 126
> LogicalJoin(condition=[>($8, $6)], joinType=[inner]), id = 142
> LogicalTableScan(table=[[testdb, emp]]), id = 1
> LogicalAggregate(group=[{0}]), id = 120
> LogicalProject(deptno0=[CAST($0):DOUBLE]), id = 118
> LogicalTableScan(table=[[testdb, dept]]), id = 3
> {code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)