diff --git ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java index d4b7a2c..0c47fb7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java +++ ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java @@ -347,7 +347,8 @@ public enum ErrorMsg { COLUMNSTATSCOLLECTOR_INVALID_SYNTAX(30008, "Dynamic partitioning is not supported yet while " + "gathering column statistics through ANALYZE statement"), COLUMNSTATSCOLLECTOR_PARSE_ERROR(30009, "Encountered parse error while parsing rewritten query"), - COLUMNSTATSCOLLECTOR_IO_ERROR(30010, "Encountered I/O exception while parsing rewritten query") + COLUMNSTATSCOLLECTOR_IO_ERROR(30010, "Encountered I/O exception while parsing rewritten query"), + DROP_COMMAND_NOT_ALLOWED_FOR_PARTITION(30011, "Partition protected from being dropped"), ; private int errorCode; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java index c450d4f..8ad4334 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -2233,15 +2233,16 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { } } + boolean ignoreProtection = (ast.getFirstChildWithType(HiveParser.TOK_IGNOREPROTECTION) != null); if (partSpecs != null) { boolean ifExists = (ast.getFirstChildWithType(HiveParser.TOK_IFEXISTS) != null); // we want to signal an error if the partition doesn't exist and we're // configured not to fail silently boolean throwException = !ifExists && !HiveConf.getBoolVar(conf, ConfVars.DROPIGNORESNONEXISTENT); - addTableDropPartsOutputs(tblName, partSpecs, throwException, stringPartitionColumns); + addTableDropPartsOutputs(tblName, partSpecs, throwException, + stringPartitionColumns, ignoreProtection); } - boolean ignoreProtection = (ast.getFirstChildWithType(HiveParser.TOK_IGNOREPROTECTION) != null); DropTableDesc dropTblDesc = new DropTableDesc(tblName, partSpecs, expectView, stringPartitionColumns, ignoreProtection); @@ -2635,7 +2636,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { * throwIfNonExistent is true, otherwise ignore it. */ private void addTableDropPartsOutputs(String tblName, List partSpecs, - boolean throwIfNonExistent, boolean stringPartitionColumns) + boolean throwIfNonExistent, boolean stringPartitionColumns, boolean ignoreProtection) throws SemanticException { Table tab; try { @@ -2670,6 +2671,10 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { } } for (Partition p : parts) { + if (!ignoreProtection && !p.canDrop()) { + throw new SemanticException( + ErrorMsg.DROP_COMMAND_NOT_ALLOWED_FOR_PARTITION.getMsg(p.getCompleteName())); + } outputs.add(new WriteEntity(p)); } } diff --git ql/src/test/queries/clientnegative/sa_fail_hook3.q ql/src/test/queries/clientnegative/sa_fail_hook3.q new file mode 100644 index 0000000..e54201c --- /dev/null +++ ql/src/test/queries/clientnegative/sa_fail_hook3.q @@ -0,0 +1,4 @@ +create table mp2 (a string) partitioned by (b string); +alter table mp2 add partition (b='1'); +alter table mp2 partition (b='1') enable NO_DROP; +alter table mp2 drop partition (b='1'); diff --git ql/src/test/results/clientnegative/alter_partition_nodrop.q.out ql/src/test/results/clientnegative/alter_partition_nodrop.q.out index 13e9401..bf1c3fd 100644 --- ql/src/test/results/clientnegative/alter_partition_nodrop.q.out +++ ql/src/test/results/clientnegative/alter_partition_nodrop.q.out @@ -33,10 +33,4 @@ POSTHOOK: Input: default@alter_part_nodrop_part@year=1996/month=10 POSTHOOK: Input: default@alter_part_nodrop_part@year=1996/month=12 POSTHOOK: Output: default@alter_part_nodrop_part@year=1996/month=10 POSTHOOK: Output: default@alter_part_nodrop_part@year=1996/month=12 -PREHOOK: query: alter table alter_part_nodrop_part drop partition (year='1996') -PREHOOK: type: ALTERTABLE_DROPPARTS -PREHOOK: Input: default@alter_part_nodrop_part -PREHOOK: Output: default@alter_part_nodrop_part@year=1996/month=10 -PREHOOK: Output: default@alter_part_nodrop_part@year=1996/month=12 -FAILED: Error in metadata: Table alter_part_nodrop_part Partition year=1996/month=10 is protected from being dropped -FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask +FAILED: SemanticException [Error 30011]: Partition protected from being dropped default@alter_part_nodrop_part@year=1996/month=10 diff --git ql/src/test/results/clientnegative/protectmode_part_no_drop.q.out ql/src/test/results/clientnegative/protectmode_part_no_drop.q.out index 2ec06df..035fb36 100644 --- ql/src/test/results/clientnegative/protectmode_part_no_drop.q.out +++ ql/src/test/results/clientnegative/protectmode_part_no_drop.q.out @@ -43,9 +43,4 @@ p string None p string None #### A masked pattern was here #### -PREHOOK: query: alter table tbl_protectmode_no_drop drop partition (p='p1') -PREHOOK: type: ALTERTABLE_DROPPARTS -PREHOOK: Input: default@tbl_protectmode_no_drop -PREHOOK: Output: default@tbl_protectmode_no_drop@p=p1 -FAILED: Error in metadata: Table tbl_protectmode_no_drop Partition p=p1 is protected from being dropped -FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask +FAILED: SemanticException [Error 30011]: Partition protected from being dropped default@tbl_protectmode_no_drop@p=p1 diff --git ql/src/test/results/clientnegative/protectmode_tbl7.q.out ql/src/test/results/clientnegative/protectmode_tbl7.q.out index 74c99ae..28e7b03 100644 --- ql/src/test/results/clientnegative/protectmode_tbl7.q.out +++ ql/src/test/results/clientnegative/protectmode_tbl7.q.out @@ -49,9 +49,4 @@ POSTHOOK: query: alter table tbl_protectmode_tbl7 enable no_drop cascade POSTHOOK: type: ALTERTABLE_PROTECTMODE POSTHOOK: Input: default@tbl_protectmode_tbl7 POSTHOOK: Output: default@tbl_protectmode_tbl7 -PREHOOK: query: alter table tbl_protectmode_tbl7 drop partition (p='p1') -PREHOOK: type: ALTERTABLE_DROPPARTS -PREHOOK: Input: default@tbl_protectmode_tbl7 -PREHOOK: Output: default@tbl_protectmode_tbl7@p=p1 -FAILED: Error in metadata: Table tbl_protectmode_tbl7 Partition p=p1 is protected from being dropped -FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask +FAILED: SemanticException [Error 30011]: Partition protected from being dropped default@tbl_protectmode_tbl7@p=p1 diff --git ql/src/test/results/clientnegative/protectmode_tbl8.q.out ql/src/test/results/clientnegative/protectmode_tbl8.q.out index 3048d06..bd716d8 100644 --- ql/src/test/results/clientnegative/protectmode_tbl8.q.out +++ ql/src/test/results/clientnegative/protectmode_tbl8.q.out @@ -49,9 +49,4 @@ POSTHOOK: query: alter table tbl_protectmode_tbl8 add partition (p='p1') POSTHOOK: type: ALTERTABLE_ADDPARTS POSTHOOK: Input: default@tbl_protectmode_tbl8 POSTHOOK: Output: default@tbl_protectmode_tbl8@p=p1 -PREHOOK: query: alter table tbl_protectmode_tbl8 drop partition (p='p1') -PREHOOK: type: ALTERTABLE_DROPPARTS -PREHOOK: Input: default@tbl_protectmode_tbl8 -PREHOOK: Output: default@tbl_protectmode_tbl8@p=p1 -FAILED: Error in metadata: Table tbl_protectmode_tbl8 Partition p=p1 is protected from being dropped -FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask +FAILED: SemanticException [Error 30011]: Partition protected from being dropped default@tbl_protectmode_tbl8@p=p1 diff --git ql/src/test/results/clientnegative/sa_fail_hook3.q.out ql/src/test/results/clientnegative/sa_fail_hook3.q.out new file mode 100644 index 0000000..cddd1cb --- /dev/null +++ ql/src/test/results/clientnegative/sa_fail_hook3.q.out @@ -0,0 +1,22 @@ +PREHOOK: query: create table mp2 (a string) partitioned by (b string) +PREHOOK: type: CREATETABLE +POSTHOOK: query: create table mp2 (a string) partitioned by (b string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@mp2 +PREHOOK: query: alter table mp2 add partition (b='1') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@mp2 +POSTHOOK: query: alter table mp2 add partition (b='1') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@mp2 +POSTHOOK: Output: default@mp2@b=1 +PREHOOK: query: alter table mp2 partition (b='1') enable NO_DROP +PREHOOK: type: ALTERPARTITION_PROTECTMODE +PREHOOK: Input: default@mp2 +PREHOOK: Output: default@mp2@b=1 +POSTHOOK: query: alter table mp2 partition (b='1') enable NO_DROP +POSTHOOK: type: ALTERPARTITION_PROTECTMODE +POSTHOOK: Input: default@mp2 +POSTHOOK: Input: default@mp2@b=1 +POSTHOOK: Output: default@mp2@b=1 +FAILED: SemanticException [Error 30011]: Partition protected from being dropped default@mp2@b=1