{"record":{"id":"ba47f1301876a806","repo":"apache/druid","slug":"expected-a-number-or-an-instance-of-mergingdigest-ba47f1","errorCode":null,"errorMessage":"Expected a number or an instance of MergingDigest, but received [%s] of type [%s]","messagePattern":"Expected a number or an instance of MergingDigest, but received \\[(.+?)\\] of type \\[(.+?)\\]","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchBufferAggregator.java","lineNumber":80,"sourceCode":"  {\n    MergingDigest emptyDigest = new MergingDigest(compression);\n    addToCache(buffer, position, emptyDigest);\n  }\n\n  @Override\n  public void aggregate(ByteBuffer buffer, int position)\n  {\n    Object x = selector.getObject();\n    if (x == null) {\n      return;\n    }\n    MergingDigest sketch = sketchCache.get(buffer).get(position);\n    if (x instanceof Number) {\n      sketch.add(((Number) x).doubleValue());\n    } else if (x instanceof MergingDigest) {\n      sketch.add((MergingDigest) x);\n    } else {\n      throw new IAE(\n          \"Expected a number or an instance of MergingDigest, but received [%s] of type [%s]\",\n          x,\n          x.getClass()\n      );\n    }\n  }\n\n  @Override\n  public Object get(final ByteBuffer buffer, final int position)\n  {\n    // sketchCache is an IdentityHashMap where the reference of buffer is used for equality checks.\n    // So the returned object isn't impacted by the changes in the buffer object made by concurrent threads.\n    return sketchCache.get(buffer).get(position);\n  }\n\n  @Override\n  public float getFloat(final ByteBuffer buffer, final int position)\n  {","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchBufferAggregator.java#L62-L98","documentation":"TDigestSketchBufferAggregator.aggregate() only knows how to fold two input shapes: a raw Number (added as a single value) and an already-built MergingDigest (merged into the sketch). When the selector's getObject() returns any other type, the column does not hold valid t-digest sketch data and aggregation cannot continue, so it throws instead of silently skipping a non-null, non-numeric value.","triggerScenarios":"Thrown at extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchBufferAggregator.java:80 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix the input so the aggregated column contains numbers or MergingDigest values (e.g. correct the parser/flattener spec)","If ingesting from serialized sketches, ensure the tdigestsketch complex metric serde is used so values deserialized to MergingDigest","Inspect the offending rows and cast or transform non-numeric values before ingestion"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}