Zhen Chen created CALCITE-7401:
----------------------------------

             Summary: Multi-level correlated subqueries cause an out-of-range 
error in the TopDownGeneralDecorrelator
                 Key: CALCITE-7401
                 URL: https://issues.apache.org/jira/browse/CALCITE-7401
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.41.0
            Reporter: Zhen Chen


Using CoreQuidemTest2 to test the following SQL will result in an error.
# Test case for [CALCITE-5789]
select deptno from dept d1 where exists (
 select 1 from dept d2 where d2.deptno = d1.deptno and exists (
  select 1 from dept d3 where d3.deptno = d2.deptno and d3.dname = d1.dname));
+--------+
| DEPTNO |
+--------+
|    10 |
|    20 |
|    30 |
|    40 |
+--------+
(4 rows)
​
!ok
Error message:
> java.lang.AssertionError: out of range; value: 6, limit: 6
>   at org.apache.calcite.util.Litmus.lambda$static$0(Litmus.java:31)
>   at 
> org.apache.calcite.sql2rel.RelDecorrelator.allLessThan(RelDecorrelator.java:2397)
>   at 
> org.apache.calcite.sql2rel.RelDecorrelator$Frame.<init>(RelDecorrelator.java:3790)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator$UnnestedQuery.<init>(TopDownGeneralDecorrelator.java:970)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator$UnnestedQuery.createJoinUnnestInfo(TopDownGeneralDecorrelator.java:1021)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator$UnnestedQuery.access$100(TopDownGeneralDecorrelator.java:957)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.unnestInternal(TopDownGeneralDecorrelator.java:663)
>   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
> Method)
>   at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
>   at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.base/java.lang.reflect.Method.invoke(Method.java:568)
>   at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.unnest(TopDownGeneralDecorrelator.java:420)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.unnestInternal(TopDownGeneralDecorrelator.java:436)
>   at jdk.internal.reflect.GeneratedMethodAccessor178.invoke(Unknown Source)
>   at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.base/java.lang.reflect.Method.invoke(Method.java:568)
>   at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.unnest(TopDownGeneralDecorrelator.java:420)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.unnestInternal(TopDownGeneralDecorrelator.java:458)
>   at jdk.internal.reflect.GeneratedMethodAccessor179.invoke(Unknown Source)
>   at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.base/java.lang.reflect.Method.invoke(Method.java:568)
>   at org.apache.calcite.util.ReflectUtil$2.invoke(ReflectUtil.java:533)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.unnest(TopDownGeneralDecorrelator.java:420)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.correlateElimination(TopDownGeneralDecorrelator.java:283)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.correlateElimination(TopDownGeneralDecorrelator.java:243)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.correlateElimination(TopDownGeneralDecorrelator.java:243)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.correlateElimination(TopDownGeneralDecorrelator.java:243)
>   at 
> org.apache.calcite.sql2rel.TopDownGeneralDecorrelator.decorrelateQuery(TopDownGeneralDecorrelator.java:213)
>   at 
> org.apache.calcite.tools.Programs$DecorrelateProgram.run(Programs.java:454)
>   at org.apache.calcite.tools.Programs$SequenceProgram.run(Programs.java:406)
>   at org.apache.calcite.prepare.Prepare.optimize(Prepare.java:178)
>   at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:320)
>   at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:221)
>   at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:675)
>   at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:526)
>   at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:494)
>   at 
> org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:246)
>   at 
> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:654)
>   at 
> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:677)
>   at 
> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:157)
>   at 
> org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:228)
>   at net.hydromatic.quidem.Quidem.checkResult(Quidem.java:317)



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to