You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2020/02/04 00:15:55 UTC

[calcite] 01/02: [CALCITE-3764] AggregateCaseToFilterRule handles NULL values incorrectly

This is an automated email from the ASF dual-hosted git repository.

jhyde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git

commit 13728c0320dcd2e042e775dcc19b615df5c4a614
Author: Julian Hyde <jh...@apache.org>
AuthorDate: Fri Jan 31 21:35:25 2020 -0800

    [CALCITE-3764] AggregateCaseToFilterRule handles NULL values incorrectly
---
 .../rel/rules/AggregateCaseToFilterRule.java       |  2 +-
 core/src/test/resources/sql/agg.iq                 | 36 ++++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateCaseToFilterRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateCaseToFilterRule.java
index d7876cb..2db096f 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateCaseToFilterRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateCaseToFilterRule.java
@@ -166,7 +166,7 @@ public class AggregateCaseToFilterRule extends RelOptRule {
 
     // Operand 1: Filter
     final SqlPostfixOperator op =
-        flip ? SqlStdOperatorTable.IS_FALSE : SqlStdOperatorTable.IS_TRUE;
+        flip ? SqlStdOperatorTable.IS_NOT_TRUE : SqlStdOperatorTable.IS_TRUE;
     final RexNode filterFromCase =
         rexBuilder.makeCall(op, caseCall.operands.get(0));
 
diff --git a/core/src/test/resources/sql/agg.iq b/core/src/test/resources/sql/agg.iq
index 6eac41b..8b3fd9c 100644
--- a/core/src/test/resources/sql/agg.iq
+++ b/core/src/test/resources/sql/agg.iq
@@ -1307,6 +1307,42 @@ group by deptno;
 
 !ok
 
+# Convert CASE to FILTER
+select count(case x when 0 then null else -1 end) as c
+from (values 0, null, 0, 1) as t(x);
++---+
+| C |
++---+
+| 2 |
++---+
+(1 row)
+
+!ok
+
+# Same, expressed as FILTER
+select count(*) filter (where (x = 0) is not true) as c
+from (values 0, null, 0, 1) as t(x);
++---+
+| C |
++---+
+| 2 |
++---+
+(1 row)
+
+!ok
+
+# Similar, not quite the same
+select count(*) filter (where (x = 0) is false) as c
+from (values 0, null, 0, 1) as t(x);
++---+
+| C |
++---+
+| 1 |
++---+
+(1 row)
+
+!ok
+
 # [CALCITE-1293] Bad code generated when argument to COUNT(DISTINCT) is a
 # GROUP BY column
 select count(distinct deptno) as cd, count(*) as c