{"record":{"id":"0ecc33efca13c4e1","repo":"apache/druid","slug":"column-is-not-multi-valued","errorCode":null,"errorMessage":"Column is not multi-valued","messagePattern":"Column is not multi-valued","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/column/StringUtf8DictionaryEncodedColumn.java","lineNumber":114,"sourceCode":"  }\n\n  @Override\n  public boolean hasMultipleValues()\n  {\n    return column == null;\n  }\n\n  @Override\n  public int getSingleValueRow(int rowNum)\n  {\n    return column.get(rowNum);\n  }\n\n  @Override\n  public IndexedInts getMultiValueRow(int rowNum)\n  {\n    if (!hasMultipleValues()) {\n      throw new UnsupportedOperationException(\"Column is not multi-valued\");\n    }\n    return multiValueColumn.get(rowNum);\n  }\n\n  @Override\n  @Nullable\n  public String lookupName(int id)\n  {\n    final ByteBuffer buffer = utf8Dictionary.get(id);\n    if (buffer == null) {\n      return null;\n    }\n    return StringUtils.fromUtf8(buffer);\n  }\n\n  @Override\n  public int lookupId(String name)\n  {","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/column/StringUtf8DictionaryEncodedColumn.java#L96-L132","documentation":"StringUtf8DictionaryEncodedColumn.getMultiValueRow() returns the multi-valued row (IndexedInts of dictionary ids) for a given row number. It throws UnsupportedOperationException when the underlying column does not have multiple values, because the multiValueColumn delegate does not exist in that case.","triggerScenarios":"Calling getMultiValueRow(rowNum) on a single-valued String column (one where hasMultipleValues() returns false), e.g. a column stored with plain single-value encoding.","commonSituations":"Generic query/segment code that assumes all string columns are multi-valued; schema changes that converted a column from multi-valued to single-valued; tests or tools written against multi-valued fixtures applied to single-valued segments.","solutions":["Check column.hasMultipleValues() (or ColumnCapabilities.hasMultipleValues()) before calling getMultiValueRow","Use getSingleValueRow(int) for single-valued columns","Ensure the ingestion spec keeps the column multi-valued (e.g. input is a JSON array) if multi-valued semantics are required"],"exampleFix":"// before\nIndexedInts row = column.getMultiValueRow(rowNum);\n// after\nIndexedInts row = column.hasMultipleValues()\n    ? column.getMultiValueRow(rowNum)\n    : IndexibleInts.of(column.getSingleValueRow(rowNum));","handlingStrategy":"validation","validationCode":"if (column.hasMultipleValues()) { row = column.getMultiValueRow(rowNum); } else { row = IndexibleInts.wrap(column.getSingleValueRow(rowNum)); }","typeGuard":"boolean isMultiValued(DimensionHandler h, ColumnCapabilities caps) { return caps != null && caps.hasMultipleValues(); }","tryCatchPattern":"try { return column.getMultiValueRow(rowNum); } catch (UnsupportedOperationException e) { return column.getSingleValueRowWrapped(rowNum); }","preventionTips":["Check ColumnCapabilities.hasMultipleValues() before multi-value APIs","Keep ingestion schemas consistent so column arity does not change across segments","Prefer capability-driven selector factories over direct column access"],"tags":["java","unsupported-operation","segments"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}