apache/druid · error · java.lang.IllegalStateException
Multi-value row not supported
Error message
Multi-value row not supported
What it means
VariantColumn does not support multi-value (list-of-lists) rows: getMultiValueRow is an intentionally unimplemented accessor that always throws IllegalStateException. Nested variant columns expose arrays through their own mechanisms, not through the multi-value dimension row API.
Solutions
- Use the nested column's array accessors or SQL ARRAY functions instead of multi-value row access
- Rewrite the query to use UNNEST or nested column functions rather than MV dimension selectors
- Avoid treating variant columns as multi-value dimensions in custom code
- Check Druid docs for supported nested-column query paths
Example fix
// before IndexedInts row = column.getMultiValueRow(rowNum); // after Object val = column.get(rowNum); // single-value or Object[] for arrays
Defensive patterns
Strategy: type-guard
Validate before calling
// check column type before MV access
if (column instanceof VariantColumn) { /* use getRowValue/objects API, not getMultiValueRow */ } Type guard
static boolean supportsMultiValueRows(Column column) { return !(column instanceof VariantColumn); } Try / catch
try { return column.getMultiValueRow(row); } catch (IllegalStateException e) { if (e.getMessage().equals("Multi-value row not supported")) { return SingleIndexedInt.of(...); } throw e; } Prevention
- Treat nested variant columns as single-value/array columns, not MV dimensions
- Use SQL array functions or UNNEST for array semantics
- Audit custom code that calls getMultiValueRow on arbitrary columns
When it happens
Trigger: Any query or engine path that calls getMultiValueRow on a variant column, e.g. a legacy multi-value dimension selector path or ingestion code treating the variant column as a multi-value string dimension.
Common situations: Queries with old-style multi-value dimension handling against nested columns; code that assumes all dictionary-encoded columns support getMultiValueRow; SQL functions expecting MV semantics applied through the raw column API.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Dimension selector is currently unsupported for
- Aggregator[ ] cannot vectorize
- AppenderatorsManager methods should only called by services…
- ApproximateHistogramBufferAggregator does not support…
- ApproximateHistogramBufferAggregator does not support…
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/7cb5671725ccf9aa.
Report an issue: GitHub.
Appendix: source
Thrown at processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java:284
return encodedValueColumn.size();
}
@Override
public boolean hasMultipleValues()
{
return false;
}
@Override
public int getSingleValueRow(int rowNum)
{
return encodedValueColumn.get(rowNum);
}
@Override
public IndexedInts getMultiValueRow(int rowNum)
{
throw new IllegalStateException("Multi-value row not supported");
}
@Nullable
@Override
public String lookupName(int id)
{
if (id < stringDictionary.size()) {
return StringUtils.fromUtf8Nullable(stringDictionary.get(id));
} else if (id < stringDictionary.size() + longDictionary.size()) {
return String.valueOf(longDictionary.get(id - adjustLongId));
} else if (id < stringDictionary.size() + longDictionary.size() + doubleDictionary.size()) {
return String.valueOf(doubleDictionary.get(id - adjustDoubleId));
}
return null;
}
@Override
public int lookupId(String val)View on GitHub (pinned to 9b90983fd2)