{"record":{"id":"40c919d3d6eb10e7","repo":"apache/iceberg","slug":"cannot-apply-unknown-modify-column-change","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/v1.20/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/v1.20/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java#L209-L245","documentation":"applyModifyColumn handles only the known ModifyColumn subtypes (rename, type, comment, position, etc.); any other ModifyColumn variant falls into the else branch and is rejected. This can surface when a new Flink ModifyColumn subtype is used with an older connector.","triggerScenarios":"Calling applySchemaChanges with a TableChange.ModifyColumn subtype not implemented in this util version (e.g. a newly added Flink subtype), or a bare/unknown ModifyColumn instance.","commonSituations":"Flink version upgrade introducing new column-modification semantics; generic DDL executors passing through all ModifyColumn variants.","solutions":["Upgrade iceberg-flink to a version supporting the specific ModifyColumn subtype","Replace the unsupported modification with equivalent supported operations (e.g. drop + add, or separate rename/type/comment calls)","Inspect change.toString() in the message to identify which subtype failed and adjust the DDL"],"exampleFix":"// before\nALTER TABLE t MODIFY col NEWTYPE; // unsupported modify variant\n// after\nALTER TABLE t DROP col;\nALTER TABLE t ADD col NEWTYPE; // or use a supported MODIFY form (rename/type/comment)","handlingStrategy":"validation","validationCode":"for (TableChange c : changes) {\n  if (c instanceof TableChange.ModifyColumn\n      && !(c instanceof TableChange.ModifyColumnName\n        || c instanceof TableChange.UpdateColumnType\n        || c instanceof TableChange.ModifyColumnComment\n        || c instanceof TableChange.ModifyColumnPosition)) {\n    throw new IllegalArgumentException(\"Unsupported ModifyColumn: \" + c);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  FlinkAlterTableUtil.applySchemaChanges(table, changes);\n} catch (UnsupportedOperationException e) {\n  // fall back to drop+add or direct UpdateSchema for the unsupported modify\n}","preventionTips":["Use only documented MODIFY COLUMN forms (rename/type/comment/position)","Match Flink and Iceberg connector versions","Translate unsupported modify variants before applying"],"tags":["flink","ddl","columns"],"backgroundTag":"unsupported-operation","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}