diff --git ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java index cd957b7..0dbb10c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java +++ ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java @@ -291,6 +291,11 @@ public enum ErrorMsg { HIVE_GROUPING_SETS_EXPR_NOT_IN_GROUPBY(10213, "Grouping sets expression is not in GROUP BY key"), INVALID_PARTITION_SPEC(10214, "Invalid partition spec specified"), + ALTER_TBL_UNSET_NON_EXIST_PROPERTY(10215, "Could not unset non-existed property.\n" + + "Please use the following syntax if not sure " + + "whether the property existed or not:\n" + + "ALTER TABLE tableName UNSET TBLPROPERTIES IF EXISTS (key1, key2, ...)\n" + + "the following property is not existed, and could not be unset without IF EXISTS: "), SCRIPT_INIT_ERROR(20000, "Unable to initialize custom script."), SCRIPT_IO_ERROR(20001, "An error occurred while reading or writing to your custom script. " 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..93febc4 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,11 @@ 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()) { + tbl.getTTable().getParameters().remove(keyItr.next()); + } } 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..705ad2e 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,10 @@ 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_DROPVIEW_PROPERTIES: + analyzeAlterTableProps(ast, true, true); break; case HiveParser.TOK_ALTERVIEW_ADDPARTS: // for ALTER VIEW ADD PARTITION, we wrapped the ADD to discriminate @@ -320,7 +323,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); @@ -962,6 +968,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { case DROPPARTITION: case RENAMEPARTITION: case ADDPROPS: + case DROPPROPS: case RENAME: // allow this form break; @@ -978,14 +985,21 @@ 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); + if (ast.getChild(2) != null) { + alterTblDesc.setDropIfExists(true); + } + } else { + alterTblDesc = new AlterTableDesc(AlterTableTypes.ADDPROPS, expectView); + } alterTblDesc.setProps(mapProp); alterTblDesc.setOldName(tableName); @@ -1127,6 +1141,19 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { if (desc != null) { validateAlterTableType(tab, desc.getOp(), desc.getExpectView()); + + // validate Unset Non Existed Table Properties + if (desc.getOp() == AlterTableDesc.AlterTableTypes.DROPPROPS && + desc.getIsDropIfExists() == false) { + Iterator keyItr = desc.getProps().keySet().iterator(); + while (keyItr.hasNext()) { + String currKey = keyItr.next(); + if (tab.getTTable().getParameters().containsKey(currKey) == false) { + throw new SemanticException( + ErrorMsg.ALTER_TBL_UNSET_NON_EXIST_PROPERTY.getMsg(currKey)); + } + } + } } } 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..ab27963 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; @@ -199,6 +200,7 @@ TOK_DROPFUNCTION; TOK_CREATEVIEW; TOK_DROPVIEW; TOK_ALTERVIEW_PROPERTIES; +TOK_DROPVIEW_PROPERTIES; TOK_ALTERVIEW_ADDPARTS; TOK_ALTERVIEW_DROPPARTS; TOK_ALTERVIEW_RENAME; @@ -733,6 +735,8 @@ alterStatementSuffixProperties @after { msgs.pop(); } : name=Identifier KW_SET KW_TBLPROPERTIES tableProperties -> ^(TOK_ALTERTABLE_PROPERTIES $name tableProperties) + | name=Identifier KW_UNSET KW_TBLPROPERTIES ifExists? tableProperties + -> ^(TOK_DROPTABLE_PROPERTIES $name tableProperties ifExists?) ; alterViewSuffixProperties @@ -740,6 +744,8 @@ alterViewSuffixProperties @after { msgs.pop(); } : name=Identifier KW_SET KW_TBLPROPERTIES tableProperties -> ^(TOK_ALTERVIEW_PROPERTIES $name tableProperties) + | name=Identifier KW_UNSET KW_TBLPROPERTIES ifExists? tableProperties + -> ^(TOK_DROPVIEW_PROPERTIES $name tableProperties ifExists?) ; alterStatementSuffixSerdeProperties @@ -1253,6 +1259,8 @@ tablePropertiesList @after { msgs.pop(); } : keyValueProperty (COMMA keyValueProperty)* -> ^(TOK_TABLEPROPLIST keyValueProperty+) + | + keyProperty (COMMA keyProperty)* -> ^(TOK_TABLEPROPLIST keyProperty+) ; keyValueProperty @@ -1262,6 +1270,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 +2514,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..ddedf64 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); @@ -76,6 +77,7 @@ public final class SemanticAnalyzerFactory { commandType.put(HiveParser.TOK_ALTERINDEX_REBUILD, HiveOperation.ALTERINDEX_REBUILD); commandType.put(HiveParser.TOK_ALTERINDEX_PROPERTIES, HiveOperation.ALTERINDEX_PROPS); commandType.put(HiveParser.TOK_ALTERVIEW_PROPERTIES, HiveOperation.ALTERVIEW_PROPERTIES); + commandType.put(HiveParser.TOK_DROPVIEW_PROPERTIES, HiveOperation.ALTERVIEW_PROPERTIES); commandType.put(HiveParser.TOK_ALTERVIEW_ADDPARTS, HiveOperation.ALTERTABLE_ADDPARTS); commandType.put(HiveParser.TOK_ALTERVIEW_DROPPARTS, HiveOperation.ALTERTABLE_DROPPARTS); commandType.put(HiveParser.TOK_QUERY, HiveOperation.QUERY); @@ -157,11 +159,13 @@ 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: case HiveParser.TOK_ALTERINDEX_PROPERTIES: case HiveParser.TOK_ALTERVIEW_PROPERTIES: + case HiveParser.TOK_DROPVIEW_PROPERTIES: case HiveParser.TOK_ALTERVIEW_ADDPARTS: case HiveParser.TOK_ALTERVIEW_DROPPARTS: case HiveParser.TOK_ALTERVIEW_RENAME: 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..a4d9cbd 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, @@ -86,6 +86,7 @@ public class AlterTableDesc extends DDLDesc implements Serializable { List skewedColNames; List> skewedColValues; Table table; + boolean isDropIfExists = false; public AlterTableDesc() { } @@ -671,4 +672,18 @@ public class AlterTableDesc extends DDLDesc implements Serializable { this.isStoredAsSubDirectories = isStoredAsSubDirectories; } + /** + * @param isDropIfExists the isDropIfExists to set + */ + public void setDropIfExists(boolean isDropIfExists) { + this.isDropIfExists = isDropIfExists; + } + + /** + * @return isDropIfExists + */ + public boolean getIsDropIfExists() { + return isDropIfExists; + } + } diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java index 7bdc821..415d850 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java @@ -72,6 +72,7 @@ public enum HiveOperation { DROPINDEX("DROPINDEX", null, null), ALTERINDEX_REBUILD("ALTERINDEX_REBUILD", null, null), ALTERVIEW_PROPERTIES("ALTERVIEW_PROPERTIES", null, null), + DROPVIEW_PROPERTIES("DROPVIEW_PROPERTIES", null, null), LOCKTABLE("LOCKTABLE", new Privilege[]{Privilege.LOCK}, null), UNLOCKTABLE("UNLOCKTABLE", new Privilege[]{Privilege.LOCK}, null), CREATEROLE("CREATEROLE", null, null), diff --git ql/src/test/queries/clientnegative/set_table_property.q ql/src/test/queries/clientnegative/set_table_property.q new file mode 100644 index 0000000..d582aae --- /dev/null +++ ql/src/test/queries/clientnegative/set_table_property.q @@ -0,0 +1,4 @@ +create table testTable(col1 int, col2 int); + +-- set a table property = null, it should be caught by the grammar +alter table testTable set tblproperties ('a'=); diff --git ql/src/test/queries/clientnegative/unset_table_property.q ql/src/test/queries/clientnegative/unset_table_property.q new file mode 100644 index 0000000..7a24e65 --- /dev/null +++ ql/src/test/queries/clientnegative/unset_table_property.q @@ -0,0 +1,6 @@ +CREATE TABLE testTable(col1 INT, col2 INT); +ALTER TABLE testTable SET TBLPROPERTIES ('a'='1', 'c'='3'); +SHOW TBLPROPERTIES testTable; + +-- unset a subset of the properties and some non-existed properties without if exists +ALTER TABLE testTable UNSET TBLPROPERTIES ('c', 'x', 'y', 'z'); diff --git ql/src/test/queries/clientnegative/unset_view_property.q ql/src/test/queries/clientnegative/unset_view_property.q new file mode 100644 index 0000000..1113100 --- /dev/null +++ ql/src/test/queries/clientnegative/unset_view_property.q @@ -0,0 +1,6 @@ +CREATE VIEW testView AS SELECT value FROM src WHERE key=86; +ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB'='200'); +SHOW TBLPROPERTIES testView; + +-- unset a subset of the properties and some non-existed properties without if exists +ALTER VIEW testView UNSET TBLPROPERTIES ('propB', 'propX', 'propY', 'propZ'); diff --git ql/src/test/queries/clientpositive/unset_table_view_property.q ql/src/test/queries/clientpositive/unset_table_view_property.q new file mode 100644 index 0000000..f838cd1 --- /dev/null +++ ql/src/test/queries/clientpositive/unset_table_view_property.q @@ -0,0 +1,64 @@ +CREATE TABLE testTable(col1 INT, col2 INT); +SHOW TBLPROPERTIES testTable; + +-- UNSET TABLE PROPERTIES +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; + +-- the same property being UNSET multiple times +ALTER TABLE testTable UNSET TBLPROPERTIES ('c', 'c', 'c'); +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 using IF EXISTS +ALTER TABLE testTable UNSET TBLPROPERTIES IF EXISTS ('b', 'd', 'b', 'f'); +SHOW TBLPROPERTIES testTable; + +-- UNSET a subset of the properties and some non-existed properties using IF EXISTS +ALTER TABLE testTable UNSET TBLPROPERTIES IF EXISTS ('b', 'd', 'c', 'f', 'x', 'y', 'z'); +SHOW TBLPROPERTIES testTable; + +-- UNSET VIEW PROPERTIES +CREATE VIEW testView AS SELECT value FROM src WHERE key=86; +ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB'='200'); +SHOW TBLPROPERTIES testView; + +-- UNSET all the properties +ALTER VIEW testView UNSET TBLPROPERTIES ('propA', 'propB'); +SHOW TBLPROPERTIES testView; + +ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propC'='300', 'propD'='400'); +SHOW TBLPROPERTIES testView; + +-- UNSET a subset of the properties +ALTER VIEW testView UNSET TBLPROPERTIES ('propA', 'propC'); +SHOW TBLPROPERTIES testView; + +-- the same property being UNSET multiple times +ALTER VIEW testView UNSET TBLPROPERTIES ('propD', 'propD', 'propD'); +SHOW TBLPROPERTIES testView; + +ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB' = '200', 'propC'='300', 'propD'='400'); +SHOW TBLPROPERTIES testView; + +-- UNSET a subset of the properties and some non-existed properties using IF EXISTS +ALTER VIEW testView UNSET TBLPROPERTIES IF EXISTS ('propC', 'propD', 'propD', 'propC', 'propZ'); +SHOW TBLPROPERTIES testView; + +-- UNSET a subset of the properties and some non-existed properties using IF EXISTS +ALTER VIEW testView UNSET TBLPROPERTIES IF EXISTS ('propB', 'propC', 'propD', 'propF'); +SHOW TBLPROPERTIES testView; + diff --git ql/src/test/results/clientnegative/set_table_property.q.out ql/src/test/results/clientnegative/set_table_property.q.out new file mode 100644 index 0000000..e1d1f4b --- /dev/null +++ ql/src/test/results/clientnegative/set_table_property.q.out @@ -0,0 +1,7 @@ +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 +FAILED: ParseException line 4:45 mismatched input ')' expecting StringLiteral near '=' in specifying key/value property + diff --git ql/src/test/results/clientnegative/unset_table_property.q.out ql/src/test/results/clientnegative/unset_table_property.q.out new file mode 100644 index 0000000..968e301 --- /dev/null +++ ql/src/test/results/clientnegative/unset_table_property.q.out @@ -0,0 +1,27 @@ +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: 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 #### +FAILED: SemanticException [Error 10215]: Could not unset non-existed property. +Please use the following syntax if not sure whether the property existed or not: +ALTER TABLE tableName UNSET TBLPROPERTIES IF EXISTS (key1, key2, ...) +the following property is not existed, and could not be unset without IF EXISTS: z diff --git ql/src/test/results/clientnegative/unset_view_property.q.out ql/src/test/results/clientnegative/unset_view_property.q.out new file mode 100644 index 0000000..9f234fa --- /dev/null +++ ql/src/test/results/clientnegative/unset_view_property.q.out @@ -0,0 +1,28 @@ +PREHOOK: query: CREATE VIEW testView AS SELECT value FROM src WHERE key=86 +PREHOOK: type: CREATEVIEW +#### A masked pattern was here #### +POSTHOOK: query: CREATE VIEW testView AS SELECT value FROM src WHERE key=86 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Output: default@testView +#### A masked pattern was here #### +PREHOOK: query: ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB'='200') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB'='200') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +propA 100 +propB 200 +#### A masked pattern was here #### +FAILED: SemanticException [Error 10215]: Could not unset non-existed property. +Please use the following syntax if not sure whether the property existed or not: +ALTER TABLE tableName UNSET TBLPROPERTIES IF EXISTS (key1, key2, ...) +the following property is not existed, and could not be unset without IF EXISTS: propX diff --git ql/src/test/results/clientpositive/unset_table_view_property.q.out ql/src/test/results/clientpositive/unset_table_view_property.q.out new file mode 100644 index 0000000..2f4dfba --- /dev/null +++ ql/src/test/results/clientpositive/unset_table_view_property.q.out @@ -0,0 +1,307 @@ +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: -- UNSET TABLE PROPERTIES +ALTER TABLE testTable SET TBLPROPERTIES ('a'='1', 'c'='3') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: -- UNSET TABLE PROPERTIES +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: -- the same property being UNSET multiple times +ALTER TABLE testTable UNSET TBLPROPERTIES ('c', 'c', 'c') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@testtable +PREHOOK: Output: default@testtable +POSTHOOK: query: -- the same property being UNSET multiple times +ALTER TABLE testTable UNSET TBLPROPERTIES ('c', 'c', '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', '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 using IF EXISTS +ALTER TABLE testTable UNSET TBLPROPERTIES IF EXISTS ('b', 'd', 'b', '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 using IF EXISTS +ALTER TABLE testTable UNSET TBLPROPERTIES IF EXISTS ('b', 'd', 'b', '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 using IF EXISTS +ALTER TABLE testTable UNSET TBLPROPERTIES IF EXISTS ('b', 'd', 'c', 'f', 'x', 'y', 'z') +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 using IF EXISTS +ALTER TABLE testTable UNSET TBLPROPERTIES IF EXISTS ('b', 'd', 'c', 'f', 'x', 'y', 'z') +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 #### +PREHOOK: query: -- UNSET VIEW PROPERTIES +CREATE VIEW testView AS SELECT value FROM src WHERE key=86 +PREHOOK: type: CREATEVIEW +#### A masked pattern was here #### +POSTHOOK: query: -- UNSET VIEW PROPERTIES +CREATE VIEW testView AS SELECT value FROM src WHERE key=86 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Output: default@testView +#### A masked pattern was here #### +PREHOOK: query: ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB'='200') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB'='200') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +propA 100 +propB 200 +#### A masked pattern was here #### +PREHOOK: query: -- UNSET all the properties +ALTER VIEW testView UNSET TBLPROPERTIES ('propA', 'propB') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: -- UNSET all the properties +ALTER VIEW testView UNSET TBLPROPERTIES ('propA', 'propB') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +PREHOOK: query: ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propC'='300', 'propD'='400') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propC'='300', 'propD'='400') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +propA 100 +#### A masked pattern was here #### +propD 400 +propC 300 +PREHOOK: query: -- UNSET a subset of the properties +ALTER VIEW testView UNSET TBLPROPERTIES ('propA', 'propC') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: -- UNSET a subset of the properties +ALTER VIEW testView UNSET TBLPROPERTIES ('propA', 'propC') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +propD 400 +PREHOOK: query: -- the same property being UNSET multiple times +ALTER VIEW testView UNSET TBLPROPERTIES ('propD', 'propD', 'propD') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: -- the same property being UNSET multiple times +ALTER VIEW testView UNSET TBLPROPERTIES ('propD', 'propD', 'propD') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +PREHOOK: query: ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB' = '200', 'propC'='300', 'propD'='400') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: ALTER VIEW testView SET TBLPROPERTIES ('propA'='100', 'propB' = '200', 'propC'='300', 'propD'='400') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +propA 100 +propB 200 +#### A masked pattern was here #### +propD 400 +propC 300 +PREHOOK: query: -- UNSET a subset of the properties and some non-existed properties using IF EXISTS +ALTER VIEW testView UNSET TBLPROPERTIES IF EXISTS ('propC', 'propD', 'propD', 'propC', 'propZ') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: -- UNSET a subset of the properties and some non-existed properties using IF EXISTS +ALTER VIEW testView UNSET TBLPROPERTIES IF EXISTS ('propC', 'propD', 'propD', 'propC', 'propZ') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +propA 100 +propB 200 +#### A masked pattern was here #### +PREHOOK: query: -- UNSET a subset of the properties and some non-existed properties using IF EXISTS +ALTER VIEW testView UNSET TBLPROPERTIES IF EXISTS ('propB', 'propC', 'propD', 'propF') +PREHOOK: type: ALTERVIEW_PROPERTIES +PREHOOK: Input: default@testview +PREHOOK: Output: default@testview +POSTHOOK: query: -- UNSET a subset of the properties and some non-existed properties using IF EXISTS +ALTER VIEW testView UNSET TBLPROPERTIES IF EXISTS ('propB', 'propC', 'propD', 'propF') +POSTHOOK: type: ALTERVIEW_PROPERTIES +POSTHOOK: Input: default@testview +POSTHOOK: Output: default@testview +PREHOOK: query: SHOW TBLPROPERTIES testView +PREHOOK: type: SHOW_TBLPROPERTIES +POSTHOOK: query: SHOW TBLPROPERTIES testView +POSTHOOK: type: SHOW_TBLPROPERTIES + +#### A masked pattern was here #### +propA 100 +#### A masked pattern was here ####