apache/iceberg · error · UnsupportedOperationException

Cannot apply unknown modify-column change: {modifyColumn}

Error message

Cannot apply unknown modify-column change: {modifyColumn}

What it means

applyModifyColumn handles ModifyColumnType/Name/Position/Comment etc.; any ModifyColumn subtype it doesn't recognize throws UnsupportedOperationException. The unknown modify-column change has no Iceberg UpdateSchema mapping in this version.

Source

Thrown at flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java:227

      applyModifyColumnPosition(pendingUpdate, modifyPosition);
    } else if (modifyColumn instanceof TableChange.ModifyPhysicalColumnType) {
      TableChange.ModifyPhysicalColumnType modifyType =
          (TableChange.ModifyPhysicalColumnType) modifyColumn;
      Type type = FlinkSchemaUtil.convert(modifyType.getNewType().getLogicalType());
      String columnName = modifyType.getOldColumn().getName();
      pendingUpdate.updateColumn(columnName, type.asPrimitiveType());
      if (modifyType.getNewColumn().getDataType().getLogicalType().isNullable()) {
        pendingUpdate.makeColumnOptional(columnName);
      } else {
        pendingUpdate.requireColumn(columnName);
      }
    } else if (modifyColumn instanceof TableChange.ModifyColumnComment) {
      TableChange.ModifyColumnComment modifyComment =
          (TableChange.ModifyColumnComment) modifyColumn;
      pendingUpdate.updateColumnDoc(
          modifyComment.getOldColumn().getName(), modifyComment.getNewComment());
    } else {
      throw new UnsupportedOperationException(
          "Cannot apply unknown modify-column change: " + modifyColumn);
    }
  }

  private static void applyModifyColumnPosition(
      UpdateSchema pendingUpdate, TableChange.ModifyColumnPosition modifyColumnPosition) {
    TableChange.ColumnPosition newPosition = modifyColumnPosition.getNewPosition();
    if (newPosition instanceof TableChange.First) {
      pendingUpdate.moveFirst(modifyColumnPosition.getOldColumn().getName());
    } else if (newPosition instanceof TableChange.After) {
      TableChange.After after = (TableChange.After) newPosition;
      pendingUpdate.moveAfter(modifyColumnPosition.getOldColumn().getName(), after.column());
    } else {
      throw new UnsupportedOperationException(
          "Cannot apply unknown modify-column-position change: " + modifyColumnPosition);
    }
  }

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Upgrade iceberg-flink to match your Flink version
  2. Replace the unsupported ModifyColumn subtype with a supported one (type/name/position/comment)
  3. Apply the column modification directly via UpdateSchema.updateColumn... APIs

Example fix

// before
change = new TableChange.ModifyColumnSomeNewType(...);
// after
table.updateSchema().updateColumn(name, newType).commit();
Defensive patterns

Strategy: try-catch

Validate before calling

if (modifyColumn.getClass().getSimpleName().startsWith("ModifyColumn") &&
    !(modifyColumn instanceof TableChange.ModifyColumnType || modifyColumn instanceof TableChange.ModifyColumnName || modifyColumn instanceof TableChange.ModifyColumnPosition || modifyColumn instanceof TableChange.ModifyColumnComment)) {
  throw new IllegalArgumentException("Modify-column subtype not mapped: " + modifyColumn.getClass());
}

Type guard

boolean isSupportedModifyColumn(TableChange.ModifyColumn c) {
  return c instanceof TableChange.ModifyColumnType || c instanceof TableChange.ModifyColumnName
    || c instanceof TableChange.ModifyColumnPosition || c instanceof TableChange.ModifyColumnComment;
}

Try / catch

try {
  FlinkAlterTableUtil.applySchemaChanges(update, List.of(modifyColumn));
} catch (UnsupportedOperationException e) {
  if (e.getMessage().contains("unknown modify-column change")) { /* apply via UpdateSchema directly */ }
  throw e;
}

Prevention

When it happens

Trigger: Calling applySchemaChanges with a TableChange.ModifyColumn subtype not covered by the instanceof chain (e.g. a new Flink change type like ModifyColumnExpression).

Common situations: Flink version skew: newer Flink TableChange subtypes reaching an older Iceberg connector; custom catalog subclassing mistakes.

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/a06fce625d4e497d. Report an issue: GitHub.