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]]>

Reply via email to