diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g index 9463ef1..8f15fca 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g @@ -263,7 +263,8 @@ searchCondition // INSERT INTO (col1,col2,...) SELECT * FROM (VALUES(1,2,3),(4,5,6),...) as Foo(a,b,c) valueRowConstructor : - LPAREN atomExpression (COMMA atomExpression)* RPAREN -> ^(TOK_VALUE_ROW atomExpression+) + LPAREN precedenceUnaryPrefixExpression (COMMA precedenceUnaryPrefixExpression)* RPAREN -> ^(TOK_VALUE_ROW precedenceUnaryPrefixExpression+) +// LPAREN atomExpression (COMMA atomExpression)* RPAREN -> ^(TOK_VALUE_ROW atomExpression+) ; valuesTableConstructor diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g index 714e7d1..e32171f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g @@ -2237,7 +2237,8 @@ deleteStatement /*SET = (3 + col2)*/ columnAssignmentClause : - tableOrColumn EQUAL^ atomExpression + tableOrColumn EQUAL^ precedencePlusExpression +// tableOrColumn EQUAL^ atomExpression ; /*SET col1 = 5, col2 = (4 + col4), ...*/ diff --git ql/src/test/org/apache/hadoop/hive/ql/parse/TestIUD.java ql/src/test/org/apache/hadoop/hive/ql/parse/TestIUD.java index 548215a..056c56d 100644 --- ql/src/test/org/apache/hadoop/hive/ql/parse/TestIUD.java +++ ql/src/test/org/apache/hadoop/hive/ql/parse/TestIUD.java @@ -24,6 +24,9 @@ import org.junit.BeforeClass; import org.junit.Test; +/** + * various Parser tests for INSERT/UPDATE/DELETE + */ public class TestIUD { private static HiveConf conf; @@ -102,6 +105,18 @@ public void testUpdateWithWhereSingleSet() throws ParseException { ast.toStringTree()); } @Test + public void testUpdateWithWhereSingleSetExpr() throws ParseException { + ASTNode ast = parse("UPDATE src SET key = -3+(5*9)%8, val = cast(6.1 + c as INT), d = d - 1 WHERE value IS NULL"); + Assert.assertEquals("AST doesn't match", + "(TOK_UPDATE_TABLE (TOK_TABNAME src) " + + "(TOK_SET_COLUMNS_CLAUSE " + + "(= (TOK_TABLE_OR_COL key) (+ (- 3) (% (* 5 9) 8))) " + + "(= (TOK_TABLE_OR_COL val) (TOK_FUNCTION TOK_INT (+ 6.1 (TOK_TABLE_OR_COL c)))) " + + "(= (TOK_TABLE_OR_COL d) (- (TOK_TABLE_OR_COL d) 1))) " + + "(TOK_WHERE (TOK_FUNCTION TOK_ISNULL (TOK_TABLE_OR_COL value))))", + ast.toStringTree()); + } + @Test public void testUpdateWithWhereMultiSet() throws ParseException { ASTNode ast = parse("UPDATE src SET key = 3, value = 8 WHERE VALUE = 1230997"); Assert.assertEquals("AST doesn't match", @@ -207,13 +222,13 @@ public void testInsertIntoTableFromAnonymousTable1Row() throws ParseException { } @Test public void testInsertIntoTableFromAnonymousTable() throws ParseException { - ASTNode ast = parse("insert into table page_view values(1,2),(3,4)"); + ASTNode ast = parse("insert into table page_view values(-1,2),(3,+4)"); Assert.assertEquals("AST doesn't match", "(TOK_QUERY " + "(TOK_FROM " + "(TOK_VIRTUAL_TABLE " + "(TOK_VIRTUAL_TABREF TOK_ANONYMOUS) " + - "(TOK_VALUES_TABLE (TOK_VALUE_ROW 1 2) (TOK_VALUE_ROW 3 4)))) " + + "(TOK_VALUES_TABLE (TOK_VALUE_ROW (- 1) 2) (TOK_VALUE_ROW 3 (+ 4))))) " + "(TOK_INSERT (TOK_INSERT_INTO (TOK_TAB (TOK_TABNAME page_view))) " + "(TOK_SELECT (TOK_SELEXPR TOK_ALLCOLREF))))", ast.toStringTree()); diff --git ql/src/test/queries/clientpositive/insert_values_tmp_table.q ql/src/test/queries/clientpositive/insert_values_tmp_table.q index fd8ec29..1e5943f 100644 --- ql/src/test/queries/clientpositive/insert_values_tmp_table.q +++ ql/src/test/queries/clientpositive/insert_values_tmp_table.q @@ -7,6 +7,7 @@ create temporary table acid_ivtt(i int, de decimal(5,2), vc varchar(128)) cluste insert into table acid_ivtt values (1, 109.23, 'mary had a little lamb'), - (429496729, 0.14, 'its fleece was white as snow'); + (429496729, 0.14, 'its fleece was white as snow'), + (-29496729, -0.14, 'negative values test'); select i, de, vc from acid_ivtt order by i; diff --git ql/src/test/queries/clientpositive/update_all_types.q ql/src/test/queries/clientpositive/update_all_types.q index 39fe73d..ddb8359 100644 --- ql/src/test/queries/clientpositive/update_all_types.q +++ ql/src/test/queries/clientpositive/update_all_types.q @@ -53,4 +53,10 @@ update acid_uat set select * from acid_uat order by i; +update acid_uat set + ti = ti * 2, + si = cast(ti as int), + d = floor(d) + where s = 'aw724t8c5558x2xneC624'; + diff --git ql/src/test/results/clientpositive/insert_values_tmp_table.q.out ql/src/test/results/clientpositive/insert_values_tmp_table.q.out index 95d6372..a424c18 100644 --- ql/src/test/results/clientpositive/insert_values_tmp_table.q.out +++ ql/src/test/results/clientpositive/insert_values_tmp_table.q.out @@ -8,13 +8,15 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@acid_ivtt PREHOOK: query: insert into table acid_ivtt values (1, 109.23, 'mary had a little lamb'), - (429496729, 0.14, 'its fleece was white as snow') + (429496729, 0.14, 'its fleece was white as snow'), + (-29496729, -0.14, 'negative values test') PREHOOK: type: QUERY PREHOOK: Input: default@values__tmp__table__1 PREHOOK: Output: default@acid_ivtt POSTHOOK: query: insert into table acid_ivtt values (1, 109.23, 'mary had a little lamb'), - (429496729, 0.14, 'its fleece was white as snow') + (429496729, 0.14, 'its fleece was white as snow'), + (-29496729, -0.14, 'negative values test') POSTHOOK: type: QUERY POSTHOOK: Input: default@values__tmp__table__1 POSTHOOK: Output: default@acid_ivtt @@ -29,5 +31,6 @@ POSTHOOK: query: select i, de, vc from acid_ivtt order by i POSTHOOK: type: QUERY POSTHOOK: Input: default@acid_ivtt #### A masked pattern was here #### +-29496729 -0.14 negative values test 1 109.23 mary had a little lamb 429496729 0.14 its fleece was white as snow diff --git ql/src/test/results/clientpositive/tez/insert_values_tmp_table.q.out ql/src/test/results/clientpositive/tez/insert_values_tmp_table.q.out index 95d6372..a424c18 100644 --- ql/src/test/results/clientpositive/tez/insert_values_tmp_table.q.out +++ ql/src/test/results/clientpositive/tez/insert_values_tmp_table.q.out @@ -8,13 +8,15 @@ POSTHOOK: Output: database:default POSTHOOK: Output: default@acid_ivtt PREHOOK: query: insert into table acid_ivtt values (1, 109.23, 'mary had a little lamb'), - (429496729, 0.14, 'its fleece was white as snow') + (429496729, 0.14, 'its fleece was white as snow'), + (-29496729, -0.14, 'negative values test') PREHOOK: type: QUERY PREHOOK: Input: default@values__tmp__table__1 PREHOOK: Output: default@acid_ivtt POSTHOOK: query: insert into table acid_ivtt values (1, 109.23, 'mary had a little lamb'), - (429496729, 0.14, 'its fleece was white as snow') + (429496729, 0.14, 'its fleece was white as snow'), + (-29496729, -0.14, 'negative values test') POSTHOOK: type: QUERY POSTHOOK: Input: default@values__tmp__table__1 POSTHOOK: Output: default@acid_ivtt @@ -29,5 +31,6 @@ POSTHOOK: query: select i, de, vc from acid_ivtt order by i POSTHOOK: type: QUERY POSTHOOK: Input: default@acid_ivtt #### A masked pattern was here #### +-29496729 -0.14 negative values test 1 109.23 mary had a little lamb 429496729 0.14 its fleece was white as snow