{"record":{"id":"793da205ff1be27d","repo":"apache/iceberg","slug":"retainall-is-not-supported","errorCode":null,"errorMessage":"retainAll is not supported","messagePattern":"retainAll is not supported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/iceberg/util/PartitionSet.java","lineNumber":178,"sourceCode":"      return Iterables.all(objects, this::contains);\n    }\n    return false;\n  }\n\n  @Override\n  public boolean addAll(Collection<? extends Pair<Integer, StructLike>> pairs) {\n    boolean changed = false;\n    if (pairs != null) {\n      for (Pair<Integer, StructLike> pair : pairs) {\n        changed |= add(pair);\n      }\n    }\n    return changed;\n  }\n\n  @Override\n  public boolean retainAll(Collection<?> c) {\n    throw new UnsupportedOperationException(\"retainAll is not supported\");\n  }\n\n  @Override\n  public boolean removeAll(Collection<?> objects) {\n    boolean changed = false;\n    if (objects != null) {\n      for (Object object : objects) {\n        changed |= remove(object);\n      }\n    }\n    return changed;\n  }\n\n  @Override\n  public String toString() {\n    StringJoiner result = new StringJoiner(\", \", \"[\", \"]\");\n    for (Map.Entry<Integer, Set<StructLike>> e : partitionSetById.entrySet()) {\n      StringJoiner partitionDataJoiner = new StringJoiner(\", \");","sourceCodeStart":160,"sourceCodeEnd":196,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/util/PartitionSet.java#L160-L196","documentation":"PartitionSet implements only the set operations it needs; retainAll is deliberately unsupported and throws UnsupportedOperationException. Partition sets are append/remove-only structures used during expire/delete planning.","triggerScenarios":"Calling retainAll(Collection) on a PartitionSet, e.g. via generic Set API usage or Collection.retainAll on a set viewed as a PartitionSet.","commonSituations":"Generic set-algebra code written against java.util.Collection; refactoring that assumed full Set semantics.","solutions":["Rebuild a new PartitionSet containing only the retained partitions instead of retainAll","Use removeAll for removals, which is supported","Implement your own intersection using contains() filtering"],"exampleFix":"// before\nset.retainAll(other); // throws\n// after\nPartitionSet kept = PartitionSet.create(spec);\nfor (Pair<Integer, StructLike> p : partitions) if (other.contains(p)) kept.add(p);","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"boolean supportsRetainAll(Set<?> s) { return !(s instanceof PartitionSet); }","tryCatchPattern":"try { set.retainAll(other); } catch (UnsupportedOperationException e) { /* rebuild set manually */ }","preventionTips":["Don't rely on full java.util.Set semantics for PartitionSet","Implement intersection by rebuilding via contains()","Check supported ops: add/addAll/remove/removeAll"],"tags":["partitionset","unsupported","set"],"backgroundTag":"unsupported-operation","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"}