{"record":{"id":"9659624ab8f981e2","repo":"apache/iceberg","slug":"alwaysfalse-is-a-placeholder-only","errorCode":null,"errorMessage":"AlwaysFalse is a placeholder only","messagePattern":"AlwaysFalse is a placeholder only","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"parquet/src/main/java/org/apache/iceberg/parquet/ParquetFilters.java","lineNumber":251,"sourceCode":"    throw new UnsupportedOperationException(\n        \"Type not supported yet: \" + value.getClass().getName());\n  }\n\n  private static class AlwaysTrue implements FilterPredicate {\n    static final AlwaysTrue INSTANCE = new AlwaysTrue();\n\n    @Override\n    public <R> R accept(Visitor<R> visitor) {\n      throw new UnsupportedOperationException(\"AlwaysTrue is a placeholder only\");\n    }\n  }\n\n  private static class AlwaysFalse implements FilterPredicate {\n    static final AlwaysFalse INSTANCE = new AlwaysFalse();\n\n    @Override\n    public <R> R accept(Visitor<R> visitor) {\n      throw new UnsupportedOperationException(\"AlwaysFalse is a placeholder only\");\n    }\n  }\n}\n","sourceCodeStart":233,"sourceCodeEnd":255,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/parquet/src/main/java/org/apache/iceberg/parquet/ParquetFilters.java#L233-L255","documentation":"AlwaysFalse in ParquetFilters is only a placeholder FilterPredicate used as a marker when converting expressions; it has no visitor implementation. Calling accept(Visitor) always throws UnsupportedOperationException because it is never meant to be evaluated as a real filter.","triggerScenarios":"Passing ParquetFilters.AlwaysFalse.INSTANCE into a Parquet FilterPredicate Visitor or composing it via and()/or() and then evaluating the resulting tree.","commonSituations":"Expressions that bind to alwaysFalse (e.g. comparing incompatible values) get converted to the sentinel, then downstream code attempts to visit/evaluate the predicate instead of short-circuiting to an empty result.","solutions":["Short-circuit: treat a converted alwaysFalse predicate as 'return no rows' without invoking a visitor","Use parquet-mr's FilterApi.alwaysFalse() if an actual always-reject filter object is needed"],"exampleFix":"// before\nFilterPredicate p = ParquetFilters.predicate(Expressions.alwaysFalse());\nvisitor.visit(p); // throws\n// after\nif (expr == Expressions.alwaysFalse()) { return CloseableIterable.empty(); }","handlingStrategy":"type-guard","validationCode":"if (pred instanceof ParquetFilters.AlwaysFalse) { /* return empty result set */ }","typeGuard":"static boolean isPlaceholder(FilterPredicate p) {\n  return p instanceof ParquetFilters.AlwaysTrue || p instanceof ParquetFilters.AlwaysFalse;\n}","tryCatchPattern":"if (!isPlaceholder(pred)) {\n  visitor.visit(pred);\n} else {\n  // sentinel: produce empty result, do not call accept()\n}","preventionTips":["Treat alwaysFalse conversion results as 'no rows' without visiting","Use FilterApi.alwaysFalse() when a real always-reject filter is required"],"tags":["parquet","placeholder","unsupported-operation"],"backgroundTag":"internal-invariant-violation","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}