{"record":{"id":"4b35717d3dba712d","repo":"apache/druid","slug":"column-d-is-not-a-valid-column","errorCode":null,"errorMessage":"Column[%d] is not a valid column","messagePattern":"Column\\[(.+?)\\] is not a valid column","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexedTable.java","lineNumber":154,"sourceCode":"  @Override\n  public RowSignature rowSignature()\n  {\n    return rowSignature;\n  }\n\n  @Override\n  public Index columnIndex(int column)\n  {\n    return getKeyColumnIndex(column, indexes);\n  }\n\n  @Override\n  public Reader columnReader(int column)\n  {\n    final Function<RowType, Object> columnFn = columnFunctions.get(column);\n\n    if (columnFn == null) {\n      throw new IAE(\"Column[%d] is not a valid column\", column);\n    }\n\n    return row -> columnFn.apply(table.get(row));\n  }\n\n  @Override\n  public byte[] computeCacheKey()\n  {\n    return Preconditions.checkNotNull(cacheKey, \"Cache key can't be null\");\n  }\n\n  @Override\n  public boolean isCacheable()\n  {\n    return (null != cacheKey);\n  }\n\n  @Override","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/join/table/RowBasedIndexedTable.java#L136-L172","documentation":"columnReader(column) looks up a precomputed column function by index; an out-of-range or unknown column index yields null and the Reader implementation throws IAE because there is no valid column at that position.","triggerScenarios":"Calling IndexedTable.columnReader(int) (e.g. via makeColumnSelectorFactory / join matcher column access) with an index >= number of columns or a negative index not present in columnFunctions.","commonSituations":"Outdated column ordinal cached after the table schema changed; off-by-one when iterating column indexes; custom code reading a column index from a mismatched signature.","solutions":["Use a valid column index within 0..rowSignature.size()-1","Resolve column indexes via table.rowSignature().indexOf(columnName) instead of hardcoding","Refresh any cached column ordinals after schema changes","Check for negative/off-by-one index computation"],"exampleFix":"// before\nReader reader = table.columnReader(7);\n// after\nint col = table.rowSignature().indexOf(\"columnName\");\nif (col < 0) { throw new IllegalArgumentException(\"unknown column\"); }\nReader reader = table.columnReader(col);","handlingStrategy":"type-guard","validationCode":"if (column < 0 || column >= table.rowSignature().size()) { throw new IllegalArgumentException(\"invalid column \" + column); }","typeGuard":"boolean validColumn = column >= 0 && column < table.rowSignature().size();","tryCatchPattern":"try { reader = table.columnReader(col); } catch (IAE e) { /* re-resolve column ordinal */ }","preventionTips":["Resolve indexes via rowSignature().indexOf(name), never hardcode","Invalidate cached ordinals when the table schema changes"],"tags":["java","indexed-table","column-index","illegal-argument"],"backgroundTag":"index-out-of-bounds","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"}