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
- Upgrade iceberg-flink to match your Flink version
- Replace the unsupported ModifyColumn subtype with a supported one (type/name/position/comment)
- 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
- Restrict DDL to column type/name/position/comment modifications on Iceberg tables
- Keep Flink and connector versions in sync
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
- Unsupported table change: AddWatermark.
- Unsupported table change: ModifyWatermark.
- Unsupported table change: DropWatermark.
- Unsupported table change: DropConstraint.
- Cannot apply unknown table change: {change}
AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12).
Data as JSON: /api/errors/a06fce625d4e497d.
Report an issue: GitHub.