apache / apache/druid

APPROX_COUNT_DISTINCT_BUILTIN is broken in window expressions

Open
#15,666 1 comment 0 reactions 0 assignees View on GitHub
Area - SQL Bug
Dominant language
Java
Stars
14.1k
Forks
3.8k
Avg merge
2d 58m
Merged PRs (30d)
233

Description

sqlTest file:
```
type: "operatorValidation"

sql: |
SELECT
APPROX_COUNT_DISTINCT_BUILTIN(dim2) OVER ()
FROM druid.numfoo

expectedResults:
- [null]
```

backtrace:
```
Caused by: org.apache.druid.java.util.common.RE: Failed to execute because of exception.
at org.apache.druid.sql.calcite.CalciteWindowQueryTest$TestCase.verifyResults(CalciteWindowQueryTest.java:126)
at org.apache.druid.sql.calcite.QueryVerification$QueryResultsVerifierFactory.lambda$make$0(QueryVerification.java:51)
... 44 more
Caused by: org.apache.druid.error.DruidException: Cannot coerce field [w0] from type [org.apache.druid.hll.VersionOneHyperLogLogCollector] to type [BIGINT]
at org.apache.druid.error.DruidException$DruidExceptionBuilder.build(DruidException.java:455)
at org.apache.druid.sql.calcite.run.SqlResults.cannotCoerce(SqlResults.java:248)
at org.apache.druid.sql.calcite.run.SqlResults.cannotCoerce(SqlResults.java:273)
at org.apache.druid.sql.calcite.run.SqlResults.coerce(SqlResults.java:121)
at org.apache.druid.sql.calcite.run.NativeQueryMaker.lambda$4(NativeQueryMaker.java:245)
at org.apache.druid.java.util.common.guava.MappingAccumulator.accumulate(MappingAccumulator.java:40)
at org.apache.druid.java.util.common.guava.MappingAccumulator.accumulate(MappingAccumulator.java:40)
at org.apache.druid.java.util.common.guava.BaseSequence.accumulate(BaseSequence.java:44)
at org.apache.druid.java.util.common.guava.ConcatSequence.lambda$0(ConcatSequence.java:42)
at org.apache.druid.java.util.common.guava.MappingAccumulator.accumulate(MappingAccumulator.java:40)
at org.apache.druid.query.operator.OperatorSequence$1.accumulate(OperatorSequence.java:60)
at org.apache.druid.query.operator.OperatorSequence$1.accumulate(OperatorSequence.java:1)
at org.apache.druid.query.operator.OperatorSequence$MyReceiver.push(OperatorSequence.java:146)
at org.apache.druid.query.operator.WindowProcessorOperator$1.push(WindowProcessorOperator.java:54)
at org.apache.druid.query.operator.NaivePartitioningOperator$1.push(NaivePartitioningOperator.java:126)
at org.apache.druid.query.operator.SequenceOperator.goOrContinue(SequenceOperator.java:65)
at org.apache.druid.query.operator.NaivePartitioningOperator.goOrContinue(NaivePartitioningOperator.java:106)
at org.apache.druid.query.operator.WindowProcessorOperator.goOrContinue(WindowProcessorOperator.java:47)
[...]
```

Contributor guide

Open the contributing guide

Research direction

Start with the supplied sqlTest operatorValidation case and reproduce it through CalciteWindowQueryTest. Trace the result through WindowProcessorOperator and NativeQueryMaker, focusing on the VersionOneHyperLogLogCollector-to-BIGINT coercion shown in the backtrace. Done means the window expression returns the expected [null] result without the coercion failure.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, sql
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.