You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by gi...@apache.org on 2017/10/17 15:32:24 UTC
calcite git commit: [CALCITE-1910] NPE on filtered aggregators using
"IN"
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 <gi...@gmail.com>
Authored: Tue Sep 5 07:21:48 2017 -0700
Committer: Gian Merlino <gi...@gmail.com>
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">
<![CDATA[select deptno