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]