From 0a216401d007a77829730714e9f66590fb25c808 Mon Sep 17 00:00:00 2001 From: Eduard Tudenhoefner Date: Tue, 23 Apr 2024 16:46:24 +0200 Subject: [PATCH] Core: Assign fresh IDs to view schema --- .../iceberg/rest/RESTSessionCatalog.java | 10 +++ .../view/BaseMetastoreViewCatalog.java | 10 +++ .../iceberg/view/ViewVersionReplace.java | 8 +++ .../apache/iceberg/view/ViewCatalogTests.java | 61 +++++++++++++------ 4 files changed, 70 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/org/apache/iceberg/rest/RESTSessionCatalog.java b/core/src/main/java/org/apache/iceberg/rest/RESTSessionCatalog.java index 94f3057f9fe7..223c0f859ae6 100644 --- a/core/src/main/java/org/apache/iceberg/rest/RESTSessionCatalog.java +++ b/core/src/main/java/org/apache/iceberg/rest/RESTSessionCatalog.java @@ -32,6 +32,7 @@ import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; @@ -92,6 +93,7 @@ import org.apache.iceberg.rest.responses.LoadViewResponse; import org.apache.iceberg.rest.responses.OAuthTokenResponse; import org.apache.iceberg.rest.responses.UpdateNamespacePropertiesResponse; +import org.apache.iceberg.types.TypeUtil; import org.apache.iceberg.util.EnvironmentUtil; import org.apache.iceberg.util.Pair; import org.apache.iceberg.util.PropertyUtil; @@ -1185,6 +1187,8 @@ public View create() { Preconditions.checkState( null != defaultNamespace, "Cannot create view without specifying a default namespace"); + schema = TypeUtil.assignFreshIds(schema, new AtomicInteger(0)::incrementAndGet); + ViewVersion viewVersion = ImmutableViewVersion.builder() .versionId(1) @@ -1262,6 +1266,12 @@ private View replace(LoadViewResponse response) { .max(Integer::compareTo) .orElseGet(metadata::currentVersionId); + schema = + TypeUtil.assignFreshIds( + schema, + metadata.schema(), + new AtomicInteger(metadata.schema().highestFieldId())::incrementAndGet); + ViewVersion viewVersion = ImmutableViewVersion.builder() .versionId(maxVersionId + 1) diff --git a/core/src/main/java/org/apache/iceberg/view/BaseMetastoreViewCatalog.java b/core/src/main/java/org/apache/iceberg/view/BaseMetastoreViewCatalog.java index 6e2d6ff5e864..89af4138c07d 100644 --- a/core/src/main/java/org/apache/iceberg/view/BaseMetastoreViewCatalog.java +++ b/core/src/main/java/org/apache/iceberg/view/BaseMetastoreViewCatalog.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.iceberg.BaseMetastoreCatalog; import org.apache.iceberg.EnvironmentContext; import org.apache.iceberg.Schema; @@ -33,6 +34,7 @@ import org.apache.iceberg.relocated.com.google.common.base.Preconditions; import org.apache.iceberg.relocated.com.google.common.collect.Lists; import org.apache.iceberg.relocated.com.google.common.collect.Maps; +import org.apache.iceberg.types.TypeUtil; public abstract class BaseMetastoreViewCatalog extends BaseMetastoreCatalog implements ViewCatalog { protected abstract ViewOperations newViewOps(TableIdentifier identifier); @@ -155,6 +157,8 @@ private View create(ViewOperations ops) { Preconditions.checkState( null != defaultNamespace, "Cannot create view without specifying a default namespace"); + schema = TypeUtil.assignFreshIds(schema, new AtomicInteger(0)::incrementAndGet); + ViewVersion viewVersion = ImmutableViewVersion.builder() .versionId(1) @@ -204,6 +208,12 @@ private View replace(ViewOperations ops) { .max(Integer::compareTo) .orElseGet(metadata::currentVersionId); + schema = + TypeUtil.assignFreshIds( + schema, + metadata.schema(), + new AtomicInteger(metadata.schema().highestFieldId())::incrementAndGet); + ViewVersion viewVersion = ImmutableViewVersion.builder() .versionId(maxVersionId + 1) diff --git a/core/src/main/java/org/apache/iceberg/view/ViewVersionReplace.java b/core/src/main/java/org/apache/iceberg/view/ViewVersionReplace.java index 8b3d087940a5..0ddf42c6e981 100644 --- a/core/src/main/java/org/apache/iceberg/view/ViewVersionReplace.java +++ b/core/src/main/java/org/apache/iceberg/view/ViewVersionReplace.java @@ -28,12 +28,14 @@ import static org.apache.iceberg.TableProperties.COMMIT_TOTAL_RETRY_TIME_MS_DEFAULT; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.iceberg.EnvironmentContext; import org.apache.iceberg.Schema; import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.exceptions.CommitFailedException; import org.apache.iceberg.relocated.com.google.common.base.Preconditions; import org.apache.iceberg.relocated.com.google.common.collect.Lists; +import org.apache.iceberg.types.TypeUtil; import org.apache.iceberg.util.PropertyUtil; import org.apache.iceberg.util.Tasks; @@ -71,6 +73,12 @@ ViewMetadata internalApply() { .max(Integer::compareTo) .orElseGet(viewVersion::versionId); + schema = + TypeUtil.assignFreshIds( + schema, + base.schema(), + new AtomicInteger(base.schema().highestFieldId())::incrementAndGet); + ViewVersion newVersion = ImmutableViewVersion.builder() .versionId(maxVersionId + 1) diff --git a/core/src/test/java/org/apache/iceberg/view/ViewCatalogTests.java b/core/src/test/java/org/apache/iceberg/view/ViewCatalogTests.java index b3765bb1eae7..3c128d70c29d 100644 --- a/core/src/test/java/org/apache/iceberg/view/ViewCatalogTests.java +++ b/core/src/test/java/org/apache/iceberg/view/ViewCatalogTests.java @@ -52,9 +52,20 @@ public abstract class ViewCatalogTests