{"record":{"id":"39fe3c53b1c8b23e","repo":"apache/druid","slug":"comparing-histograms-is-not-supported","errorCode":null,"errorMessage":"Comparing histograms is not supported","messagePattern":"Comparing histograms is not supported","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":500,"severity":"error","filePath":"extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/kll/KllDoublesSketchToCDFPostAggregator.java","lineNumber":97,"sourceCode":"    return ColumnType.DOUBLE_ARRAY;\n  }\n\n  @JsonProperty\n  public PostAggregator getField()\n  {\n    return field;\n  }\n\n  @JsonProperty\n  public double[] getSplitPoints()\n  {\n    return splitPoints;\n  }\n\n  @Override\n  public Comparator<double[]> getComparator()\n  {\n    throw new IAE(\"Comparing histograms is not supported\");\n  }\n\n  @Override\n  public Set<String> getDependentFields()\n  {\n    return field.getDependentFields();\n  }\n\n  @Override\n  public String toString()\n  {\n    return getClass().getSimpleName() + \"{\" +\n        \"name='\" + name + '\\'' +\n        \", field=\" + field +\n        \", splitPoints=\" + Arrays.toString(splitPoints) +\n        \"}\";\n  }\n","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/kll/KllDoublesSketchToCDFPostAggregator.java#L79-L115","documentation":"KllDoublesSketchToCDFPostAggregator.getComparator always throws IllegalArgumentException because a CDF (cumulative distribution function) histogram array has no meaningful total ordering. This comparator is only requested by machinery that needs to order post-aggregator values (e.g. ORDER BY on this output), which the library deliberately refuses to support.","triggerScenarios":"Requesting ordering/comparison semantics on the CDF post-aggregator, e.g. using its output in an ORDER BY, or registering it where a Comparator<double[]> must be supplied by the post-aggregator interface.","commonSituations":"Trying to sort query results by the CDF output column; UI or API code that generically calls getComparator() on every post-aggregator to build ordering.","solutions":["Do not ORDER BY or sort on the CDF output; sort by a scalar field instead","Sort on an intermediate scalar (e.g. a quantile via kllDoublesSketchToQuantiles) rather than the histogram array","If generic code calls getComparator, guard for post-aggregators that don't support comparison before invoking"],"exampleFix":"// before\nORDER BY cdfOutput ASC\n// after\nORDER BY myQuantile ASC  -- scalar derived via kllDoublesSketchToQuantiles","handlingStrategy":"validation","validationCode":"if (postAgg instanceof KllDoublesSketchToCDFPostAggregator) {\n  throw new IllegalArgumentException(\"CDF output is not sortable\");\n}","typeGuard":null,"tryCatchPattern":"try { cmp = postAgg.getComparator(); } catch (IllegalArgumentException e) { cmp = null; /* mark column unsortable */ }","preventionTips":["Never ORDER BY on array-valued post-aggregator outputs","Expose only scalar columns to sorting UI/framework layers","Treat getComparator() throwing as 'column unsortable' in generic code"],"tags":["druid","datasketches","kll","post-aggregator","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}