{"record":{"id":"804f1bb1ceae577a","repo":"apache/druid","slug":"cannot-call-makedimensionselector-on-field-of-type","errorCode":null,"errorMessage":"Cannot call makeDimensionSelector on field of type [%s]","messagePattern":"Cannot call makeDimensionSelector on field of type \\[(.+?)\\]","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/frame/field/StringFieldReader.java","lineNumber":116,"sourceCode":"  {\n    this.asArray = asArray;\n  }\n\n  @Override\n  public ColumnValueSelector<?> makeColumnValueSelector(Memory memory, ReadableFieldPointer fieldPointer)\n  {\n    return new Selector(memory, fieldPointer, null, asArray);\n  }\n\n  @Override\n  public DimensionSelector makeDimensionSelector(\n      Memory memory,\n      ReadableFieldPointer fieldPointer,\n      @Nullable ExtractionFn extractionFn\n  )\n  {\n    if (asArray) {\n      throw new ISE(\"Cannot call makeDimensionSelector on field of type [%s]\", ColumnType.STRING_ARRAY);\n    }\n\n    return new Selector(memory, fieldPointer, extractionFn, false);\n  }\n\n  @Override\n  public boolean isNull(Memory memory, long position)\n  {\n    final byte firstByte = memory.getByte(position);\n\n    if (firstByte == StringFieldWriter.NULL_ROW) {\n      return true;\n    } else if (!asArray) {\n      return firstByte == StringFieldWriter.NULL_BYTE\n             && memory.getByte(position + 1) == StringFieldWriter.VALUE_TERMINATOR\n             && memory.getByte(position + 2) == StringFieldWriter.ROW_TERMINATOR;\n    } else {\n      return false;","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/frame/field/StringFieldReader.java#L98-L134","documentation":"StringFieldReader.makeDimensionSelector supports reading string fields either as single strings or as string arrays (depending on how the field was written). When makeDimensionSelector is invoked with asArray=true on a field written as plain STRING (not STRING_ARRAY), the reader cannot produce an array selector and throws ISE. This is a mismatch between the column's declared/read type and the field's physical encoding in the frame.","triggerScenarios":"Requesting a dimension selector with asArray=true from a column cursor backed by a frame whose string field was written in non-array mode; a type-adapter or cursor layer advertising STRING_ARRAY while the frame stores plain strings.","commonSituations":"Query planner assumes a column is an array (schema says STRING_ARRAY) but the frame was produced when the column was STRING; using frame-based cursors across segments whose schema changed between versions.","solutions":["Ensure frames are re-written after column type changes so the physical encoding matches the declared type.","Request the selector with asArray=false when the field is a plain string.","Verify ColumnCapabilities/type metadata on the frame column agrees with the frame's field kind."],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// Java: match asArray to the frame field's actual kind\nboolean wantArray = columnCapabilities.getType().isArray();\nselector = fieldReader.makeDimensionSelector(memory, ptr, extractionFn, wantArray);","typeGuard":"// Only request array selectors when the column is truly array-typed\nboolean asArray = capabilities.getType().equals(ColumnType.STRING_ARRAY)\n    && !capabilities.getType().equals(ColumnType.STRING);","tryCatchPattern":null,"preventionTips":["Rewrite frames after column type changes so encoding matches declared schema.","Verify frame column capabilities against physical field kind before selector creation."],"tags":["frame-reader","dimension-selector","type-mismatch","druid"],"backgroundTag":"type-mismatch","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"}