{"record":{"id":"d79231bc9287a93f","repo":"apache/iceberg","slug":"cannot-apply-unknown-modify-column-position-change-d79231","errorCode":null,"errorMessage":"Cannot apply unknown modify-column-position change: {modifyColumnPosition}","messagePattern":"Cannot apply unknown modify-column-position 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":241,"sourceCode":"          (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\n  private static void applyUniqueConstraint(\n      UpdateSchema pendingUpdate, UniqueConstraint constraint) {\n    switch (constraint.getType()) {\n      case PRIMARY_KEY:\n        pendingUpdate.setIdentifierFields(constraint.getColumns());\n        break;\n      case UNIQUE_KEY:\n        throw new UnsupportedOperationException(\n            \"Unsupported table change: setting unique key constraints.\");\n      default:\n        throw new UnsupportedOperationException(\n            \"Cannot apply unknown unique constraint: \" + constraint.getType().name());\n    }\n  }","sourceCodeStart":223,"sourceCodeEnd":259,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java#L223-L259","documentation":"applyModifyColumnPosition supports only TableChange.First and TableChange.After. Any other ModifyColumnPosition subtype (or null beyond these) throws UnsupportedOperationException, because Iceberg moves only support first/after semantics.","triggerScenarios":"Passing a TableChange.ModifyColumnPosition whose newPosition is neither First nor After (e.g. TableChange.Before-like custom subtype) through applyAddColumn/applyModifyColumn.","commonSituations":"Custom Flink catalog or SQL dialect emitting positional change types Iceberg cannot express.","solutions":["Convert the position change to TableChange.After with the preceding column name, or First","Implement a Before->After translation (after the previous column) before calling the util","Drop the positional clause from the DDL for Iceberg tables"],"exampleFix":"// before\nTableChange.Before before = ...; applyModifyColumnPosition(update, new ModifyColumnPosition(col, before));\n// after\nTableChange.After after = TableChange.after(previousColumnName());\napplyModifyColumnPosition(update, new TableChange.ModifyColumnPosition(col, after));","handlingStrategy":"validation","validationCode":"if (newPosition instanceof TableChange.First) {\n  // ok\n} else if (newPosition instanceof TableChange.After a) {\n  if (a.column() == null) throw new IllegalArgumentException(\"After.column must be set\");\n} else {\n  throw new IllegalArgumentException(\"Unsupported column position: \" + newPosition);\n}","typeGuard":"boolean isSupportedPosition(TableChange.ColumnPosition p) {\n  return p instanceof TableChange.First || p instanceof TableChange.After;\n}","tryCatchPattern":"try {\n  FlinkAlterTableUtil.applySchemaChanges(update, List.of(change));\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().contains(\"modify-column-position\")) { /* translate to After/First */ }\n  throw e;\n}","preventionTips":["Translate any non-First/non-After position semantics (e.g. Before) to After with the preceding column before applying","Restrict generated DDL to FIRST/AFTER column positions"],"tags":["flink","schema-change","column-position","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"}