This is an automated email from the ASF dual-hosted git repository.
zhehu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 137fed23f9 [CALCITE-6734] RelFieldTrimmer should trim Aggregate's
input fields which are arguments of unused aggregate functions
137fed23f9 is described below
commit 137fed23f91ba687f6c4b029e4b654e616191e47
Author: ViggoC <[email protected]>
AuthorDate: Tue Dec 17 23:27:58 2024 +0800
[CALCITE-6734] RelFieldTrimmer should trim Aggregate's input fields which
are arguments of unused aggregate functions
---
.../apache/calcite/sql2rel/RelFieldTrimmer.java | 20 +++++++++------
.../calcite/sql2rel/RelFieldTrimmerTest.java | 29 ++++++++++++++++++++++
2 files changed, 41 insertions(+), 8 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
index 69e9ae90bb..effb5078f1 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
@@ -1054,16 +1054,20 @@ public class RelFieldTrimmer implements
ReflectiveVisitor {
// 1. group fields are always used
final ImmutableBitSet.Builder inputFieldsUsed =
aggregate.getGroupSet().rebuild();
- // 2. agg functions
+ // 2. agg functions: consider only the ones that are needed according to
fieldsUsed
+ int aggCallIndex = aggregate.getGroupCount();
for (AggregateCall aggCall : aggregate.getAggCallList()) {
- inputFieldsUsed.addAll(aggCall.getArgList());
- if (aggCall.filterArg >= 0) {
- inputFieldsUsed.set(aggCall.filterArg);
- }
- if (aggCall.distinctKeys != null) {
- inputFieldsUsed.addAll(aggCall.distinctKeys);
+ if (fieldsUsed.get(aggCallIndex)) {
+ inputFieldsUsed.addAll(aggCall.getArgList());
+ if (aggCall.filterArg >= 0) {
+ inputFieldsUsed.set(aggCall.filterArg);
+ }
+ if (aggCall.distinctKeys != null) {
+ inputFieldsUsed.addAll(aggCall.distinctKeys);
+ }
+ inputFieldsUsed.addAll(RelCollations.ordinals(aggCall.collation));
}
- inputFieldsUsed.addAll(RelCollations.ordinals(aggCall.collation));
+ aggCallIndex++;
}
// Create input with trimmed columns.
diff --git
a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java
b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java
index ebe65d93d0..34d94f990c 100644
--- a/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java
+++ b/core/src/test/java/org/apache/calcite/sql2rel/RelFieldTrimmerTest.java
@@ -281,6 +281,35 @@ class RelFieldTrimmerTest {
assertTrue(aggregate.getHints().contains(aggHint));
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6734">[CALCITE-6734]
+ * RelFieldTrimmer should trim Aggregate's input fields which are arguments
of
+ * unused aggregate functions</a>. */
+ @Test void testTrimUnusedAggregateInput() {
+ final RelBuilder builder = RelBuilder.create(config().build());
+ final RelNode original =
+ builder.scan("EMP")
+ .filter(
+ builder.greaterThan(builder.field("DEPTNO"),
+ builder.literal(100)))
+ .aggregate(
+ builder.groupKey(builder.field("DEPTNO")),
+ builder.sum(false, "SAL", builder.field("SAL")),
+ builder.count(false, "ENAME", builder.field("ENAME")))
+ .project(builder.field("DEPTNO"), builder.field("SAL"))
+ .build();
+
+ final RelFieldTrimmer fieldTrimmer = new RelFieldTrimmer(null, builder);
+ final RelNode trimmed = fieldTrimmer.trim(original);
+
+ final String expected = ""
+ + "LogicalAggregate(group=[{2}], SAL=[SUM($1)])\n"
+ + " LogicalFilter(condition=[>($2, 100)])\n"
+ + " LogicalProject(EMPNO=[$0], SAL=[$5], DEPTNO=[$7])\n"
+ + " LogicalTableScan(table=[[scott, EMP]])\n";
+ assertThat(trimmed, hasTree(expected));
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-4055">[CALCITE-4055]
* RelFieldTrimmer loses hints</a>. */