{"record":{"id":"8c353533218a1d61","repo":"prestodb/presto","slug":"iceberg-table-updates-require-at-least-format-vers","errorCode":null,"errorMessage":"Iceberg table updates require at least format version 2 and update mode must be merge-on-read","messagePattern":"Iceberg table updates require at least format version 2 and update mode must be merge-on-read","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergAbstractMetadata.java","lineNumber":1921,"sourceCode":"\n    @Override\n    public ConnectorTableHandle beginUpdate(ConnectorSession session, ConnectorTableHandle tableHandle, List<ColumnHandle> updatedColumns)\n    {\n        IcebergTableHandle handle = (IcebergTableHandle) tableHandle;\n        Table icebergTable = getIcebergTable(session, handle.getSchemaTableName());\n        validateBranchExists(handle, icebergTable);\n        int formatVersion = opsFromTable(icebergTable).current().formatVersion();\n\n        if (formatVersion > MAX_FORMAT_VERSION_FOR_ROW_LEVEL_OPERATIONS) {\n            throw new PrestoException(NOT_SUPPORTED,\n                    format(\"Iceberg table updates for format version %s are not supported yet\", formatVersion));\n        }\n\n        if (formatVersion < MIN_FORMAT_VERSION_FOR_DELETE ||\n                !Optional.ofNullable(icebergTable.properties().get(TableProperties.UPDATE_MODE))\n                        .map(mode -> mode.equals(MERGE_ON_READ.modeName()))\n                        .orElse(false)) {\n            throw new RuntimeException(\"Iceberg table updates require at least format version 2 and update mode must be merge-on-read\");\n        }\n        validateTableMode(session, icebergTable);\n        return handle\n                .withUpdatedColumns(updatedColumns.stream()\n                        .map(IcebergColumnHandle.class::cast)\n                        .collect(toImmutableList()));\n    }\n\n    @Override\n    public void finishUpdate(ConnectorSession session, ConnectorTableHandle tableHandle, Collection<Slice> fragments)\n    {\n        IcebergTableHandle handle = (IcebergTableHandle) tableHandle;\n        Table icebergTable = getIcebergTable(session, handle.getSchemaTableName());\n        IcebergOutputTableHandle outputTableHandle = new IcebergOutputTableHandle(\n                handle.getSchemaName(),\n                handle.getIcebergTableName(),\n                toPrestoSchema(icebergTable.schema(), typeManager),\n                toPrestoPartitionSpec(icebergTable.spec(), typeManager),","sourceCodeStart":1903,"sourceCodeEnd":1939,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergAbstractMetadata.java#L1903-L1939","documentation":"beginUpdate validates row-level update support: the table's Iceberg format version must be exactly 2 with merge-on-read update mode (versions above MAX_FORMAT_VERSION_FOR_ROW_LEVEL_OPERATIONS or copy-on-write are rejected). The check fails when the table's formatVersion is outside the supported range for UPDATE statements.","triggerScenarios":"Thrown at presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergAbstractMetadata.java:1921 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure the table uses Iceberg format version 2 with merge-on-read mode for updates","Rewrite the table at format version 2 (e.g. alter table set TBLPROPERTIES ('format-version'='2')) before running UPDATE"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}