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

singhpk234 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git


The following commit(s) were added to refs/heads/main by this push:
     new f7b564630 IRC SPEC v3 support: Change the IRC spec to use 1.10 yaml 
(#2731)
f7b564630 is described below

commit f7b5646308b0477f737e9e0615c4649b0a497805
Author: Prashant Singh <[email protected]>
AuthorDate: Wed Oct 1 04:55:39 2025 -0700

    IRC SPEC v3 support: Change the IRC spec to use 1.10 yaml (#2731)
---
 .../service/exception/IcebergExceptionMapper.java  |   2 +-
 spec/iceberg-rest-catalog-open-api.yaml            | 141 +++++++++++++++++----
 2 files changed, 116 insertions(+), 27 deletions(-)

diff --git 
a/runtime/service/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java
 
b/runtime/service/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java
index c9d91815d..419365382 100644
--- 
a/runtime/service/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java
+++ 
b/runtime/service/src/main/java/org/apache/polaris/service/exception/IcebergExceptionMapper.java
@@ -181,7 +181,7 @@ public class IcebergExceptionMapper implements 
ExceptionMapper<RuntimeException>
       case ForbiddenException e -> Status.FORBIDDEN.getStatusCode();
       case jakarta.ws.rs.ForbiddenException e -> 
Status.FORBIDDEN.getStatusCode();
       case NotAuthorizedException e -> Status.UNAUTHORIZED.getStatusCode();
-      case NamespaceNotEmptyException e -> Status.BAD_REQUEST.getStatusCode();
+      case NamespaceNotEmptyException e -> Status.CONFLICT.getStatusCode();
       case ValidationException e -> Status.BAD_REQUEST.getStatusCode();
       case ServiceUnavailableException e -> 
Status.SERVICE_UNAVAILABLE.getStatusCode();
       case RuntimeIOException e -> Status.SERVICE_UNAVAILABLE.getStatusCode();
diff --git a/spec/iceberg-rest-catalog-open-api.yaml 
b/spec/iceberg-rest-catalog-open-api.yaml
index 73af389b5..b0140faea 100644
--- a/spec/iceberg-rest-catalog-open-api.yaml
+++ b/spec/iceberg-rest-catalog-open-api.yaml
@@ -19,7 +19,7 @@
 
 # CODE_COPIED_TO_POLARIS
 
-# Apache Iceberg Version: 1.8.1
+# Apache Iceberg Version: 1.10.0
 
 ---
 openapi: 3.1.1
@@ -260,7 +260,6 @@ paths:
       parameters:
         - $ref: '#/components/parameters/page-token'
         - $ref: '#/components/parameters/page-size'
-        - $ref: '#/components/parameters/prefix'
         - name: parent
           in: query
           description:
@@ -429,6 +428,15 @@ paths:
               examples:
                 NoSuchNamespaceExample:
                   $ref: '#/components/examples/NoSuchNamespaceError'
+        409:
+          description: Not Empty - Namespace to delete is not empty.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/IcebergErrorResponse'
+              examples:
+                NamespaceNotEmptyExample:
+                  $ref: '#/components/examples/NamespaceNotEmptyError'
         419:
           $ref: '#/components/responses/AuthenticationTimeoutResponse'
         503:
@@ -511,8 +519,6 @@ paths:
       description: Return all table identifiers under this namespace
       operationId: listTables
       parameters:
-        - $ref: '#/components/parameters/prefix'
-        - $ref: '#/components/parameters/namespace'
         - $ref: '#/components/parameters/page-token'
         - $ref: '#/components/parameters/page-size'
       responses:
@@ -559,8 +565,6 @@ paths:
         table state.
       operationId: createTable
       parameters:
-        - $ref: '#/components/parameters/prefix'
-        - $ref: '#/components/parameters/namespace'
         - $ref: '#/components/parameters/data-access'
       requestBody:
         required: true
@@ -938,9 +942,6 @@ paths:
         for table requests. Otherwise, a token may be passed using a RFC 8693 
token type as a configuration
         key. For example, "urn:ietf:params:oauth:token-type:jwt=<JWT-token>".
       parameters:
-        - $ref: '#/components/parameters/prefix'
-        - $ref: '#/components/parameters/namespace'
-        - $ref: '#/components/parameters/table'
         - $ref: '#/components/parameters/data-access'
         - name: If-None-Match
           in: header
@@ -1455,8 +1456,6 @@ paths:
       description: Return all view identifiers under this namespace
       operationId: listViews
       parameters:
-        - $ref: '#/components/parameters/prefix'
-        - $ref: '#/components/parameters/namespace'
         - $ref: '#/components/parameters/page-token'
         - $ref: '#/components/parameters/page-size'
       responses:
@@ -2393,6 +2392,25 @@ components:
           items:
             $ref: '#/components/schemas/SortField'
 
+    EncryptedKey:
+      type: object
+      required:
+        - key-id
+        - encrypted-key-metadata
+      properties:
+        key-id:
+          type: string
+        encrypted-key-metadata:
+          type: string
+          format: byte # for compatibility
+          contentEncoding: base64
+        encrypted-by-id:
+          type: string
+        properties:
+          type: object
+          additionalProperties:
+            type: string
+
     Snapshot:
       type: object
       required:
@@ -2416,6 +2434,10 @@ components:
         manifest-list:
           type: string
           description: Location of the snapshot's manifest list file
+        first-row-id:
+          type: integer
+          format: int64
+          description: The first _row_id assigned to the first row in the 
first data file in the first manifest
         summary:
           type: object
           required:
@@ -2493,7 +2515,7 @@ components:
         format-version:
           type: integer
           minimum: 1
-          maximum: 2
+          maximum: 3
         table-uuid:
           type: string
         location:
@@ -2501,6 +2523,10 @@ components:
         last-updated-ms:
           type: integer
           format: int64
+        next-row-id:
+          type: integer
+          format: int64
+          description: A long higher than all assigned row IDs; the next 
snapshot's first-row-id.
         properties:
           type: object
           additionalProperties:
@@ -2530,6 +2556,11 @@ components:
             $ref: '#/components/schemas/SortOrder'
         default-sort-order-id:
           type: integer
+        # encryption
+        encryption-keys:
+          type: array
+          items:
+            $ref: '#/components/schemas/EncryptedKey'
         # snapshot tracking
         snapshots:
           type: array
@@ -2683,7 +2714,9 @@ components:
           set-partition-statistics: 
'#/components/schemas/SetPartitionStatisticsUpdate'
           remove-partition-statistics: 
'#/components/schemas/RemovePartitionStatisticsUpdate'
           remove-partition-specs: 
'#/components/schemas/RemovePartitionSpecsUpdate'
-          enable-row-lineage: '#/components/schemas/EnableRowLineageUpdate'
+          remove-schemas: '#/components/schemas/RemoveSchemasUpdate'
+          add-encryption-key: '#/components/schemas/AddEncryptionKeyUpdate'
+          remove-encryption-key: 
'#/components/schemas/RemoveEncryptionKeyUpdate'
       type: object
       required:
         - action
@@ -2988,14 +3021,43 @@ components:
           items:
             type: integer
 
-    # Disabling Row Lineage is Forbidden
-    EnableRowLineageUpdate:
+    RemoveSchemasUpdate:
       allOf:
         - $ref: '#/components/schemas/BaseUpdate'
+      required:
+        - schema-ids
       properties:
         action:
           type: string
-          const: "enable-row-lineage"
+          const: "remove-schemas"
+        schema-ids:
+          type: array
+          items:
+            type: integer
+
+    AddEncryptionKeyUpdate:
+      allOf:
+        - $ref: '#/components/schemas/BaseUpdate'
+      required:
+        - encryption-key
+      properties:
+        action:
+          type: string
+          const: "add-encryption-key"
+        encryption-key:
+          $ref: '#/components/schemas/EncryptedKey'
+
+    RemoveEncryptionKeyUpdate:
+      allOf:
+        - $ref: '#/components/schemas/BaseUpdate'
+      required:
+        - key-id
+      properties:
+        action:
+          type: string
+          const: "remove-encryption-key"
+        key-id:
+          type: string
 
     TableUpdate:
       anyOf:
@@ -3017,7 +3079,9 @@ components:
         - $ref: '#/components/schemas/SetStatisticsUpdate'
         - $ref: '#/components/schemas/RemoveStatisticsUpdate'
         - $ref: '#/components/schemas/RemovePartitionSpecsUpdate'
-        - $ref: '#/components/schemas/EnableRowLineageUpdate'
+        - $ref: '#/components/schemas/RemoveSchemasUpdate'
+        - $ref: '#/components/schemas/AddEncryptionKeyUpdate'
+        - $ref: '#/components/schemas/RemoveEncryptionKeyUpdate'
 
     ViewUpdate:
       anyOf:
@@ -3076,9 +3140,10 @@ components:
           type: string
 
     AssertRefSnapshotId:
-      description:
-        The table branch or tag identified by the requirement's `ref` must 
reference the requirement's `snapshot-id`;
-        if `snapshot-id` is `null` or missing, the ref must not already exist
+      description: |
+        The table branch or tag identified by the requirement's `ref` must 
reference the requirement's `snapshot-id`.
+        The `snapshot-id` field is required in this object, but in the case of 
a `null`
+        the ref must not already exist.
       allOf:
         - $ref: '#/components/schemas/TableRequirement'
       required:
@@ -3093,6 +3158,7 @@ components:
         snapshot-id:
           type: integer
           format: int64
+          nullable: true
 
     AssertLastAssignedFieldId:
       description:
@@ -3249,6 +3315,7 @@ components:
         metadata-location:
           type: string
           description: May be null if the table is staged as part of a 
transaction
+          nullable: true
         metadata:
           $ref: '#/components/schemas/TableMetadata'
         config:
@@ -3473,6 +3540,10 @@ components:
           type: string
         metadata-location:
           type: string
+        overwrite:
+          description: Whether to overwrite table metadata if the table 
already exists
+          type: boolean
+          default: false
 
     CreateViewRequest:
       type: object
@@ -4243,6 +4314,10 @@ components:
         content:
           type: string
           const: "data"
+        first-row-id:
+          type: integer
+          format: int64
+          description: "The first row ID assigned to the first row in the data 
file"
         column-sizes:
           allOf:
             - $ref: '#/components/schemas/CountMap'
@@ -4452,7 +4527,9 @@ components:
     #  The fields `message` and `type` as indicated here are not presently 
prescriptive.
     UnauthorizedResponse:
       description:
-        Unauthorized. Authentication is required and has failed or has not yet 
been provided.
+        Unauthorized. The REST Catalog SHOULD respond with the 401 
UnauthorizedResponse when
+        the access token provided is expired, revoked, malformed, or invalid 
for other reasons.
+        The client MAY request a new access token and retry the request.
       content:
         application/json:
           schema:
@@ -4560,7 +4637,9 @@ components:
 
     AuthenticationTimeoutResponse:
       description:
-        Credentials have timed out. If possible, the client should refresh 
credentials and retry.
+        This is an optional status response type that the REST Catalog can 
issue when the
+        token has expired. The client MAY request a new access token and retry 
the request.
+        401 UnauthorizedResponse SHOULD be preferred over this response type 
on token expiry.
       content:
         application/json:
           schema:
@@ -4575,10 +4654,10 @@ components:
 
     ServiceUnavailableResponse:
       description:
-        The service is not ready to handle the request. The client should wait 
and retry.
+        The service is not ready to handle the request, request could have 
been partially processed.
 
-
-        The service may additionally send a Retry-After header to indicate 
when to retry.
+        The service may additionally send a Retry-After header to indicate 
when to retry, a non idempotent
+        request should only be retried by the client when the Retry-After 
header is present.
       content:
         application/json:
           schema:
@@ -4725,7 +4804,7 @@ components:
       value: "accounting%1Ftax"
 
     NamespaceAsPathVariable:
-      summary: A single part namespace, as represented in a path paremeter
+      summary: A single part namespace, as represented in a path parameter
       value: "accounting"
 
     NamespaceAlreadyExistsError:
@@ -4788,6 +4867,16 @@ components:
         }
       }
 
+    NamespaceNotEmptyError:
+      summary: The requested namespace is not empty
+      value: {
+        "error": {
+          "message": "The given namespace is not empty",
+          "type": "NamespaceNotEmptyException",
+          "code": 409
+        }
+      }
+
     RenameTableSameNamespace:
       summary: Rename a table in the same namespace
       value: {

Reply via email to