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