{"record":{"id":"7cb5671725ccf9aa","repo":"apache/druid","slug":"multi-value-row-not-supported-7cb567","errorCode":null,"errorMessage":"Multi-value row not supported","messagePattern":"Multi-value row not supported","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java","lineNumber":284,"sourceCode":"    return encodedValueColumn.size();\n  }\n\n  @Override\n  public boolean hasMultipleValues()\n  {\n    return false;\n  }\n\n  @Override\n  public int getSingleValueRow(int rowNum)\n  {\n    return encodedValueColumn.get(rowNum);\n  }\n\n  @Override\n  public IndexedInts getMultiValueRow(int rowNum)\n  {\n    throw new IllegalStateException(\"Multi-value row not supported\");\n  }\n\n  @Nullable\n  @Override\n  public String lookupName(int id)\n  {\n    if (id < stringDictionary.size()) {\n      return StringUtils.fromUtf8Nullable(stringDictionary.get(id));\n    } else if (id < stringDictionary.size() + longDictionary.size()) {\n      return String.valueOf(longDictionary.get(id - adjustLongId));\n    } else if (id < stringDictionary.size() + longDictionary.size() + doubleDictionary.size()) {\n      return String.valueOf(doubleDictionary.get(id - adjustDoubleId));\n    }\n    return null;\n  }\n\n  @Override\n  public int lookupId(String val)","sourceCodeStart":266,"sourceCodeEnd":302,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java#L266-L302","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nIndexedInts row = column.getMultiValueRow(rowNum);\n// after\nObject val = column.get(rowNum); // single-value or Object[] for arrays","handlingStrategy":"type-guard","validationCode":"// check column type before MV access\nif (column instanceof VariantColumn) { /* use getRowValue/objects API, not getMultiValueRow */ }","typeGuard":"static boolean supportsMultiValueRows(Column column) { return !(column instanceof VariantColumn); }","tryCatchPattern":"try { return column.getMultiValueRow(row); } catch (IllegalStateException e) { if (e.getMessage().equals(\"Multi-value row not supported\")) { return SingleIndexedInt.of(...); } throw e; }","preventionTips":["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"],"tags":["druid","nested-columns","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-17T15:17:12.973Z"}