diff --git a/lib/trino-filesystem/src/main/java/io/trino/filesystem/Locations.java b/lib/trino-filesystem/src/main/java/io/trino/filesystem/Locations.java index 0b2a65d4d399..14cab3113653 100644 --- a/lib/trino-filesystem/src/main/java/io/trino/filesystem/Locations.java +++ b/lib/trino-filesystem/src/main/java/io/trino/filesystem/Locations.java @@ -17,7 +17,7 @@ public final class Locations { - private static final Pattern S3_TABLES = Pattern.compile("s3://(?!.*/).*--table-s3"); + private static final Pattern S3_TABLES = Pattern.compile("s3://[^/]*--table-s3(?:/.*)?"); private Locations() {} diff --git a/lib/trino-filesystem/src/test/java/io/trino/filesystem/TestLocations.java b/lib/trino-filesystem/src/test/java/io/trino/filesystem/TestLocations.java index f423fe5841c7..9265e3a018d4 100644 --- a/lib/trino-filesystem/src/test/java/io/trino/filesystem/TestLocations.java +++ b/lib/trino-filesystem/src/test/java/io/trino/filesystem/TestLocations.java @@ -85,9 +85,9 @@ void testIsS3Tables() { assertThat(Locations.isS3Tables("s3://e97725d9-dbfb-4334-784sox7edps35ncq16arh546frqa1use2b--table-s3")).isTrue(); assertThat(Locations.isS3Tables("s3://75fed916-b871-4909-mx9t6iohbseks57q16e5y6nf1c8gguse2b--table-s3")).isTrue(); + assertThat(Locations.isS3Tables("s3://e97725d9-dbfb-4334-784sox7edps35ncq16arh546frqa1use2b--table-s3/")).isTrue(); + assertThat(Locations.isS3Tables("s3://75fed916-b871-4909-mx9t6iohbseks57q16e5y6nf1c8gguse2b--table-s3/")).isTrue(); - assertThat(Locations.isS3Tables("s3://e97725d9-dbfb-4334-784sox7edps35ncq16arh546frqa1use2b--table-s3/")).isFalse(); - assertThat(Locations.isS3Tables("s3://75fed916-b871-4909-mx9t6iohbseks57q16e5y6nf1c8gguse2b--table-s3/")).isFalse(); assertThat(Locations.isS3Tables("s3://75fed916-b871-4909/mx9t6iohbseks57q16e5y6nf1c8gguse2b--table-s3")).isFalse(); assertThat(Locations.isS3Tables("s3://test-bucket")).isFalse(); assertThat(Locations.isS3Tables("s3://test-bucket/default")).isFalse(); diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java index 9934da4711ee..db55693704f3 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java @@ -34,6 +34,7 @@ import io.trino.filesystem.FileEntry; import io.trino.filesystem.FileIterator; import io.trino.filesystem.Location; +import io.trino.filesystem.Locations; import io.trino.filesystem.TrinoFileSystem; import io.trino.metastore.Column; import io.trino.metastore.HiveMetastore; @@ -49,6 +50,7 @@ import io.trino.plugin.iceberg.aggregation.DataSketchStateSerializer; import io.trino.plugin.iceberg.aggregation.IcebergThetaSketchForStats; import io.trino.plugin.iceberg.catalog.TrinoCatalog; +import io.trino.plugin.iceberg.catalog.rest.TrinoRestCatalog; import io.trino.plugin.iceberg.functions.IcebergFunctionProvider; import io.trino.plugin.iceberg.procedure.IcebergAddFilesFromTableHandle; import io.trino.plugin.iceberg.procedure.IcebergAddFilesHandle; @@ -249,7 +251,6 @@ import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.common.collect.Maps.transformValues; import static com.google.common.collect.Sets.difference; -import static io.trino.filesystem.Locations.isS3Tables; import static io.trino.plugin.base.filter.UtcConstraintExtractor.extractTupleDomain; import static io.trino.plugin.base.projection.ApplyProjectionUtil.extractSupportedProjectedColumns; import static io.trino.plugin.base.projection.ApplyProjectionUtil.replaceWithNewVariables; @@ -1304,13 +1305,13 @@ public ConnectorOutputTableHandle beginCreateTable(ConnectorSession session, Con if (tableLocation == null) { tableLocation = getTableLocation(tableMetadata.getProperties()) - .orElseGet(() -> catalog.defaultTableLocation(session, tableMetadata.getTable())); + .orElseGet(() -> catalog.defaultTableLocation(session, tableMetadata.getTable()).orElse(null)); } transaction = newCreateTableTransaction(catalog, tableMetadata, session, replace, tableLocation, allowedExtraProperties); Location location = Location.of(transaction.table().location()); try { // S3 Tables internally assigns a unique location for each table - if (!isS3Tables(location.toString())) { + if (!Locations.isS3Tables(location.toString())) { TrinoFileSystem fileSystem = fileSystemFactory.create(session.getIdentity(), transaction.table().io().properties()); if (!replace && fileSystem.listFiles(location).hasNext()) { throw new TrinoException(ICEBERG_FILESYSTEM_ERROR, format("" + @@ -1527,10 +1528,7 @@ public Optional finishInsert( appendFiles.scanManifestsWith(icebergScanExecutor); commitUpdate(appendFiles, session, "insert"); - if (isS3Tables(icebergTable.location())) { - log.debug("S3 Tables do not support statistics: %s", table.name()); - } - else if (!computedStatistics.isEmpty()) { + if (!computedStatistics.isEmpty()) { long newSnapshotId = icebergTable.currentSnapshot().snapshotId(); CollectedStatistics collectedStatistics = processComputedTableStatistics(icebergTable, computedStatistics); @@ -2874,6 +2872,11 @@ public TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(Connector return TableStatisticsMetadata.empty(); } + if (isS3Tables()) { + // S3 Tables throw "Malformed request: Cannot parse missing field: statistics" error when we try to commit extended statistics + return TableStatisticsMetadata.empty(); + } + if (tableReplace) { return getStatisticsCollectionMetadata(tableMetadata, Optional.empty(), availableColumnNames -> {}); } @@ -2922,6 +2925,10 @@ public ConnectorAnalyzeMetadata getStatisticsCollectionMetadata(ConnectorSession IcebergSessionProperties.EXTENDED_STATISTICS_ENABLED)); } + if (isS3Tables()) { + throw new TrinoException(NOT_SUPPORTED, "S3 Tables do not support analyze"); + } + checkArgument(handle.getTableType() == DATA, "Cannot analyze non-DATA table: %s", handle.getTableType()); if (handle.getSnapshotId().isEmpty()) { @@ -2987,9 +2994,6 @@ public ConnectorTableHandle beginStatisticsCollection(ConnectorSession session, { IcebergTableHandle handle = (IcebergTableHandle) tableHandle; Table icebergTable = catalog.loadTable(session, handle.getSchemaTableName()); - if (isS3Tables(icebergTable.location())) { - throw new TrinoException(NOT_SUPPORTED, "S3 Tables do not support analyze"); - } beginTransaction(icebergTable); return handle; } @@ -4043,6 +4047,11 @@ public WriterScalingOptions getInsertWriterScalingOptions(ConnectorSession sessi return WriterScalingOptions.ENABLED; } + private boolean isS3Tables() + { + return catalog instanceof TrinoRestCatalog restCatalog && restCatalog.isS3Tables(); + } + public Optional getIncrementalRefreshFromSnapshot() { return fromSnapshotForRefresh; diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/AbstractTrinoCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/AbstractTrinoCatalog.java index 6bbbd92bb2fa..89afdf1cffbd 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/AbstractTrinoCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/AbstractTrinoCatalog.java @@ -306,7 +306,7 @@ protected Location createMaterializedViewStorage( } SchemaTableName storageTableName = new SchemaTableName(viewName.getSchemaName(), tableNameWithType(viewName.getTableName(), MATERIALIZED_VIEW_STORAGE)); String tableLocation = getTableLocation(materializedViewProperties) - .orElseGet(() -> defaultTableLocation(session, viewName)); + .orElseGet(() -> defaultTableLocation(session, viewName).orElse(null)); List columns = columnsForMaterializedView(definition, materializedViewProperties); Schema schema = schemaFromMetadata(columns); @@ -349,7 +349,7 @@ protected SchemaTableName createMaterializedViewStorageTable( ConnectorTableMetadata tableMetadata = new ConnectorTableMetadata(storageTable, columns, materializedViewProperties, Optional.empty()); String tableLocation = getTableLocation(tableMetadata.getProperties()) - .orElseGet(() -> defaultTableLocation(session, tableMetadata.getTable())); + .orElseGet(() -> defaultTableLocation(session, tableMetadata.getTable()).orElse(null)); Transaction transaction = IcebergUtil.newCreateTableTransaction(this, tableMetadata, session, false, tableLocation, _ -> false); AppendFiles appendFiles = transaction.newAppend(); commit(appendFiles, session); diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/TrinoCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/TrinoCatalog.java index 823c8b8f9d79..2c1fdc40c607 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/TrinoCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/TrinoCatalog.java @@ -26,7 +26,6 @@ import io.trino.spi.connector.SchemaTableName; import io.trino.spi.metrics.Metrics; import io.trino.spi.security.TrinoPrincipal; -import jakarta.annotation.Nullable; import org.apache.iceberg.BaseTable; import org.apache.iceberg.PartitionSpec; import org.apache.iceberg.Schema; @@ -161,8 +160,7 @@ Transaction newCreateOrReplaceTableTransaction( void updateViewColumnComment(ConnectorSession session, SchemaTableName schemaViewName, String columnName, Optional comment); - @Nullable - String defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName); + Optional defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName); void setTablePrincipal(ConnectorSession session, SchemaTableName schemaTableName, TrinoPrincipal principal); diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/TrinoGlueCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/TrinoGlueCatalog.java index 76bef165c41b..1948edd03cd8 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/TrinoGlueCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/glue/TrinoGlueCatalog.java @@ -919,7 +919,7 @@ else if (isTrinoView(tableType, parameters) && !viewCache.asMap().containsKey(sc } @Override - public String defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) + public Optional defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) { String databaseLocation = stats.getGetDatabase().call(() -> glueClient.getDatabase(x -> x.name(schemaTableName.getSchemaName())) @@ -940,7 +940,7 @@ public String defaultTableLocation(ConnectorSession session, SchemaTableName sch databaseLocation = appendPath(defaultSchemaLocation.get(), schemaDirectoryName); } - return appendPath(databaseLocation, tableName); + return Optional.of(appendPath(databaseLocation, tableName)); } @Override diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java index 8ad6a2d0e79d..3200b07144a3 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java @@ -507,14 +507,14 @@ public void updateViewColumnComment(ConnectorSession session, SchemaTableName vi } @Override - public String defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) + public Optional defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) { Database database = metastore.getDatabase(schemaTableName.getSchemaName()) .orElseThrow(() -> new SchemaNotFoundException(schemaTableName.getSchemaName())); String tableNameForLocation = createNewTableName(schemaTableName.getTableName()); String location = database.getLocation().orElseThrow(() -> new TrinoException(HIVE_DATABASE_LOCATION_ERROR, format("Database '%s' location is not set", schemaTableName.getSchemaName()))); - return appendPath(location, tableNameForLocation); + return Optional.of(appendPath(location, tableNameForLocation)); } @Override diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/jdbc/TrinoJdbcCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/jdbc/TrinoJdbcCatalog.java index 5e05f3abbbac..a5db51518382 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/jdbc/TrinoJdbcCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/jdbc/TrinoJdbcCatalog.java @@ -436,7 +436,7 @@ public void updateViewColumnComment(ConnectorSession session, SchemaTableName sc } @Override - public String defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) + public Optional defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) { Namespace namespace = Namespace.of(schemaTableName.getSchemaName()); String tableName = createNewTableName(schemaTableName.getTableName()); @@ -449,7 +449,7 @@ public String defaultTableLocation(ConnectorSession session, SchemaTableName sch String schemaLocation = databaseLocation.orElseGet(() -> appendPath(defaultWarehouseDir, schemaTableName.getSchemaName())); - return appendPath(schemaLocation, tableName); + return Optional.of(appendPath(schemaLocation, tableName)); } @Override @@ -471,7 +471,7 @@ public void createView(ConnectorSession session, SchemaTableName schemaViewName, .withDefaultNamespace(Namespace.of(schemaViewName.getSchemaName())) .withDefaultCatalog(definition.getCatalog().orElse(null)) .withProperties(properties.buildOrThrow()) - .withLocation(defaultTableLocation(session, schemaViewName)); + .withLocation(defaultTableLocation(session, schemaViewName).orElseThrow()); if (replace) { viewBuilder.createOrReplace(); diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/nessie/TrinoNessieCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/nessie/TrinoNessieCatalog.java index a18b0ac436eb..1f6c93a37b43 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/nessie/TrinoNessieCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/nessie/TrinoNessieCatalog.java @@ -326,7 +326,7 @@ public void unregisterTable(ConnectorSession session, SchemaTableName tableName) } @Override - public String defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) + public Optional defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) { Optional databaseLocation = Optional.empty(); if (namespaceExists(session, schemaTableName.getSchemaName())) { @@ -336,7 +336,7 @@ public String defaultTableLocation(ConnectorSession session, SchemaTableName sch String schemaLocation = databaseLocation.orElseGet(() -> appendPath(warehouseLocation, schemaTableName.getSchemaName())); - return appendPath(schemaLocation, createNewTableName(schemaTableName.getTableName())); + return Optional.of(appendPath(schemaLocation, createNewTableName(schemaTableName.getTableName()))); } @Override diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/rest/TrinoRestCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/rest/TrinoRestCatalog.java index 751dd20fe41d..16edc8b8499b 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/rest/TrinoRestCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/rest/TrinoRestCatalog.java @@ -45,6 +45,7 @@ import io.trino.spi.security.TrinoPrincipal; import io.trino.spi.type.TypeManager; import org.apache.iceberg.BaseTable; +import org.apache.iceberg.CatalogProperties; import org.apache.iceberg.PartitionSpec; import org.apache.iceberg.Schema; import org.apache.iceberg.SortOrder; @@ -575,7 +576,7 @@ public void updateTableComment(ConnectorSession session, SchemaTableName schemaT } @Override - public String defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) + public Optional defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) { String tableName = createLocationForTable(schemaTableName.getTableName()); @@ -584,10 +585,10 @@ public String defaultTableLocation(ConnectorSession session, SchemaTableName sch if (databaseLocation == null) { // Iceberg REST catalog doesn't require location property. // S3 Tables doesn't return the property. - return null; + return Optional.empty(); } - return appendPath(databaseLocation, tableName); + return Optional.of(appendPath(databaseLocation, tableName)); } private String createLocationForTable(String baseTableName) @@ -618,7 +619,7 @@ public void createView(ConnectorSession session, SchemaTableName schemaViewName, .withDefaultNamespace(toRemoteNamespace(session, toNamespace(schemaViewName.getSchemaName()))) .withDefaultCatalog(definition.getCatalog().orElse(null)) .withProperties(properties.buildOrThrow()) - .withLocation(defaultTableLocation(session, schemaViewName)); + .withLocation(defaultTableLocation(session, schemaViewName).orElse(null)); try { if (replace) { viewBuilder.createOrReplace(); @@ -827,6 +828,12 @@ public void updateViewColumnComment(ConnectorSession session, SchemaTableName sc replaceViewVersion.commit(); } + public boolean isS3Tables() + { + String warehouse = restSessionCatalog.properties().get(CatalogProperties.WAREHOUSE_LOCATION); + return warehouse != null && warehouse.startsWith("s3tablescatalog/") && "sigv4".equals(restSessionCatalog.properties().get("rest.auth.type")); + } + private SessionCatalog.SessionContext convert(ConnectorSession session) { return switch (sessionType) { diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/snowflake/TrinoSnowflakeCatalog.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/snowflake/TrinoSnowflakeCatalog.java index c679a8f491f1..b7f9d5459aa3 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/snowflake/TrinoSnowflakeCatalog.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/snowflake/TrinoSnowflakeCatalog.java @@ -317,7 +317,7 @@ public void updateViewColumnComment(ConnectorSession session, SchemaTableName sc } @Override - public String defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) + public Optional defaultTableLocation(ConnectorSession session, SchemaTableName schemaTableName) { throw new TrinoException(NOT_SUPPORTED, "Snowflake managed Iceberg tables do not support modifications"); } diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/IcebergQueryRunner.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/IcebergQueryRunner.java index cd53c9b39888..5b4fa2a9b034 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/IcebergQueryRunner.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/IcebergQueryRunner.java @@ -50,6 +50,7 @@ import static io.trino.plugin.iceberg.catalog.jdbc.TestingIcebergJdbcServer.PASSWORD; import static io.trino.plugin.iceberg.catalog.jdbc.TestingIcebergJdbcServer.USER; import static io.trino.plugin.iceberg.catalog.rest.RestCatalogTestUtils.backendCatalog; +import static io.trino.testing.SystemEnvironmentUtils.requireEnv; import static io.trino.testing.TestingProperties.requiredNonEmptySystemProperty; import static io.trino.testing.TestingSession.testSessionBuilder; import static io.trino.testing.containers.Minio.MINIO_ACCESS_KEY; @@ -284,6 +285,34 @@ static void main() } } + public static final class IcebergS3TablesQueryRunnerMain + { + private IcebergS3TablesQueryRunnerMain() {} + + static void main() + throws Exception + { + @SuppressWarnings("resource") + QueryRunner queryRunner = IcebergQueryRunner.builder("tpch") + .addCoordinatorProperty("http-server.http.port", "8080") + .addIcebergProperty("iceberg.catalog.type", "rest") + .addIcebergProperty("iceberg.rest-catalog.uri", "https://glue.%s.amazonaws.com/iceberg".formatted(requireEnv("AWS_REGION"))) + .addIcebergProperty("iceberg.rest-catalog.warehouse", "s3tablescatalog/" + requireEnv("S3_TABLES_BUCKET")) + .addIcebergProperty("iceberg.rest-catalog.view-endpoints-enabled", "false") + .addIcebergProperty("iceberg.rest-catalog.security", "sigv4") + .addIcebergProperty("iceberg.rest-catalog.signing-name", "glue") + .addIcebergProperty("fs.native-s3.enabled", "true") + .addIcebergProperty("s3.region", requireEnv("AWS_REGION")) + .addIcebergProperty("s3.aws-access-key", requireEnv("AWS_ACCESS_KEY_ID")) + .addIcebergProperty("s3.aws-secret-key", requireEnv("AWS_SECRET_ACCESS_KEY")) + .build(); + + Logger log = Logger.get(IcebergS3TablesQueryRunnerMain.class); + log.info("======== SERVER STARTED ========"); + log.info("\n====\n%s\n====", queryRunner.getCoordinator().getBaseUrl()); + } + } + public static final class IcebergExternalQueryRunnerMain { private IcebergExternalQueryRunnerMain() {} diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergV2.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergV2.java index 05cd1e7ec4d9..42917cb9055b 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergV2.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergV2.java @@ -1445,7 +1445,7 @@ void testHighlyNestedFields() new Schema(column), PartitionSpec.unpartitioned(), SortOrder.unsorted(), - Optional.ofNullable(catalog.defaultTableLocation(SESSION, schemaTableName)), + catalog.defaultTableLocation(SESSION, schemaTableName), ImmutableMap.of()) .commitTransaction(); @@ -1549,7 +1549,7 @@ void testAnalyzeNoSnapshot() new Schema(Types.NestedField.optional(1, "x", Types.LongType.get())), PartitionSpec.unpartitioned(), SortOrder.unsorted(), - Optional.ofNullable(catalog.defaultTableLocation(SESSION, schemaTableName)), + catalog.defaultTableLocation(SESSION, schemaTableName), ImmutableMap.of()) .commitTransaction(); diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/BaseTrinoCatalogTest.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/BaseTrinoCatalogTest.java index 6288a52f6b7a..5469fc11c418 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/BaseTrinoCatalogTest.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/BaseTrinoCatalogTest.java @@ -110,7 +110,7 @@ public void testCreateNamespaceWithLocation() catalog.createNamespace(SESSION, namespace, namespaceProperties, new TrinoPrincipal(PrincipalType.USER, SESSION.getUser())); assertThat(catalog.listNamespaces(SESSION)).contains(namespace); assertThat(catalog.loadNamespaceMetadata(SESSION, namespace)).isEqualTo(namespaceProperties); - assertThat(catalog.defaultTableLocation(SESSION, new SchemaTableName(namespace, "table"))).isEqualTo(namespaceLocation.replaceAll("/$", "") + "/table"); + assertThat(catalog.defaultTableLocation(SESSION, new SchemaTableName(namespace, "table"))).contains(namespaceLocation.replaceAll("/$", "") + "/table"); catalog.dropNamespace(SESSION, namespace); assertThat(catalog.listNamespaces(SESSION)).doesNotContain(namespace); } @@ -380,8 +380,8 @@ public void testUseUniqueTableLocations() catalog.createNamespace(SESSION, namespace, namespaceProperties, new TrinoPrincipal(PrincipalType.USER, SESSION.getUser())); try { - String location1 = catalog.defaultTableLocation(SESSION, schemaTableName); - String location2 = catalog.defaultTableLocation(SESSION, schemaTableName); + String location1 = catalog.defaultTableLocation(SESSION, schemaTableName).orElseThrow(); + String location2 = catalog.defaultTableLocation(SESSION, schemaTableName).orElseThrow(); assertThat(location1) .isNotEqualTo(location2); @@ -619,7 +619,7 @@ protected String arbitraryTableLocation(TrinoCatalog catalog, ConnectorSession s throws Exception { try { - return catalog.defaultTableLocation(session, schemaTableName); + return catalog.defaultTableLocation(session, schemaTableName).orElseThrow(); } catch (TrinoException e) { if (!e.getErrorCode().equals(HIVE_DATABASE_LOCATION_ERROR.toErrorCode())) { diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/glue/TestTrinoGlueCatalog.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/glue/TestTrinoGlueCatalog.java index b2c71e66174d..bdc7135c52ea 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/glue/TestTrinoGlueCatalog.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/glue/TestTrinoGlueCatalog.java @@ -257,7 +257,7 @@ public void testDefaultLocation() try { File expectedSchemaDirectory = new File(tmpDirectory.toFile(), namespace + ".db"); File expectedTableDirectory = new File(expectedSchemaDirectory, schemaTableName.getTableName()); - assertThat(catalogWithDefaultLocation.defaultTableLocation(SESSION, schemaTableName)).isEqualTo(expectedTableDirectory.toPath().toAbsolutePath().toString()); + assertThat(catalogWithDefaultLocation.defaultTableLocation(SESSION, schemaTableName)).contains(expectedTableDirectory.toPath().toAbsolutePath().toString()); } finally { try { diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/nessie/TestTrinoNessieCatalog.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/nessie/TestTrinoNessieCatalog.java index d9f5318e5b69..a80829907a75 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/nessie/TestTrinoNessieCatalog.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/catalog/nessie/TestTrinoNessieCatalog.java @@ -158,7 +158,7 @@ public void testDefaultLocation() File expectedSchemaDirectory = new File(tmpDirectory.toFile(), namespace); File expectedTableDirectory = new File(expectedSchemaDirectory, schemaTableName.getTableName()); assertThat(catalogWithDefaultLocation.defaultTableLocation(SESSION, schemaTableName)) - .isEqualTo(expectedTableDirectory.toPath().toAbsolutePath().toString()); + .contains(expectedTableDirectory.toPath().toAbsolutePath().toString()); } finally { catalogWithDefaultLocation.dropNamespace(SESSION, namespace); diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/procedure/TestIcebergOptimizeManifestsProcedure.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/procedure/TestIcebergOptimizeManifestsProcedure.java index 67a41d75f0e9..d7bfd6b37e6a 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/procedure/TestIcebergOptimizeManifestsProcedure.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/procedure/TestIcebergOptimizeManifestsProcedure.java @@ -31,7 +31,6 @@ import org.apache.iceberg.types.Types; import org.junit.jupiter.api.Test; -import java.util.Optional; import java.util.Set; import static com.google.common.collect.ImmutableSet.toImmutableSet; @@ -241,7 +240,7 @@ void testNoSnapshot() new Schema(Types.NestedField.required(1, "x", Types.LongType.get())), PartitionSpec.unpartitioned(), SortOrder.unsorted(), - Optional.ofNullable(catalog.defaultTableLocation(SESSION, tableName)), + catalog.defaultTableLocation(SESSION, tableName), ImmutableMap.of()) .commitTransaction(); assertThat(catalog.loadTable(SESSION, tableName).currentSnapshot()).isNull();