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