diff --git a/aws/src/main/java/org/apache/iceberg/aws/glue/GlueCatalog.java b/aws/src/main/java/org/apache/iceberg/aws/glue/GlueCatalog.java index fb4aac3f27e8..5bccea4c8cae 100644 --- a/aws/src/main/java/org/apache/iceberg/aws/glue/GlueCatalog.java +++ b/aws/src/main/java/org/apache/iceberg/aws/glue/GlueCatalog.java @@ -260,7 +260,8 @@ public void renameTable(TableIdentifier from, TableIdentifier to) { TableInput.Builder tableInputBuilder = TableInput.builder() .owner(fromTable.owner()) .tableType(fromTable.tableType()) - .parameters(fromTable.parameters()); + .parameters(fromTable.parameters()) + .storageDescriptor(fromTable.storageDescriptor()); glue.createTable(CreateTableRequest.builder() .catalogId(awsProperties.glueCatalogId()) diff --git a/aws/src/test/java/org/apache/iceberg/aws/glue/GlueCatalogTest.java b/aws/src/test/java/org/apache/iceberg/aws/glue/GlueCatalogTest.java index 669a73e30b5e..e085689a4000 100644 --- a/aws/src/test/java/org/apache/iceberg/aws/glue/GlueCatalogTest.java +++ b/aws/src/test/java/org/apache/iceberg/aws/glue/GlueCatalogTest.java @@ -43,6 +43,8 @@ import software.amazon.awssdk.services.glue.GlueClient; import software.amazon.awssdk.services.glue.model.CreateDatabaseRequest; import software.amazon.awssdk.services.glue.model.CreateDatabaseResponse; +import software.amazon.awssdk.services.glue.model.CreateTableRequest; +import software.amazon.awssdk.services.glue.model.CreateTableResponse; import software.amazon.awssdk.services.glue.model.Database; import software.amazon.awssdk.services.glue.model.DeleteDatabaseRequest; import software.amazon.awssdk.services.glue.model.DeleteDatabaseResponse; @@ -56,6 +58,7 @@ import software.amazon.awssdk.services.glue.model.GetTableResponse; import software.amazon.awssdk.services.glue.model.GetTablesRequest; import software.amazon.awssdk.services.glue.model.GetTablesResponse; +import software.amazon.awssdk.services.glue.model.StorageDescriptor; import software.amazon.awssdk.services.glue.model.Table; import software.amazon.awssdk.services.glue.model.UpdateDatabaseRequest; import software.amazon.awssdk.services.glue.model.UpdateDatabaseResponse; @@ -235,6 +238,47 @@ public Object answer(InvocationOnMock invocation) throws Throwable { Assert.assertEquals(0, counter.get()); } + @Test + public void renameTableWithStorageDescriptor() { + AtomicInteger counter = new AtomicInteger(1); + + Map parameters = new HashMap<>(); + parameters.put(BaseMetastoreTableOperations.TABLE_TYPE_PROP, + BaseMetastoreTableOperations.ICEBERG_TABLE_TYPE_VALUE); + + Map storageDescriptorParameters = new HashMap<>(); + storageDescriptorParameters.put("key_0", "value_0"); + + StorageDescriptor storageDescriptor = StorageDescriptor.builder().parameters(storageDescriptorParameters).build(); + + Mockito.doReturn(GetTableResponse.builder().table( + Table.builder() + .databaseName("db") + .name("t_renamed") + .parameters(parameters) + .storageDescriptor(storageDescriptor).build()).build() + ).when(glue).getTable(Mockito.any(GetTableRequest.class)); + Mockito.doReturn(GetTablesResponse.builder().build()) + .when(glue).getTables(Mockito.any(GetTablesRequest.class)); + Mockito.doReturn(GetDatabaseResponse.builder() + .database(Database.builder().name("db").build()).build()) + .when(glue).getDatabase(Mockito.any(GetDatabaseRequest.class)); + + Mockito.doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + CreateTableRequest createTableRequest = (CreateTableRequest) invocation.getArguments()[0]; + if (createTableRequest.tableInput().storageDescriptor().hasParameters()) { + counter.decrementAndGet(); + } + return CreateTableResponse.builder().build(); + } + }).when(glue).createTable(Mockito.any(CreateTableRequest.class)); + + glueCatalog.renameTable(TableIdentifier.of("db", "t"), TableIdentifier.of("db", "x_renamed")); + Assert.assertEquals(0, counter.get()); + } + @Test public void createNamespace() { Mockito.doReturn(CreateDatabaseResponse.builder().build())