{"record":{"id":"1e15851b72c53591","repo":"apache/druid","slug":"received-a-non-applicable-rewrite-s-filter-s-di-1e1585","errorCode":null,"errorMessage":"Received a non-applicable rewrite: %s, filter's dimension: %s","messagePattern":"Received a non-applicable rewrite: (.+?), filter's dimension: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/filter/TypedInFilter.java","lineNumber":355,"sourceCode":"\n  @Override\n  public boolean canVectorizeMatcher(ColumnInspector inspector)\n  {\n    return true;\n  }\n\n  @Override\n  public boolean supportsRequiredColumnRewrite()\n  {\n    return true;\n  }\n\n  @Override\n  public Filter rewriteRequiredColumns(Map<String, String> columnRewrites)\n  {\n    String rewriteDimensionTo = columnRewrites.get(column);\n    if (rewriteDimensionTo == null) {\n      throw new IAE(\"Received a non-applicable rewrite: %s, filter's dimension: %s\", columnRewrites, column);\n    }\n\n    if (rewriteDimensionTo.equals(column)) {\n      return this;\n    } else {\n      return new TypedInFilter(\n          rewriteDimensionTo,\n          matchValueType,\n          null,\n          sortedMatchValues.get(),\n          filterTuning\n      );\n    }\n  }\n\n  @Override\n  public String toString()\n  {","sourceCodeStart":337,"sourceCodeEnd":373,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/filter/TypedInFilter.java#L337-L373","documentation":"TypedInFilter.rewriteRequiredColumns rewrites the filter to operate on a different column per the supplied map. It throws IAE when the map has no entry for the filter's own dimension, meaning the rewrite is not applicable to this filter. This is an internal invariant check used when rewriting filters onto unnest/expr columns.","triggerScenarios":"Calling rewriteRequiredColumns with a map whose keys do not include the filter's `column` (e.g. rewriting on an unrelated output column, or an empty map).","commonSituations":"Native query rewrites around unnested columns in SQL planning; code paths that apply a single column-rewrite map to a compound filter where some leaf filters reference columns absent from the map.","solutions":["Ensure the rewrite map contains a mapping for the filter's dimension (columnRewrites.get(filter.getColumn()) != null) before calling rewriteRequiredColumns.","Only propagate rewrites to filters whose column appears in the map; skip others instead of rewriting them.","Check upstream logic that builds the rewrite map so it covers all columns used by the filter tree."],"exampleFix":"// before\nFilter rewritten = filter.rewriteRequiredColumns(Map.of(\"other\", \"unnest_col\"));\n// after\nString target = Map.of(\"other\", \"unnest_col\").get(filter.getColumn());\nFilter rewritten = target == null ? filter : filter.rewriteRequiredColumns(Map.of(filter.getColumn(), \"unnest_col\"));","handlingStrategy":"validation","validationCode":"if (columnRewrites == null || columnRewrites.get(filter.getColumn()) == null) { throw new IllegalArgumentException(\"rewrite map missing column \" + filter.getColumn()); }","typeGuard":"boolean applicable = (filter instanceof TypedInFilter) && columnRewrites.containsKey(((TypedInFilter) filter).getColumn());","tryCatchPattern":"try { rewritten = filter.rewriteRequiredColumns(rewrites); } catch (IllegalArgumentException e) { rewritten = filter; }","preventionTips":["Always include every filter column in the rewrite map","Check map coverage against filter.getRequiredColumns() before rewriting","Skip leaf filters whose column is absent from the map"],"tags":["druid","filter","column-rewrite","illegal-argument"],"backgroundTag":"invalid-argument-value","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"}