Skip to content

NPE with SQL-compatible null handling in LongSumAggregator compare #9140

@jon-wei

Description

@jon-wei

I observed the following NPE when running a TopN query with druid.generic.useDefaultValueForNull=false, when ordering by a long column that contains nulls:

java.lang.NullPointerException: null
	at org.apache.druid.query.aggregation.LongSumAggregator$1.compare(LongSumAggregator.java:36) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.TopNNumericResultBuilder.lambda$new$0(TopNNumericResultBuilder.java:96) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at java.util.PriorityQueue.siftUpUsingComparator(PriorityQueue.java:670) ~[?:1.8.0_202]
	at java.util.PriorityQueue.siftUp(PriorityQueue.java:646) ~[?:1.8.0_202]
	at java.util.PriorityQueue.offer(PriorityQueue.java:345) ~[?:1.8.0_202]
	at java.util.PriorityQueue.add(PriorityQueue.java:322) ~[?:1.8.0_202]
	at org.apache.druid.query.topn.TopNNumericResultBuilder.addEntry(TopNNumericResultBuilder.java:178) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.TopNNumericResultBuilder.addEntry(TopNNumericResultBuilder.java:43) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.PooledTopNAlgorithm.updateResults(PooledTopNAlgorithm.java:745) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.PooledTopNAlgorithm.updateResults(PooledTopNAlgorithm.java:53) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.BaseTopNAlgorithm.runWithCardinalityKnown(BaseTopNAlgorithm.java:122) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.BaseTopNAlgorithm.run(BaseTopNAlgorithm.java:83) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.TopNMapFn.apply(TopNMapFn.java:67) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.TopNQueryEngine$1.apply(TopNQueryEngine.java:97) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.topn.TopNQueryEngine$1.apply(TopNQueryEngine.java:90) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.MappingAccumulator.accumulate(MappingAccumulator.java:40) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.FilteringAccumulator.accumulate(FilteringAccumulator.java:41) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.MappingAccumulator.accumulate(MappingAccumulator.java:40) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.BaseSequence.accumulate(BaseSequence.java:44) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.MappedSequence.accumulate(MappedSequence.java:43) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.FilteredSequence.accumulate(FilteredSequence.java:45) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.MappedSequence.accumulate(MappedSequence.java:43) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.FilteredSequence.accumulate(FilteredSequence.java:45) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.LazySequence.accumulate(LazySequence.java:40) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.LazySequence.accumulate(LazySequence.java:40) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.spec.SpecificSegmentQueryRunner$1.accumulate(SpecificSegmentQueryRunner.java:79) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.spec.SpecificSegmentQueryRunner.doNamed(SpecificSegmentQueryRunner.java:163) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.spec.SpecificSegmentQueryRunner.access$100(SpecificSegmentQueryRunner.java:42) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.spec.SpecificSegmentQueryRunner$2.wrap(SpecificSegmentQueryRunner.java:145) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.CPUTimeMetricQueryRunner$1.wrap(CPUTimeMetricQueryRunner.java:74) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.java.util.common.guava.Sequence.toList(Sequence.java:85) ~[druid-core-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.ChainedExecutionQueryRunner$1$1.call(ChainedExecutionQueryRunner.java:124) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at org.apache.druid.query.ChainedExecutionQueryRunner$1$1.call(ChainedExecutionQueryRunner.java:114) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_202]
	at org.apache.druid.query.PrioritizedListenableFutureTask.run(PrioritizedExecutorService.java:247) ~[druid-processing-0.18.0-SNAPSHOT.jar:0.18.0-SNAPSHOT]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_202]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_202]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_202]

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions