{"record":{"id":"a06fce625d4e497d","repo":"apache/iceberg","slug":"cannot-apply-unknown-modify-column-change-modify","errorCode":null,"errorMessage":"Cannot apply unknown modify-column change: {modifyColumn}","messagePattern":"Cannot apply unknown modify-column change: (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java","lineNumber":227,"sourceCode":"      applyModifyColumnPosition(pendingUpdate, modifyPosition);\n    } else if (modifyColumn instanceof TableChange.ModifyPhysicalColumnType) {\n      TableChange.ModifyPhysicalColumnType modifyType =\n          (TableChange.ModifyPhysicalColumnType) modifyColumn;\n      Type type = FlinkSchemaUtil.convert(modifyType.getNewType().getLogicalType());\n      String columnName = modifyType.getOldColumn().getName();\n      pendingUpdate.updateColumn(columnName, type.asPrimitiveType());\n      if (modifyType.getNewColumn().getDataType().getLogicalType().isNullable()) {\n        pendingUpdate.makeColumnOptional(columnName);\n      } else {\n        pendingUpdate.requireColumn(columnName);\n      }\n    } else if (modifyColumn instanceof TableChange.ModifyColumnComment) {\n      TableChange.ModifyColumnComment modifyComment =\n          (TableChange.ModifyColumnComment) modifyColumn;\n      pendingUpdate.updateColumnDoc(\n          modifyComment.getOldColumn().getName(), modifyComment.getNewComment());\n    } else {\n      throw new UnsupportedOperationException(\n          \"Cannot apply unknown modify-column change: \" + modifyColumn);\n    }\n  }\n\n  private static void applyModifyColumnPosition(\n      UpdateSchema pendingUpdate, TableChange.ModifyColumnPosition modifyColumnPosition) {\n    TableChange.ColumnPosition newPosition = modifyColumnPosition.getNewPosition();\n    if (newPosition instanceof TableChange.First) {\n      pendingUpdate.moveFirst(modifyColumnPosition.getOldColumn().getName());\n    } else if (newPosition instanceof TableChange.After) {\n      TableChange.After after = (TableChange.After) newPosition;\n      pendingUpdate.moveAfter(modifyColumnPosition.getOldColumn().getName(), after.column());\n    } else {\n      throw new UnsupportedOperationException(\n          \"Cannot apply unknown modify-column-position change: \" + modifyColumnPosition);\n    }\n  }\n","sourceCodeStart":209,"sourceCodeEnd":245,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java#L209-L245","documentation":"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.","triggerScenarios":"Calling applySchemaChanges with a TableChange.ModifyColumn subtype not covered by the instanceof chain (e.g. a new Flink change type like ModifyColumnExpression).","commonSituations":"Flink version skew: newer Flink TableChange subtypes reaching an older Iceberg connector; custom catalog subclassing mistakes.","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"],"exampleFix":"// before\nchange = new TableChange.ModifyColumnSomeNewType(...);\n// after\ntable.updateSchema().updateColumn(name, newType).commit();","handlingStrategy":"try-catch","validationCode":"if (modifyColumn.getClass().getSimpleName().startsWith(\"ModifyColumn\") &&\n    !(modifyColumn instanceof TableChange.ModifyColumnType || modifyColumn instanceof TableChange.ModifyColumnName || modifyColumn instanceof TableChange.ModifyColumnPosition || modifyColumn instanceof TableChange.ModifyColumnComment)) {\n  throw new IllegalArgumentException(\"Modify-column subtype not mapped: \" + modifyColumn.getClass());\n}","typeGuard":"boolean isSupportedModifyColumn(TableChange.ModifyColumn c) {\n  return c instanceof TableChange.ModifyColumnType || c instanceof TableChange.ModifyColumnName\n    || c instanceof TableChange.ModifyColumnPosition || c instanceof TableChange.ModifyColumnComment;\n}","tryCatchPattern":"try {\n  FlinkAlterTableUtil.applySchemaChanges(update, List.of(modifyColumn));\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().contains(\"unknown modify-column change\")) { /* apply via UpdateSchema directly */ }\n  throw e;\n}","preventionTips":["Restrict DDL to column type/name/position/comment modifications on Iceberg tables","Keep Flink and connector versions in sync"],"tags":["flink","schema-change","modify-column","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}