diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java index 04abba2..112e991 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -3082,6 +3082,12 @@ public class DDLTask extends Task implements Serializable { tbl.getTTable().getSd().setCols(alterTbl.getNewCols()); } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.ADDPROPS) { tbl.getTTable().getParameters().putAll(alterTbl.getProps()); + } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.DROPPROPS) { + Iterator keyItr = alterTbl.getProps().keySet().iterator(); + while (keyItr.hasNext()) { + String temp = keyItr.next(); + tbl.getTTable().getParameters().remove(temp); + } } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.ADDSERDEPROPS) { if (part != null) { part.getTPartition().getSd().getSerdeInfo().getParameters().putAll( diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java index d621db1..e0ea687 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java @@ -399,8 +399,10 @@ public abstract class BaseSemanticAnalyzer { for (int propChild = 0; propChild < prop.getChildCount(); propChild++) { String key = unescapeSQLString(prop.getChild(propChild).getChild(0) .getText()); - String value = unescapeSQLString(prop.getChild(propChild).getChild(1) - .getText()); + String value = null; + if (prop.getChild(propChild).getChild(1) != null) { + value = unescapeSQLString(prop.getChild(propChild).getChild(1).getText()); + } mapProp.put(key, value); } } 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 60c207b..5076c04 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -275,7 +275,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { analyzeDropTable(ast, true); break; case HiveParser.TOK_ALTERVIEW_PROPERTIES: - analyzeAlterTableProps(ast, true); + analyzeAlterTableProps(ast, true, false); break; case HiveParser.TOK_ALTERVIEW_ADDPARTS: // for ALTER VIEW ADD PARTITION, we wrapped the ADD to discriminate @@ -320,7 +320,10 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { analyzeAlterTableDropParts(ast, false); break; case HiveParser.TOK_ALTERTABLE_PROPERTIES: - analyzeAlterTableProps(ast, false); + analyzeAlterTableProps(ast, false, false); + break; + case HiveParser.TOK_DROPTABLE_PROPERTIES: + analyzeAlterTableProps(ast, false, true); break; case HiveParser.TOK_ALTERTABLE_CLUSTER_SORT: analyzeAlterTableClusterSort(ast); @@ -978,14 +981,18 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { } } - private void analyzeAlterTableProps(ASTNode ast, boolean expectView) + private void analyzeAlterTableProps(ASTNode ast, boolean expectView, boolean isUnset) throws SemanticException { String tableName = getUnescapedName((ASTNode) ast.getChild(0)); HashMap mapProp = getProps((ASTNode) (ast.getChild(1)) .getChild(0)); - AlterTableDesc alterTblDesc = - new AlterTableDesc(AlterTableTypes.ADDPROPS, expectView); + AlterTableDesc alterTblDesc = null; + if (isUnset == true) { + alterTblDesc = new AlterTableDesc(AlterTableTypes.DROPPROPS, expectView); + } else { + alterTblDesc = new AlterTableDesc(AlterTableTypes.ADDPROPS, expectView); + } alterTblDesc.setProps(mapProp); alterTblDesc.setOldName(tableName); diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g index 745a185..bf6c4d9 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g @@ -119,6 +119,7 @@ TOK_CREATEINDEX; TOK_CREATEINDEX_INDEXTBLNAME; TOK_DEFERRED_REBUILDINDEX; TOK_DROPINDEX; +TOK_DROPTABLE_PROPERTIES; TOK_LIKETABLE; TOK_DESCTABLE; TOK_DESCFUNCTION; @@ -733,6 +734,8 @@ alterStatementSuffixProperties @after { msgs.pop(); } : name=Identifier KW_SET KW_TBLPROPERTIES tableProperties -> ^(TOK_ALTERTABLE_PROPERTIES $name tableProperties) + | name=Identifier KW_UNSET KW_TBLPROPERTIES tableProperties + -> ^(TOK_DROPTABLE_PROPERTIES $name tableProperties) ; alterViewSuffixProperties @@ -1253,6 +1256,8 @@ tablePropertiesList @after { msgs.pop(); } : keyValueProperty (COMMA keyValueProperty)* -> ^(TOK_TABLEPROPLIST keyValueProperty+) + | + keyProperty (COMMA keyProperty)* -> ^(TOK_TABLEPROPLIST keyProperty+) ; keyValueProperty @@ -1262,6 +1267,13 @@ keyValueProperty key=StringLiteral EQUAL value=StringLiteral -> ^(TOK_TABLEPROPERTY $key $value) ; +keyProperty +@init { msgs.push("specifying key property"); } +@after { msgs.pop(); } + : + key=StringLiteral -> ^(TOK_TABLEPROPERTY $key TOK_NULL) + ; + tableRowFormatFieldIdentifier @init { msgs.push("table row format's field separator"); } @after { msgs.pop(); } @@ -2499,6 +2511,7 @@ KW_SERDEPROPERTIES: 'SERDEPROPERTIES'; KW_DBPROPERTIES: 'DBPROPERTIES'; KW_LIMIT: 'LIMIT'; KW_SET: 'SET'; +KW_UNSET: 'UNSET'; KW_TBLPROPERTIES: 'TBLPROPERTIES'; KW_IDXPROPERTIES: 'IDXPROPERTIES'; KW_VALUE_TYPE: '$VALUE$'; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java index 2be9c98..87c140b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java @@ -56,6 +56,7 @@ public final class SemanticAnalyzerFactory { commandType.put(HiveParser.TOK_ALTERTABLE_ARCHIVE, HiveOperation.ALTERTABLE_ARCHIVE); commandType.put(HiveParser.TOK_ALTERTABLE_UNARCHIVE, HiveOperation.ALTERTABLE_UNARCHIVE); commandType.put(HiveParser.TOK_ALTERTABLE_PROPERTIES, HiveOperation.ALTERTABLE_PROPERTIES); + commandType.put(HiveParser.TOK_DROPTABLE_PROPERTIES, HiveOperation.ALTERTABLE_PROPERTIES); commandType.put(HiveParser.TOK_ALTERTABLE_CLUSTER_SORT, HiveOperation.ALTERTABLE_CLUSTER_SORT); commandType.put(HiveParser.TOK_SHOWDATABASES, HiveOperation.SHOWDATABASES); commandType.put(HiveParser.TOK_SHOWTABLES, HiveOperation.SHOWTABLES); @@ -157,6 +158,7 @@ public final class SemanticAnalyzerFactory { case HiveParser.TOK_ALTERTABLE_DROPPARTS: case HiveParser.TOK_ALTERTABLE_ADDPARTS: case HiveParser.TOK_ALTERTABLE_PROPERTIES: + case HiveParser.TOK_DROPTABLE_PROPERTIES: case HiveParser.TOK_ALTERTABLE_SERIALIZER: case HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES: case HiveParser.TOK_ALTERINDEX_REBUILD: diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java index ef63301..64f0230 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java @@ -44,7 +44,7 @@ public class AlterTableDesc extends DDLDesc implements Serializable { * */ public static enum AlterTableTypes { - RENAME, ADDCOLS, REPLACECOLS, ADDPROPS, ADDSERDE, ADDSERDEPROPS, + RENAME, ADDCOLS, REPLACECOLS, ADDPROPS, DROPPROPS, ADDSERDE, ADDSERDEPROPS, ADDFILEFORMAT, ADDCLUSTERSORTCOLUMN, RENAMECOLUMN, ADDPARTITION, TOUCH, ARCHIVE, UNARCHIVE, ALTERPROTECTMODE, ALTERPARTITIONPROTECTMODE, ALTERLOCATION, DROPPARTITION, RENAMEPARTITION, ADDSKEWEDBY, ALTERSKEWEDLOCATION, diff --git ql/src/test/queries/clientpositive/unset_table_property.q ql/src/test/queries/clientpositive/unset_table_property.q new file mode 100644 index 0000000..399f733 --- /dev/null +++ ql/src/test/queries/clientpositive/unset_table_property.q @@ -0,0 +1,27 @@ +create table testTable(col1 int, col2 int); +SHOW TBLPROPERTIES testTable; + +alter table testTable set tblproperties ('a'='1', 'c'='3'); +SHOW TBLPROPERTIES testTable; + +-- unset all the properties +alter table testTable unset tblproperties ('a', 'c'); +SHOW TBLPROPERTIES testTable; + +alter table testTable set tblproperties ('a'='1', 'c'='3', 'd'='4'); +SHOW TBLPROPERTIES testTable; + +-- unset a subset of the properties +alter table testTable unset tblproperties ('a', 'd'); +SHOW TBLPROPERTIES testTable; + +alter table testTable set tblproperties ('a'='1', 'b' = '2', 'c'='3', 'd'='4'); +SHOW TBLPROPERTIES testTable; + +-- unset a subset of the properties and some non-existed properties +alter table testTable unset tblproperties ('b', 'd', 'f'); +SHOW TBLPROPERTIES testTable; + +-- unset a subset of the properties and some non-existed properties +alter table testTable unset tblproperties ('b', 'd', 'c', 'f'); +SHOW TBLPROPERTIES testTable; diff --git ql/src/test/results/clientpositive/unset_table_property.q.out ql/src/test/results/clientpositive/unset_table_property.q.out new file mode 100644 index 0000000..babcc34 --- /dev/null +++ ql/src/test/results/clientpositive/unset_table_property.q.out @@ -0,0 +1,140 @@ +PREHOOK: query: create table testTable(col1 int, col2 int) +PREHOOK: type: CREATETABLE +POSTHOOK: query: create table testTable(col1 int, col2 int) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@testTable +PREHOOK: query: SHOW TBLPROPERTIES testTable +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testTable +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +PREHOOK: query: alter table testTable set tblproperties ('a'='1', 'c'='3') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: alter table testTable set tblproperties ('a'='1', 'c'='3') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@testtable +POSTHOOK: Output: default@testtable +PREHOOK: query: SHOW TBLPROPERTIES testTable +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testTable +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +c 3 +#### A masked pattern was here #### +a 1 +#### A masked pattern was here #### +PREHOOK: query: -- unset all the properties +alter table testTable unset tblproperties ('a', 'c') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: -- unset all the properties +alter table testTable unset tblproperties ('a', 'c') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@testtable +POSTHOOK: Output: default@testtable +PREHOOK: query: SHOW TBLPROPERTIES testTable +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testTable +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +PREHOOK: query: alter table testTable set tblproperties ('a'='1', 'c'='3', 'd'='4') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: alter table testTable set tblproperties ('a'='1', 'c'='3', 'd'='4') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@testtable +POSTHOOK: Output: default@testtable +PREHOOK: query: SHOW TBLPROPERTIES testTable +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testTable +POSTHOOK: type: SHOW_TBLPROPERTIES + +d 4 +#### A masked pattern was here #### +c 3 +#### A masked pattern was here #### +a 1 +#### A masked pattern was here #### +PREHOOK: query: -- unset a subset of the properties +alter table testTable unset tblproperties ('a', 'd') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: -- unset a subset of the properties +alter table testTable unset tblproperties ('a', 'd') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@testtable +POSTHOOK: Output: default@testtable +PREHOOK: query: SHOW TBLPROPERTIES testTable +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testTable +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +c 3 +#### A masked pattern was here #### +PREHOOK: query: alter table testTable set tblproperties ('a'='1', 'b' = '2', 'c'='3', 'd'='4') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: alter table testTable set tblproperties ('a'='1', 'b' = '2', 'c'='3', 'd'='4') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@testtable +POSTHOOK: Output: default@testtable +PREHOOK: query: SHOW TBLPROPERTIES testTable +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testTable +POSTHOOK: type: SHOW_TBLPROPERTIES + +d 4 +#### A masked pattern was here #### +b 2 +c 3 +#### A masked pattern was here #### +a 1 +#### A masked pattern was here #### +PREHOOK: query: -- unset a subset of the properties and some non-existed properties +alter table testTable unset tblproperties ('b', 'd', 'f') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: -- unset a subset of the properties and some non-existed properties +alter table testTable unset tblproperties ('b', 'd', 'f') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@testtable +POSTHOOK: Output: default@testtable +PREHOOK: query: SHOW TBLPROPERTIES testTable +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testTable +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +c 3 +#### A masked pattern was here #### +a 1 +#### A masked pattern was here #### +PREHOOK: query: -- unset a subset of the properties and some non-existed properties +alter table testTable unset tblproperties ('b', 'd', 'c', 'f') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: -- unset a subset of the properties and some non-existed properties +alter table testTable unset tblproperties ('b', 'd', 'c', 'f') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@testtable +POSTHOOK: Output: default@testtable +PREHOOK: query: SHOW TBLPROPERTIES testTable +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testTable +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +a 1 +#### A masked pattern was here ####