{"record":{"id":"b73722dcbe04f0f2","repo":"apache/iceberg","slug":"cannot-apply-unknown-modify-column-position-change-b73722","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.3/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.3/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java#L223-L259","documentation":"applyModifyColumnPosition supports only TableChange.First and TableChange.After positions; any other ModifyColumnPosition subtype throws UnsupportedOperationException. It maps Flink column-position changes onto Iceberg moveFirst/moveAfter operations.","triggerScenarios":"Issuing a column-position change using TableChange.Before (or another position subtype) through the Flink alter-table path.","commonSituations":"Using `ALTER TABLE ... MODIFY COLUMN c AFTER/BY ...` DDL variants that Flink translates to a position subtype Iceberg does not handle.","solutions":["Express the position as TableChange.First or TableChange.After.","Rewrite the DDL to use AFTER with the preceding column name instead of BEFORE.","Apply the move directly: updateSchema().moveBefore(...) on the Table API if BEFORE semantics are needed."],"exampleFix":"// before\nnew TableChange.ModifyColumnPosition(new TableChange.Before(\"other\"), column);\n// after\nnew TableChange.ModifyColumnPosition(new TableChange.After(\"other\"), column);","handlingStrategy":"validation","validationCode":"// java\nif (!(pos instanceof TableChange.First) && !(pos instanceof TableChange.After)) {\n  throw new IllegalArgumentException(\"only First/After positions supported; rewrite BEFORE as AFTER\");\n}","typeGuard":"boolean isSupportedPosition(TableChange.ColumnPosition pos) {\n  return pos instanceof TableChange.First || pos instanceof TableChange.After;\n}","tryCatchPattern":"try {\n  FlinkAlterTableUtil.applyModifyColumnPosition(update, change);\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().startsWith(\"Cannot apply unknown modify-column-position\")) {\n    // convert Before to After with preceding column and retry\n  } else { throw e; }\n}","preventionTips":["Rewrite BEFORE-clause position DDL as AFTER with the preceding column.","Use updateSchema().moveBefore/moveAfter directly for BEFORE semantics.","Cover position changes with a unit test against this utility."],"tags":["flink","unsupported-operation","column-position"],"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"}