diff --git a/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java b/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java index 068ec441e55..6959d56354b 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java @@ -931,7 +931,8 @@ static List rewrite( (RexCorrelVariable) fieldAccess.getReferenceExpr(); CorDef corDef = new CorDef(v.id, fieldAccess.getField().getIndex()); int newIndex = requireNonNull(unnestedQuery.corDefOutputs.get(corDef)); - return new RexInputRef(newIndex, fieldAccess.getType()); + return new RexInputRef( + newIndex, unnestedQuery.r.getRowType().getFieldList().get(newIndex).getType()); } return super.visitFieldAccess(fieldAccess); } diff --git a/core/src/test/resources/sql/new-decorr.iq b/core/src/test/resources/sql/new-decorr.iq index 8f05bbac2a2..4c2e5791af3 100644 --- a/core/src/test/resources/sql/new-decorr.iq +++ b/core/src/test/resources/sql/new-decorr.iq @@ -276,4 +276,28 @@ select deptno from dept d1 where exists ( !ok +# [CALCITE-7402] Two-level nested correlated subquery causes TopDownGeneralDecorrelator type mismatch during translation +# This case comes from sub-query.iq [CALCITE-5716] +!use scott +SELECT dept.deptno, ( + SELECT max(emp.empno) + FROM emp + WHERE empno = (SELECT max(empno) AS maxDept + FROM emp e2 + WHERE e2.deptno = dept.deptno) + AND emp.deptno = dept.deptno), + dept.dname +FROM dept; ++--------+--------+------------+ +| DEPTNO | EXPR$1 | DNAME | ++--------+--------+------------+ +| 10 | 7934 | ACCOUNTING | +| 20 | 7902 | RESEARCH | +| 30 | 7900 | SALES | +| 40 | | OPERATIONS | ++--------+--------+------------+ +(4 rows) + +!ok + # End new-decorr.iq