diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java index d634b4021600fd8b980dc5d56b77e3192eba5d9f..7bfd5421820a92cc0dc0a25893781e6a724259cf 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -56,6 +56,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FsShell; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hive.common.FileUtils; import org.apache.hadoop.hive.common.StatsSetupConst; import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.conf.HiveConf; @@ -939,10 +940,17 @@ private int renamePartition(Hive db, RenamePartitionDesc renamePartitionDesc) th Table tbl = db.getTable(renamePartitionDesc.getTableName()); - Partition oldPart = db.getPartition(tbl, renamePartitionDesc.getOldPartSpec(), false); - Partition part = db.getPartition(tbl, renamePartitionDesc.getOldPartSpec(), false); + LinkedHashMap oldPartSpec = renamePartitionDesc.getOldPartSpec(); + Partition oldPart = db.getPartition(tbl, oldPartSpec, false); + if (oldPart == null) { + String partName = FileUtils.makePartName(new ArrayList(oldPartSpec.keySet()), + new ArrayList(oldPartSpec.values())); + throw new HiveException("Rename partition: source partition [" + partName + + "] does not exist."); + } + Partition part = db.getPartition(tbl, oldPartSpec, false); part.setValues(renamePartitionDesc.getNewPartSpec()); - db.renamePartition(tbl, renamePartitionDesc.getOldPartSpec(), part); + db.renamePartition(tbl, oldPartSpec, part); Partition newPart = db .getPartition(tbl, renamePartitionDesc.getNewPartSpec(), false); work.getInputs().add(new ReadEntity(oldPart)); diff --git a/ql/src/test/queries/clientnegative/alter_rename_partition_failure.q b/ql/src/test/queries/clientnegative/alter_rename_partition_failure.q index be971f18498693491d0699f7793a39e21b1ed684..1db6593bfc2dbff9a7c306569045f7ecb6c24c15 100644 --- a/ql/src/test/queries/clientnegative/alter_rename_partition_failure.q +++ b/ql/src/test/queries/clientnegative/alter_rename_partition_failure.q @@ -1,6 +1,6 @@ create table alter_rename_partition_src ( col1 string ) stored as textfile ; load data local inpath '../../data/files/test.dat' overwrite into table alter_rename_partition_src ; create table alter_rename_partition ( col1 string ) partitioned by (pcol1 string , pcol2 string) stored as sequencefile; -insert overwrite table alter_rename_partition partition (pCol1='old_part1:', pcol2='old_part2:') select col1 from alter_rename_partition_src ; +insert overwrite table alter_rename_partition partition (pCol1='old_part1', pcol2='old_part2') select col1 from alter_rename_partition_src ; -alter table alter_rename_partition partition (pCol1='nonexist_part1:', pcol2='nonexist_part2:') rename to partition (pCol1='new_part1:', pcol2='new_part2:'); +alter table alter_rename_partition partition (pCol1='nonexist_part1', pcol2='nonexist_part2') rename to partition (pCol1='new_part1', pcol2='new_part2'); diff --git a/ql/src/test/results/clientnegative/alter_rename_partition_failure.q.out b/ql/src/test/results/clientnegative/alter_rename_partition_failure.q.out index f1640be1d2728d971517afdfc4f36efe1e5bb508..486ab8cdb0e2bc1a9646adb4f5f9ac1e348c582c 100644 --- a/ql/src/test/results/clientnegative/alter_rename_partition_failure.q.out +++ b/ql/src/test/results/clientnegative/alter_rename_partition_failure.q.out @@ -22,16 +22,16 @@ POSTHOOK: query: create table alter_rename_partition ( col1 string ) partitioned POSTHOOK: type: CREATETABLE POSTHOOK: Output: database:default POSTHOOK: Output: default@alter_rename_partition -PREHOOK: query: insert overwrite table alter_rename_partition partition (pCol1='old_part1:', pcol2='old_part2:') select col1 from alter_rename_partition_src +PREHOOK: query: insert overwrite table alter_rename_partition partition (pCol1='old_part1', pcol2='old_part2') select col1 from alter_rename_partition_src PREHOOK: type: QUERY PREHOOK: Input: default@alter_rename_partition_src -PREHOOK: Output: default@alter_rename_partition@pcol1=old_part1%3A/pcol2=old_part2%3A -POSTHOOK: query: insert overwrite table alter_rename_partition partition (pCol1='old_part1:', pcol2='old_part2:') select col1 from alter_rename_partition_src +PREHOOK: Output: default@alter_rename_partition@pcol1=old_part1/pcol2=old_part2 +POSTHOOK: query: insert overwrite table alter_rename_partition partition (pCol1='old_part1', pcol2='old_part2') select col1 from alter_rename_partition_src POSTHOOK: type: QUERY POSTHOOK: Input: default@alter_rename_partition_src -POSTHOOK: Output: default@alter_rename_partition@pcol1=old_part1%3A/pcol2=old_part2%3A -POSTHOOK: Lineage: alter_rename_partition PARTITION(pcol1=old_part1:,pcol2=old_part2:).col1 SIMPLE [(alter_rename_partition_src)alter_rename_partition_src.FieldSchema(name:col1, type:string, comment:null), ] -PREHOOK: query: alter table alter_rename_partition partition (pCol1='nonexist_part1:', pcol2='nonexist_part2:') rename to partition (pCol1='new_part1:', pcol2='new_part2:') +POSTHOOK: Output: default@alter_rename_partition@pcol1=old_part1/pcol2=old_part2 +POSTHOOK: Lineage: alter_rename_partition PARTITION(pcol1=old_part1,pcol2=old_part2).col1 SIMPLE [(alter_rename_partition_src)alter_rename_partition_src.FieldSchema(name:col1, type:string, comment:null), ] +PREHOOK: query: alter table alter_rename_partition partition (pCol1='nonexist_part1', pcol2='nonexist_part2') rename to partition (pCol1='new_part1', pcol2='new_part2') PREHOOK: type: ALTERTABLE_RENAMEPART PREHOOK: Input: default@alter_rename_partition -FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. null +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Rename partition: source partition [pcol1=nonexist_part1/pcol2=nonexist_part2] does not exist.