diff --git ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java index 73710a7c2917b5268f788f22baaee2d87846961b..9d4b7cc02c6d8cd8e540da1493cdb9190b18259e 100644 --- ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java @@ -3522,6 +3522,11 @@ protected void replaceFiles(Path tablePath, Path srcf, Path destf, Path oldPath, return; } + if (oldPath == null && destFs.exists(destf)) { + // it seems the partition is missing from the HMS but the directory is there on HDFS + oldPath = destf; + } + if (oldPath != null) { boolean oldPathDeleted = false; boolean isOldPathUnderDestf = false; diff --git ql/src/test/queries/clientpositive/insert_overwrite_table.q ql/src/test/queries/clientpositive/insert_overwrite_table.q new file mode 100644 index 0000000000000000000000000000000000000000..92004d55e8bcb12784f606ac101c5de4d349bcfa --- /dev/null +++ ql/src/test/queries/clientpositive/insert_overwrite_table.q @@ -0,0 +1,16 @@ +create external table test_part (col1 string, col2 int) partitioned by (dt string) +location '${system:test.tmp.dir}/test'; + +insert into test_part partition(dt = 'p1') values ("a", 1); + +alter table test_part drop partition (dt='p1'); + +dfs -mv ${system:test.tmp.dir}/test/dt=p1/000000_0 ${system:test.tmp.dir}/test/dt=p1/000000_1; + +insert overwrite table test_part partition(dt = 'p1') values ("b", 2); + +select * from test_part; + +drop table test_part; + +dfs -rmr ${system:test.tmp.dir}/test; \ No newline at end of file diff --git ql/src/test/results/clientpositive/insert_overwrite_table.q.out ql/src/test/results/clientpositive/insert_overwrite_table.q.out new file mode 100644 index 0000000000000000000000000000000000000000..3288d5e460b1b0e64a5bdada28dafa9d2e86a06f --- /dev/null +++ ql/src/test/results/clientpositive/insert_overwrite_table.q.out @@ -0,0 +1,56 @@ +PREHOOK: query: create external table test_part (col1 string, col2 int) partitioned by (dt string) +#### A masked pattern was here #### +PREHOOK: type: CREATETABLE +#### A masked pattern was here #### +PREHOOK: Output: database:default +PREHOOK: Output: default@test_part +POSTHOOK: query: create external table test_part (col1 string, col2 int) partitioned by (dt string) +#### A masked pattern was here #### +POSTHOOK: type: CREATETABLE +#### A masked pattern was here #### +POSTHOOK: Output: database:default +POSTHOOK: Output: default@test_part +PREHOOK: query: insert into test_part partition(dt = 'p1') values ("a", 1) +PREHOOK: type: QUERY +PREHOOK: Output: default@test_part@dt=p1 +POSTHOOK: query: insert into test_part partition(dt = 'p1') values ("a", 1) +POSTHOOK: type: QUERY +POSTHOOK: Output: default@test_part@dt=p1 +POSTHOOK: Lineage: test_part PARTITION(dt=p1).col1 SIMPLE [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: test_part PARTITION(dt=p1).col2 EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +PREHOOK: query: alter table test_part drop partition (dt='p1') +PREHOOK: type: ALTERTABLE_DROPPARTS +PREHOOK: Input: default@test_part +PREHOOK: Output: default@test_part@dt=p1 +POSTHOOK: query: alter table test_part drop partition (dt='p1') +POSTHOOK: type: ALTERTABLE_DROPPARTS +POSTHOOK: Input: default@test_part +POSTHOOK: Output: default@test_part@dt=p1 +PREHOOK: query: insert overwrite table test_part partition(dt = 'p1') values ("b", 2) +PREHOOK: type: QUERY +PREHOOK: Output: default@test_part@dt=p1 +POSTHOOK: query: insert overwrite table test_part partition(dt = 'p1') values ("b", 2) +POSTHOOK: type: QUERY +POSTHOOK: Output: default@test_part@dt=p1 +POSTHOOK: Lineage: test_part PARTITION(dt=p1).col1 SIMPLE [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: test_part PARTITION(dt=p1).col2 EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +PREHOOK: query: select * from test_part +PREHOOK: type: QUERY +PREHOOK: Input: default@test_part +PREHOOK: Input: default@test_part@dt=p1 +#### A masked pattern was here #### +POSTHOOK: query: select * from test_part +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test_part +POSTHOOK: Input: default@test_part@dt=p1 +#### A masked pattern was here #### +b 2 p1 +PREHOOK: query: drop table test_part +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@test_part +PREHOOK: Output: default@test_part +POSTHOOK: query: drop table test_part +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@test_part +POSTHOOK: Output: default@test_part +#### A masked pattern was here ####