This is an automated email from the ASF dual-hosted git repository.

xiangfu 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 5c75b15234 Fix NPE in ArrayAgg functions (#13358)
5c75b15234 is described below

commit 5c75b15234fdac59ad859c03588316b2e9e53390
Author: Xiang Fu <[email protected]>
AuthorDate: Tue Jun 11 15:06:56 2024 -0700

    Fix NPE in ArrayAgg functions (#13358)
---
 .../function/array/BaseArrayAggDoubleFunction.java |  3 +++
 .../function/array/BaseArrayAggFloatFunction.java  |  3 +++
 .../function/array/BaseArrayAggIntFunction.java    |  3 +++
 .../function/array/BaseArrayAggLongFunction.java   |  3 +++
 .../function/array/BaseArrayAggStringFunction.java |  3 +++
 .../function/array/ListAggFunction.java            |  3 +++
 .../pinot/integration/tests/custom/ArrayTest.java  | 24 ++++++++++++++++++++++
 7 files changed, 42 insertions(+)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggDoubleFunction.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggDoubleFunction.java
index e9cb01dfe8..de3e52b80e 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggDoubleFunction.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggDoubleFunction.java
@@ -93,6 +93,9 @@ public abstract class BaseArrayAggDoubleFunction<I extends 
AbstractDoubleCollect
 
   @Override
   public DoubleArrayList extractFinalResult(I doubleArrayList) {
+    if (doubleArrayList == null) {
+      return new DoubleArrayList();
+    }
     return new DoubleArrayList(doubleArrayList);
   }
 }
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggFloatFunction.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggFloatFunction.java
index 32314064bd..a6f4078dc5 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggFloatFunction.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggFloatFunction.java
@@ -93,6 +93,9 @@ public abstract class BaseArrayAggFloatFunction<I extends 
AbstractFloatCollectio
 
   @Override
   public FloatArrayList extractFinalResult(I floatArrayList) {
+    if (floatArrayList == null) {
+      return new FloatArrayList();
+    }
     return new FloatArrayList(floatArrayList);
   }
 }
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggIntFunction.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggIntFunction.java
index 60af69fd36..7f05d15857 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggIntFunction.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggIntFunction.java
@@ -98,6 +98,9 @@ public abstract class BaseArrayAggIntFunction<I extends 
AbstractIntCollection>
 
   @Override
   public IntArrayList extractFinalResult(I intArrayList) {
+    if (intArrayList == null) {
+      return new IntArrayList();
+    }
     return new IntArrayList(intArrayList);
   }
 }
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggLongFunction.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggLongFunction.java
index edb037f06d..76e705945a 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggLongFunction.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggLongFunction.java
@@ -96,6 +96,9 @@ public abstract class BaseArrayAggLongFunction<I extends 
AbstractLongCollection>
 
   @Override
   public LongArrayList extractFinalResult(I arrayList) {
+    if (arrayList == null) {
+      return new LongArrayList();
+    }
     return new LongArrayList(arrayList);
   }
 }
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggStringFunction.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggStringFunction.java
index e906015a86..2e80eb6040 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggStringFunction.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/BaseArrayAggStringFunction.java
@@ -94,6 +94,9 @@ public abstract class BaseArrayAggStringFunction<I extends 
AbstractObjectCollect
 
   @Override
   public ObjectArrayList<String> extractFinalResult(I stringArrayList) {
+    if (stringArrayList == null) {
+      return new ObjectArrayList<>();
+    }
     // NOTE: Wrap a String[] to work around the bug of ObjectArrayList 
constructor creating Object[] internally.
     String[] stringArray = new String[stringArrayList.size()];
     ObjectIterators.unwrap(stringArrayList.iterator(), stringArray);
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/ListAggFunction.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/ListAggFunction.java
index b1e39ae939..f433df81f4 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/ListAggFunction.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/function/array/ListAggFunction.java
@@ -152,6 +152,9 @@ public class ListAggFunction
 
   @Override
   public String extractFinalResult(AbstractObjectCollection<String> strings) {
+    if (strings == null) {
+      return null;
+    }
     return StringUtils.join(strings, _separator);
   }
 }
diff --git 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/ArrayTest.java
 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/ArrayTest.java
index ceeefa28d2..eab6def0bf 100644
--- 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/ArrayTest.java
+++ 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/custom/ArrayTest.java
@@ -54,6 +54,30 @@ public class ArrayTest extends 
CustomDataQueryClusterIntegrationTest {
     return 1000;
   }
 
+  @Test(dataProvider = "useBothQueryEngines")
+  public void testArrayAggWithEmptyPredicate(boolean useMultiStageQueryEngine) 
throws Exception {
+    setUseMultiStageQueryEngine(useMultiStageQueryEngine);
+    String query =
+        String.format("SELECT "
+            + "arrayAgg(boolCol, 'BOOLEAN'), "
+            + "arrayAgg(intCol, 'INT'), "
+            + "arrayAgg(longCol, 'LONG'), "
+            // NOTE: FLOAT array is auto converted to DOUBLE array
+            + (useMultiStageQueryEngine ? "arrayAgg(floatCol, 'DOUBLE'), " : 
"arrayAgg(floatCol, 'FLOAT'), ")
+            + "arrayAgg(doubleCol, 'DOUBLE'), "
+            + "arrayAgg(stringCol, 'STRING'), "
+            + "arrayAgg(timestampCol, 'TIMESTAMP') "
+            + "FROM %s WHERE intCol < 0 LIMIT %d", getTableName(), 
getCountStarResult());
+    JsonNode jsonNode = postQuery(query);
+    JsonNode rows = jsonNode.get("resultTable").get("rows");
+    assertEquals(rows.size(), 1);
+    JsonNode row = rows.get(0);
+    assertEquals(row.size(), 7);
+    for (int i = 0; i < 7; i++) {
+      assertEquals(row.get(i).size(), 0);
+    }
+  }
+
   @Test(dataProvider = "useBothQueryEngines")
   public void testArrayAggQueries(boolean useMultiStageQueryEngine)
       throws Exception {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to