This is an automated email from the ASF dual-hosted git repository.
danny0405 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 50cd134 [CALCITE-3076] AggregateJoinTransposeRule throws error for
unique under aggregate keys when generating merged calls
50cd134 is described below
commit 50cd1340c6df8f4d8e2bde287ddd18c1b07e312c
Author: yuzhao.cyz <[email protected]>
AuthorDate: Mon May 20 21:56:25 2019 +0800
[CALCITE-3076] AggregateJoinTransposeRule throws error for unique under
aggregate keys when generating merged calls
AggregateJoinTransposeRule generates wrong mapping for under agg
calls with unique aggregate keys.
Close apache/calcite#1223
---
.../rel/rules/AggregateJoinTransposeRule.java | 4 +++-
.../org/apache/calcite/test/RelOptRulesTest.java | 22 +++++++++++++++++
.../org/apache/calcite/test/RelOptRulesTest.xml | 28 ++++++++++++++++++++++
3 files changed, 53 insertions(+), 1 deletion(-)
diff --git
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java
index dda4e10..22a77af 100644
---
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java
+++
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java
@@ -257,8 +257,10 @@ public class AggregateJoinTransposeRule extends RelOptRule
{
final int index = ((RexInputRef) singleton).getIndex();
if (!belowAggregateKey.get(index)) {
projects.add(singleton);
+ side.split.put(aggCall.i, projects.size() - 1);
+ } else {
+ side.split.put(aggCall.i, index);
}
- side.split.put(aggCall.i, index);
} else {
projects.add(singleton);
side.split.put(aggCall.i, projects.size() - 1);
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 d4b386d..5ca18f8 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -4086,6 +4086,28 @@ public class RelOptRulesTest extends RelOptTestBase {
}
/** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-3076">[CALCITE-3076]
+ * AggregateJoinTransposeRule throws error for unique under aggregate keys
when
+ * generating merged calls</a>.*/
+ @Test public void testPushAggregateThroughJoinOnEmptyLogicalValues() {
+ final HepProgram preProgram = new HepProgramBuilder()
+ .addRuleInstance(AggregateProjectMergeRule.INSTANCE)
+
.addRuleInstance(ReduceExpressionsRule.FilterReduceExpressionsRule.FILTER_INSTANCE)
+ .build();
+
+ final HepProgram program = new HepProgramBuilder()
+ .addRuleInstance(AggregateJoinTransposeRule.EXTENDED)
+ .build();
+
+ final String sql =
+ "select count(*) volume, sum(C1.sal) C1_sum_sal "
+ + "from (select sal, ename from sales.emp where 1=2) C1 "
+ + "inner join (select ename from sales.emp) C2 "
+ + "on C1.ename = C2.ename ";
+ sql(sql).withPre(preProgram).with(program).check();
+ }
+
+ /** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-2249">[CALCITE-2249]
* AggregateJoinTransposeRule generates inequivalent nodes if Aggregate
relNode contains
* distinct aggregate function.</a>. */
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 191afb5..beeb4a1 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -7695,6 +7695,34 @@ LogicalAggregate(group=[{}], EXPR$0=[$SUM0($4)])
]]>
</Resource>
</TestCase>
+ <TestCase name="testPushAggregateThroughJoinOnEmptyLogicalValues">
+ <Resource name="sql">
+ <![CDATA[select count(*) from sales.emp join sales.dept on job =
name]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalAggregate(group=[{}], VOLUME=[COUNT()], C1_SUM_SAL=[SUM($0)])
+ LogicalJoin(condition=[=($1, $2)], joinType=[inner])
+ LogicalProject(SAL=[$5], ENAME=[$1])
+ LogicalValues(tuples=[[]])
+ LogicalProject(ENAME=[$1])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalAggregate(group=[{}], VOLUME=[$SUM0($3)], C1_SUM_SAL=[SUM($4)])
+ LogicalProject(ENAME=[$0], SAL=[$1], ENAME0=[$2], VOLUME=[$3],
$f4=[CAST(*($1, $3)):INTEGER])
+ LogicalJoin(condition=[=($0, $2)], joinType=[inner])
+ LogicalProject(ENAME=[$1], SAL=[$0])
+ LogicalProject(SAL=[$5], ENAME=[$1])
+ LogicalValues(tuples=[[]])
+ LogicalAggregate(group=[{0}], VOLUME=[COUNT()])
+ LogicalProject(ENAME=[$1])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
<TestCase name="testPushDistinctAggregateIntoJoin">
<Resource name="sql">
<![CDATA[select count(distinct sal) from sales.emp join sales.dept
on job = name]]>