From 6a996adf166171363b898531dc7361086385b836 Mon Sep 17 00:00:00 2001 From: Abhishek Agarwal <1477457+abhishekagarwal87@users.noreply.github.com> Date: Tue, 25 Jul 2023 14:07:55 +0530 Subject: [PATCH] Fix the bug in string last vector aggregation --- .../last/StringLastVectorAggregator.java | 5 ++++- .../last/StringLastVectorAggregatorTest.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregator.java b/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregator.java index 045360ba6167..f10584a2c748 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregator.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregator.java @@ -42,7 +42,7 @@ public class StringLastVectorAggregator implements VectorAggregator protected long lastTime; public StringLastVectorAggregator( - final BaseLongVectorValueSelector timeSelector, + @Nullable final BaseLongVectorValueSelector timeSelector, final VectorObjectSelector valueSelector, final int maxStringBytes ) @@ -124,6 +124,9 @@ public void aggregate( int positionOffset ) { + if (timeSelector == null) { + return; + } long[] timeVector = timeSelector.getLongVector(); Object[] objectsWhichMightBeStrings = valueSelector.getObjectVector(); diff --git a/processing/src/test/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregatorTest.java b/processing/src/test/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregatorTest.java index 428ff3e3742f..6e5c0275107b 100644 --- a/processing/src/test/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregatorTest.java +++ b/processing/src/test/java/org/apache/druid/query/aggregation/last/StringLastVectorAggregatorTest.java @@ -129,6 +129,25 @@ public void aggregate() Assert.assertEquals(VALUES[3], result.rhs); } + @Test + public void aggregateNoOp() + { + // Test that aggregates run just fine when the input field does not exist + StringLastVectorAggregator aggregator = new StringLastVectorAggregator(null, selector, 10); + aggregator.aggregate(buf, 0, 0, VALUES.length); + } + + @Test + public void aggregateBatchNoOp() + { + // Test that aggregates run just fine when the input field does not exist + StringLastVectorAggregator aggregator = new StringLastVectorAggregator(null, selector, 10); + int[] positions = new int[]{0, 43, 70}; + int positionOffset = 2; + clearBufferForPositions(positionOffset, positions); + aggregator.aggregate(buf, 3, positions, null, positionOffset); + } + @Test public void aggregateBatchWithoutRows() {