Repository: calcite Updated Branches: refs/heads/master 9baa96f39 -> 188c8020d
[CALCITE-1910] NPE on filtered aggregators using "IN" Close apache/calcite#548 Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/188c8020 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/188c8020 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/188c8020 Branch: refs/heads/master Commit: 188c8020d4e68c0a3180265b07949aeb8830ff1b Parents: 9baa96f Author: Gian Merlino <[email protected]> Authored: Tue Sep 5 07:21:48 2017 -0700 Committer: Gian Merlino <[email protected]> Committed: Tue Oct 17 08:32:11 2017 -0700 ---------------------------------------------------------------------- .../apache/calcite/sql2rel/SqlToRelConverter.java | 16 ++++++++++++++++ .../apache/calcite/test/SqlToRelConverterTest.java | 8 ++++++++ .../apache/calcite/test/SqlToRelConverterTest.xml | 15 +++++++++++++++ 3 files changed, 39 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/188c8020/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index 9057f80..752743b 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -2693,6 +2693,10 @@ public class SqlToRelConverter { replaceSubQueries(bb, aggregateFinder.list, RelOptUtil.Logic.TRUE_FALSE_UNKNOWN); + // also replace sub-queries inside filters in the aggregates + replaceSubQueries(bb, aggregateFinder.filterList, + RelOptUtil.Logic.TRUE_FALSE_UNKNOWN); + // If group-by clause is missing, pretend that it has zero elements. if (groupList == null) { groupList = SqlNodeList.EMPTY; @@ -5214,12 +5218,24 @@ public class SqlToRelConverter { */ private static class AggregateFinder extends SqlBasicVisitor<Void> { final SqlNodeList list = new SqlNodeList(SqlParserPos.ZERO); + final SqlNodeList filterList = new SqlNodeList(SqlParserPos.ZERO); @Override public Void visit(SqlCall call) { // ignore window aggregates and ranking functions (associated with OVER operator) if (call.getOperator().getKind() == SqlKind.OVER) { return null; } + + if (call.getOperator().getKind() == SqlKind.FILTER) { + // the WHERE in a FILTER must be tracked too so we can call replaceSubQueries on it. + // see https://issues.apache.org/jira/browse/CALCITE-1910 + final SqlNode aggCall = call.getOperandList().get(0); + final SqlNode whereCall = call.getOperandList().get(1); + list.add(aggCall); + filterList.add(whereCall); + return null; + } + if (call.getOperator().isAggregator()) { list.add(call); return null; http://git-wip-us.apache.org/repos/asf/calcite/blob/188c8020/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java index ca2623c..f0276f4 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java @@ -469,6 +469,14 @@ public class SqlToRelConverterTest extends SqlToRelTestBase { sql(sql).ok(); } + @Test public void testAggFilterWithIn() { + final String sql = "select\n" + + " deptno, sum(sal * 2) filter (where empno not in (1, 2)), count(*)\n" + + "from emp\n" + + "group by deptno"; + sql(sql).ok(); + } + @Test public void testFakeStar() { sql("SELECT * FROM (VALUES (0, 0)) AS T(A, \"*\")").ok(); } http://git-wip-us.apache.org/repos/asf/calcite/blob/188c8020/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml ---------------------------------------------------------------------- diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml index fb92801..dd944d1 100644 --- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml @@ -2891,6 +2891,21 @@ LogicalAggregate(group=[{0}], EXPR$1=[SUM($1) FILTER $2], EXPR$2=[COUNT()]) ]]> </Resource> </TestCase> + <TestCase name="testAggFilterWithIn"> + <Resource name="sql"> + <![CDATA[select + deptno, sum(sal * 2) filter (where empno not in (1, 2)), count(*) +from emp +group by deptno]]> + </Resource> + <Resource name="plan"> + <![CDATA[ +LogicalAggregate(group=[{0}], EXPR$1=[SUM($1) FILTER $2], EXPR$2=[COUNT()]) + LogicalProject(DEPTNO=[$7], $f1=[*($5, 2)], $f2=[AND(<>($0, 1), <>($0, 2))]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + </TestCase> <TestCase name="testSubQueryAggregateFunctionFollowedBySimpleOperation"> <Resource name="sql"> <