This is an automated email from the ASF dual-hosted git repository. gortiz 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 ab09ff318c6 Enhance validation for multi-value columns in aggregate grouping (#16577) ab09ff318c6 is described below commit ab09ff318c6b34a24e95e81c0a1f98eb5616851c Author: Gonzalo Ortiz Jaureguizar <gor...@users.noreply.github.com> AuthorDate: Tue Aug 26 08:58:53 2025 +0200 Enhance validation for multi-value columns in aggregate grouping (#16577) --- .../tests/MultiStageEngineIntegrationTest.java | 15 +++++++++++++++ .../validation/ArrayToMvValidationVisitor.java | 20 ++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/MultiStageEngineIntegrationTest.java b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/MultiStageEngineIntegrationTest.java index 111c57c7b16..6b0ac607400 100644 --- a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/MultiStageEngineIntegrationTest.java +++ b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/MultiStageEngineIntegrationTest.java @@ -20,6 +20,8 @@ package org.apache.pinot.integration.tests; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.jayway.jsonpath.DocumentContext; +import com.jayway.jsonpath.JsonPath; import java.io.File; import java.io.IOException; import java.time.Duration; @@ -896,6 +898,19 @@ public class MultiStageEngineIntegrationTest extends BaseClusterIntegrationTestS Assert.assertEquals(jsonNode.get("resultTable").get("rows").size(), 154); } + @Test + public void incorrectMultiValueColumnGroupBy() + throws Exception { + String pinotQuery = "SELECT count(*) FROM mytable " + + "GROUP BY RandomAirports"; + JsonNode jsonNode = postQuery(pinotQuery); + DocumentContext docContext = JsonPath.parse(jsonNode.toString()); + List<String> messages = docContext.read("$.exceptions[*].message"); + Assertions.assertThat(messages) + .anySatisfy(message -> + Assertions.assertThat(message).contains("Use ARRAY_TO_MV() to group by multi-value column")); + } + @Test public void testVariadicFunction() throws Exception { diff --git a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/validation/ArrayToMvValidationVisitor.java b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/validation/ArrayToMvValidationVisitor.java index 445520bd7d8..99024ec28d6 100644 --- a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/validation/ArrayToMvValidationVisitor.java +++ b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/validation/ArrayToMvValidationVisitor.java @@ -19,6 +19,7 @@ package org.apache.pinot.query.planner.validation; import java.util.List; +import org.apache.pinot.common.utils.DataSchema; import org.apache.pinot.query.planner.logical.RexExpression; import org.apache.pinot.query.planner.plannode.AggregateNode; import org.apache.pinot.query.planner.plannode.EnrichedJoinNode; @@ -86,14 +87,25 @@ public class ArrayToMvValidationVisitor implements PlanNodeVisitor<Void, Boolean @Override public Void visitAggregate(AggregateNode node, Boolean isIntermediateStage) { - if (isIntermediateStage && containsArrayToMv(node.getAggCalls())) { + if (!isIntermediateStage) { + // No need to traverse underlying ProjectNode in leaf stage + return null; + } + if (containsArrayToMv(node.getAggCalls())) { throw new QueryException(QueryErrorCode.QUERY_PLANNING, "Function 'ArrayToMv' is not supported in AGGREGATE Intermediate Stage"); } - if (isIntermediateStage) { - node.getInputs().forEach(e -> e.visit(this, true)); + DataSchema.ColumnDataType[] columnDataTypes = node.getDataSchema().getColumnDataTypes(); + for (Integer key : node.getGroupKeys()) { + if (key >= 0 && key < columnDataTypes.length + && columnDataTypes[key] != null + && columnDataTypes[key].isArray()) { + throw new QueryException(QueryErrorCode.QUERY_PLANNING, + "Multi-valued columns are not supported as a grouping key in the intermediate stage. " + + "Use ARRAY_TO_MV() to group by multi-value column"); + } } - // No need to traverse underlying ProjectNode in leaf stage + node.getInputs().forEach(e -> e.visit(this, true)); return null; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org