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

Reply via email to