apache/iceberg · error · UnsupportedOperationException
Update type %s is not supported
Error message
Update type %s is not supported
What it means
An UnsupportedOperationException thrown from RESTTableOperations.commit when the TableMetadata update type is not one of the supported kinds (create, replace, or simple updates). The switch over updateType has a default branch that rejects any other update type, since the REST protocol can only express the mapped request shapes.
Source
Thrown at core/src/main/java/org/apache/iceberg/rest/RESTTableOperations.java:195
updates =
ImmutableList.<MetadataUpdate>builder()
.addAll(createChanges)
.addAll(metadata.changes())
.build();
// use the original replace base metadata because the transaction will refresh
requirements = UpdateRequirements.forReplaceTable(replaceBase, updates);
errorHandler = ErrorHandlers.tableCommitHandler();
break;
case SIMPLE:
Preconditions.checkState(base != null, "Invalid base metadata: null");
updates = metadata.changes();
requirements = UpdateRequirements.forUpdateTable(base, updates);
errorHandler = ErrorHandlers.tableCommitHandler();
break;
default:
throw new UnsupportedOperationException(
String.format("Update type %s is not supported", updateType));
}
UpdateTableRequest request = new UpdateTableRequest(requirements, updates);
// the error handler will throw necessary exceptions like CommitFailedException and
// UnknownCommitStateException
// TODO: ensure that the HTTP client lib passes HTTP client errors to the error handler
LoadTableResponse response;
try {
response = client.post(path, request, LoadTableResponse.class, mutationHeaders, errorHandler);
} catch (CommitStateUnknownException e) {
// Lightweight reconciliation for snapshot-add-only updates on transient unknown commit state
if (updateType == UpdateType.SIMPLE && reconcileOnSimpleUpdate(updates, e)) {
return;
}
throw e;View on GitHub (pinned to 86d9c8fc54)
Solutions
- Check the message's update type and split the commit so unsupported change kinds are not mixed into a REST catalog commit.
- Upgrade Iceberg — support for additional update types in REST commits is added over time.
- Perform unsupported operations through the engine/catalog API that owns them rather than raw metadata commits.
- Inspect TableMetadata.changes() to identify which update kind triggered the default branch.
Example fix
// before ops.commit(base, metadata.withAll(changes)); // unsupported update type mixed in // after ops.commit(base, metadata.withChanges(supportedChanges)); // only create/replace/standard updates
Defensive patterns
Strategy: try-catch
Try / catch
try { ops.commit(base, metadata); } catch (UnsupportedOperationException e) { /* update type unsupported by REST commit: split or upgrade */ } Prevention
- Only commit metadata changes produced by supported operations (create/replace/standard updates)
- Inspect TableMetadata.changes() before committing through RESTTableOperations
- Upgrade Iceberg when using newer update kinds with REST catalogs
- Keep raw metadata commits out of application code
When it happens
Trigger: Committing table metadata whose first change is an update type the REST integration does not map — e.g. metadata changes produced by operations outside the create/replace/standard-update set that RESTTableOperations.commit supports.
Common situations: Combining snapshot/expire operations or unusual metadata mutations with a REST catalog commit; custom code constructing TableMetadata changes directly; engine integrations producing newer update kinds before the REST client added support.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Cannot call commit on temporary table operations
- Cannot call commit on temporary table operations
- Failed to write manifest list file
- Cannot create namespace " + namespace + ": metadata is not s
- Cannot call refresh on temporary table operations
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/8833ef6197de5a7a.
Report an issue: GitHub.