{"record":{"id":"963e0ef1157fcd06","repo":"apache/druid","slug":"stringanybufferaggregator-does-not-support-getfloa","errorCode":null,"errorMessage":"StringAnyBufferAggregator does not support getFloat()","messagePattern":"StringAnyBufferAggregator does not support getFloat\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/aggregation/any/StringAnyBufferAggregator.java","lineNumber":109,"sourceCode":"  @Override\n  public Object get(ByteBuffer buf, int position)\n  {\n    ByteBuffer copyBuffer = buf.duplicate();\n    copyBuffer.position(position);\n    int stringSizeBytes = copyBuffer.getInt();\n    if (stringSizeBytes >= 0) {\n      byte[] valueBytes = new byte[stringSizeBytes];\n      copyBuffer.get(valueBytes, 0, stringSizeBytes);\n      return StringUtils.fromUtf8(valueBytes);\n    } else {\n      return null;\n    }\n  }\n\n  @Override\n  public float getFloat(ByteBuffer buf, int position)\n  {\n    throw new UnsupportedOperationException(\"StringAnyBufferAggregator does not support getFloat()\");\n  }\n\n  @Override\n  public long getLong(ByteBuffer buf, int position)\n  {\n    throw new UnsupportedOperationException(\"StringAnyBufferAggregator does not support getLong()\");\n  }\n\n  @Override\n  public double getDouble(ByteBuffer buf, int position)\n  {\n    throw new UnsupportedOperationException(\"StringAnyBufferAggregator does not support getDouble()\");\n  }\n\n  @Override\n  public void close()\n  {\n    // no-op","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/aggregation/any/StringAnyBufferAggregator.java#L91-L127","documentation":"StringAnyBufferAggregator aggregates string values, so its buffer only holds the resulting string; numeric accessors are meaningless and unsupported. Calling getFloat() throws UnsupportedOperationException by design.","triggerScenarios":"A query/aggregation pipeline calls bufferAggregator.getFloat(buf, position) on a StringAnyAggregatorFactory-created aggregator, i.e. the aggregation's output type was resolved as FLOAT instead of STRING.","commonSituations":"Querying an 'any' aggregator column expecting a numeric result; misconfigured post-aggregator or result-row numeric extraction on a string-typed aggregation.","solutions":["Do not call getFloat() on a string any-aggregator; read the result as an Object/String via get()","If a numeric result is needed, use a numeric aggregator (e.g. doubleSum/longSum) instead of 'any'","Cast/parse the aggregated string downstream in a post-aggregator if numeric semantics are required"],"exampleFix":"// before\nfloat v = bufferAggregator.getFloat(buf, position);\n// after\nObject v = bufferAggregator.get(buf, position); // string result","handlingStrategy":"type-guard","validationCode":"if (aggFactory instanceof StringAnyAggregatorFactory) { /* handle as string, never call getFloat */ }","typeGuard":"if (!(factory instanceof StringAnyAggregatorFactory)) {\n    float v = bufferAggregator.getFloat(buf, position);\n} else {\n    Object v = bufferAggregator.get(buf, position);\n}","tryCatchPattern":"try {\n    v = bufferAggregator.getFloat(buf, position);\n} catch (UnsupportedOperationException e) {\n    v = Float.NaN; // or fall back to string get()\n}","preventionTips":["Treat 'any' aggregator output as string-typed in all query/result code","Never route string aggregations through numeric accessor paths","Check AggregatorFactory.getType() before invoking numeric getters"],"tags":["java","druid","aggregation","unsupported"],"backgroundTag":"unsupported-operation","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"}