提交 3a54fe23 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

ON clause in MERGE USING statement should not require ()

上级 8c10350d
...@@ -122,7 +122,7 @@ MERGE INTO TEST KEY(ID) VALUES(2, 'World') ...@@ -122,7 +122,7 @@ MERGE INTO TEST KEY(ID) VALUES(2, 'World')
"Commands (DML)","MERGE USING"," "Commands (DML)","MERGE USING","
MERGE INTO targetTableName [ [AS] targetAlias] MERGE INTO targetTableName [ [AS] targetAlias]
USING { ( select ) | sourceTableName }[ [AS] sourceAlias ] USING { ( select ) | sourceTableName }[ [AS] sourceAlias ]
ON ( expression ) ON expression
[ WHEN MATCHED THEN [ WHEN MATCHED THEN
[ UPDATE SET setClauseList ] [ DELETE deleteSearchCondition ] ] [ UPDATE SET setClauseList ] [ DELETE deleteSearchCondition ] ]
[ WHEN NOT MATCHED THEN INSERT insertColumnsAndSource ] [ WHEN NOT MATCHED THEN INSERT insertColumnsAndSource ]
...@@ -138,20 +138,20 @@ If WHEN MATCHED THEN is specified it should contain UPDATE or DELETE clauses of ...@@ -138,20 +138,20 @@ If WHEN MATCHED THEN is specified it should contain UPDATE or DELETE clauses of
If statement doesn't need a source table a DUAL table can be substituted. If statement doesn't need a source table a DUAL table can be substituted.
"," ","
MERGE INTO TARGET_TABLE AS T USING SOURCE_TABLE AS S MERGE INTO TARGET_TABLE AS T USING SOURCE_TABLE AS S
ON (T.ID = S.ID) ON T.ID = S.ID
WHEN MATCHED THEN WHEN MATCHED THEN
UPDATE SET T.COL1 = S.COL1 WHERE T.COL2<>'FINAL' UPDATE SET T.COL1 = S.COL1 WHERE T.COL2<>'FINAL'
DELETE WHERE T.COL2='FINAL' DELETE WHERE T.COL2='FINAL'
WHEN NOT MATCHED THEN WHEN NOT MATCHED THEN
INSERT (ID,COL1,COL2) VALUES(S.ID,S.COL1,S.COL2) INSERT (ID,COL1,COL2) VALUES(S.ID,S.COL1,S.COL2)
MERGE INTO TARGET_TABLE AS T USING (SELECT * FROM SOURCE_TABLE) AS S MERGE INTO TARGET_TABLE AS T USING (SELECT * FROM SOURCE_TABLE) AS S
ON (T.ID = S.ID) ON T.ID = S.ID
WHEN MATCHED THEN WHEN MATCHED THEN
UPDATE SET T.COL1 = S.COL1 WHERE T.COL2<>'FINAL' UPDATE SET T.COL1 = S.COL1 WHERE T.COL2<>'FINAL'
DELETE WHERE T.COL2='FINAL' DELETE WHERE T.COL2='FINAL'
WHEN NOT MATCHED THEN WHEN NOT MATCHED THEN
INSERT (ID,COL1,COL2) VALUES(S.ID,S.COL1,S.COL2) INSERT (ID,COL1,COL2) VALUES(S.ID,S.COL1,S.COL2)
MERGE INTO TARGET_TABLE USING DUAL ON (ID = 1) MERGE INTO TARGET_TABLE USING DUAL ON ID = 1
WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (1, 'Test') WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (1, 'Test')
WHEN MATCHED THEN UPDATE SET NAME = 'Test' WHEN MATCHED THEN UPDATE SET NAME = 'Test'
" "
......
...@@ -1170,10 +1170,8 @@ public class Parser { ...@@ -1170,10 +1170,8 @@ public class Parser {
command.setQuery(preparedQuery); command.setQuery(preparedQuery);
} }
read("ON"); read("ON");
read("(");
Expression condition = readExpression(); Expression condition = readExpression();
command.setOnCondition(condition); command.setOnCondition(condition);
read(")");
read("WHEN"); read("WHEN");
boolean matched = readIf("MATCHED"); boolean matched = readIf("MATCHED");
......
...@@ -166,7 +166,7 @@ public class TestMergeUsing extends TestDb implements Trigger { ...@@ -166,7 +166,7 @@ public class TestMergeUsing extends TestDb implements Trigger {
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL,
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) WHERE X<0", "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) WHERE X<0",
0, 0,
"expected \"WHEN\""); "WHEN\"");
// Two updates to same row - update and delete together - emptying the // Two updates to same row - update and delete together - emptying the
// parent table // parent table
testMergeUsing( testMergeUsing(
......
...@@ -118,7 +118,7 @@ DROP TABLE DEST_TABLE; ...@@ -118,7 +118,7 @@ DROP TABLE DEST_TABLE;
CREATE TABLE TEST(C1 INT, C2 INT, C3 INT); CREATE TABLE TEST(C1 INT, C2 INT, C3 INT);
> ok > ok
MERGE INTO TEST USING DUAL ON (C1 = 11 AND C2 = 21) MERGE INTO TEST USING DUAL ON C1 = 11 AND C2 = 21
WHEN NOT MATCHED THEN INSERT (C1, C2, C3) VALUES (11, 21, 31) WHEN NOT MATCHED THEN INSERT (C1, C2, C3) VALUES (11, 21, 31)
WHEN MATCHED THEN UPDATE SET C3 = 31; WHEN MATCHED THEN UPDATE SET C3 = 31;
> update count: 1 > update count: 1
...@@ -135,7 +135,7 @@ SELECT * FROM TEST ORDER BY C1, C2; ...@@ -135,7 +135,7 @@ SELECT * FROM TEST ORDER BY C1, C2;
> 11 22 32 > 11 22 32
> rows (ordered): 2 > rows (ordered): 2
MERGE INTO TEST USING DUAL ON (C1 = 11 AND C2 = 21) MERGE INTO TEST USING DUAL ON C1 = 11 AND C2 = 21
WHEN NOT MATCHED THEN INSERT (C1, C2, C3) VALUES (11, 21, 33) WHEN NOT MATCHED THEN INSERT (C1, C2, C3) VALUES (11, 21, 33)
WHEN MATCHED THEN UPDATE SET C3 = 33; WHEN MATCHED THEN UPDATE SET C3 = 33;
> update count: 1 > update count: 1
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论