{"record":{"id":"d8a09e141517bf6f","repo":"apache/iceberg","slug":"unknown-position-for-reorder","errorCode":null,"errorMessage":"Unknown position for reorder: ","messagePattern":"Unknown position for reorder: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/Spark3Util.java","lineNumber":232,"sourceCode":"      }\n    }\n\n    return pendingUpdate;\n  }\n\n  private static void apply(UpdateSchema pendingUpdate, TableChange.UpdateColumnPosition update) {\n    Preconditions.checkArgument(update.position() != null, \"Invalid position: null\");\n\n    if (update.position() instanceof TableChange.After) {\n      TableChange.After after = (TableChange.After) update.position();\n      String referenceField = peerName(update.fieldNames(), after.column());\n      pendingUpdate.moveAfter(DOT.join(update.fieldNames()), referenceField);\n\n    } else if (update.position() instanceof TableChange.First) {\n      pendingUpdate.moveFirst(DOT.join(update.fieldNames()));\n\n    } else {\n      throw new IllegalArgumentException(\"Unknown position for reorder: \" + update.position());\n    }\n  }\n\n  private static void apply(UpdateSchema pendingUpdate, TableChange.AddColumn add) {\n    Preconditions.checkArgument(\n        add.isNullable(),\n        \"Incompatible change: cannot add required column: %s\",\n        leafName(add.fieldNames()));\n    if (add.defaultValue() != null) {\n      throw new UnsupportedOperationException(\n          String.format(\n              \"Cannot add column %s since setting default values in Spark is currently unsupported\",\n              leafName(add.fieldNames())));\n    }\n\n    Type type = SparkSchemaUtil.convert(add.dataType());\n    pendingUpdate.addColumn(\n        parentName(add.fieldNames()), leafName(add.fieldNames()), type, add.comment());","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/Spark3Util.java#L214-L250","documentation":"Thrown when applying a Spark TableChange.UpdateColumnPosition whose position is neither TableChange.After nor TableChange.First. Spark3Util only knows how to map these two position kinds onto Iceberg's moveBefore/moveAfter/moveFirst operations.","triggerScenarios":"Applying an UpdateColumnChange with a custom or future position subclass, or a position type produced by an engine/extension other than After/First.","commonSituations":"Engine extensions (e.g. other catalogs) generating custom position kinds; Spark upgrades adding new position types; manually constructed UpdateColumnPosition objects.","solutions":["Use TableChange.After or TableChange.First for reorders","Upgrade Iceberg if a new Spark position type was introduced","Convert the position manually via updatePosition/moveAfter APIs"],"exampleFix":"// before\nTableChange.updateColumnPosition(new MyCustomPosition(), col);\n// after\nTableChange.updateColumnPosition(TableChange.after(previousCol), col);","handlingStrategy":"type-guard","validationCode":"if (!(pos instanceof TableChange.After || pos instanceof TableChange.First)) { throw new IllegalArgumentException(\"Position must be After or First: \" + pos); }","typeGuard":"boolean knownPosition(TableChange.ColumnPosition p) { return p instanceof TableChange.After || p instanceof TableChange.First; }","tryCatchPattern":"try { spark.sql(\"ALTER TABLE t COLUMN REORDER ...\"); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Unknown position for reorder\")) { /* rebuild using After/First */ } else throw e; }","preventionTips":["Build reorders only with TableChange.After/First","Avoid custom ColumnPosition subclasses","Map engine-specific positions to Iceberg's before applying"],"tags":["spark","schema","column-position"],"backgroundTag":"invalid-enum-value","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"}