This is an automated email from the ASF dual-hosted git repository.
yashmayya pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push:
new c58c13feca4 Fix missing GROUPING SETS in multi-stage EXPLAIN when
asking servers (#19769)
c58c13feca4 is described below
commit c58c13feca49a03a5e5a7cdb534ab6d950cc2da6
Author: Yash Mayya <[email protected]>
AuthorDate: Tue Oct 6 21:13:43 2026 -0700
Fix missing GROUPING SETS in multi-stage EXPLAIN when asking servers
(#19769)
---
.../planner/logical/PlanNodeToRelConverter.java | 14 ++++++++++++--
.../planner/logical/PlanNodeToRelConverterTest.java | 20 ++++++++++++++++++++
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverter.java
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverter.java
index 9b39f80cbd1..2ff2e9289bb 100644
---
a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverter.java
+++
b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverter.java
@@ -108,8 +108,18 @@ public final class PlanNodeToRelConverter {
visitChildren(node);
try {
- int[] groupKeyArr =
node.getGroupKeys().stream().mapToInt(Integer::intValue).toArray();
- RelBuilder.GroupKey groupKey = _builder.groupKey(groupKeyArr);
+ List<Integer> groupKeys = node.getGroupKeys();
+ RelBuilder.GroupKey groupKey;
+ if (node.isGroupingSets()) {
+ // Each grouping set holds indexes into the group keys, not input
field indexes
+ List<ImmutableBitSet> groupSets = new
ArrayList<>(node.getGroupingSets().size());
+ for (List<Integer> groupingSet : node.getGroupingSets()) {
+
groupSets.add(ImmutableBitSet.of(groupingSet.stream().map(groupKeys::get).collect(Collectors.toList())));
+ }
+ groupKey = _builder.groupKey(ImmutableBitSet.of(groupKeys),
groupSets);
+ } else {
+ groupKey =
_builder.groupKey(groupKeys.stream().mapToInt(Integer::intValue).toArray());
+ }
List<RexExpression.FunctionCall> functionCalls = node.getAggCalls();
List<Integer> filterArgs = node.getFilterArgs();
diff --git
a/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverterTest.java
b/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverterTest.java
index d642beb5118..646d2ce4911 100644
---
a/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverterTest.java
+++
b/pinot-query-planner/src/test/java/org/apache/pinot/query/planner/logical/PlanNodeToRelConverterTest.java
@@ -61,4 +61,24 @@ public class PlanNodeToRelConverterTest {
+ " LogicalProject(a=[$0], c=[$2])\n"
+ " Leaf\n");
}
+
+ @Test
+ public void testAggregateGroupingSets() {
+ // MAX(d) ... GROUP BY ROLLUP(b, c), where the grouping sets hold indexes
into the group keys [1, 2]
+ DataSchema leafSchema = new DataSchema(new String[]{"a", "b", "c", "d"},
+ new ColumnDataType[]{ColumnDataType.INT, ColumnDataType.INT,
ColumnDataType.INT, ColumnDataType.INT});
+ PlanNode leaf = new ExplainedNode(0, leafSchema, null, List.of(), "Leaf",
Map.of());
+ DataSchema aggregateSchema = new DataSchema(new String[]{"b", "c",
"$groupingId", "max"},
+ new ColumnDataType[]{ColumnDataType.INT, ColumnDataType.INT,
ColumnDataType.INT, ColumnDataType.INT});
+ RexExpression.FunctionCall max =
+ new RexExpression.FunctionCall(ColumnDataType.INT, "MAX", List.of(new
RexExpression.InputRef(3)));
+ PlanNode aggregate = new AggregateNode(0, aggregateSchema, null,
List.of(leaf), List.of(max), List.of(-1),
+ List.of(1, 2), AggregateNode.AggType.LEAF, false, null, 0,
List.of(List.of(0, 1), List.of(0), List.of()));
+
+ RelBuilder relBuilder =
RelBuilder.create(Frameworks.newConfigBuilder().build());
+ RelNode relNode = PlanNodeToRelConverter.convert(relBuilder, aggregate);
+ assertEquals(RelOptUtil.toString(relNode),
+ "LogicalAggregate(group=[{1, 2}], groups=[[{1, 2}, {1}, {}]],
agg#0=[MAX($3)])\n"
+ + " Leaf\n");
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]