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>