From 8e9bdccf8e0409e38ffbc1120dd4bef0cac203df Mon Sep 17 00:00:00 2001 From: findinpath Date: Wed, 12 Jan 2022 10:45:09 +0100 Subject: [PATCH 1/2] Add redirection awareness to the table tasks --- .../main/java/io/trino/execution/AddColumnTask.java | 2 +- .../main/java/io/trino/execution/CommentTask.java | 2 +- .../main/java/io/trino/execution/DropTableTask.java | 2 +- .../java/io/trino/execution/RenameTableTask.java | 9 +++++++-- .../product/hive/TestHiveRedirectionToIceberg.java | 13 ++++++------- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/execution/AddColumnTask.java b/core/trino-main/src/main/java/io/trino/execution/AddColumnTask.java index c6993df95ea2..031fbb1e6393 100644 --- a/core/trino-main/src/main/java/io/trino/execution/AddColumnTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/AddColumnTask.java @@ -83,7 +83,7 @@ public ListenableFuture execute( { Session session = stateMachine.getSession(); QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getName()); - Optional tableHandle = plannerContext.getMetadata().getTableHandle(session, tableName); + Optional tableHandle = plannerContext.getMetadata().getRedirectionAwareTableHandle(session, tableName).getTableHandle(); if (tableHandle.isEmpty()) { if (!statement.isTableExists()) { throw semanticException(TABLE_NOT_FOUND, statement, "Table '%s' does not exist", tableName); diff --git a/core/trino-main/src/main/java/io/trino/execution/CommentTask.java b/core/trino-main/src/main/java/io/trino/execution/CommentTask.java index 1e482f350b91..8158606847b6 100644 --- a/core/trino-main/src/main/java/io/trino/execution/CommentTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/CommentTask.java @@ -70,7 +70,7 @@ public ListenableFuture execute( if (statement.getType() == Comment.Type.TABLE) { QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getName()); - Optional tableHandle = metadata.getTableHandle(session, tableName); + Optional tableHandle = metadata.getRedirectionAwareTableHandle(session, tableName).getTableHandle(); if (tableHandle.isEmpty()) { throw semanticException(TABLE_NOT_FOUND, statement, "Table does not exist: %s", tableName); } diff --git a/core/trino-main/src/main/java/io/trino/execution/DropTableTask.java b/core/trino-main/src/main/java/io/trino/execution/DropTableTask.java index 2b6b8bad049b..411535805301 100644 --- a/core/trino-main/src/main/java/io/trino/execution/DropTableTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/DropTableTask.java @@ -83,7 +83,7 @@ public ListenableFuture execute( return immediateVoidFuture(); } - Optional tableHandle = metadata.getTableHandle(session, tableName); + Optional tableHandle = metadata.getRedirectionAwareTableHandle(session, tableName).getTableHandle(); if (tableHandle.isEmpty()) { if (!statement.isExists()) { throw semanticException(TABLE_NOT_FOUND, statement, "Table '%s' does not exist", tableName); diff --git a/core/trino-main/src/main/java/io/trino/execution/RenameTableTask.java b/core/trino-main/src/main/java/io/trino/execution/RenameTableTask.java index 824cf85103da..b4bc0ef6bfcb 100644 --- a/core/trino-main/src/main/java/io/trino/execution/RenameTableTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/RenameTableTask.java @@ -18,6 +18,7 @@ import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; +import io.trino.metadata.RedirectionAwareTableHandle; import io.trino.metadata.TableHandle; import io.trino.security.AccessControl; import io.trino.sql.tree.Expression; @@ -86,7 +87,8 @@ public ListenableFuture execute( return immediateVoidFuture(); } - Optional tableHandle = metadata.getTableHandle(session, tableName); + RedirectionAwareTableHandle redirectionAwareTableHandle = metadata.getRedirectionAwareTableHandle(session, tableName); + Optional tableHandle = redirectionAwareTableHandle.getTableHandle(); if (tableHandle.isEmpty()) { if (!statement.isExists()) { throw semanticException(TABLE_NOT_FOUND, statement, "Table '%s' does not exist", tableName); @@ -95,13 +97,16 @@ public ListenableFuture execute( } QualifiedObjectName target = createQualifiedObjectName(session, statement, statement.getTarget()); + if (redirectionAwareTableHandle.getRedirectedTableName().isPresent()) { + target = new QualifiedObjectName(tableHandle.get().getCatalogName().getCatalogName(), target.getSchemaName(), target.getObjectName()); + } if (metadata.getCatalogHandle(session, target.getCatalogName()).isEmpty()) { throw semanticException(CATALOG_NOT_FOUND, statement, "Target catalog '%s' does not exist", target.getCatalogName()); } if (metadata.getTableHandle(session, target).isPresent()) { throw semanticException(TABLE_ALREADY_EXISTS, statement, "Target table '%s' already exists", target); } - if (!tableName.getCatalogName().equals(target.getCatalogName())) { + if (!tableHandle.get().getCatalogName().getCatalogName().equals(target.getCatalogName())) { throw semanticException(NOT_SUPPORTED, statement, "Table rename across catalogs is not supported"); } accessControl.checkCanRenameTable(session.toSecurityContext(), tableName, target); diff --git a/testing/trino-product-tests/src/main/java/io/trino/tests/product/hive/TestHiveRedirectionToIceberg.java b/testing/trino-product-tests/src/main/java/io/trino/tests/product/hive/TestHiveRedirectionToIceberg.java index 4294080efcf0..f22a8bf97315 100644 --- a/testing/trino-product-tests/src/main/java/io/trino/tests/product/hive/TestHiveRedirectionToIceberg.java +++ b/testing/trino-product-tests/src/main/java/io/trino/tests/product/hive/TestHiveRedirectionToIceberg.java @@ -330,13 +330,12 @@ public void testAlterTableAddColumn() onTrino().executeQuery("ALTER TABLE " + hiveTableName + " ADD COLUMN some_new_column double"); - // TODO: ALTER TABLE succeeded, but new column was not added Assertions.assertThat(onTrino().executeQuery("DESCRIBE " + icebergTableName).column(1)) - .containsOnly("nationkey", "name", "regionkey", "comment"); + .containsOnly("nationkey", "name", "regionkey", "comment", "some_new_column"); assertResultsEqual( onTrino().executeQuery("TABLE " + icebergTableName), - onTrino().executeQuery("SELECT * /*, NULL*/ FROM tpch.tiny.nation")); + onTrino().executeQuery("SELECT * , NULL FROM tpch.tiny.nation")); onTrino().executeQuery("DROP TABLE " + icebergTableName); } @@ -353,11 +352,11 @@ public void testCommentTable() assertTableComment("hive", "default", tableName).isNull(); assertTableComment("iceberg", "default", tableName).isNull(); - onTrino().executeQuery("COMMENT ON TABLE " + hiveTableName + " IS 'This is my table, there are many like it but this one is mine'"); + String tableComment = "This is my table, there are many like it but this one is mine"; + onTrino().executeQuery(format("COMMENT ON TABLE " + hiveTableName + " IS '%s'", tableComment)); - // TODO: COMMENT ON TABLE succeeded, but comment was not preserved - assertTableComment("hive", "default", tableName).isNull(); - assertTableComment("iceberg", "default", tableName).isNull(); + assertTableComment("hive", "default", tableName).isEqualTo(tableComment); + assertTableComment("iceberg", "default", tableName).isEqualTo(tableComment); onTrino().executeQuery("DROP TABLE " + icebergTableName); } From 958e05c2a3f07e68f9203fed670b5af6605bc479 Mon Sep 17 00:00:00 2001 From: findinpath Date: Wed, 12 Jan 2022 17:19:08 +0100 Subject: [PATCH 2/2] empty