commit aac0ba485504527385a2ed6e54f6cbf60ed8e3ab Author: Vihang Karajgaonkar Date: Wed Apr 5 11:02:28 2017 -0700 HIVE-16287 : Alter table partition rename with location - moves partition back to hive warehouse diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java index d0511ada20fa60efceef0650a710c7eb6960fc88..a3e31f57d8207007dee3f943d6966768bb34223a 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java @@ -442,7 +442,15 @@ public Partition alterPartition(final RawStore msdb, Warehouse wh, final String msdb.alterPartition(dbname, name, part_vals, new_part); } else { try { - destPath = new Path(wh.getTablePath(msdb.getDatabase(dbname), name), + // if tbl location is available use it + // else derive the tbl location from database location + Path destParent; + if(tbl.getSd().getLocation() != null) { + destParent = wh.getDnsPath(new Path(tbl.getSd().getLocation())); + } else { + destParent = wh.getTablePath(msdb.getDatabase(dbname), name); + } + destPath = new Path(destParent, Warehouse.makePartName(tbl.getPartitionKeys(), new_part.getValues())); destPath = constructRenamedPath(destPath, new Path(new_part.getSd().getLocation())); } catch (NoSuchObjectException e) { diff --git a/ql/src/test/queries/clientpositive/rename_partition_location.q b/ql/src/test/queries/clientpositive/rename_partition_location.q index ee4ff8171f60bc74a959a10c5975a8bb79d7c4c1..bf8baca5e53d63acb984d14f3b1dc649fda0ecbc 100644 --- a/ql/src/test/queries/clientpositive/rename_partition_location.q +++ b/ql/src/test/queries/clientpositive/rename_partition_location.q @@ -17,4 +17,18 @@ SELECT count(*) FROM rename_partition_table where part = '2'; SET hive.exec.post.hooks=; +CREATE TABLE rename_partition_table_2 (key STRING, value STRING) PARTITIONED BY (part STRING) +LOCATION '${system:test.tmp.dir}/rename_partition_table_2'; + +INSERT OVERWRITE TABLE rename_partition_table_2 PARTITION (part = '1') SELECT * FROM src; + +ALTER TABLE rename_partition_table_2 PARTITION (part = '1') RENAME TO PARTITION (part = '2'); + +SET hive.exec.post.hooks=org.apache.hadoop.hive.ql.hooks.VerifyPartitionIsSubdirectoryOfTableHook; + +SELECT count(*) FROM rename_partition_table where part = '2'; + +SET hive.exec.post.hooks=; + DROP TABLE rename_partition_table; +DROP TABLE rename_partition_table_2; diff --git a/ql/src/test/results/clientpositive/rename_partition_location.q.out b/ql/src/test/results/clientpositive/rename_partition_location.q.out index bfdd5800281986b97d2f0790f0e5148340939eba..55c31bcbdbfce6a702f33cb0f4c4e9ef7dd05b7d 100644 --- a/ql/src/test/results/clientpositive/rename_partition_location.q.out +++ b/ql/src/test/results/clientpositive/rename_partition_location.q.out @@ -46,7 +46,30 @@ PREHOOK: type: QUERY PREHOOK: Input: default@rename_partition_table #### A masked pattern was here #### 500 +PREHOOK: query: CREATE TABLE rename_partition_table_2 (key STRING, value STRING) PARTITIONED BY (part STRING) +#### A masked pattern was here #### +PREHOOK: type: CREATETABLE +#### A masked pattern was here #### +PREHOOK: Output: database:default +PREHOOK: Output: default@rename_partition_table_2 +PREHOOK: query: INSERT OVERWRITE TABLE rename_partition_table_2 PARTITION (part = '1') SELECT * FROM src +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@rename_partition_table_2@part=1 +PREHOOK: query: ALTER TABLE rename_partition_table_2 PARTITION (part = '1') RENAME TO PARTITION (part = '2') +PREHOOK: type: ALTERTABLE_RENAMEPART +PREHOOK: Input: default@rename_partition_table_2 +PREHOOK: Output: default@rename_partition_table_2@part=1 +PREHOOK: query: SELECT count(*) FROM rename_partition_table where part = '2' +PREHOOK: type: QUERY +PREHOOK: Input: default@rename_partition_table +#### A masked pattern was here #### +500 PREHOOK: query: DROP TABLE rename_partition_table PREHOOK: type: DROPTABLE PREHOOK: Input: default@rename_partition_table PREHOOK: Output: default@rename_partition_table +PREHOOK: query: DROP TABLE rename_partition_table_2 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@rename_partition_table_2 +PREHOOK: Output: default@rename_partition_table_2