HIVE-16190: Support expression in merge statement (Pengcheng Xiong, reviewed by 
Eugene Koifman)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/af19055c
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/af19055c
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/af19055c

Branch: refs/heads/hive-14535
Commit: af19055c142ded4e68ef7880d1e3c75793ca8493
Parents: 445b791
Author: Pengcheng Xiong <[email protected]>
Authored: Tue Mar 14 11:00:05 2017 -0700
Committer: Pengcheng Xiong <[email protected]>
Committed: Tue Mar 14 11:00:05 2017 -0700

----------------------------------------------------------------------
 .../java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g | 4 ++--
 ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java  | 7 +++++++
 .../org/apache/hadoop/hive/ql/parse/TestMergeStatement.java | 9 +--------
 3 files changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/af19055c/ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g 
b/ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g
index c8c71b0..558ca7f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/FromClauseParser.g
@@ -295,7 +295,7 @@ valueRowConstructor
 @init { gParent.pushMsg("value row constructor", state); }
 @after { gParent.popMsg(state); }
     :
-    LPAREN precedenceUnaryPrefixExpression (COMMA 
precedenceUnaryPrefixExpression)* RPAREN -> ^(TOK_VALUE_ROW 
precedenceUnaryPrefixExpression+)
+    expressionsInParenthesis[false] -> ^(TOK_VALUE_ROW 
expressionsInParenthesis)
     ;
 
 valuesTableConstructor
@@ -314,7 +314,7 @@ valuesClause
 @init { gParent.pushMsg("values clause", state); }
 @after { gParent.popMsg(state); }
     :
-    KW_VALUES valuesTableConstructor -> valuesTableConstructor
+    KW_VALUES! valuesTableConstructor
     ;
 
 /*

http://git-wip-us.apache.org/repos/asf/hive/blob/af19055c/ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java 
b/ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java
index b9df674..6dae7ba 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands.java
@@ -898,4 +898,11 @@ public class TestTxnCommands {
     //> 2 seconds pass, i.e. that the command in Driver actually blocks before 
cancel is fired
     Assert.assertTrue(System.currentTimeMillis() > start + 2);
   }
+
+  @Test
+  public void testMergeCase() throws Exception {
+    runStatementOnDriver("create table merge_test (c1 integer, c2 integer, c3 
integer) CLUSTERED BY (c1) into 2 buckets stored as orc 
tblproperties(\"transactional\"=\"true\")");
+    runStatementOnDriver("create table if not exists e011_02 (c1 float, c2 
double, c3 float)");
+    runStatementOnDriver("merge into merge_test using e011_02 on 
(merge_test.c1 = e011_02.c1) when not matched then insert values (case when 
e011_02.c1 > 0 then e011_02.c1 + 1 else e011_02.c1 end, e011_02.c2 + 
e011_02.c3, coalesce(e011_02.c3, 1))");
+  }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/af19055c/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMergeStatement.java
----------------------------------------------------------------------
diff --git 
a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMergeStatement.java 
b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMergeStatement.java
index a862e5c..8e0ac9d 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMergeStatement.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMergeStatement.java
@@ -219,15 +219,8 @@ public class TestMergeStatement {
       "MERGE INTO target USING source ON target.pk = source.pk WHEN NOT 
MATCHED THEN INSERT VALUES(a,source.b) WHEN MATCHED THEN DELETE");
   }
 
-  /**
-   * why does this fail but next one passes
-   * @throws ParseException
-   */
   @Test
-  public void testNegative5() throws ParseException {
-    expectedException.expect(ParseException.class);
-    expectedException.expectMessage("line 1:103 mismatched input '+' expecting 
) near 'b' in value row constructor");
-    //todo: why does this fail but next one passes?
+  public void test5_1() throws ParseException {
     ASTNode ast = parse(
       "MERGE INTO target USING source ON target.pk = source.pk WHEN NOT 
MATCHED THEN INSERT VALUES(a,source.b + 1)");
   }

Reply via email to