This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 65ccfb3  Add `MERGE` statement test case (#9599)
65ccfb3 is described below

commit 65ccfb386b997a28a6bb87cab6bb1213ed28b4bb
Author: Thanoshan MV <[email protected]>
AuthorDate: Thu Mar 11 12:47:10 2021 +0530

    Add `MERGE` statement test case (#9599)
    
    * add a merge statement test case
    
    * modify merge test case
    
    * add single parameter asserts, remove blanklines similar to others
---
 .../impl/OracleDMLStatementSQLVisitor.java         | 49 +++++++++++++++++--
 .../statement/impl/OracleStatementSQLVisitor.java  | 11 +++++
 .../sql/common/statement/dml/MergeStatement.java   | 10 ++--
 .../statement/dml/impl/MergeStatementAssert.java   | 26 ++++++++--
 .../statement/dml/MergeStatementTestCase.java      | 11 +++--
 .../src/main/resources/case/dml/merge.xml          | 57 +++++++++++++++++++++-
 .../src/main/resources/sql/supported/dml/merge.xml |  1 +
 7 files changed, 143 insertions(+), 22 deletions(-)

diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
index 0589c4c..2fd6085 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleDMLStatementSQLVisitor.java
@@ -34,6 +34,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FromCl
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.GroupByClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.InsertContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.InsertValuesClauseContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IntoClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.JoinSpecificationContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.JoinedTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.LockClauseContext;
@@ -55,6 +56,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TableR
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TableReferencesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.UnionClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.UpdateContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.UsingClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.WhereClauseContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.InsertValuesSegment;
@@ -482,13 +484,50 @@ public final class OracleDMLStatementSQLVisitor extends 
OracleStatementSQLVisito
     @Override
     public ASTNode visitMerge(final MergeContext ctx) {
         OracleMergeStatement result = new OracleMergeStatement();
-        if (null != ctx.intoClause().tableName()) {
-            result.getTables().add((SimpleTableSegment) 
visit(ctx.intoClause().tableName()));
+        result.setTarget((SimpleTableSegment) visit(ctx.intoClause()));
+        result.setSource((TableSegment) visit(ctx.usingClause()));
+        result.setExpr((ExpressionSegment) (visit(ctx.usingClause().expr())));
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitIntoClause(final IntoClauseContext ctx) {
+        if (null != ctx.tableName()) {
+            SimpleTableSegment result = (SimpleTableSegment) 
visit(ctx.tableName());
+            if (null != ctx.alias()) {
+                result.setAlias((AliasSegment) visit(ctx.alias()));
+            }
+            return result;
         }
-        if (null != ctx.usingClause().tableName()) {
-            result.getTables().add((SimpleTableSegment) 
visit(ctx.usingClause().tableName()));
+        SimpleTableSegment result = (SimpleTableSegment) visit(ctx.viewName());
+        if (null != ctx.alias()) {
+            result.setAlias((AliasSegment) visit(ctx.alias()));
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitUsingClause(final UsingClauseContext ctx) {
+        if (null != ctx.tableName()) {
+            SimpleTableSegment result = (SimpleTableSegment) 
visit(ctx.tableName());
+            if (null != ctx.alias()) {
+                result.setAlias((AliasSegment) visit(ctx.alias()));
+            }
+            return result;
+        }
+        if (null != ctx.viewName()) {
+            SimpleTableSegment result = (SimpleTableSegment) 
visit(ctx.viewName());
+            if (null != ctx.alias()) {
+                result.setAlias((AliasSegment) visit(ctx.alias()));
+            }
+            return result;
+        }
+        OracleSelectStatement subquery = (OracleSelectStatement) 
visit(ctx.subquery());
+        SubquerySegment subquerySegment = new 
SubquerySegment(ctx.subquery().start.getStartIndex(), 
ctx.subquery().stop.getStopIndex(), subquery);
+        SubqueryTableSegment result = new 
SubqueryTableSegment(subquerySegment);
+        if (null != ctx.alias()) {
+            result.setAlias((AliasSegment) visit(ctx.alias()));
         }
-        result.setExpr((ExpressionSegment) (visit(ctx.usingClause().expr())));
         return result;
     }
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
index 49b1ef8..6d01ad7 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
@@ -59,6 +59,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.String
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TableNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TableNamesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.UnreservedWordContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ViewNameContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.constant.AggregationType;
 import org.apache.shardingsphere.sql.parser.sql.common.constant.OrderDirection;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
@@ -214,6 +215,16 @@ public abstract class OracleStatementSQLVisitor extends 
OracleStatementBaseVisit
     }
     
     @Override
+    public final ASTNode visitViewName(final ViewNameContext ctx) {
+        SimpleTableSegment result = new SimpleTableSegment(new 
TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
(IdentifierValue) visit(ctx.name())));
+        OwnerContext owner = ctx.owner();
+        if (null != owner) {
+            result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), 
owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
+        }
+        return result;
+    }
+    
+    @Override
     public final ASTNode visitIndexName(final IndexNameContext ctx) {
         return new IndexSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.identifier()));
     }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
index aa34e19..b1e5446 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
@@ -21,12 +21,9 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
 
-import java.util.LinkedList;
-import java.util.List;
-
 /**
  * Merge statement.
  */
@@ -35,8 +32,9 @@ import java.util.List;
 @ToString
 public abstract class MergeStatement extends AbstractSQLStatement implements 
DMLStatement {
     
-    private final List<SimpleTableSegment> tables = new LinkedList<>();
+    private TableSegment target;
     
-    private ExpressionSegment expr;
+    private TableSegment source;
     
+    private ExpressionSegment expr;
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dml/impl/MergeStatementAssert.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dml/impl/MergeStatementAssert.java
index b41e085..86ecb6e 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dml/impl/MergeStatementAssert.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dml/impl/MergeStatementAssert.java
@@ -25,6 +25,8 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.e
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.table.TableAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dml.MergeStatementTestCase;
 
+import static org.junit.Assert.assertNull;
+
 /**
  * Merge statement assert.
  */
@@ -39,12 +41,28 @@ public final class MergeStatementAssert {
      * @param expected expected parser result
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final MergeStatement actual, final MergeStatementTestCase expected) {
-        assertTables(assertContext, actual, expected);
+        assertTable(assertContext, actual, expected);
+        assertExpression(assertContext, actual, expected);
     }
     
-    private static void assertTables(final SQLCaseAssertContext assertContext, 
final MergeStatement actual, final MergeStatementTestCase expected) {
-        TableAssert.assertIs(assertContext, actual.getTables(), 
expected.getTables());
-        ExpressionAssert.assertExpression(assertContext, actual.getExpr(), 
expected.getExpr());
+    private static void assertTable(final SQLCaseAssertContext assertContext, 
final MergeStatement actual, final MergeStatementTestCase expected) {
+        if (null != expected.getSource()) {
+            TableAssert.assertIs(assertContext, actual.getSource(), 
expected.getSource());
+        } else {
+            assertNull(assertContext.getText("Actual source should not 
exist."), actual.getSource());
+        }
+        if (null != expected.getTarget()) {
+            TableAssert.assertIs(assertContext, actual.getTarget(), 
expected.getTarget());
+        } else {
+            assertNull(assertContext.getText("Actual target should not 
exist."), actual.getTarget());
+        }
     }
     
+    private static void assertExpression(final SQLCaseAssertContext 
assertContext, final MergeStatement actual, final MergeStatementTestCase 
expected) {
+        if (null != expected.getExpr()) {
+            ExpressionAssert.assertExpression(assertContext, actual.getExpr(), 
expected.getExpr());
+        } else {
+            assertNull(assertContext.getText("Actual expression should not 
exist."), actual.getExpr());
+        }
+    }
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dml/MergeStatementTestCase.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dml/MergeStatementTestCase.java
index 59c76bb..e084f43 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dml/MergeStatementTestCase.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dml/MergeStatementTestCase.java
@@ -20,12 +20,10 @@ package 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domai
 import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.expr.ExpectedExpression;
-import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.table.ExpectedSimpleTable;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.table.ExpectedTable;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
-import java.util.LinkedList;
-import java.util.List;
 
 /**
  * Merge statement test case.
@@ -34,8 +32,11 @@ import java.util.List;
 @Setter
 public final class MergeStatementTestCase extends SQLParserTestCase {
     
-    @XmlElement(name = "table")
-    private final List<ExpectedSimpleTable> tables = new LinkedList<>();
+    @XmlElement(name = "target")
+    private ExpectedTable target;
+    
+    @XmlElement(name = "source")
+    private ExpectedTable source;
     
     @XmlElement(name = "expr")
     private ExpectedExpression expr;
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/merge.xml
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/merge.xml
index 6df0726..3ef1946 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/merge.xml
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/merge.xml
@@ -19,8 +19,12 @@
 
 <sql-parser-test-cases>
     <merge sql-case-id="merge_into_table_using_table" >
-        <table name="people_target" start-index="11" stop-index="23" />
-        <table name="people_source" start-index="31" stop-index="43" />
+        <target>
+            <simple-table name="people_target" start-index="11" 
stop-index="23" />
+        </target>
+        <source>
+            <simple-table name="people_source" start-index="31" 
stop-index="43" />
+        </source>
         <expr>
             <binary-operation-expression start-index="49" stop-index="97">
                 <left>
@@ -37,4 +41,53 @@
             </binary-operation-expression>
         </expr>
     </merge>
+    <merge sql-case-id="merge_into_table_using_subquery_alias" >
+        <target>
+            <simple-table name="bonuses" alias="D" start-index="11" 
stop-index="19" />
+        </target>
+        <source>
+            <subquery-table alias="S">
+                <subquery>
+                    <select>
+                        <from>
+                            <simple-table name="employees" start-index="75" 
stop-index="83" />
+                        </from>
+                        <projections start-index="35" stop-index="68">
+                            <column-projection name="employee_id" 
start-index="35" stop-index="45" />
+                            <column-projection name="salary" start-index="48" 
stop-index="53" />
+                            <column-projection name="department_id" 
start-index="56" stop-index="68" />
+                        </projections>
+                        <where start-index="85" stop-index="108">
+                            <expr>
+                                <binary-operation-expression start-index="91" 
stop-index="108">
+                                    <left>
+                                        <column name="department_id" 
start-index="91" stop-index="103"/>
+                                    </left>
+                                    <operator>=</operator>
+                                    <right>
+                                        <literal-expression value="80" 
start-index="107" stop-index="108" />
+                                    </right>
+                                </binary-operation-expression>
+                            </expr>
+                        </where>
+                    </select>
+                </subquery>
+            </subquery-table>
+        </source>
+        <expr>
+            <binary-operation-expression start-index="117" stop-index="145">
+                <left>
+                    <column name="employee_id" start-index="117" 
stop-index="129">
+                        <owner name="D" start-index="117" stop-index="117" />
+                    </column>
+                </left>
+                <operator>=</operator>
+                <right>
+                    <column name="employee_id" start-index="133" 
stop-index="145">
+                        <owner name="S" start-index="133" stop-index="133" />
+                    </column>
+                </right>
+            </binary-operation-expression>
+        </expr>
+    </merge>
 </sql-parser-test-cases>
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/merge.xml
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/merge.xml
index 5a1a979..7111fbd 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/merge.xml
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/merge.xml
@@ -18,4 +18,5 @@
 
 <sql-cases>
     <sql-case id="merge_into_table_using_table" value="MERGE INTO 
people_target USING people_source ON (people_target.person_id = 
people_source.person_id)"  db-types="Oracle"/>
+    <sql-case id="merge_into_table_using_subquery_alias" value="MERGE INTO 
bonuses D USING (SELECT employee_id, salary, department_id FROM employees WHERE 
department_id = 80) S ON (D.employee_id = S.employee_id)"  db-types="Oracle"/>
 </sql-cases>

Reply via email to