apache/iceberg · error · UnsupportedOperationException
%s doesn't implement validateFilesExist
Error message
%s doesn't implement validateFilesExist
What it means
DeleteFiles.validateFilesExist() is a default interface method; engines must override it to enable existence validation of deleted files at commit. The default throws UnsupportedOperationException naming the implementing class, signalling the operation is not supported by that implementation.
Source
Thrown at api/src/main/java/org/apache/iceberg/DeleteFiles.java:92
*/
DeleteFiles deleteFromRowFilter(Expression expr);
/**
* Enables or disables case sensitive expression binding for methods that accept expressions.
*
* @param caseSensitive whether expression binding should be case sensitive
* @return this for method chaining
*/
DeleteFiles caseSensitive(boolean caseSensitive);
/**
* Enables validation that any files that are part of the deletion still exist when committing the
* operation.
*
* @return this for method chaining
*/
default DeleteFiles validateFilesExist() {
throw new UnsupportedOperationException(
this.getClass().getName() + " doesn't implement validateFilesExist");
}
}
View on GitHub (pinned to 86d9c8fc54)
Solutions
- Use the standard implementation (BaseOverwrite/BaseDeleteFiles from iceberg-core via table.newDelete()) which supports validateFilesExist.
- Remove the validateFilesExist() call if existence validation is not required.
- If you implement DeleteFiles, override validateFilesExist() to record the validation and implement it in the commit path.
- Align iceberg-api and implementation jar versions.
Example fix
// before (custom impl)
class MyDelete implements DeleteFiles { }
// after
@Override
public DeleteFiles validateFilesExist() {
this.validateExistence = true;
return this;
} Defensive patterns
Strategy: try-catch
Try / catch
DeleteFiles delete;
try {
delete = table.newDelete().validateFilesExist();
} catch (UnsupportedOperationException e) {
delete = table.newDelete(); // skip existence validation or switch implementation
} Prevention
- Use table.newDelete() from iceberg-core, which supports validateFilesExist.
- Check feature support of custom catalogs before relying on validation options.
- Keep implementation and API versions aligned.
When it happens
Trigger: Calling validateFilesExist() on a DeleteFiles instance whose implementation (e.g. a custom or minimal RowLevelOperation builder) does not override it.
Common situations: Using a third-party or custom catalog's delete builder that lacks this feature; wiring the API interface directly instead of the engine's full implementation; version skew where the implementation predates the method.
Related errors
- %s doesn't implement copyWithStats
- %s doesn't implement cleanupLevel
- %s doesn't implement cleanExpiredMetadata
- Managing snapshots is not supported by + getClass().getName(
- this.getClass().getName() + " doesn't implement addNonDefaul
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/d2ec4293f9dca34e.
Report an issue: GitHub.