You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Julian Hyde (Jira)" <ji...@apache.org> on 2023/04/13 17:37:00 UTC
[jira] [Created] (CALCITE-5645) Correlated scalar sub-query returns incorrect results when the correlating variable is NULL
Julian Hyde created CALCITE-5645:
------------------------------------
Summary: Correlated scalar sub-query returns incorrect results when the correlating variable is NULL
Key: CALCITE-5645
URL: https://issues.apache.org/jira/browse/CALCITE-5645
Project: Calcite
Issue Type: Bug
Reporter: Julian Hyde
Correlated scalar sub-query returns incorrect results when the correlating variable is NULL. For example, consider the following view and query:
{code}
!use scott
!set outputformat mysql
create view emp1 as
select empno, ename, job, sal,
case when job = 'ANALYST' then null
else deptno
end as deptno
from emp);
!ok
select ename, (select count(*) as c
from emp1 as e2
where e2.deptno is not distinct from e1.deptno) as c
from emp1 as e1;
!ok
select ename, deptno,
count(*) over (partition by deptno) as c
from emp1 as e1;
+--------+--------+---+
| ENAME | DEPTNO | C |
+--------+--------+---+
| ADAMS | 20 | 3 |
| ALLEN | 30 | 6 |
| BLAKE | 30 | 6 |
| CLARK | 10 | 3 |
| FORD | | 2 |
| JAMES | 30 | 6 |
| JONES | 20 | 3 |
| KING | 10 | 3 |
| MARTIN | 30 | 6 |
| MILLER | 10 | 3 |
| SCOTT | | 2 |
| SMITH | 20 | 3 |
| TURNER | 30 | 6 |
| WARD | 30 | 6 |
+--------+--------+---+
(14 rows)
!ok
{code}
The {{emp1}} view just provides null values for the {{deptno}} column.
The two queries should be equivalent, but the first throws:
{noformat}
java.lang.AssertionError: RexInputRef index 7 out of range 0..4
at org.apache.calcite.util.Litmus.lambda$static$0(Litmus.java:31)
at org.apache.calcite.rex.RexChecker.visitInputRef(RexChecker.java:125)
at org.apache.calcite.rex.RexChecker.visitInputRef(RexChecker.java:61)
at org.apache.calcite.rex.RexInputRef.accept(RexInputRef.java:113)
at org.apache.calcite.rex.RexChecker.visitCall(RexChecker.java:144)
at org.apache.calcite.rex.RexChecker.visitCall(RexChecker.java:61)
at org.apache.calcite.rex.RexCall.accept(RexCall.java:189)
at org.apache.calcite.rel.core.Project.isValid(Project.java:262)
at org.apache.calcite.rel.core.Project.<init>(Project.java:107)
at org.apache.calcite.rel.logical.LogicalProject.<init>(LogicalProject.java:75)
at org.apache.calcite.rel.logical.LogicalProject.create(LogicalProject.java:166)
at org.apache.calcite.rel.logical.LogicalProject.create(LogicalProject.java:143)
at org.apache.calcite.rel.core.RelFactories$ProjectFactoryImpl.createProject(RelFactories.java:199)
at org.apache.calcite.tools.RelBuilder.project_(RelBuilder.java:2117)
at org.apache.calcite.tools.RelBuilder.project(RelBuilder.java:1888)
at org.apache.calcite.tools.RelBuilder.projectNamed(RelBuilder.java:2209)
at org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectList(SqlToRelConverter.java:4638)
{noformat}
The simpler query
{code}
select ename, deptno,
(select count(*)
from emp1 as e2
where e1.deptno is null) as c
from emp1 as e1;
!ok
{code}
throws a similar exception.
This functionality is necessary for supporting measures (see CALCITE-4496) with NULL keys in the GROUP BY, or with GROUPING SETS.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)