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

  1. Convert the selector output to a supported numeric type before aggregation.
  2. 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)