{"record":{"id":"ef54e7fd05d30d2f","repo":"apache/iceberg","slug":"alwaystrue-is-a-placeholder-only","errorCode":null,"errorMessage":"AlwaysTrue is a placeholder only","messagePattern":"AlwaysTrue is a placeholder only","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"parquet/src/main/java/org/apache/iceberg/parquet/ParquetFilters.java","lineNumber":242,"sourceCode":"    // TODO: this needs to convert to handle BigDecimal and UUID\n    Object value = lit.value();\n    if (value instanceof Number) {\n      return (C) lit.value();\n    } else if (value instanceof CharSequence) {\n      return (C) Binary.fromString(value.toString());\n    } else if (value instanceof ByteBuffer) {\n      return (C) Binary.fromReusedByteBuffer((ByteBuffer) value);\n    }\n    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":224,"sourceCodeEnd":255,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/parquet/src/main/java/org/apache/iceberg/parquet/ParquetFilters.java#L224-L255","documentation":"AlwaysTrue in ParquetFilters is only a placeholder FilterPredicate used as an identity marker when converting expressions; it is never a real filter to be evaluated. Calling its accept(Visitor) method always throws UnsupportedOperationException because no visitor evaluation is defined for it.","triggerScenarios":"Passing ParquetFilters.AlwaysTrue.INSTANCE to a Parquet FilterPredicate Visitor (e.g. LogicalFilterPredicate composition or parquet-mr's FilterPredicate visitor evaluation), which invokes accept().","commonSituations":"Manually composing Parquet filters with and()/or() using the sentinel; running parquet-mr's filter evaluation against a converted predicate that collapsed to AlwaysTrue.","solutions":["Do not use AlwaysTrue as an actual filter — use FilterApi alwaysTrue() from parquet-mr's FilterApi if a real always-match filter is needed","Treat AlwaysTrue in converted output as a signal to skip filtering entirely rather than feeding it to a visitor"],"exampleFix":"// before\nFilterPredicate p = ParquetFilters.predicate(Expressions.alwaysTrue());\nvisitor.visit(p); // throws\n// after\nFilterPredicate p = FilterApi.alwaysTrue(); // real parquet-mr filter\n","handlingStrategy":"type-guard","validationCode":"if (pred instanceof ParquetFilters.AlwaysTrue) { /* skip filtering: match all rows */ }","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  // handle sentinel explicitly, never call accept()\n}","preventionTips":["Never feed converted sentinel predicates to parquet-mr visitors","Short-circuit alwaysTrue/alwaysFalse results before evaluation"],"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"}