diff --git metastore/src/java/org/apache/hadoop/hive/metastore/Warehouse.java metastore/src/java/org/apache/hadoop/hive/metastore/Warehouse.java index d616946..7ea40ed 100755 --- metastore/src/java/org/apache/hadoop/hive/metastore/Warehouse.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/Warehouse.java @@ -422,7 +422,11 @@ public static void makeSpecFromName(Map partSpec, Path currPath) // reverse the list since we checked the part from leaf dir to table's base dir for (int i = kvs.size(); i > 0; i--) { - partSpec.put(kvs.get(i - 1)[0], kvs.get(i - 1)[1]); + if (!partSpec.containsKey(kvs.get(i - 1)[0]) || + (partSpec.containsKey(kvs.get(i - 1)[0]) + && partSpec.get(kvs.get(i - 1)[0]) == null)) { + partSpec.put(kvs.get(i - 1)[0], kvs.get(i - 1)[1]); + } } } diff --git ql/src/test/queries/clientpositive/msck1.q ql/src/test/queries/clientpositive/msck1.q new file mode 100644 index 0000000..3dcc3da --- /dev/null +++ ql/src/test/queries/clientpositive/msck1.q @@ -0,0 +1,12 @@ +DROP TABLE IF EXISTS mscktable; + +CREATE TABLE mscktable(col STRING) PARTITIONED BY (p1 STRING); + +dfs ${system:test.dfs.mkdir} ${system:test.warehouse.dir}/mscktable/p1=a/p1=b; +dfs ${system:test.dfs.mkdir} ${system:test.warehouse.dir}/mscktable/p1=c/p1=d; + +MSCK REPAIR TABLE mscktable; + +SHOW PARTITIONS mscktable; + +DROP TABLE mscktable; diff --git ql/src/test/results/clientpositive/msck1.q.out ql/src/test/results/clientpositive/msck1.q.out new file mode 100644 index 0000000..d01642b --- /dev/null +++ ql/src/test/results/clientpositive/msck1.q.out @@ -0,0 +1,35 @@ +PREHOOK: query: DROP TABLE IF EXISTS mscktable +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE IF EXISTS mscktable +POSTHOOK: type: DROPTABLE +PREHOOK: query: CREATE TABLE mscktable(col STRING) PARTITIONED BY (p1 STRING) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@mscktable +POSTHOOK: query: CREATE TABLE mscktable(col STRING) PARTITIONED BY (p1 STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@mscktable +PREHOOK: query: MSCK REPAIR TABLE mscktable +PREHOOK: type: MSCK +POSTHOOK: query: MSCK REPAIR TABLE mscktable +POSTHOOK: type: MSCK +Partitions not in metastore: mscktable:p1=a/p1=b mscktable:p1=c/p1=d +Repair: Added partition to metastore mscktable:p1=a/p1=b +Repair: Added partition to metastore mscktable:p1=c/p1=d +PREHOOK: query: SHOW PARTITIONS mscktable +PREHOOK: type: SHOWPARTITIONS +PREHOOK: Input: default@mscktable +POSTHOOK: query: SHOW PARTITIONS mscktable +POSTHOOK: type: SHOWPARTITIONS +POSTHOOK: Input: default@mscktable +p1=a +p1=c +PREHOOK: query: DROP TABLE mscktable +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@mscktable +PREHOOK: Output: default@mscktable +POSTHOOK: query: DROP TABLE mscktable +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@mscktable +POSTHOOK: Output: default@mscktable