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 <[email protected]>
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