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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]