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

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


The following commit(s) were added to refs/heads/master by this push:
     new 23e1b1f  [CALCITE-4848] Adding a HAVING condition to a query with a 
dynamic parameter makes the result always empty
23e1b1f is described below

commit 23e1b1fcae6614fb9b6600951251ba622b379b30
Author: Thomas Rebele <thomas.reb...@gmail.com>
AuthorDate: Thu Oct 14 09:44:33 2021 +0200

    [CALCITE-4848] Adding a HAVING condition to a query with a dynamic 
parameter makes the result always empty
---
 .../apache/calcite/rel/rules/ReduceExpressionsRule.java  |  2 +-
 .../java/org/apache/calcite/test/RelOptRulesTest.java    | 16 ++++++++++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml          | 16 ++++++++++++++++
 3 files changed, 33 insertions(+), 1 deletion(-)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
index 1177e16..67aa567 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
@@ -1071,7 +1071,7 @@ public abstract class ReduceExpressionsRule<C extends 
ReduceExpressionsRule.Conf
     @Override public Void visitInputRef(RexInputRef inputRef) {
       final RexNode constant = constants.get(inputRef);
       if (constant != null) {
-        if (constant instanceof RexCall) {
+        if (constant instanceof RexCall || constant instanceof 
RexDynamicParam) {
           constant.accept(this);
         } else {
           stack.add(Constancy.REDUCIBLE_CONSTANT);
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java 
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index 001f643..1a1e572 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -3280,6 +3280,22 @@ class RelOptRulesTest extends RelOptTestBase {
         .check();
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-4848";>[CALCITE-4848]
+   * Adding a HAVING condition to a query with a dynamic parameter makes the 
result always empty
+   </a>. */
+  @Test void testAggregateWithDynamicParam() {
+    HepProgramBuilder builder = new HepProgramBuilder();
+    builder.addRuleClass(ReduceExpressionsRule.class);
+    HepPlanner hepPlanner = new HepPlanner(builder.build());
+    hepPlanner.addRule(CoreRules.FILTER_REDUCE_EXPRESSIONS);
+    final String sql = "SELECT sal, COUNT(1) AS count_val\n"
+        + "FROM emp t WHERE sal = ?\n"
+        + "GROUP BY sal HAVING sal < 1000";
+    sql(sql).with(hepPlanner)
+        .checkUnchanged();
+  }
+
   @Test void testReduceCasts() {
     // Disable simplify in RelBuilder so that there are casts in 'before';
     // The resulting plan should have no cast expressions
diff --git 
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml 
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 12e944c..4a070d7 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -1097,6 +1097,22 @@ LogicalAggregate(group=[{0}], EXPR$1=[SUM($1)])
 ]]>
     </Resource>
   </TestCase>
+  <TestCase name="testAggregateWithDynamicParam">
+    <Resource name="sql">
+      <![CDATA[SELECT sal, COUNT(1) AS count_val
+FROM emp t WHERE sal = ?
+GROUP BY sal HAVING sal < 1000]]>
+    </Resource>
+    <Resource name="planBefore">
+      <![CDATA[
+LogicalFilter(condition=[<($0, 1000)])
+  LogicalAggregate(group=[{0}], COUNT_VAL=[COUNT()])
+    LogicalProject(SAL=[$5], $f1=[1])
+      LogicalFilter(condition=[=($5, ?0)])
+        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
   <TestCase name="testAll">
     <Resource name="sql">
       <![CDATA[select * from emp e1

Reply via email to