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

  1. Check the message's update type and split the commit so unsupported change kinds are not mixed into a REST catalog commit.
  2. Upgrade Iceberg — support for additional update types in REST commits is added over time.
  3. Perform unsupported operations through the engine/catalog API that owns them rather than raw metadata commits.
  4. 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

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


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/8833ef6197de5a7a. Report an issue: GitHub.