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/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java
index 82c8333..ee9d60a 100644
--- ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java
+++ ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java
@@ -17,6 +17,7 @@
*/
package org.apache.hadoop.hive.ql.parse;
+import antlr.collections.AST;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
import org.apache.hadoop.hive.ql.Context;
@@ -343,8 +344,10 @@ private void reparseAndSuperAnalyze(ASTNode tree) throws SemanticException {
// Add the setRCols to the input list
for (String colName : setRCols) {
- columnAccessInfo.add(Table.getCompleteName(mTable.getDbName(), mTable.getTableName()),
+ if(columnAccessInfo != null) {//assuming this means we are not doing Auth
+ columnAccessInfo.add(Table.getCompleteName(mTable.getDbName(), mTable.getTableName()),
colName);
+ }
}
}
@@ -386,7 +389,7 @@ private void addSetRCols(ASTNode node, Set setRCols) {
setRCols.add(colName.getText());
} else if (node.getChildren() != null) {
for (Node n : node.getChildren()) {
- addSetRCols(node, setRCols);
+ addSetRCols((ASTNode)n, setRCols);
}
}
}
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..7f935a9 100644
--- ql/src/test/queries/clientpositive/update_all_types.q
+++ ql/src/test/queries/clientpositive/update_all_types.q
@@ -53,4 +53,11 @@ update acid_uat set
select * from acid_uat order by i;
+update acid_uat set
+ ti = ti * 2,
+ si = cast(f as int),
+ d = floor(de)
+ where s = 'aw724t8c5558x2xneC624';
+
+select * from acid_uat order by i;
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
diff --git ql/src/test/results/clientpositive/tez/update_all_types.q.out ql/src/test/results/clientpositive/tez/update_all_types.q.out
index 36b4684..c09293c 100644
--- ql/src/test/results/clientpositive/tez/update_all_types.q.out
+++ ql/src/test/results/clientpositive/tez/update_all_types.q.out
@@ -151,3 +151,37 @@ NULL -5470 -1072076362 1864027286 NULL -5470.0 NULL NULL 1970-01-01 2uLyD28144vk
NULL -947 -1070551679 1864027286 NULL -947.0 NULL NULL 1970-01-01 iUR3Q iUR3Q 4KWs6gw7lv2WYd66P false
11 NULL -1069736047 -453772520 11.0 NULL 11.0 1969-12-31 16:00:02.351 NULL k17Am8uPHWk02cEf1jet k17Am8uPHWk02cEf1jet qrXLLNX1 true
1 2 3 4 3.14 6.28 5.99 NULL 2014-09-01 its a beautiful day in the neighbhorhood a beautiful day for a neighbor wont you be mine true
+PREHOOK: query: update acid_uat set
+ ti = ti * 2,
+ si = cast(f as int),
+ d = floor(de)
+ where s = 'aw724t8c5558x2xneC624'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@acid_uat
+PREHOOK: Output: default@acid_uat
+POSTHOOK: query: update acid_uat set
+ ti = ti * 2,
+ si = cast(f as int),
+ d = floor(de)
+ where s = 'aw724t8c5558x2xneC624'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@acid_uat
+POSTHOOK: Output: default@acid_uat
+PREHOOK: query: select * from acid_uat order by i
+PREHOOK: type: QUERY
+PREHOOK: Input: default@acid_uat
+#### A masked pattern was here ####
+POSTHOOK: query: select * from acid_uat order by i
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@acid_uat
+#### A masked pattern was here ####
+11 NULL -1073279343 -1595604468 11.0 NULL 11.0 1969-12-31 16:00:02.351 NULL oj1YrV5Wa oj1YrV5Wa P76636jJ6qM17d7DIy true
+NULL -7382 -1073051226 -1887561756 NULL -7382.0 NULL NULL 1970-01-01 A34p7oRr2WvUJNf A34p7oRr2WvUJNf 4hA4KQj2vD3fI6gX82220d false
+11 NULL -1072910839 2048385991 11.0 NULL 11.0 1969-12-31 16:00:02.351 NULL 0iqrc5 0iqrc5 KbaDXiN85adbHRx58v false
+NULL 8373 -1072081801 1864027286 NULL 8373.0 NULL NULL 1970-01-01 dPkN74F7 dPkN74F7 4KWs6gw7lv2WYd66P true
+NULL -5470 -1072076362 1864027286 NULL -5470.0 NULL NULL 1970-01-01 2uLyD28144vklju213J1mr 2uLyD28144vklju213J1mr 4KWs6gw7lv2WYd66P true
+-102 -51 -1071480828 -1401575336 -51.0 -51.0 -51.0 1969-12-31 16:00:08.451 NULL aw724t8c5558x2xneC624 aw724t8c5558x2xneC624 4uE7l74tESBiKfu7c8wM7GA true
+8 NULL -1071363017 1349676361 8.0 NULL 8.0 1969-12-31 16:00:15.892 NULL Anj0oF Anj0oF IwE1G7Qb0B1NEfV030g true
+NULL -947 -1070551679 1864027286 NULL -947.0 NULL NULL 1970-01-01 iUR3Q iUR3Q 4KWs6gw7lv2WYd66P false
+11 NULL -1069736047 -453772520 11.0 NULL 11.0 1969-12-31 16:00:02.351 NULL k17Am8uPHWk02cEf1jet k17Am8uPHWk02cEf1jet qrXLLNX1 true
+1 2 3 4 3.14 6.28 5.99 NULL 2014-09-01 its a beautiful day in the neighbhorhood a beautiful day for a neighbor wont you be mine true
diff --git ql/src/test/results/clientpositive/update_all_types.q.out ql/src/test/results/clientpositive/update_all_types.q.out
index 36b4684..c09293c 100644
--- ql/src/test/results/clientpositive/update_all_types.q.out
+++ ql/src/test/results/clientpositive/update_all_types.q.out
@@ -151,3 +151,37 @@ NULL -5470 -1072076362 1864027286 NULL -5470.0 NULL NULL 1970-01-01 2uLyD28144vk
NULL -947 -1070551679 1864027286 NULL -947.0 NULL NULL 1970-01-01 iUR3Q iUR3Q 4KWs6gw7lv2WYd66P false
11 NULL -1069736047 -453772520 11.0 NULL 11.0 1969-12-31 16:00:02.351 NULL k17Am8uPHWk02cEf1jet k17Am8uPHWk02cEf1jet qrXLLNX1 true
1 2 3 4 3.14 6.28 5.99 NULL 2014-09-01 its a beautiful day in the neighbhorhood a beautiful day for a neighbor wont you be mine true
+PREHOOK: query: update acid_uat set
+ ti = ti * 2,
+ si = cast(f as int),
+ d = floor(de)
+ where s = 'aw724t8c5558x2xneC624'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@acid_uat
+PREHOOK: Output: default@acid_uat
+POSTHOOK: query: update acid_uat set
+ ti = ti * 2,
+ si = cast(f as int),
+ d = floor(de)
+ where s = 'aw724t8c5558x2xneC624'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@acid_uat
+POSTHOOK: Output: default@acid_uat
+PREHOOK: query: select * from acid_uat order by i
+PREHOOK: type: QUERY
+PREHOOK: Input: default@acid_uat
+#### A masked pattern was here ####
+POSTHOOK: query: select * from acid_uat order by i
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@acid_uat
+#### A masked pattern was here ####
+11 NULL -1073279343 -1595604468 11.0 NULL 11.0 1969-12-31 16:00:02.351 NULL oj1YrV5Wa oj1YrV5Wa P76636jJ6qM17d7DIy true
+NULL -7382 -1073051226 -1887561756 NULL -7382.0 NULL NULL 1970-01-01 A34p7oRr2WvUJNf A34p7oRr2WvUJNf 4hA4KQj2vD3fI6gX82220d false
+11 NULL -1072910839 2048385991 11.0 NULL 11.0 1969-12-31 16:00:02.351 NULL 0iqrc5 0iqrc5 KbaDXiN85adbHRx58v false
+NULL 8373 -1072081801 1864027286 NULL 8373.0 NULL NULL 1970-01-01 dPkN74F7 dPkN74F7 4KWs6gw7lv2WYd66P true
+NULL -5470 -1072076362 1864027286 NULL -5470.0 NULL NULL 1970-01-01 2uLyD28144vklju213J1mr 2uLyD28144vklju213J1mr 4KWs6gw7lv2WYd66P true
+-102 -51 -1071480828 -1401575336 -51.0 -51.0 -51.0 1969-12-31 16:00:08.451 NULL aw724t8c5558x2xneC624 aw724t8c5558x2xneC624 4uE7l74tESBiKfu7c8wM7GA true
+8 NULL -1071363017 1349676361 8.0 NULL 8.0 1969-12-31 16:00:15.892 NULL Anj0oF Anj0oF IwE1G7Qb0B1NEfV030g true
+NULL -947 -1070551679 1864027286 NULL -947.0 NULL NULL 1970-01-01 iUR3Q iUR3Q 4KWs6gw7lv2WYd66P false
+11 NULL -1069736047 -453772520 11.0 NULL 11.0 1969-12-31 16:00:02.351 NULL k17Am8uPHWk02cEf1jet k17Am8uPHWk02cEf1jet qrXLLNX1 true
+1 2 3 4 3.14 6.28 5.99 NULL 2014-09-01 its a beautiful day in the neighbhorhood a beautiful day for a neighbor wont you be mine true