{"record":{"id":"eef5c0bd0b534f5e","repo":"apache/iceberg","slug":"cannot-apply-unknown-modify-column-position-change-eef5c0","errorCode":null,"errorMessage":"Cannot apply unknown modify-column-position change: ","messagePattern":"Cannot apply unknown modify-column-position 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":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.2/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java#L223-L259","documentation":"applyModifyColumnPosition supports only TableChange.First and TableChange.After position changes; any other TableChange position subclass (or null-like unknown variant) throws this UnsupportedOperationException. It signals that column-reposition logic received an unrecognized position marker.","triggerScenarios":"A TableChange.ModifyColumnPosition whose newPosition is neither First nor After (e.g. Before semantics arriving as an unhandled variant) passed through applySchemaChanges.","commonSituations":"Flink emits a new position change kind not supported by the Iceberg runtime version; custom code constructing ModifyColumnPosition with a custom position class.","solutions":["Map Before positions manually to After (previous column) or First before submitting the change","Upgrade iceberg-flink to a version handling the emitted position variant","Catch the exception and fall back to explicit UpdateSchema.moveFirst/moveAfter calls"],"exampleFix":"// before\nchange = TableChange.modifyColumnPosition(col, someBeforePosition);\n// after\nchange = TableChange.after(col, previousColumnName); // or table.changeSchema().moveFirst(col)","handlingStrategy":"type-guard","validationCode":"static boolean hasSupportedPosition(TableChange.ModifyColumnPosition c) {\n  return c.newPosition() instanceof TableChange.First || c.newPosition() instanceof TableChange.After;\n}\nif (!hasSupportedPosition(c)) throw new IllegalArgumentException(\"Only First/After positions supported\");","typeGuard":"static boolean isSupportedPosition(TableChange c) {\n  return c instanceof TableChange.First || c instanceof TableChange.After;\n}","tryCatchPattern":"try { FlinkAlterTableUtil.applySchemaChanges(update, changes); }\ncatch (UnsupportedOperationException e) {\n  if (e.getMessage().startsWith(\"Cannot apply unknown modify-column-position\")) { /* convert to After/First */ }\n  throw e;\n}","preventionTips":["Convert Before positions to After(previousColumn) before submitting changes","Verify position-change semantics against the Iceberg version in use","Prefer UpdateSchema.moveFirst/moveAfter directly for positional edits"],"tags":["flink","iceberg","column-position","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"}