You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by fo...@apache.org on 2023/06/05 21:54:07 UTC

[iceberg] branch master updated: Spec: Add missing `last-column-id` (#7445)

This is an automated email from the ASF dual-hosted git repository.

fokko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/master by this push:
     new 26af4c7387 Spec: Add missing `last-column-id` (#7445)
26af4c7387 is described below

commit 26af4c7387d68a04762bb50d388d3227536527b9
Author: Fokko Driesprong <fo...@apache.org>
AuthorDate: Mon Jun 5 23:54:00 2023 +0200

    Spec: Add missing `last-column-id` (#7445)
    
    * Spec: Add missing last-column-id to open-api spec
    
    * Add description
---
 .../main/java/org/apache/iceberg/MetadataUpdateParser.java    |  7 ++++++-
 .../java/org/apache/iceberg/TestMetadataUpdateParser.java     | 11 +++++++++++
 open-api/rest-catalog-open-api.yaml                           |  3 +++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/iceberg/MetadataUpdateParser.java b/core/src/main/java/org/apache/iceberg/MetadataUpdateParser.java
index 1ecf40cc40..8c9b1b3f4e 100644
--- a/core/src/main/java/org/apache/iceberg/MetadataUpdateParser.java
+++ b/core/src/main/java/org/apache/iceberg/MetadataUpdateParser.java
@@ -397,7 +397,12 @@ public class MetadataUpdateParser {
   private static MetadataUpdate readAddSchema(JsonNode node) {
     JsonNode schemaNode = JsonUtil.get(SCHEMA, node);
     Schema schema = SchemaParser.fromJson(schemaNode);
-    int lastColumnId = JsonUtil.getInt(LAST_COLUMN_ID, node);
+    int lastColumnId;
+    if (node.has(LAST_COLUMN_ID)) {
+      lastColumnId = JsonUtil.getInt(LAST_COLUMN_ID, node);
+    } else {
+      lastColumnId = schema.highestFieldId();
+    }
     return new MetadataUpdate.AddSchema(schema, lastColumnId);
   }
 
diff --git a/core/src/test/java/org/apache/iceberg/TestMetadataUpdateParser.java b/core/src/test/java/org/apache/iceberg/TestMetadataUpdateParser.java
index c6baead8a7..aa7c120aeb 100644
--- a/core/src/test/java/org/apache/iceberg/TestMetadataUpdateParser.java
+++ b/core/src/test/java/org/apache/iceberg/TestMetadataUpdateParser.java
@@ -123,6 +123,17 @@ public class TestMetadataUpdateParser {
     assertEquals(action, actualUpdate, MetadataUpdateParser.fromJson(json));
   }
 
+  @Test
+  public void testAddSchemaFromJsonWithoutLastColumnId() {
+    String action = MetadataUpdateParser.ADD_SCHEMA;
+    Schema schema = ID_DATA_SCHEMA;
+    int lastColumnId = schema.highestFieldId();
+    String json =
+        String.format("{\"action\":\"add-schema\",\"schema\":%s}", SchemaParser.toJson(schema));
+    MetadataUpdate actualUpdate = new MetadataUpdate.AddSchema(schema, lastColumnId);
+    assertEquals(action, actualUpdate, MetadataUpdateParser.fromJson(json));
+  }
+
   @Test
   public void testAddSchemaToJson() {
     Schema schema = ID_DATA_SCHEMA;
diff --git a/open-api/rest-catalog-open-api.yaml b/open-api/rest-catalog-open-api.yaml
index 2de99a7517..e08e8d78cc 100644
--- a/open-api/rest-catalog-open-api.yaml
+++ b/open-api/rest-catalog-open-api.yaml
@@ -1502,6 +1502,9 @@ components:
           properties:
             schema:
               $ref: '#/components/schemas/Schema'
+            last-column-id:
+              type: integer
+              description: The highest assigned column ID for the table. This is used to ensure columns are always assigned an unused ID when evolving schemas. When omitted, it will be computed on the server side.
 
     SetCurrentSchemaUpdate:
       allOf: