{"record":{"id":"fb07a232785eca57","repo":"apache/iceberg","slug":"cannot-apply-unknown-modify-column-change-fb07a2","errorCode":null,"errorMessage":"Cannot apply unknown modify-column change: ","messagePattern":"Cannot apply unknown modify-column change: ","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"flink/v2.2/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.2/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java#L209-L245","documentation":"applyModifyColumn recognizes only specific Modify* change types (type, comment, position, rename); anything else hits this final throw. It means an unhandled TableChange modify-column variant reached the schema update logic.","triggerScenarios":"Passing a ModifyColumnPosition variant or new Modify* subtype not covered by the if/else chain into applySchemaChanges; custom Flink change types.","commonSituations":"Version mismatch between Flink planner and iceberg-flink module; hand-built TableChange lists; newly added Flink change kinds used with an older Iceberg runtime.","solutions":["Upgrade the Iceberg Flink runtime to match your Flink version","Inspect change.getClass().getName() in the message and check whether that subtype is supported in your Iceberg version","Convert the change manually via UpdateSchema APIs (updateColumnType, updateColumnDoc, etc.) instead of relying on the utility"],"exampleFix":"// before\n// unknown modify change thrown\n// after\nif (change instanceof TableChange.ModifyColumnType) {\n  pendingUpdate.updateColumn type(...); // use supported UpdateSchema operations directly\n}","handlingStrategy":"type-guard","validationCode":"boolean supported = change instanceof TableChange.ModifyColumnType || change instanceof TableChange.ModifyColumnComment || change instanceof TableChange.ModifyColumnPosition || change instanceof TableChange.RenameColumn;\nif (!supported) throw new IllegalArgumentException(\"Unsupported modify change: \" + change.getClass());","typeGuard":"static boolean isSupportedModifyChange(TableChange c) {\n  return c instanceof TableChange.ModifyColumnType || c instanceof TableChange.ModifyColumnComment\n      || c instanceof TableChange.ModifyColumnPosition || c instanceof TableChange.RenameColumn;\n}","tryCatchPattern":"try { FlinkAlterTableUtil.applySchemaChanges(update, changes); }\ncatch (UnsupportedOperationException e) {\n  if (e.getMessage().startsWith(\"Cannot apply unknown modify-column change\")) { log.error(\"Unhandled modify variant: {}\", changes); }\n  throw e;\n}","preventionTips":["Check iceberg-flink version compatibility with your Flink version","Avoid constructing custom TableChange subtypes","Prefer direct UpdateSchema calls for exotic column modifications"],"tags":["flink","iceberg","modify-column","unsupported-operation"],"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"}