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[