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