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 e9cb01dfe878..de3e52b80e51 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 I merge(I intermediateResult1, I intermediateResult2) { @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 32314064bdef..a6f4078dc54f 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 I merge(I intermediateResult1, I intermediateResult2) { @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 60af69fd3658..7f05d1585789 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 I merge(I intermediateResult1, I intermediateResult2) { @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 edb037f06db2..76e705945afb 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 I merge(I intermediateResult1, I intermediateResult2) { @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 e906015a86e5..2e80eb6040a0 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 I merge(I intermediateResult1, I intermediateResult2) { @Override public ObjectArrayList 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 b1e39ae93956..f433df81f474 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 DataSchema.ColumnDataType getFinalResultColumnType() { @Override public String extractFinalResult(AbstractObjectCollection 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 ceeefa28d295..eab6def0bf77 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 @@ protected long getCountStarResult() { 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 {