[
https://issues.apache.org/jira/browse/CALCITE-7859?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mihai Budiu resolved CALCITE-7859.
----------------------------------
Fix Version/s: 1.43.0
Resolution: Fixed
Fixed in
[https://github.com/apache/calcite/commit/9b2bde463d877e1f9c54a7a159bacf4cae31c9a6]
Thank you for the fix [~jooger]
> SqlToRelConverter.convertMerge produces a wrong plan or fails when a
> sub-query in MERGE ... UPDATE SET is expanded (expand = true)
> ----------------------------------------------------------------------------------------------------------------------------------
>
> Key: CALCITE-7859
> URL: https://issues.apache.org/jira/browse/CALCITE-7859
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.42.0
> Reporter: Iurii Gerzhedovich
> Assignee: Iurii Gerzhedovich
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.43.0
>
>
> {{SqlToRelConverter.convertMerge}} assumes that the input of the projection
> of the MERGE source select is the join of the
> source and the target:
> {code:java}
> LogicalJoin join = (LogicalJoin) mergeSourceRel.getInput(0);
> int nSourceFields = join.getLeft().getRowType().getFieldCount();
> ...
> relBuilder.push(join).project(projects, ...);
> {code}
> With {{expand = true}} (the default of {{SqlToRelConverter.Config}}) a
> sub-query in the SET expression is expanded into a
> join or a correlate on top of that join, so the assumption does not hold.
> 1. Correlated sub-query: the input is a {{LogicalCorrelate}} and the
> conversion fails with
> {noformat}
> java.lang.ClassCastException: class LogicalCorrelate cannot be cast to class
> LogicalJoin
> at SqlToRelConverter.convertMerge
> {noformat}
> 2. Uncorrelated sub-query: the input is a {{LogicalJoin}} of the
> source/target join and the sub-query, so the cast
> succeeds, but {{join.getLeft()}} is the source/target join, and
> {{nSourceFields}} is the width of both tables instead
> of the width of the source. All target columns are dropped from the
> projection, and the join with the sub-query
> is discarded or referenced wrongly. Query (SqlToRelConverterTest catalog):
> {code:sql}
> merge into empnullables e
> using (select * from emp) t
> on e.empno = t.empno
> when matched then update
> set sal = (select max(d.deptno) from dept d)
> {code}
> Actual plan (the update row has only the SET expression, the 9 target columns
> are missing):
> {noformat}
> LogicalTableModify(table=[[CATALOG, SALES, EMPNULLABLES]], operation=[MERGE],
> updateColumnList=[[SAL]], flattened=[true])
> LogicalProject(EXPR$0=[$18])
> LogicalJoin(condition=[true], joinType=[left])
> ...
> {noformat}
> Expected:
> {noformat}
> LogicalProject(EMPNO0=[$9], ENAME0=[$10], JOB0=[$11], MGR0=[$12],
> HIREDATE0=[$13], SAL0=[$14], COMM0=[$15], DEPTNO0=[$16], SLACKER0=[$17],
> EXPR$0=[$18])
> {noformat}
> Fix: compute the number of source fields from the validator namespace of the
> source table reference, and build the new
> projection over the real input of the source projection instead of over the
> first join found.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)