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/04/27 07:12:17 UTC

[iceberg] 01/01: Spec: Add missing `last-column-id`

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

fokko pushed a commit to branch fd-add-missing-last-column-id
in repository https://gitbox.apache.org/repos/asf/iceberg.git

commit e857d4153b3bd05e4ad2b5c2a66e04f32a013216
Author: Fokko Driesprong <fo...@apache.org>
AuthorDate: Thu Apr 27 09:12:10 2023 +0200

    Spec: Add missing `last-column-id`
    
    I noticed that this was required:
    
    ```
    com.fasterxml.jackson.databind.JsonMappingException: Cannot parse missing int: last-column-id (through reference chain: org.apache.iceberg.rest.requests.UpdateTableRequest[&quot;updates&quot;]-&gt;java.util.ArrayList[0])
            at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:402)
            at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:373)
            at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:375)
            at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244)
            at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28)
            at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
            at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314)
            at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)
            at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
            at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4730)
            at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3690)
            at org.apache.iceberg.rest.RESTCatalogServlet$ServletRequestContext.from(RESTCatalogServlet.java:179)
            at org.apache.iceberg.rest.RESTCatalogServlet.doPost(RESTCatalogServlet.java:78)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
            at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
            at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550)
            at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
            at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:713)
            at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
            at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
            at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434)
            at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
            at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
            at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
            at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
            at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
            at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
            at org.eclipse.jetty.server.Server.handle(Server.java:516)
            at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388)
            at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
            at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380)
            at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
            at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
            at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
            at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
            at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
            at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
            at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
            at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
            at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:386)
            at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
            at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
            at java.base/java.lang.Thread.run(Thread.java:833)
    Caused by: java.lang.IllegalArgumentException: Cannot parse missing int: last-column-id
            at org.apache.iceberg.relocated.com.google.common.base.Preconditions.checkArgument(Preconditions.java:220)
            at org.apache.iceberg.util.JsonUtil.getInt(JsonUtil.java:108)
            at org.apache.iceberg.MetadataUpdateParser.readAddSchema(MetadataUpdateParser.java:400)
            at org.apache.iceberg.MetadataUpdateParser.fromJson(MetadataUpdateParser.java:245)
            at org.apache.iceberg.rest.RESTSerializers$MetadataUpdateDeserializer.deserialize(RESTSerializers.java:130)
            at org.apache.iceberg.rest.RESTSerializers$MetadataUpdateDeserializer.deserialize(RESTSerializers.java:125)
            at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:359)
            ... 41 more
    ```
    
    Java code:
    https://github.com/apache/iceberg/blob/882459d488a3fae73eda5b1f09f18d1af9fe6f51/core/src/main/java/org/apache/iceberg/MetadataUpdateParser.java#L397-L402
---
 open-api/rest-catalog-open-api.yaml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/open-api/rest-catalog-open-api.yaml b/open-api/rest-catalog-open-api.yaml
index a2473488e9..10546fc02e 100644
--- a/open-api/rest-catalog-open-api.yaml
+++ b/open-api/rest-catalog-open-api.yaml
@@ -1500,6 +1500,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.
 
     SetCurrentSchemaUpdate:
       allOf: