anais-source opened a new issue, #7068:
URL: https://github.com/apache/paimon/issues/7068

   ### Description
   
   When using Paimon 1.3.1 with Iceberg REST export, a partitioned Paimon table 
generates Iceberg metadata with:
   
   - spec-id = 0 (empty)
   - spec-id = 1 (partitioned)
   - while default-spec-id remains 0.
   
   As a result, Iceberg readers interpret the table as unpartitioned, and the 
presence of multiple specs introduces partition evolution even for a freshly 
created table.
   
   This behavior blocks downstream systems such as StarRocks from creating 
partitioned materialized views, as StarRocks rejects Iceberg tables that expose 
partition evolution.
   
   ### Environment
   - Paimon: 1.3.1
   - Flink: 2.2
   - Gravitino REST: 1.1.0
   - S3-compatible storage
   - Iceberg REST catalog
   
   ### Minimal reproduction
   **1) Create a Paimon table with Iceberg REST export:**
   
   ```
   CREATE TABLE analytics.test_paimon_bug (
     id BIGINT,
     time_day DATE,
     PRIMARY KEY (id, time_day) NOT ENFORCED
   )
   PARTITIONED BY (time_day)
   WITH (
     'bucket' = '1',
     'metadata.iceberg.storage' = 'rest-catalog',
     'metadata.iceberg.rest.uri' = 'http://<gravitino>/iceberg',
     'metadata.iceberg.rest.warehouse' = 'icebergCatalog',
     'metadata.iceberg.rest.clients' = '1'
   );
   ```
   
   ```
   INSERT INTO analytics.test_paimon_bug VALUES
     (1, DATE '2026-01-16'),
     (2, DATE '2026-01-17');
   ```
   
   **2) Check Iceberg metadata via REST:**
   
   `GET /iceberg/v1/icebergCatalog/namespaces/analytics/tables/test_paimon_bug`
   **Output (trimmed)**
   ```
   {
     "default_spec": 0,
     "specs": [
       {
         "spec-id": 0,
         "fields": []
       },
       {
         "spec-id": 1,
         "fields": [
           {
             "name": "time_day",
             "transform": "identity",
             "source-id": 1,
             "field-id": 1000
           }
         ]
       }
     ]
   }
   ```
   
   
   **Expected**
   - One partition spec with `time_day`
   - `default-spec-id` pointing to that spec
   - No partition evolution on a fresh table
   
   **Actual**
   - `default-spec-id = 0`
   - `spec-id = 0` empty
   - `spec-id = 1` with `time_day`
   
   ### Additional context
   
   This issue does not appear to be related to Gravitino or the Iceberg REST 
catalog itself.
   
   When creating an Iceberg-native table directly in the same Gravitino Iceberg 
REST catalog (using the same storage and catalog configuration):
   
   ```
   {
     "default_spec": 0,
     "specs": [
       {
         "spec-id": 0,
         "fields": [
           {
             "name": "time_day",
             "transform": "identity",
             "source-id": 2,
             "field-id": 1000
           }
         ]
       }
     ]
   }
   ```
   
   - The table is created with a single partition spec
   - `default-spec-id` correctly points to the partitioned spec
   - No partition evolution is present
   
   This indicates that the dual-spec metadata (empty spec-id=0 + partitioned 
spec-id=1 with default-spec-id=0) is produced at table creation time by 
Paimon’s Iceberg export.
   
   ### Possible cause
   
   It appears that Paimon initializes Iceberg tables with an empty default 
partition spec (spec-id=0), and then adds the partitioned spec as spec-id=1 
without updating `default-spec-id`.
   
   ### Question
   
   Is it possible for Paimon to:
   - initialize the table directly with the partitioned spec as the default 
spec, or
   - set `default-spec-id` to the partitioned spec at creation time to avoid 
partition evolution?
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to