{"record":{"id":"f5560711cd86e1ee","repo":"apache/iceberg","slug":"operation-updateproperties-is-not-supported-after","errorCode":null,"errorMessage":"Operation updateProperties is not supported after the table is serialized","messagePattern":"Operation updateProperties is not supported after the table is serialized","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/iceberg/SerializableTable.java","lineNumber":362,"sourceCode":"\n  @Override\n  public List<HistoryEntry> history() {\n    return lazyTable().history();\n  }\n\n  @Override\n  public UpdateSchema updateSchema() {\n    throw new UnsupportedOperationException(errorMsg(\"updateSchema\"));\n  }\n\n  @Override\n  public UpdatePartitionSpec updateSpec() {\n    throw new UnsupportedOperationException(errorMsg(\"updateSpec\"));\n  }\n\n  @Override\n  public UpdateProperties updateProperties() {\n    throw new UnsupportedOperationException(errorMsg(\"updateProperties\"));\n  }\n\n  @Override\n  public ReplaceSortOrder replaceSortOrder() {\n    throw new UnsupportedOperationException(errorMsg(\"replaceSortOrder\"));\n  }\n\n  @Override\n  public UpdateLocation updateLocation() {\n    throw new UnsupportedOperationException(errorMsg(\"updateLocation\"));\n  }\n\n  @Override\n  public AppendFiles newAppend() {\n    throw new UnsupportedOperationException(errorMsg(\"newAppend\"));\n  }\n\n  @Override","sourceCodeStart":344,"sourceCodeEnd":380,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/SerializableTable.java#L344-L380","documentation":"SerializableTable guard: updateProperties() is refused on a deserialized table copy because the handle is read-only on executors. Property updates must be issued against the original catalog-loaded Table in the driver process.","triggerScenarios":"Calling updateProperties() on a SerializableTable, commonly in executor-side code or utility functions that mutate table properties.","commonSituations":"Generic maintenance utilities that set table properties; applying config changes inside distributed tasks.","solutions":["Apply property updates on the driver using the live catalog table","Pass the Catalog plus table identifier to the code that needs updates","Use SerializableTable strictly for read-only access"],"exampleFix":"// before\nserializableTable.updateProperties().set(\"write.format.default\", \"parquet\").commit();\n// after\ncatalog.loadTable(id).updateProperties().set(\"write.format.default\", \"parquet\").commit();","handlingStrategy":"validation","validationCode":"if (table instanceof SerializableTable) { throw new UnsupportedOperationException(\"Property updates require a live catalog table\"); }","typeGuard":"boolean canWrite = !(table instanceof SerializableTable);","tryCatchPattern":"try { table.updateProperties().commit(); } catch (UnsupportedOperationException e) { catalog.loadTable(id).updateProperties().commit(); }","preventionTips":["Apply property changes on the driver","Restrict SerializableTable to read paths","Review utility code for Table mutation on serialized handles"],"tags":["iceberg","serialization","read-only"],"backgroundTag":"operation-not-supported","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"}