You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ay...@apache.org on 2023/04/11 21:02:18 UTC

[hive] branch master updated: HIVE-27208: Iceberg: Add support for rename table. (#4185). (Ayush Saxena, reviewed by Denys Kuzmenko, Butao Zhang)

This is an automated email from the ASF dual-hosted git repository.

ayushsaxena pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 02603b17e79 HIVE-27208: Iceberg: Add support for rename table. (#4185). (Ayush Saxena, reviewed by Denys Kuzmenko, Butao Zhang)
02603b17e79 is described below

commit 02603b17e7963879f4ed0af7352d986ad3694458
Author: Ayush Saxena <ay...@apache.org>
AuthorDate: Wed Apr 12 02:32:03 2023 +0530

    HIVE-27208: Iceberg: Add support for rename table. (#4185). (Ayush Saxena, reviewed by Denys Kuzmenko, Butao Zhang)
---
 .../main/java/org/apache/iceberg/mr/Catalogs.java  |  13 +
 .../iceberg/mr/hive/HiveIcebergMetaHook.java       |  10 +-
 .../src/test/queries/positive/iceberg_rename.q     |  65 +++++
 .../src/test/results/positive/iceberg_rename.q.out | 265 +++++++++++++++++++++
 .../ql/ddl/table/AbstractAlterTableOperation.java  |   6 +-
 .../misc/rename/AlterTableRenameOperation.java     |   6 +
 .../org/apache/hadoop/hive/ql/metadata/Hive.java   |  17 +-
 .../org/apache/hadoop/hive/ql/metadata/Table.java  |  13 +-
 .../apache/hadoop/hive/metastore/HiveMetaHook.java |   8 +
 .../hadoop/hive/metastore/HiveAlterHandler.java    |   7 +-
 10 files changed, 400 insertions(+), 10 deletions(-)

diff --git a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/Catalogs.java b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/Catalogs.java
index c58e7d07fc5..ab75665aed0 100644
--- a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/Catalogs.java
+++ b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/Catalogs.java
@@ -222,6 +222,19 @@ public final class Catalogs {
     return new HadoopTables(conf).create(schema, spec, map, location);
   }
 
+  public static void renameTable(Configuration conf, Properties props, TableIdentifier to) {
+    String catalogName = props.getProperty(InputFormatConfig.CATALOG_NAME);
+
+    Optional<Catalog> catalog = loadCatalog(conf, catalogName);
+    if (catalog.isPresent()) {
+      String name = props.getProperty(NAME);
+      Preconditions.checkNotNull(name, "Table identifier not set");
+      catalog.get().renameTable(TableIdentifier.parse(name), to);
+    } else {
+      throw new RuntimeException("Rename from " + props.getProperty(NAME) + " to " + to + " failed");
+    }
+  }
+
   static Optional<Catalog> loadCatalog(Configuration conf, String catalogName) {
     String catalogType = getCatalogType(conf, catalogName);
     if (NO_CATALOG_TYPE.equalsIgnoreCase(catalogType)) {
diff --git a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
index 174022e5ea2..229e0490f5d 100644
--- a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
+++ b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
@@ -120,7 +120,7 @@ public class HiveIcebergMetaHook implements HiveMetaHook {
   static final EnumSet<AlterTableType> SUPPORTED_ALTER_OPS = EnumSet.of(
       AlterTableType.ADDCOLS, AlterTableType.REPLACE_COLUMNS, AlterTableType.RENAME_COLUMN,
       AlterTableType.ADDPROPS, AlterTableType.DROPPROPS, AlterTableType.SETPARTITIONSPEC,
-      AlterTableType.UPDATE_COLUMNS, AlterTableType.SETPARTITIONSPEC, AlterTableType.EXECUTE);
+      AlterTableType.UPDATE_COLUMNS, AlterTableType.RENAME, AlterTableType.EXECUTE);
   private static final List<String> MIGRATION_ALLOWED_SOURCE_FORMATS = ImmutableList.of(
       FileFormat.PARQUET.name().toLowerCase(),
       FileFormat.ORC.name().toLowerCase(),
@@ -319,6 +319,10 @@ public class HiveIcebergMetaHook implements HiveMetaHook {
       throws MetaException {
     catalogProperties = getCatalogProperties(hmsTable);
     setupAlterOperationType(hmsTable, context);
+    if (AlterTableType.RENAME.equals(currentAlterTableOp)) {
+      catalogProperties.put(Catalogs.NAME, TableIdentifier.of(context.getProperties().get(OLD_DB_NAME),
+          context.getProperties().get(OLD_TABLE_NAME)).toString());
+    }
     if (commitLock == null) {
       commitLock = new HiveCommitLock(conf, new CachedClientPool(conf, Maps.fromProperties(catalogProperties)),
           catalogProperties.getProperty(Catalogs.NAME), hmsTable.getDbName(), hmsTable.getTableName());
@@ -549,6 +553,10 @@ public class HiveIcebergMetaHook implements HiveMetaHook {
         case SETPARTITIONSPEC:
           IcebergTableUtil.updateSpec(conf, icebergTable);
           break;
+        case RENAME:
+          Catalogs.renameTable(conf, catalogProperties, TableIdentifier.of(hmsTable.getDbName(),
+              hmsTable.getTableName()));
+          break;
       }
     }
   }
diff --git a/iceberg/iceberg-handler/src/test/queries/positive/iceberg_rename.q b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_rename.q
new file mode 100644
index 00000000000..88f9765030b
--- /dev/null
+++ b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_rename.q
@@ -0,0 +1,65 @@
+
+-- create a v1 table
+create table icev1 (id int, name string) Stored by Iceberg;
+
+-- insert some values
+insert into icev1 values (1, 'SSD'),(2, 'RAM');
+
+select * from icev1 order by id;
+
+-- do the rename
+explain alter table icev1 rename to icev1renamed;
+
+alter table icev1 rename to icev1renamed;
+
+select * from icev1renamed order by id;
+
+-- create an unpartitioned v2 table
+create table iceorgin (id int, name string) Stored by Iceberg TBLPROPERTIES ('format-version'='2');
+
+-- insert some values
+insert into iceorgin values (1, 'ABC'),(2, 'CBS'),(3, null),(4, 'POPI'),(5, 'AQWR'),(6, 'POIU'),
+(9, null),(8,'POIKL'),(10, 'YUIO');
+
+-- do some deletes
+delete from iceorgin where id>9 OR id=8;
+
+select * from iceorgin order by id;
+
+-- do the rename
+
+alter table iceorgin rename to icerenamed;
+
+select * from icerenamed order by id;
+
+-- create a partitioned v2 table
+create table iceorginpart (id int) partitioned by (part string) Stored by Iceberg TBLPROPERTIES ('format-version'='2');
+
+insert into iceorginpart values (1, 'ABC'),(2, 'CBS'),(3,'CBS'),(4, 'ABC'),(5, 'AQWR'),(6, 'ABC'),
+(9, 'AQWR'),(8,'ABC'),(10, 'YUIO');
+
+-- do some deletes
+delete from iceorginpart where id<3 OR id=7;
+
+select * from iceorginpart order by id;
+
+explain alter table iceorginpart rename to icerenamedpart;
+
+alter table iceorginpart rename to icerenamedpart;
+
+select * from icerenamedpart order by id;
+
+-- create a new unpartitioned table with old name
+create table iceorgin (id int, name string) Stored by Iceberg TBLPROPERTIES ('format-version'='2');
+
+insert into iceorgin values (100, 'ABCDWC');
+
+select * from iceorgin order by id;
+
+-- create a new partitioned table with old name
+
+create table iceorginpart (id int) partitioned by (part string) Stored by Iceberg TBLPROPERTIES ('format-version'='2');
+
+insert into iceorginpart values (22, 'DER'),(2, 'KLM');
+
+select * from iceorginpart order by id;
diff --git a/iceberg/iceberg-handler/src/test/results/positive/iceberg_rename.q.out b/iceberg/iceberg-handler/src/test/results/positive/iceberg_rename.q.out
new file mode 100644
index 00000000000..76d5d2b0ce4
--- /dev/null
+++ b/iceberg/iceberg-handler/src/test/results/positive/iceberg_rename.q.out
@@ -0,0 +1,265 @@
+PREHOOK: query: create table icev1 (id int, name string) Stored by Iceberg
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@icev1
+POSTHOOK: query: create table icev1 (id int, name string) Stored by Iceberg
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@icev1
+PREHOOK: query: insert into icev1 values (1, 'SSD'),(2, 'RAM')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@icev1
+POSTHOOK: query: insert into icev1 values (1, 'SSD'),(2, 'RAM')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@icev1
+PREHOOK: query: select * from icev1 order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icev1
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from icev1 order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icev1
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1	SSD
+2	RAM
+PREHOOK: query: explain alter table icev1 rename to icev1renamed
+PREHOOK: type: ALTERTABLE_RENAME
+PREHOOK: Input: default@icev1
+PREHOOK: Output: database:default
+PREHOOK: Output: default@icev1
+PREHOOK: Output: default@icev1renamed
+POSTHOOK: query: explain alter table icev1 rename to icev1renamed
+POSTHOOK: type: ALTERTABLE_RENAME
+POSTHOOK: Input: default@icev1
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@icev1
+POSTHOOK: Output: default@icev1renamed
+Stage-0
+  Rename Table{"table name:":"default.icev1","new table name:":"default.icev1renamed"}
+
+PREHOOK: query: alter table icev1 rename to icev1renamed
+PREHOOK: type: ALTERTABLE_RENAME
+PREHOOK: Input: default@icev1
+PREHOOK: Output: database:default
+PREHOOK: Output: default@icev1
+PREHOOK: Output: default@icev1renamed
+POSTHOOK: query: alter table icev1 rename to icev1renamed
+POSTHOOK: type: ALTERTABLE_RENAME
+POSTHOOK: Input: default@icev1
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@icev1
+POSTHOOK: Output: default@icev1renamed
+PREHOOK: query: select * from icev1renamed order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icev1renamed
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from icev1renamed order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icev1renamed
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1	SSD
+2	RAM
+PREHOOK: query: create table iceorgin (id int, name string) Stored by Iceberg TBLPROPERTIES ('format-version'='2')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@iceorgin
+POSTHOOK: query: create table iceorgin (id int, name string) Stored by Iceberg TBLPROPERTIES ('format-version'='2')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@iceorgin
+PREHOOK: query: insert into iceorgin values (1, 'ABC'),(2, 'CBS'),(3, null),(4, 'POPI'),(5, 'AQWR'),(6, 'POIU'),
+(9, null),(8,'POIKL'),(10, 'YUIO')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@iceorgin
+POSTHOOK: query: insert into iceorgin values (1, 'ABC'),(2, 'CBS'),(3, null),(4, 'POPI'),(5, 'AQWR'),(6, 'POIU'),
+(9, null),(8,'POIKL'),(10, 'YUIO')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@iceorgin
+PREHOOK: query: delete from iceorgin where id>9 OR id=8
+PREHOOK: type: QUERY
+PREHOOK: Input: default@iceorgin
+PREHOOK: Output: default@iceorgin
+POSTHOOK: query: delete from iceorgin where id>9 OR id=8
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@iceorgin
+POSTHOOK: Output: default@iceorgin
+PREHOOK: query: select * from iceorgin order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@iceorgin
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from iceorgin order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@iceorgin
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1	ABC
+2	CBS
+3	NULL
+4	POPI
+5	AQWR
+6	POIU
+9	NULL
+PREHOOK: query: alter table iceorgin rename to icerenamed
+PREHOOK: type: ALTERTABLE_RENAME
+PREHOOK: Input: default@iceorgin
+PREHOOK: Output: database:default
+PREHOOK: Output: default@iceorgin
+PREHOOK: Output: default@icerenamed
+POSTHOOK: query: alter table iceorgin rename to icerenamed
+POSTHOOK: type: ALTERTABLE_RENAME
+POSTHOOK: Input: default@iceorgin
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@iceorgin
+POSTHOOK: Output: default@icerenamed
+PREHOOK: query: select * from icerenamed order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icerenamed
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from icerenamed order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icerenamed
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1	ABC
+2	CBS
+3	NULL
+4	POPI
+5	AQWR
+6	POIU
+9	NULL
+PREHOOK: query: create table iceorginpart (id int) partitioned by (part string) Stored by Iceberg TBLPROPERTIES ('format-version'='2')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@iceorginpart
+POSTHOOK: query: create table iceorginpart (id int) partitioned by (part string) Stored by Iceberg TBLPROPERTIES ('format-version'='2')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@iceorginpart
+PREHOOK: query: insert into iceorginpart values (1, 'ABC'),(2, 'CBS'),(3,'CBS'),(4, 'ABC'),(5, 'AQWR'),(6, 'ABC'),
+(9, 'AQWR'),(8,'ABC'),(10, 'YUIO')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@iceorginpart
+POSTHOOK: query: insert into iceorginpart values (1, 'ABC'),(2, 'CBS'),(3,'CBS'),(4, 'ABC'),(5, 'AQWR'),(6, 'ABC'),
+(9, 'AQWR'),(8,'ABC'),(10, 'YUIO')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@iceorginpart
+PREHOOK: query: delete from iceorginpart where id<3 OR id=7
+PREHOOK: type: QUERY
+PREHOOK: Input: default@iceorginpart
+PREHOOK: Output: default@iceorginpart
+POSTHOOK: query: delete from iceorginpart where id<3 OR id=7
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@iceorginpart
+POSTHOOK: Output: default@iceorginpart
+PREHOOK: query: select * from iceorginpart order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@iceorginpart
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from iceorginpart order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@iceorginpart
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+3	CBS
+4	ABC
+5	AQWR
+6	ABC
+8	ABC
+9	AQWR
+10	YUIO
+PREHOOK: query: explain alter table iceorginpart rename to icerenamedpart
+PREHOOK: type: ALTERTABLE_RENAME
+PREHOOK: Input: default@iceorginpart
+PREHOOK: Output: database:default
+PREHOOK: Output: default@iceorginpart
+PREHOOK: Output: default@icerenamedpart
+POSTHOOK: query: explain alter table iceorginpart rename to icerenamedpart
+POSTHOOK: type: ALTERTABLE_RENAME
+POSTHOOK: Input: default@iceorginpart
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@iceorginpart
+POSTHOOK: Output: default@icerenamedpart
+Stage-0
+  Rename Table{"table name:":"default.iceorginpart","new table name:":"default.icerenamedpart"}
+
+PREHOOK: query: alter table iceorginpart rename to icerenamedpart
+PREHOOK: type: ALTERTABLE_RENAME
+PREHOOK: Input: default@iceorginpart
+PREHOOK: Output: database:default
+PREHOOK: Output: default@iceorginpart
+PREHOOK: Output: default@icerenamedpart
+POSTHOOK: query: alter table iceorginpart rename to icerenamedpart
+POSTHOOK: type: ALTERTABLE_RENAME
+POSTHOOK: Input: default@iceorginpart
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@iceorginpart
+POSTHOOK: Output: default@icerenamedpart
+PREHOOK: query: select * from icerenamedpart order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@icerenamedpart
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from icerenamedpart order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@icerenamedpart
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+3	CBS
+4	ABC
+5	AQWR
+6	ABC
+8	ABC
+9	AQWR
+10	YUIO
+PREHOOK: query: create table iceorgin (id int, name string) Stored by Iceberg TBLPROPERTIES ('format-version'='2')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@iceorgin
+POSTHOOK: query: create table iceorgin (id int, name string) Stored by Iceberg TBLPROPERTIES ('format-version'='2')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@iceorgin
+PREHOOK: query: insert into iceorgin values (100, 'ABCDWC')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@iceorgin
+POSTHOOK: query: insert into iceorgin values (100, 'ABCDWC')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@iceorgin
+PREHOOK: query: select * from iceorgin order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@iceorgin
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from iceorgin order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@iceorgin
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+100	ABCDWC
+PREHOOK: query: create table iceorginpart (id int) partitioned by (part string) Stored by Iceberg TBLPROPERTIES ('format-version'='2')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@iceorginpart
+POSTHOOK: query: create table iceorginpart (id int) partitioned by (part string) Stored by Iceberg TBLPROPERTIES ('format-version'='2')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@iceorginpart
+PREHOOK: query: insert into iceorginpart values (22, 'DER'),(2, 'KLM')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@iceorginpart
+POSTHOOK: query: insert into iceorginpart values (22, 'DER'),(2, 'KLM')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@iceorginpart
+PREHOOK: query: select * from iceorginpart order by id
+PREHOOK: type: QUERY
+PREHOOK: Input: default@iceorginpart
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from iceorginpart order by id
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@iceorginpart
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+2	KLM
+22	DER
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/AbstractAlterTableOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/AbstractAlterTableOperation.java
index e360f8f6ba4..c17ca82ef5d 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/AbstractAlterTableOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/AbstractAlterTableOperation.java
@@ -132,7 +132,7 @@ public abstract class AbstractAlterTableOperation<T extends AbstractAlterTableDe
       throws HiveException {
     if (partitions == null) {
       updateModifiedParameters(table.getTTable().getParameters(), context.getConf());
-      table.checkValidity(context.getConf());
+      checkValidity(table, context);
     } else {
       for (Partition partition : partitions) {
         updateModifiedParameters(partition.getParameters(), context.getConf());
@@ -228,6 +228,10 @@ public abstract class AbstractAlterTableOperation<T extends AbstractAlterTableDe
     }
   }
 
+  protected void checkValidity(Table table, DDLOperationContext context) throws HiveException {
+    table.checkValidity(context.getConf());
+  }
+
   private static void updateModifiedParameters(Map<String, String> params, HiveConf conf) throws HiveException {
     String user = SessionState.getUserFromAuthenticator();
     params.put("last_modified_by", user);
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/misc/rename/AlterTableRenameOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/misc/rename/AlterTableRenameOperation.java
index f06776c19bd..acce65dcb9e 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/misc/rename/AlterTableRenameOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/misc/rename/AlterTableRenameOperation.java
@@ -19,6 +19,7 @@
 package org.apache.hadoop.hive.ql.ddl.table.misc.rename;
 
 import org.apache.hadoop.hive.common.TableName;
+import org.apache.hadoop.hive.metastore.utils.MetaStoreUtils;
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
 import org.apache.hadoop.hive.ql.ddl.table.AbstractAlterTableOperation;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
@@ -50,4 +51,9 @@ public class AlterTableRenameOperation extends AbstractAlterTableOperation<Alter
   protected void doAlteration(Table table, Partition partition) throws HiveException {
     HiveTableName.setFrom(desc.getNewName(), table);
   }
+
+  @Override
+  protected void checkValidity(Table table, DDLOperationContext context) throws HiveException {
+    table.validateName(context.getConf());
+  }
 }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
index f4853860380..f8e844e67b2 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
@@ -114,6 +114,7 @@ import org.apache.hadoop.hive.metastore.api.GetTableRequest;
 import org.apache.hadoop.hive.metastore.api.SourceTable;
 import org.apache.hadoop.hive.metastore.api.UpdateTransactionalStatsRequest;
 import org.apache.hadoop.hive.metastore.api.NoSuchObjectException;
+import org.apache.hadoop.hive.ql.ddl.table.AlterTableType;
 import org.apache.hadoop.hive.ql.io.HdfsUtils;
 import org.apache.hadoop.hive.metastore.HiveMetaException;
 import org.apache.hadoop.hive.metastore.HiveMetaHook;
@@ -875,10 +876,16 @@ public class Hive {
       if (newTbl.getParameters() != null) {
         newTbl.getParameters().remove(hive_metastoreConstants.DDL_TIME);
       }
-      newTbl.checkValidity(conf);
       if (environmentContext == null) {
         environmentContext = new EnvironmentContext();
       }
+      if (isRename(environmentContext)) {
+        newTbl.validateName(conf);
+        environmentContext.putToProperties(HiveMetaHook.OLD_TABLE_NAME, tblName);
+        environmentContext.putToProperties(HiveMetaHook.OLD_DB_NAME, dbName);
+      } else {
+        newTbl.checkValidity(conf);
+      }
       if (cascade) {
         environmentContext.putToProperties(StatsSetupConst.CASCADE, StatsSetupConst.TRUE);
       }
@@ -918,6 +925,14 @@ public class Hive {
     }
   }
 
+  private static boolean isRename(EnvironmentContext environmentContext) {
+    if (environmentContext.isSetProperties()) {
+      String operation = environmentContext.getProperties().get(HiveMetaHook.ALTER_TABLE_OPERATION_TYPE);
+      return operation != null && AlterTableType.RENAME == AlterTableType.valueOf(operation);
+    }
+    return false;
+  }
+
   /**
    * Create a dataconnector
    * @param connector
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
index d422fbf3603..88a7960bcea 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Table.java
@@ -254,11 +254,7 @@ public class Table implements Serializable {
 
   public void checkValidity(Configuration conf) throws HiveException {
     // check for validity
-    String name = tTable.getTableName();
-    if (null == name || name.length() == 0
-        || !MetaStoreUtils.validateName(name, conf)) {
-      throw new HiveException("[" + name + "]: is not a valid table name");
-    }
+    validateName(conf);
     if (0 == getCols().size()) {
       throw new HiveException(
           "at least one column must be specified for the table");
@@ -286,6 +282,13 @@ public class Table implements Serializable {
     validateColumns(getCols(), getPartCols());
   }
 
+  public void validateName(Configuration conf) throws HiveException {
+    String name = tTable.getTableName();
+    if (StringUtils.isBlank(name) || !MetaStoreUtils.validateName(name, conf)) {
+      throw new HiveException("[" + name + "]: is not a valid table name");
+    }
+  }
+
   public StorageDescriptor getSd() {
     return tTable.getSd();
   }
diff --git a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java
index ac624131430..6a534c1669a 100644
--- a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java
+++ b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaHook.java
@@ -49,12 +49,20 @@ public interface HiveMetaHook {
   String ALLOW_PARTITION_KEY_CHANGE = "allow_partition_key_change";
   String SET_PROPERTIES = "set_properties";
   String UNSET_PROPERTIES = "unset_properties";
+
+  String TABLE_TYPE = "table_type";
+
+  String ICEBERG = "ICEBERG";
   String PROPERTIES_SEPARATOR = "'";
   String MIGRATE_HIVE_TO_ICEBERG = "migrate_hive_to_iceberg";
   String INITIALIZE_ROLLBACK_MIGRATION = "initialize_rollback_migration";
   // if this flag is set to true, the HMS call from HiveMetaStoreClient#alter_table() will be skipped
   String SKIP_METASTORE_ALTER = "skip_metastore_alter";
 
+  String OLD_TABLE_NAME = "old_table_name";
+
+  String OLD_DB_NAME = "old_db_name";
+
   /**
    * Called before a new table definition is added to the metastore
    * during CREATE TABLE.
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
index 2ee80fd4eb4..fc413504ec1 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java
@@ -253,11 +253,14 @@ public class HiveAlterHandler implements AlterHandler {
       boolean renamedTranslatedToExternalTable = rename && MetaStoreUtils.isTranslatedToExternalTable(oldt)
           && MetaStoreUtils.isTranslatedToExternalTable(newt);
 
+      boolean isRenameIcebergTable =
+          rename && HiveMetaHook.ICEBERG.equalsIgnoreCase(newt.getParameters().get(HiveMetaHook.TABLE_TYPE));
+
       List<ColumnStatistics> columnStatistics = getColumnStats(msdb, oldt);
       columnStatistics = deleteTableColumnStats(msdb, oldt, newt, columnStatistics);
 
-      if (replDataLocationChanged
-          || renamedManagedTable || renamedTranslatedToExternalTable) {
+      if (!isRenameIcebergTable &&
+          (replDataLocationChanged || renamedManagedTable || renamedTranslatedToExternalTable)) {
         srcPath = new Path(oldt.getSd().getLocation());
 
         if (replDataLocationChanged) {