{"record":{"id":"0896d0949037729b","repo":"apache/druid","slug":"received-a-non-applicable-rewrite-s-filter-s-di-0896d0","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/NullFilter.java","lineNumber":181,"sourceCode":"  @Override\n  public Set<String> getRequiredColumns()\n  {\n    return ImmutableSet.of(column);\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\n    if (rewriteDimensionTo == null) {\n      throw new IAE(\n          \"Received a non-applicable rewrite: %s, filter's dimension: %s\",\n          columnRewrites,\n          columnRewrites\n      );\n    }\n    return new NullFilter(rewriteDimensionTo, filterTuning);\n  }\n\n  @Override\n  public boolean equals(Object o)\n  {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    NullFilter that = (NullFilter) o;","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/filter/NullFilter.java#L163-L199","documentation":"NullFilter.rewriteRequiredColumns() rewrites the null-check column using a columnRewrites map. If the map has no entry for the filter's column, the rewrite cannot proceed and Druid throws this IAE. The source passes columnRewrites twice as format args, so the logged 'dimension' shows the map rather than the column.","triggerScenarios":"Calling rewriteRequiredColumns on a NullFilter with a map missing the key for the filter's column field.","commonSituations":"IS NULL/IS NOT NULL filters inside rewritten queries (join/subtotal) whose column is absent from the rewrite map; composite rewrites covering only some filters.","solutions":["Include the NullFilter's column as a key in columnRewrites","Check containsKey before invoking rewriteRequiredColumns","Rewrite the whole filter tree with Filter.rewrite so only applicable filters are transformed"],"exampleFix":"// before\nnullFilter.rewriteRequiredColumns(Map.of(\"x\", \"y\")); // filter column is \"dim\"\n// after\nnullFilter.rewriteRequiredColumns(Map.of(\"dim\", \"dim2\"));","handlingStrategy":"validation","validationCode":"if (!columnRewrites.containsKey(nullFilter.getColumn())) {\n  throw new IllegalArgumentException(\"rewrite map missing column: \" + nullFilter.getColumn());\n}","typeGuard":"boolean applicable = columnRewrites != null && columnRewrites.containsKey(nullFilter.getColumn());","tryCatchPattern":"try {\n  return filter.rewriteRequiredColumns(columnRewrites);\n} catch (IAE e) {\n  if (e.getMessage().contains(\"non-applicable rewrite\")) { return filter; }\n  throw e;\n}","preventionTips":["Map IS NULL/IS NOT NULL columns in rewrite maps","Use Query-level rewrite APIs that handle applicability automatically","Add containsKey assertions in rewrite test suites"],"tags":["filter","query-rewrite","null-filter"],"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-17T20:17:13.540Z"}