apache/druid · error · IllegalStateException
Unknown value type: [ ]
Error message
Unknown value type: [%s]
What it means
objToCompressedBigDecimal accepts null, CompressedBigDecimal, BigDecimal, Long, Integer, Double and Float selector values; any other object type reaches the final branch and is rejected by this instanceof-chain guard.
Solutions
- Convert the selector output to a supported numeric type before aggregation.
- Fix the ingestion/parser configuration so the column only yields numeric values.
Defensive patterns
Strategy: type-guard
When it happens
Trigger: Thrown at extensions-contrib/compressed-bigdecimal/src/main/java/org/apache/druid/compressedbigdecimal/Utils.java:170 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/c35c4f30d6217a6e.
Report an issue: GitHub.
Appendix: source
Thrown at extensions-contrib/compressed-bigdecimal/src/main/java/org/apache/druid/compressedbigdecimal/Utils.java:170
throw e;
} else {
result = new ArrayCompressedBigDecimal(0L, 0);
}
}
} else if (obj instanceof BigDecimal) {
result = new ArrayCompressedBigDecimal((BigDecimal) obj);
} else if (obj instanceof Long) {
result = new ArrayCompressedBigDecimal(new BigDecimal((Long) obj));
} else if (obj instanceof Integer) {
result = new ArrayCompressedBigDecimal(new BigDecimal((Integer) obj));
} else if (obj instanceof Double) {
result = new ArrayCompressedBigDecimal(BigDecimal.valueOf((Double) obj));
} else if (obj instanceof Float) {
result = new ArrayCompressedBigDecimal(BigDecimal.valueOf((Float) obj));
} else if (obj instanceof CompressedBigDecimal) {
result = (CompressedBigDecimal) obj;
} else {
throw new ISE("Unknown value type: [%s]", obj.getClass().getName());
}
return result;
}
/**
* Helper class that maintains a cache of thread local objects that can be used to access
* a ByteBuffer in {@link Utils#accumulateSum(ByteBuffer, int, int, int, CompressedBigDecimal)}.
*/
private static class BufferAccessor implements ToIntBiFunction<ByteBuffer, Integer>, ObjBiIntConsumer<ByteBuffer>
{
private static final ThreadLocal<BufferAccessor> CACHE = ThreadLocal.withInitial(BufferAccessor::new);
private int position = 0;
/**
* Initialized the BufferAccessor with the location that should be used for access.
*View on GitHub (pinned to 9b90983fd2)