diff --git a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java index 80cabab937..c375180b93 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java @@ -81,6 +81,8 @@ import org.apache.iceberg.util.PropertyUtil; import org.apache.iceberg.util.Tasks; import org.apache.iceberg.view.BaseMetastoreViewCatalog; +import org.apache.iceberg.view.BaseView; +import org.apache.iceberg.view.View; import org.apache.iceberg.view.ViewBuilder; import org.apache.iceberg.view.ViewMetadata; import org.apache.iceberg.view.ViewMetadataParser; @@ -810,6 +812,24 @@ protected ViewOperations newViewOps(TableIdentifier identifier) { return new BasePolarisViewOperations(catalogFileIO, identifier); } + /** + * Override to fix a bug in {@link BaseMetastoreViewCatalog#loadView} where {@link #newViewOps} is + * called twice, causing redundant metadata fetches. This implementation reuses the same {@link + * ViewOperations} instance. + */ + @Override + public View loadView(TableIdentifier identifier) { + if (isValidIdentifier(identifier)) { + ViewOperations ops = newViewOps(identifier); + if (ops.current() == null) { + throw new NoSuchViewException("View does not exist: %s", identifier); + } + return new BaseView(ops, ViewUtil.fullViewName(name(), identifier)); + } + + throw new NoSuchViewException("Invalid view identifier: %s", identifier); + } + @Override public boolean dropView(TableIdentifier identifier) { boolean purge =