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

chunwei 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 3af1d78  [CALCITE-4818] AggregateExpandDistinctAggregatesRule must 
infer correct data type for top aggregate calls  (Taras Ledkov)
3af1d78 is described below

commit 3af1d78f7e60588c2497f8e0095d715ab179149a
Author: tledkov <tled...@gridgain.com>
AuthorDate: Mon Oct 4 09:55:00 2021 +0300

    [CALCITE-4818] AggregateExpandDistinctAggregatesRule must infer correct 
data type for top aggregate calls  (Taras Ledkov)
    
    Close apache/calcite#2560
---
 .../AggregateExpandDistinctAggregatesRule.java     |  7 ++--
 .../org/apache/calcite/test/RelOptRulesTest.java   | 42 ++++++++++++++++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml    | 21 +++++++++++
 3 files changed, 65 insertions(+), 5 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
index 46b1ceb..38ae615 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
@@ -26,7 +26,6 @@ import org.apache.calcite.rel.core.AggregateCall;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalAggregate;
-import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexInputRef;
@@ -368,14 +367,12 @@ public final class AggregateExpandDistinctAggregatesRule
         final int arg = bottomGroups.size() + nonDistinctAggCallProcessedSoFar;
         final List<Integer> newArgs = ImmutableList.of(arg);
         if (aggCall.getAggregation().getKind() == SqlKind.COUNT) {
-          RelDataTypeFactory typeFactory = 
aggregate.getCluster().getTypeFactory();
-
           newCall =
               AggregateCall.create(new SqlSumEmptyIsZeroAggFunction(), false,
                   aggCall.isApproximate(), aggCall.ignoreNulls(),
                   newArgs, -1, aggCall.distinctKeys, aggCall.collation,
                   originalGroupSet.cardinality(), relBuilder.peek(),
-                  typeFactory.getTypeSystem().deriveSumType(typeFactory, 
aggCall.getType()),
+                  null,
                   aggCall.getName());
         } else {
           newCall =
@@ -383,7 +380,7 @@ public final class AggregateExpandDistinctAggregatesRule
                   aggCall.isApproximate(), aggCall.ignoreNulls(),
                   newArgs, -1, aggCall.distinctKeys, aggCall.collation,
                   originalGroupSet.cardinality(),
-                  relBuilder.peek(), aggCall.getType(), aggCall.name);
+                  relBuilder.peek(), null, aggCall.name);
         }
         nonDistinctAggCallProcessedSoFar++;
       }
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 1a1e572..2cad6a9 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -6999,4 +6999,46 @@ class RelOptRulesTest extends RelOptTestBase {
         .withRule(CoreRules.AGGREGATE_EXPAND_DISTINCT_AGGREGATES_TO_JOIN)
         .check();
   }
+
+  /**
+   * Test case for <a 
href="https://issues.apache.org/jira/browse/CALCITE-4818";>[CALCITE-4818]
+   * AggregateExpandDistinctAggregatesRule must infer correct data type for 
top aggregate calls</a>.
+   * <p>
+   * Checks AggregateExpandDistinctAggregatesRule when return type of the SUM 
aggregate
+   * is changed (expanded) by define custom type factory.
+   */
+  @Test void testSumAndDistinctSumWithExpandSumType() {
+    // Define new type system to expand SUM return type.
+    RelDataTypeSystemImpl typeSystem = new RelDataTypeSystemImpl() {
+      @Override public RelDataType deriveSumType(RelDataTypeFactory 
typeFactory,
+          RelDataType argumentType) {
+        switch (argumentType.getSqlTypeName()) {
+        case INTEGER:
+          return typeFactory.createSqlType(SqlTypeName.BIGINT);
+        case BIGINT:
+          return typeFactory.createSqlType(SqlTypeName.DECIMAL);
+
+        default:
+          return super.deriveSumType(typeFactory, argumentType);
+        }
+      }
+    };
+
+    Supplier<RelDataTypeFactory> typeFactorySupplier = () -> new 
SqlTypeFactoryImpl(typeSystem);
+
+    // Expected plan:
+    // LogicalProject(EXPR$0=[CAST($0):BIGINT], EXPR$1=[$1])
+    //  LogicalAggregate(group=[{}], EXPR$0=[SUM($1)], EXPR$1=[SUM($0)]) // 
RowType[DECIMAL, BIGINT]
+    //    LogicalAggregate(group=[{0}], EXPR$0=[SUM($0)])  // RowType[INTEGER, 
BIGINT]
+    //      LogicalProject(COMM=[$6])
+    //        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+    //
+    // The top 'LogicalProject' must be added in case SUM type is expanded
+    // because type of original expression 'COUNT(DISTINCT comm)' is BIGINT
+    // and type of SUM (of BIGINT) is DECIMAL.
+    sql("SELECT SUM(comm), SUM(DISTINCT comm) FROM emp")
+        .withTester(t -> t.withTypeFactorySupplier(typeFactorySupplier))
+        .withRule(CoreRules.AGGREGATE_EXPAND_DISTINCT_AGGREGATES_TO_JOIN)
+        .check();
+  }
 }
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 4a070d7..2b22095 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -12445,6 +12445,27 @@ EnumerableProject(N_REGIONKEY=[ITEM($0, 
'N_REGIONKEY')])
 ]]>
     </Resource>
   </TestCase>
+  <TestCase name="testSumAndDistinctSumWithExpandSumType">
+    <Resource name="sql">
+      <![CDATA[SELECT SUM(comm), SUM(DISTINCT comm) FROM emp]]>
+    </Resource>
+    <Resource name="planBefore">
+      <![CDATA[
+LogicalAggregate(group=[{}], EXPR$0=[SUM($0)], EXPR$1=[SUM(DISTINCT $0)])
+  LogicalProject(COMM=[$6])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+    <Resource name="planAfter">
+      <![CDATA[
+LogicalProject(EXPR$0=[CAST($0):BIGINT], EXPR$1=[$1])
+  LogicalAggregate(group=[{}], EXPR$0=[SUM($1)], EXPR$1=[SUM($0)])
+    LogicalAggregate(group=[{0}], EXPR$0=[SUM($0)])
+      LogicalProject(COMM=[$6])
+        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
   <TestCase name="testSwapAntiJoin">
     <Resource name="planBefore">
       <![CDATA[

Reply via email to