This is an automated email from the ASF dual-hosted git repository.
chengzhang 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 1a45cb83595 Refactor oracle multi table insert statement visit logic
and modify related test case (#28435)
1a45cb83595 is described below
commit 1a45cb83595b5aa139ebfd65b322ab22960f15f7
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Sep 14 18:00:35 2023 +0800
Refactor oracle multi table insert statement visit logic and modify related
test case (#28435)
---
.../statement/dml/InsertStatementBinder.java | 4 +-
.../binder/statement/dml/MergeStatementBinder.java | 4 +-
.../statement/type/OracleDMLStatementVisitor.java | 59 +++---
.../handler/dml/InsertStatementHandler.java | 70 ++++++-
.../MultiTableConditionalIntoElseSegment.java} | 9 +-
.../insert/MultiTableConditionalIntoSegment.java} | 23 ++-
.../MultiTableConditionalIntoThenSegment.java} | 9 +-
.../MultiTableConditionalIntoWhenThenSegment.java} | 15 +-
.../insert/MultiTableInsertIntoSegment.java} | 6 +-
.../oracle/insert/MultiTableInsertType.java} | 22 +--
.../oracle/dml/OracleInsertStatement.java | 38 +++-
.../handler/dml/InsertStatementHandlerTest.java | 20 +-
.../MultiTableConditionalIntoClauseAssert.java | 63 +++++++
...ultiTableConditionalIntoElseSegmentAssert.java} | 19 +-
...ultiTableConditionalIntoThenSegmentAssert.java} | 19 +-
....java => MultiTableInsertIntoClauseAssert.java} | 16 +-
.../statement/dml/impl/InsertStatementAssert.java | 46 ++++-
...> ExpectedMultiTableConditionalIntoClause.java} | 14 +-
...pectedMultiTableConditionalIntoElseClause.java} | 6 +-
...pectedMultiTableConditionalIntoThenClause.java} | 6 +-
...edMultiTableConditionalIntoWhenThenClause.java} | 17 +-
...ava => ExpectedMultiTableInsertIntoClause.java} | 6 +-
...ment.java => ExpectedMultiTableInsertType.java} | 15 +-
.../statement/dml/InsertStatementTestCase.java | 16 +-
.../parser/src/main/resources/case/dml/insert.xml | 201 ++++++++++++++++-----
.../main/resources/sql/supported/dml/insert.xml | 4 +-
26 files changed, 516 insertions(+), 211 deletions(-)
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java
index 08719ac64bf..8d7f8eedf0a 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/InsertStatementBinder.java
@@ -67,7 +67,9 @@ public final class InsertStatementBinder implements
SQLStatementBinder<InsertSta
InsertStatementHandler.getSetAssignmentSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setSetAssignmentSegment(result, optional));
InsertStatementHandler.getWithSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setWithSegment(result, optional));
InsertStatementHandler.getOutputSegment(sqlStatement).ifPresent(optional ->
InsertStatementHandler.setOutputSegment(result, optional));
-
InsertStatementHandler.getInsertMultiTableElementSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setInsertMultiTableElementSegment(result, optional));
+
InsertStatementHandler.getMultiTableInsertType(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setMultiTableInsertType(result, optional));
+
InsertStatementHandler.getMultiTableInsertIntoSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setMultiTableInsertIntoSegment(result, optional));
+
InsertStatementHandler.getMultiTableConditionalIntoSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setMultiTableConditionalIntoSegment(result,
optional));
InsertStatementHandler.getReturningSegment(sqlStatement).ifPresent(optional ->
InsertStatementHandler.setReturningSegment(result, optional));
result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments());
result.getCommentSegments().addAll(sqlStatement.getCommentSegments());
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
index 6e3b327dcd4..7a38ca7e139 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/MergeStatementBinder.java
@@ -110,7 +110,9 @@ public final class MergeStatementBinder implements
SQLStatementBinder<MergeState
InsertStatementHandler.getSetAssignmentSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setSetAssignmentSegment(result, optional));
InsertStatementHandler.getWithSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setWithSegment(result, optional));
InsertStatementHandler.getOutputSegment(sqlStatement).ifPresent(optional ->
InsertStatementHandler.setOutputSegment(result, optional));
-
InsertStatementHandler.getInsertMultiTableElementSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setInsertMultiTableElementSegment(result, optional));
+
InsertStatementHandler.getMultiTableInsertType(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setMultiTableInsertType(result, optional));
+
InsertStatementHandler.getMultiTableInsertIntoSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setMultiTableInsertIntoSegment(result, optional));
+
InsertStatementHandler.getMultiTableConditionalIntoSegment(sqlStatement).ifPresent(optional
-> InsertStatementHandler.setMultiTableConditionalIntoSegment(result,
optional));
InsertStatementHandler.getReturningSegment(sqlStatement).ifPresent(optional ->
InsertStatementHandler.setReturningSegment(result, optional));
InsertStatementHandler.getWhereSegment(sqlStatement).ifPresent(optional ->
InsertStatementHandler.setWhereSegment(result,
WhereSegmentBinder.bind(optional,
insertStatementBinderContext, targetTableBinderContexts,
sourceTableBinderContexts)));
diff --git
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
index c97e0ddf73e..ae687051fb3 100644
---
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
+++
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
@@ -152,7 +152,6 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.Loc
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.InsertMultiTableElementSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ModelSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
@@ -168,6 +167,12 @@ import
org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
import
org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
import
org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.BooleanLiteralValue;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoElseSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoThenSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoWhenThenSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertType;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml.OracleDeleteStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml.OracleInsertStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml.OracleLockTableStatement;
@@ -316,9 +321,16 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
@Override
public ASTNode visitInsertMultiTable(final InsertMultiTableContext ctx) {
OracleInsertStatement result = new OracleInsertStatement();
- result.setInsertMultiTableElementSegment(null ==
ctx.conditionalInsertClause()
- ? createInsertMultiTableElementSegment(ctx.multiTableElement())
- : (InsertMultiTableElementSegment)
visit(ctx.conditionalInsertClause()));
+ result.setMultiTableInsertType(null != ctx.conditionalInsertClause()
&& null != ctx.conditionalInsertClause().FIRST() ? MultiTableInsertType.FIRST :
MultiTableInsertType.ALL);
+ List<MultiTableElementContext> multiTableElementContexts =
ctx.multiTableElement();
+ if (null != multiTableElementContexts &&
!multiTableElementContexts.isEmpty()) {
+ MultiTableInsertIntoSegment multiTableInsertIntoSegment = new
MultiTableInsertIntoSegment(
+
multiTableElementContexts.get(0).getStart().getStartIndex(),
multiTableElementContexts.get(multiTableElementContexts.size() -
1).getStop().getStopIndex());
+
multiTableInsertIntoSegment.getInsertStatements().addAll(createInsertIntoSegments(multiTableElementContexts));
+ result.setMultiTableInsertIntoSegment(multiTableInsertIntoSegment);
+ } else {
+
result.setMultiTableConditionalIntoSegment((MultiTableConditionalIntoSegment)
visit(ctx.conditionalInsertClause()));
+ }
OracleSelectStatement subquery = (OracleSelectStatement)
visit(ctx.selectSubquery());
SubquerySegment subquerySegment = new
SubquerySegment(ctx.selectSubquery().start.getStartIndex(),
ctx.selectSubquery().stop.getStopIndex(), subquery);
result.setInsertSelect(subquerySegment);
@@ -326,13 +338,11 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
return result;
}
- private InsertMultiTableElementSegment
createInsertMultiTableElementSegment(final List<MultiTableElementContext> ctx) {
- Collection<OracleInsertStatement> insertStatements = new
LinkedList<>();
+ private Collection<InsertStatement> createInsertIntoSegments(final
List<MultiTableElementContext> ctx) {
+ Collection<InsertStatement> result = new LinkedList<>();
for (MultiTableElementContext each : ctx) {
- insertStatements.add((OracleInsertStatement) visit(each));
+ result.add((OracleInsertStatement) visit(each));
}
- InsertMultiTableElementSegment result = new
InsertMultiTableElementSegment(ctx.get(0).getStart().getStartIndex(),
ctx.get(ctx.size() - 1).getStop().getStopIndex());
- result.getInsertStatements().addAll(insertStatements);
return result;
}
@@ -441,32 +451,29 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
@Override
public ASTNode visitConditionalInsertClause(final
ConditionalInsertClauseContext ctx) {
- Collection<OracleInsertStatement> insertStatements = new
LinkedList<>();
+ Collection<MultiTableConditionalIntoWhenThenSegment> whenThenSegments
= new LinkedList<>();
for (ConditionalInsertWhenPartContext each :
ctx.conditionalInsertWhenPart()) {
-
insertStatements.addAll(createInsertStatementsFromConditionalInsertWhen(each));
+ whenThenSegments.add((MultiTableConditionalIntoWhenThenSegment)
visit(each));
}
+ MultiTableConditionalIntoSegment result = new
MultiTableConditionalIntoSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex());
+ result.getWhenThenSegments().addAll(whenThenSegments);
if (null != ctx.conditionalInsertElsePart()) {
-
insertStatements.addAll(createInsertStatementsFromConditionalInsertElse(ctx.conditionalInsertElsePart()));
+ result.setElseSegment((MultiTableConditionalIntoElseSegment)
visit(ctx.conditionalInsertElsePart()));
}
- InsertMultiTableElementSegment result = new
InsertMultiTableElementSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex());
- result.getInsertStatements().addAll(insertStatements);
return result;
}
- private Collection<OracleInsertStatement>
createInsertStatementsFromConditionalInsertWhen(final
ConditionalInsertWhenPartContext ctx) {
- Collection<OracleInsertStatement> result = new LinkedList<>();
- for (MultiTableElementContext each : ctx.multiTableElement()) {
- result.add((OracleInsertStatement) visit(each));
- }
- return result;
+ @Override
+ public ASTNode visitConditionalInsertWhenPart(final
ConditionalInsertWhenPartContext ctx) {
+ List<MultiTableElementContext> multiTableElementContexts =
ctx.multiTableElement();
+ MultiTableConditionalIntoThenSegment thenSegment = new
MultiTableConditionalIntoThenSegment(multiTableElementContexts.get(0).start.getStartIndex(),
+ multiTableElementContexts.get(multiTableElementContexts.size()
- 1).stop.getStopIndex(), createInsertIntoSegments(multiTableElementContexts));
+ return new
MultiTableConditionalIntoWhenThenSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr()), thenSegment);
}
- private Collection<OracleInsertStatement>
createInsertStatementsFromConditionalInsertElse(final
ConditionalInsertElsePartContext ctx) {
- Collection<OracleInsertStatement> result = new LinkedList<>();
- for (MultiTableElementContext each : ctx.multiTableElement()) {
- result.add((OracleInsertStatement) visit(each));
- }
- return result;
+ @Override
+ public ASTNode visitConditionalInsertElsePart(final
ConditionalInsertElsePartContext ctx) {
+ return new
MultiTableConditionalIntoElseSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), createInsertIntoSegments(ctx.multiTableElement()));
}
@Override
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandler.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandler.java
index 215bf7ecdd1..38f054b30b9 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandler.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandler.java
@@ -23,11 +23,13 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.ReturningSegm
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDuplicateKeyColumnsSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.InsertMultiTableElementSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.handler.SQLStatementHandler;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertType;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLInsertStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.dml.OpenGaussInsertStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml.OracleInsertStatement;
@@ -164,27 +166,77 @@ public final class InsertStatementHandler implements
SQLStatementHandler {
}
/**
- * Get insert multi table element segment.
+ * Get multi table insert type.
*
* @param insertStatement insert statement
- * @return insert multi table element segment
+ * @return multi table insert type
*/
- public static Optional<InsertMultiTableElementSegment>
getInsertMultiTableElementSegment(final InsertStatement insertStatement) {
+ public static Optional<MultiTableInsertType> getMultiTableInsertType(final
InsertStatement insertStatement) {
if (insertStatement instanceof OracleInsertStatement) {
- return ((OracleInsertStatement)
insertStatement).getInsertMultiTableElementSegment();
+ return ((OracleInsertStatement)
insertStatement).getMultiTableInsertType();
}
return Optional.empty();
}
/**
- * Set insert multi table element segment.
+ * Set multi table insert type.
+ *
+ * @param insertStatement insert into statement
+ * @param multiTableInsertType multi table insert type
+ */
+ public static void setMultiTableInsertType(final InsertStatement
insertStatement, final MultiTableInsertType multiTableInsertType) {
+ if (insertStatement instanceof OracleInsertStatement) {
+ ((OracleInsertStatement)
insertStatement).setMultiTableInsertType(multiTableInsertType);
+ }
+ }
+
+ /**
+ * Get multi table insert into segment.
+ *
+ * @param insertStatement insert statement
+ * @return multi table insert into segment
+ */
+ public static Optional<MultiTableInsertIntoSegment>
getMultiTableInsertIntoSegment(final InsertStatement insertStatement) {
+ if (insertStatement instanceof OracleInsertStatement) {
+ return ((OracleInsertStatement)
insertStatement).getMultiTableInsertIntoSegment();
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Set multi table insert into segment.
*
+ * @param insertStatement insert into statement
+ * @param multiTableInsertIntoSegment multi table insert into segment
+ */
+ public static void setMultiTableInsertIntoSegment(final InsertStatement
insertStatement, final MultiTableInsertIntoSegment multiTableInsertIntoSegment)
{
+ if (insertStatement instanceof OracleInsertStatement) {
+ ((OracleInsertStatement)
insertStatement).setMultiTableInsertIntoSegment(multiTableInsertIntoSegment);
+ }
+ }
+
+ /**
+ * Get multi table conditional into segment.
+ *
* @param insertStatement insert statement
- * @param insertMultiTableElementSegment insert multi table element segment
+ * @return multi table conditional into segment
+ */
+ public static Optional<MultiTableConditionalIntoSegment>
getMultiTableConditionalIntoSegment(final InsertStatement insertStatement) {
+ if (insertStatement instanceof OracleInsertStatement) {
+ return ((OracleInsertStatement)
insertStatement).getMultiTableConditionalIntoSegment();
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * Set multi table conditional into segment.
+ *
+ * @param insertStatement insert into statement
+ * @param multiTableConditionalIntoSegment multi table conditional into
segment
*/
- public static void setInsertMultiTableElementSegment(final InsertStatement
insertStatement, final InsertMultiTableElementSegment
insertMultiTableElementSegment) {
+ public static void setMultiTableConditionalIntoSegment(final
InsertStatement insertStatement, final MultiTableConditionalIntoSegment
multiTableConditionalIntoSegment) {
if (insertStatement instanceof OracleInsertStatement) {
- ((OracleInsertStatement)
insertStatement).setInsertMultiTableElementSegment(insertMultiTableElementSegment);
+ ((OracleInsertStatement)
insertStatement).setMultiTableConditionalIntoSegment(multiTableConditionalIntoSegment);
}
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoElseSegment.java
similarity index 79%
copy from
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
copy to
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoElseSegment.java
index 741444807a9..b915e477059 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoElseSegment.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
+package org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@@ -23,18 +23,17 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
import java.util.Collection;
-import java.util.LinkedList;
/**
- * Insert multi table element segment.
+ * Multi table conditional into else segment.
*/
@RequiredArgsConstructor
@Getter
-public final class InsertMultiTableElementSegment implements SQLSegment {
+public final class MultiTableConditionalIntoElseSegment implements SQLSegment {
private final int startIndex;
private final int stopIndex;
- private final Collection<InsertStatement> insertStatements = new
LinkedList<>();
+ private final Collection<InsertStatement> insertStatements;
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoSegment.java
similarity index 63%
copy from
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
copy to
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoSegment.java
index 741444807a9..23b7ef19c8a 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoSegment.java
@@ -15,26 +15,39 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
+package org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import lombok.Setter;
import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
import java.util.Collection;
import java.util.LinkedList;
+import java.util.Optional;
/**
- * Insert multi table element segment.
+ * Multi table conditional into segment.
*/
@RequiredArgsConstructor
@Getter
-public final class InsertMultiTableElementSegment implements SQLSegment {
+public final class MultiTableConditionalIntoSegment implements SQLSegment {
private final int startIndex;
private final int stopIndex;
- private final Collection<InsertStatement> insertStatements = new
LinkedList<>();
+ private final Collection<MultiTableConditionalIntoWhenThenSegment>
whenThenSegments = new LinkedList<>();
+
+ @Setter
+ private MultiTableConditionalIntoElseSegment elseSegment;
+
+ /**
+ * Get else segment.
+ *
+ * @return else segment
+ */
+ public Optional<MultiTableConditionalIntoElseSegment> getElseSegment() {
+ return Optional.ofNullable(elseSegment);
+ }
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoThenSegment.java
similarity index 79%
copy from
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
copy to
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoThenSegment.java
index 741444807a9..f324f66e0a5 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoThenSegment.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
+package org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@@ -23,18 +23,17 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
import java.util.Collection;
-import java.util.LinkedList;
/**
- * Insert multi table element segment.
+ * Multi table conditional into then segment.
*/
@RequiredArgsConstructor
@Getter
-public final class InsertMultiTableElementSegment implements SQLSegment {
+public final class MultiTableConditionalIntoThenSegment implements SQLSegment {
private final int startIndex;
private final int stopIndex;
- private final Collection<InsertStatement> insertStatements = new
LinkedList<>();
+ private final Collection<InsertStatement> insertStatements;
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoWhenThenSegment.java
similarity index 71%
copy from
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
copy to
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoWhenThenSegment.java
index 741444807a9..58c573aa189 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableConditionalIntoWhenThenSegment.java
@@ -15,26 +15,25 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
+package org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
-
-import java.util.Collection;
-import java.util.LinkedList;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
/**
- * Insert multi table element segment.
+ * Multi table conditional into when then segment.
*/
@RequiredArgsConstructor
@Getter
-public final class InsertMultiTableElementSegment implements SQLSegment {
+public final class MultiTableConditionalIntoWhenThenSegment implements
SQLSegment {
private final int startIndex;
private final int stopIndex;
- private final Collection<InsertStatement> insertStatements = new
LinkedList<>();
+ private final ExpressionSegment whenSegment;
+
+ private final MultiTableConditionalIntoThenSegment thenSegment;
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableInsertIntoSegment.java
similarity index 87%
copy from
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
copy to
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableInsertIntoSegment.java
index 741444807a9..5cd63f71a05 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableInsertIntoSegment.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
+package org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@@ -26,11 +26,11 @@ import java.util.Collection;
import java.util.LinkedList;
/**
- * Insert multi table element segment.
+ * Multi table insert into segment.
*/
@RequiredArgsConstructor
@Getter
-public final class InsertMultiTableElementSegment implements SQLSegment {
+public final class MultiTableInsertIntoSegment implements SQLSegment {
private final int startIndex;
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableInsertType.java
similarity index 55%
rename from
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
rename to
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableInsertType.java
index 741444807a9..edc20f4947f 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/InsertMultiTableElementSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/segment/oracle/insert/MultiTableInsertType.java
@@ -15,26 +15,12 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
-
-import java.util.Collection;
-import java.util.LinkedList;
+package org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert;
/**
- * Insert multi table element segment.
+ * Multi table insert type.
*/
-@RequiredArgsConstructor
-@Getter
-public final class InsertMultiTableElementSegment implements SQLSegment {
-
- private final int startIndex;
-
- private final int stopIndex;
+public enum MultiTableInsertType {
- private final Collection<InsertStatement> insertStatements = new
LinkedList<>();
+ ALL, FIRST
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dml/OracleInsertStatement.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dml/OracleInsertStatement.java
index c59d28d4c93..8c21e4b5f00 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dml/OracleInsertStatement.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/oracle/dml/OracleInsertStatement.java
@@ -17,10 +17,13 @@
package org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml;
+import lombok.Getter;
import lombok.Setter;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.InsertMultiTableElementSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertType;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.OracleStatement;
import java.util.Optional;
@@ -28,20 +31,43 @@ import java.util.Optional;
/**
* Oracle insert statement.
*/
+@Getter
@Setter
public final class OracleInsertStatement extends InsertStatement implements
OracleStatement {
- private InsertMultiTableElementSegment insertMultiTableElementSegment;
+ private MultiTableInsertType multiTableInsertType;
+
+ private MultiTableInsertIntoSegment multiTableInsertIntoSegment;
+
+ private MultiTableConditionalIntoSegment multiTableConditionalIntoSegment;
private WhereSegment where;
/**
- * Get insert multi table element segment.
+ * Get multi table insert type.
+ *
+ * @return multi table insert type
+ */
+ public Optional<MultiTableInsertType> getMultiTableInsertType() {
+ return Optional.ofNullable(multiTableInsertType);
+ }
+
+ /**
+ * Get multi table insert into segment.
+ *
+ * @return multi table insert into segment
+ */
+ public Optional<MultiTableInsertIntoSegment>
getMultiTableInsertIntoSegment() {
+ return Optional.ofNullable(multiTableInsertIntoSegment);
+ }
+
+ /**
+ * Get multi table conditional into segment.
*
- * @return insert select segment
+ * @return multi table conditional into segment
*/
- public Optional<InsertMultiTableElementSegment>
getInsertMultiTableElementSegment() {
- return Optional.ofNullable(insertMultiTableElementSegment);
+ public Optional<MultiTableConditionalIntoSegment>
getMultiTableConditionalIntoSegment() {
+ return Optional.ofNullable(multiTableConditionalIntoSegment);
}
/**
diff --git
a/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandlerTest.java
b/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandlerTest.java
index c105d339bd6..83b9afc49ca 100644
---
a/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandlerTest.java
+++
b/parser/sql/statement/src/test/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/InsertStatementHandlerTest.java
@@ -19,7 +19,7 @@ package
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDuplicateKeyColumnsSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.InsertMultiTableElementSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertIntoSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLInsertStatement;
@@ -155,19 +155,19 @@ class InsertStatementHandlerTest {
@Test
void assertGetInsertMultiTableElementSegmentForOracle() {
OracleInsertStatement insertStatement = new OracleInsertStatement();
- insertStatement.setInsertMultiTableElementSegment(new
InsertMultiTableElementSegment(0, 0));
- Optional<InsertMultiTableElementSegment>
insertMultiTableElementSegment =
InsertStatementHandler.getInsertMultiTableElementSegment(insertStatement);
+ insertStatement.setMultiTableInsertIntoSegment(new
MultiTableInsertIntoSegment(0, 0));
+ Optional<MultiTableInsertIntoSegment> insertMultiTableElementSegment =
InsertStatementHandler.getMultiTableInsertIntoSegment(insertStatement);
assertTrue(insertMultiTableElementSegment.isPresent());
- assertThat(insertMultiTableElementSegment.get(),
is(insertStatement.getInsertMultiTableElementSegment().get()));
-
assertFalse(InsertStatementHandler.getInsertMultiTableElementSegment(new
SQLServerInsertStatement()).isPresent());
+ assertThat(insertMultiTableElementSegment.get(),
is(insertStatement.getMultiTableInsertIntoSegment().get()));
+ assertFalse(InsertStatementHandler.getMultiTableInsertIntoSegment(new
SQLServerInsertStatement()).isPresent());
}
@Test
void assertGetInsertMultiTableElementSegmentForOtherDatabases() {
-
assertFalse(InsertStatementHandler.getInsertMultiTableElementSegment(new
MySQLInsertStatement()).isPresent());
-
assertFalse(InsertStatementHandler.getInsertMultiTableElementSegment(new
OpenGaussInsertStatement()).isPresent());
-
assertFalse(InsertStatementHandler.getInsertMultiTableElementSegment(new
PostgreSQLInsertStatement()).isPresent());
-
assertFalse(InsertStatementHandler.getInsertMultiTableElementSegment(new
SQL92InsertStatement()).isPresent());
-
assertFalse(InsertStatementHandler.getInsertMultiTableElementSegment(new
SQLServerInsertStatement()).isPresent());
+ assertFalse(InsertStatementHandler.getMultiTableInsertIntoSegment(new
MySQLInsertStatement()).isPresent());
+ assertFalse(InsertStatementHandler.getMultiTableInsertIntoSegment(new
OpenGaussInsertStatement()).isPresent());
+ assertFalse(InsertStatementHandler.getMultiTableInsertIntoSegment(new
PostgreSQLInsertStatement()).isPresent());
+ assertFalse(InsertStatementHandler.getMultiTableInsertIntoSegment(new
SQL92InsertStatement()).isPresent());
+ assertFalse(InsertStatementHandler.getMultiTableInsertIntoSegment(new
SQLServerInsertStatement()).isPresent());
}
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoClauseAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoClauseAssert.java
new file mode 100644
index 00000000000..712f9fe1083
--- /dev/null
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoClauseAssert.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoWhenThenSegment;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableConditionalIntoClause;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Multi table conditional into assert.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class MultiTableConditionalIntoClauseAssert {
+
+ /**
+ * Assert actual multi table conditional into segment is correct with
expected multi table conditional into segment.
+ *
+ * @param assertContext assert context
+ * @param actual actual multi table conditional into segment
+ * @param expected expected multi table conditional into segment
+ */
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final MultiTableConditionalIntoSegment actual, final
ExpectedMultiTableConditionalIntoClause expected) {
+ assertThat(assertContext.getText("Conditional into when then segment
size assertion error: "), actual.getWhenThenSegments().size(),
is(expected.getConditionalIntoWhenThenClauses().size()));
+ int index = 0;
+ for (MultiTableConditionalIntoWhenThenSegment each :
actual.getWhenThenSegments()) {
+ ExpressionAssert.assertExpression(assertContext,
each.getWhenSegment(),
expected.getConditionalIntoWhenThenClauses().get(index).getWhenClause());
+ MultiTableConditionalIntoThenSegmentAssert.assertIs(assertContext,
each.getThenSegment(),
expected.getConditionalIntoWhenThenClauses().get(index).getThenClause());
+ SQLSegmentAssert.assertIs(assertContext, actual, expected);
+ index++;
+ }
+ if (null == expected.getElseClause()) {
+ assertFalse(actual.getElseSegment().isPresent(),
assertContext.getText("Actual multi table conditional into else segment should
not exist."));
+ } else {
+ assertTrue(actual.getElseSegment().isPresent(),
assertContext.getText("Actual multi table conditional into else segment should
exist."));
+ MultiTableConditionalIntoElseSegmentAssert.assertIs(assertContext,
actual.getElseSegment().get(), expected.getElseClause());
+ }
+ }
+}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoElseSegmentAssert.java
similarity index 68%
copy from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
copy to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoElseSegmentAssert.java
index d9d211da26f..af4102ec054 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoElseSegmentAssert.java
@@ -19,31 +19,32 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.in
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.InsertMultiTableElementSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoElseSegment;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dml.impl.InsertStatementAssert;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertMultiTableElement;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableConditionalIntoElseClause;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
/**
- * Insert multi table element assert.
+ * Multi table conditional into else segment assert.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class InsertMultiTableElementAssert {
+public final class MultiTableConditionalIntoElseSegmentAssert {
/**
- * Assert actual insert multi table element segment is correct with
expected multi table element.
+ * Assert actual multi table conditional into else segment is correct with
expected multi table conditional into else segment.
*
* @param assertContext assert context
- * @param actual actual insert multi table element
- * @param expected expected insert multi table element
+ * @param actual actual multi table conditional into else segment
+ * @param expected expected multi table conditional into else segment
*/
- public static void assertIs(final SQLCaseAssertContext assertContext,
final InsertMultiTableElementSegment actual, final
ExpectedInsertMultiTableElement expected) {
- assertThat(assertContext.getText("Insert values size assertion error:
"), actual.getInsertStatements().size(),
is(expected.getInsertTestCases().size()));
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final MultiTableConditionalIntoElseSegment actual, final
ExpectedMultiTableConditionalIntoElseClause expected) {
+ assertThat(assertContext.getText("Multi table conditional into else
segment' insert values size assertion error: "),
actual.getInsertStatements().size(),
+ is(expected.getInsertTestCases().size()));
int count = 0;
for (InsertStatement each : actual.getInsertStatements()) {
InsertStatementAssert.assertIs(assertContext, each,
expected.getInsertTestCases().get(count));
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoThenSegmentAssert.java
similarity index 68%
copy from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
copy to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoThenSegmentAssert.java
index d9d211da26f..9b02954dd7e 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableConditionalIntoThenSegmentAssert.java
@@ -19,31 +19,32 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.in
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.InsertMultiTableElementSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoThenSegment;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dml.impl.InsertStatementAssert;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertMultiTableElement;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableConditionalIntoThenClause;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
/**
- * Insert multi table element assert.
+ * Multi table conditional into then segment assert.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class InsertMultiTableElementAssert {
+public final class MultiTableConditionalIntoThenSegmentAssert {
/**
- * Assert actual insert multi table element segment is correct with
expected multi table element.
+ * Assert actual multi table conditional into then segment is correct with
expected multi table conditional into then segment.
*
* @param assertContext assert context
- * @param actual actual insert multi table element
- * @param expected expected insert multi table element
+ * @param actual actual multi table conditional into then segment
+ * @param expected expected multi table conditional into then segment
*/
- public static void assertIs(final SQLCaseAssertContext assertContext,
final InsertMultiTableElementSegment actual, final
ExpectedInsertMultiTableElement expected) {
- assertThat(assertContext.getText("Insert values size assertion error:
"), actual.getInsertStatements().size(),
is(expected.getInsertTestCases().size()));
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final MultiTableConditionalIntoThenSegment actual, final
ExpectedMultiTableConditionalIntoThenClause expected) {
+ assertThat(assertContext.getText("Multi table conditional into then
segment' insert values size assertion error: "),
actual.getInsertStatements().size(),
+ is(expected.getInsertTestCases().size()));
int count = 0;
for (InsertStatement each : actual.getInsertStatements()) {
InsertStatementAssert.assertIs(assertContext, each,
expected.getInsertTestCases().get(count));
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableInsertIntoClauseAssert.java
similarity index 78%
rename from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
rename to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableInsertIntoClauseAssert.java
index d9d211da26f..c39c3cc4860 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/InsertMultiTableElementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/MultiTableInsertIntoClauseAssert.java
@@ -19,30 +19,30 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.in
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.InsertMultiTableElementSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertIntoSegment;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dml.impl.InsertStatementAssert;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertMultiTableElement;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableInsertIntoClause;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
/**
- * Insert multi table element assert.
+ * Multi table insert into assert.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class InsertMultiTableElementAssert {
+public final class MultiTableInsertIntoClauseAssert {
/**
- * Assert actual insert multi table element segment is correct with
expected multi table element.
+ * Assert actual multi table insert into segment is correct with expected
multi table insert into segment.
*
* @param assertContext assert context
- * @param actual actual insert multi table element
- * @param expected expected insert multi table element
+ * @param actual actual multi table insert into segment
+ * @param expected expected multi table insert into segment
*/
- public static void assertIs(final SQLCaseAssertContext assertContext,
final InsertMultiTableElementSegment actual, final
ExpectedInsertMultiTableElement expected) {
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final MultiTableInsertIntoSegment actual, final
ExpectedMultiTableInsertIntoClause expected) {
assertThat(assertContext.getText("Insert values size assertion error:
"), actual.getInsertStatements().size(),
is(expected.getInsertTestCases().size()));
int count = 0;
for (InsertStatement each : actual.getInsertStatements()) {
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java
index 16c18f66d73..2cdb42d37a1 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java
@@ -22,15 +22,18 @@ import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.ReturningSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.OnDuplicateKeyColumnsSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.InsertMultiTableElementSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatementHandler;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableConditionalIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertIntoSegment;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.segment.oracle.insert.MultiTableInsertType;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertColumnsClauseAssert;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertMultiTableElementAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertValuesClauseAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.MultiTableConditionalIntoClauseAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.MultiTableInsertIntoClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.OnDuplicateKeyColumnsAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.output.OutputClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.returning.ReturningClauseAssert;
@@ -41,6 +44,8 @@ import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
import java.util.Optional;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -67,7 +72,9 @@ public final class InsertStatementAssert {
assertOnDuplicateKeyColumns(assertContext, actual, expected);
assertWithClause(assertContext, actual, expected);
assertOutputClause(assertContext, actual, expected);
- assertInsertMultiTableElement(assertContext, actual, expected);
+ assertMultiTableInsertType(assertContext, actual, expected);
+ assertMultiTableInsertIntoClause(assertContext, actual, expected);
+ assertMultiTableConditionalIntoClause(assertContext, actual, expected);
assertReturningClause(assertContext, actual, expected);
}
@@ -146,13 +153,34 @@ public final class InsertStatementAssert {
}
}
- private static void assertInsertMultiTableElement(final
SQLCaseAssertContext assertContext, final InsertStatement actual, final
InsertStatementTestCase expected) {
- Optional<InsertMultiTableElementSegment> insertTableElementSegment =
InsertStatementHandler.getInsertMultiTableElementSegment(actual);
- if (null == expected.getInsertTableElement()) {
- assertFalse(insertTableElementSegment.isPresent(),
assertContext.getText("Actual insert multi table element segment should not
exist."));
+ private static void assertMultiTableInsertType(final SQLCaseAssertContext
assertContext, final InsertStatement actual, final InsertStatementTestCase
expected) {
+ Optional<MultiTableInsertType> multiTableInsertType =
InsertStatementHandler.getMultiTableInsertType(actual);
+ if (null == expected.getMultiTableInsertType()) {
+ assertFalse(multiTableInsertType.isPresent(),
assertContext.getText("Actual multi table insert type should not exist."));
} else {
- assertTrue(insertTableElementSegment.isPresent(),
assertContext.getText("Actual insert multi table element segment should
exist."));
- InsertMultiTableElementAssert.assertIs(assertContext,
insertTableElementSegment.get(), expected.getInsertTableElement());
+ assertTrue(multiTableInsertType.isPresent(),
assertContext.getText("Actual multi table insert type should exist."));
+ assertThat(assertContext.getText(String.format("`%s`'s
multiTableInsertType assertion error: ", actual.getClass().getSimpleName())),
multiTableInsertType.get().name(),
+
is(expected.getMultiTableInsertType().getMultiTableInsertType()));
+ }
+ }
+
+ private static void assertMultiTableInsertIntoClause(final
SQLCaseAssertContext assertContext, final InsertStatement actual, final
InsertStatementTestCase expected) {
+ Optional<MultiTableInsertIntoSegment> multiTableInsertIntoSegment =
InsertStatementHandler.getMultiTableInsertIntoSegment(actual);
+ if (null == expected.getMultiTableInsertInto()) {
+ assertFalse(multiTableInsertIntoSegment.isPresent(),
assertContext.getText("Actual multi table insert into segment should not
exist."));
+ } else {
+ assertTrue(multiTableInsertIntoSegment.isPresent(),
assertContext.getText("Actual multi table insert into segment should exist."));
+ MultiTableInsertIntoClauseAssert.assertIs(assertContext,
multiTableInsertIntoSegment.get(), expected.getMultiTableInsertInto());
+ }
+ }
+
+ private static void assertMultiTableConditionalIntoClause(final
SQLCaseAssertContext assertContext, final InsertStatement actual, final
InsertStatementTestCase expected) {
+ Optional<MultiTableConditionalIntoSegment>
multiTableConditionalIntoSegment =
InsertStatementHandler.getMultiTableConditionalIntoSegment(actual);
+ if (null == expected.getMultiTableConditionalInto()) {
+ assertFalse(multiTableConditionalIntoSegment.isPresent(),
assertContext.getText("Actual multi table conditional into segment should not
exist."));
+ } else {
+ assertTrue(multiTableConditionalIntoSegment.isPresent(),
assertContext.getText("Actual multi table conditional into segment should
exist."));
+ MultiTableConditionalIntoClauseAssert.assertIs(assertContext,
multiTableConditionalIntoSegment.get(),
expected.getMultiTableConditionalInto());
}
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoClause.java
similarity index 71%
copy from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
copy to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoClause.java
index 3101d5d36f4..fead100aaaa 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoClause.java
@@ -18,19 +18,23 @@
package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert;
import lombok.Getter;
+import lombok.Setter;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.InsertStatementTestCase;
import javax.xml.bind.annotation.XmlElement;
import java.util.LinkedList;
import java.util.List;
/**
- * Expected insert multi table element.
+ * Expected multi table conditional into clause.
*/
@Getter
-public final class ExpectedInsertMultiTableElement extends
AbstractExpectedSQLSegment {
+@Setter
+public final class ExpectedMultiTableConditionalIntoClause extends
AbstractExpectedSQLSegment {
- @XmlElement(name = "table-element")
- private final List<InsertStatementTestCase> insertTestCases = new
LinkedList<>();
+ @XmlElement(name = "conditional-into-when-then")
+ private final List<ExpectedMultiTableConditionalIntoWhenThenClause>
conditionalIntoWhenThenClauses = new LinkedList<>();
+
+ @XmlElement(name = "conditional-into-else")
+ private ExpectedMultiTableConditionalIntoElseClause elseClause;
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoElseClause.java
similarity index 87%
copy from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
copy to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoElseClause.java
index 3101d5d36f4..ce7b3f49725 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoElseClause.java
@@ -26,11 +26,11 @@ import java.util.LinkedList;
import java.util.List;
/**
- * Expected insert multi table element.
+ * Expected multi table conditional into else clause.
*/
@Getter
-public final class ExpectedInsertMultiTableElement extends
AbstractExpectedSQLSegment {
+public final class ExpectedMultiTableConditionalIntoElseClause extends
AbstractExpectedSQLSegment {
- @XmlElement(name = "table-element")
+ @XmlElement(name = "insert-statement")
private final List<InsertStatementTestCase> insertTestCases = new
LinkedList<>();
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoThenClause.java
similarity index 87%
copy from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
copy to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoThenClause.java
index 3101d5d36f4..89cabe3a454 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoThenClause.java
@@ -26,11 +26,11 @@ import java.util.LinkedList;
import java.util.List;
/**
- * Expected insert multi table element.
+ * Expected multi table conditional into then clause.
*/
@Getter
-public final class ExpectedInsertMultiTableElement extends
AbstractExpectedSQLSegment {
+public final class ExpectedMultiTableConditionalIntoThenClause extends
AbstractExpectedSQLSegment {
- @XmlElement(name = "table-element")
+ @XmlElement(name = "insert-statement")
private final List<InsertStatementTestCase> insertTestCases = new
LinkedList<>();
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoWhenThenClause.java
similarity index 73%
copy from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
copy to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoWhenThenClause.java
index 3101d5d36f4..d9566807e4a 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableConditionalIntoWhenThenClause.java
@@ -18,19 +18,22 @@
package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert;
import lombok.Getter;
+import lombok.Setter;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.InsertStatementTestCase;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedExpression;
import javax.xml.bind.annotation.XmlElement;
-import java.util.LinkedList;
-import java.util.List;
/**
- * Expected insert multi table element.
+ * Expected multi table conditional into when then clause.
*/
@Getter
-public final class ExpectedInsertMultiTableElement extends
AbstractExpectedSQLSegment {
+@Setter
+public final class ExpectedMultiTableConditionalIntoWhenThenClause extends
AbstractExpectedSQLSegment {
- @XmlElement(name = "table-element")
- private final List<InsertStatementTestCase> insertTestCases = new
LinkedList<>();
+ @XmlElement(name = "when")
+ private ExpectedExpression whenClause;
+
+ @XmlElement(name = "then")
+ private ExpectedMultiTableConditionalIntoThenClause thenClause;
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableInsertIntoClause.java
similarity index 88%
copy from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
copy to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableInsertIntoClause.java
index 3101d5d36f4..9c379b793cf 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableInsertIntoClause.java
@@ -26,11 +26,11 @@ import java.util.LinkedList;
import java.util.List;
/**
- * Expected insert multi table element.
+ * Expected multi table insert into clause.
*/
@Getter
-public final class ExpectedInsertMultiTableElement extends
AbstractExpectedSQLSegment {
+public final class ExpectedMultiTableInsertIntoClause extends
AbstractExpectedSQLSegment {
- @XmlElement(name = "table-element")
+ @XmlElement(name = "insert-statement")
private final List<InsertStatementTestCase> insertTestCases = new
LinkedList<>();
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableInsertType.java
similarity index 69%
rename from
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
rename to
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableInsertType.java
index 3101d5d36f4..4c7877309c9 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedInsertMultiTableElement.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedMultiTableInsertType.java
@@ -18,19 +18,18 @@
package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert;
import lombok.Getter;
+import lombok.Setter;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.InsertStatementTestCase;
-import javax.xml.bind.annotation.XmlElement;
-import java.util.LinkedList;
-import java.util.List;
+import javax.xml.bind.annotation.XmlAttribute;
/**
- * Expected insert multi table element.
+ * Expected multi table insert type.
*/
@Getter
-public final class ExpectedInsertMultiTableElement extends
AbstractExpectedSQLSegment {
+@Setter
+public class ExpectedMultiTableInsertType extends AbstractExpectedSQLSegment {
- @XmlElement(name = "table-element")
- private final List<InsertStatementTestCase> insertTestCases = new
LinkedList<>();
+ @XmlAttribute(name = "value")
+ private String multiTableInsertType;
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java
index 995293a76d4..404e58ad87f 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java
@@ -19,9 +19,12 @@ package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.
import lombok.Getter;
import lombok.Setter;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertColumnsClause;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertMultiTableElement;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertValuesClause;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableConditionalIntoClause;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableInsertIntoClause;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableInsertType;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedOnDuplicateKeyColumns;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedReturningClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.output.ExpectedOutputClause;
@@ -29,7 +32,6 @@ import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSimpleTable;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.where.ExpectedWhereClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.with.ExpectedWithClause;
-import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
import javax.xml.bind.annotation.XmlElement;
@@ -64,8 +66,14 @@ public final class InsertStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "output")
private ExpectedOutputClause outputClause;
- @XmlElement(name = "multi-table-element")
- private ExpectedInsertMultiTableElement insertTableElement;
+ @XmlElement(name = "multi-table-insert-type")
+ private ExpectedMultiTableInsertType multiTableInsertType;
+
+ @XmlElement(name = "multi-table-insert-into")
+ private ExpectedMultiTableInsertIntoClause multiTableInsertInto;
+
+ @XmlElement(name = "multi-table-conditional-into")
+ private ExpectedMultiTableConditionalIntoClause multiTableConditionalInto;
@XmlElement(name = "select-subquery")
private SelectStatementTestCase selectSubquery;
diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml
b/test/it/parser/src/main/resources/case/dml/insert.xml
index c32c2ef8e66..a7b8ca3c729 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -1362,8 +1362,9 @@
</insert>
<insert sql-case-id="insert_all_with_all_placeholders" parameters="1, 1,
'init', 2, 2, 'init', 3, 3, 'init'">
- <multi-table-element start-index="11" stop-index="183"
literal-start-index="11" literal-stop-index="198">
- <table-element>
+ <multi-table-insert-type value="ALL" />
+ <multi-table-insert-into start-index="11" stop-index="183"
literal-start-index="11" literal-stop-index="198">
+ <insert-statement>
<table name="t_order" start-index="16" stop-index="22" />
<columns start-index="24" stop-index="50">
<column name="order_id" start-index="25" stop-index="32" />
@@ -1386,8 +1387,8 @@
</assignment-value>
</value>
</values>
- </table-element>
- <table-element>
+ </insert-statement>
+ <insert-statement>
<table name="t_order" start-index="74" stop-index="80"
literal-start-index="79" literal-stop-index="85" />
<columns start-index="82" stop-index="108"
literal-start-index="87" literal-stop-index="113">
<column name="order_id" start-index="83" stop-index="90"
literal-start-index="88" literal-stop-index="95" />
@@ -1410,8 +1411,8 @@
</assignment-value>
</value>
</values>
- </table-element>
- <table-element>
+ </insert-statement>
+ <insert-statement>
<table name="t_order" start-index="132" stop-index="138"
literal-start-index="142" literal-stop-index="148" />
<columns start-index="140" stop-index="166"
literal-start-index="150" literal-stop-index="176">
<column name="order_id" start-index="141" stop-index="148"
literal-start-index="151" literal-stop-index="158" />
@@ -1434,8 +1435,8 @@
</assignment-value>
</value>
</values>
- </table-element>
- </multi-table-element>
+ </insert-statement>
+ </multi-table-insert-into>
<select>
<from>
<simple-table name="dual" start-index="199" stop-index="202"
literal-start-index="214" literal-stop-index="217" />
@@ -2045,8 +2046,9 @@
</insert>
<insert sql-case-id="insert_with_multitable_element">
- <multi-table-element start-index="11" stop-index="231">
- <table-element>
+ <multi-table-insert-type value="ALL" />
+ <multi-table-insert-into start-index="11" stop-index="231">
+ <insert-statement>
<table name="sales" start-index="16" stop-index="20" />
<columns start-index="22" stop-index="56">
<column name="prod_id" start-index="23" stop-index="29" />
@@ -2070,8 +2072,8 @@
</assignment-value>
</value>
</values>
- </table-element>
- <table-element>
+ </insert-statement>
+ <insert-statement>
<table name="sales" start-index="126" stop-index="130" />
<columns start-index="132" stop-index="166">
<column name="prod_id" start-index="133" stop-index="139"
/>
@@ -2103,8 +2105,8 @@
</assignment-value>
</value>
</values>
- </table-element>
- </multi-table-element>
+ </insert-statement>
+ </multi-table-insert-into>
<select>
<from>
<simple-table name="sales_input_table" start-index="310"
stop-index="326" />
@@ -2119,21 +2121,83 @@
</select>
</insert>
- <insert sql-case-id="insert_all_with_multitable_with_conditional_when">
- <multi-table-element start-index="7" stop-index="185">
- <table-element>
- <table name="small_orders" start-index="48" stop-index="59" />
- <columns start-index="60" stop-index="60" />
- </table-element>
- <table-element>
- <table name="medium_orders" start-index="124" stop-index="136"
/>
- <columns start-index="137" stop-index="137" />
- </table-element>
- <table-element>
- <table name="large_orders" start-index="174" stop-index="185"
/>
- <columns start-index="186" stop-index="186" />
- </table-element>
- </multi-table-element>
+ <insert sql-case-id="insert_all_with_multi_table_with_conditional_when">
+ <multi-table-insert-type value="ALL" />
+ <multi-table-conditional-into start-index="7" stop-index="185">
+ <conditional-into-when-then start-index="11" stop-index="59">
+ <when start-index="16" stop-index="36">
+ <binary-operation-expression start-index="16"
stop-index="36">
+ <left>
+ <column name="order_total" start-index="16"
stop-index="26" />
+ </left>
+ <operator><=</operator>
+ <right>
+ <literal-expression value="100000"
start-index="31" stop-index="36" />
+ </right>
+ </binary-operation-expression>
+ </when>
+ <then start-index="43" stop-index="59">
+ <insert-statement>
+ <table name="small_orders" start-index="48"
stop-index="59" />
+ <columns start-index="60" stop-index="60" />
+ </insert-statement>
+ </then>
+ </conditional-into-when-then>
+ <conditional-into-when-then start-index="61" stop-index="136">
+ <when start-index="66" stop-index="112">
+ <binary-operation-expression start-index="66"
stop-index="112">
+ <left>
+ <binary-operation-expression start-index="66"
stop-index="86">
+ <left>
+ <column name="order_total"
start-index="66" stop-index="76" />
+ </left>
+ <operator>></operator>
+ <right>
+ <literal-expression value="1000000"
start-index="80" stop-index="86" />
+ </right>
+ </binary-operation-expression>
+ </left>
+ <operator>AND</operator>
+ <right>
+ <binary-operation-expression start-index="92"
stop-index="112">
+ <left>
+ <column name="order_total"
start-index="92" stop-index="102" />
+ </left>
+ <operator><=</operator>
+ <right>
+ <literal-expression value="200000"
start-index="107" stop-index="112" />
+ </right>
+ </binary-operation-expression>
+ </right>
+ </binary-operation-expression>
+ </when>
+ <then start-index="119" stop-index="136">
+ <insert-statement>
+ <table name="medium_orders" start-index="124"
stop-index="136" />
+ <columns start-index="137" stop-index="137" />
+ </insert-statement>
+ </then>
+ </conditional-into-when-then>
+ <conditional-into-when-then start-index="138" stop-index="185">
+ <when start-index="143" stop-index="162">
+ <binary-operation-expression start-index="143"
stop-index="162">
+ <left>
+ <column name="order_total" start-index="143"
stop-index="153" />
+ </left>
+ <operator>></operator>
+ <right>
+ <literal-expression value="200000"
start-index="157" stop-index="162" />
+ </right>
+ </binary-operation-expression>
+ </when>
+ <then start-index="169" stop-index="185">
+ <insert-statement>
+ <table name="large_orders" start-index="174"
stop-index="185" />
+ <columns start-index="186" stop-index="186" />
+ </insert-statement>
+ </then>
+ </conditional-into-when-then>
+ </multi-table-conditional-into>
<select>
<from>
<simple-table name="orders" start-index="248" stop-index="253"
/>
@@ -2147,21 +2211,70 @@
</select>
</insert>
- <insert
sql-case-id="insert_all_with_multitable_with_conditional_when_with_conditional_else">
- <multi-table-element start-index="7" stop-index="158">
- <table-element>
- <table name="small_orders" start-index="48" stop-index="59" />
- <columns start-index="60" stop-index="60" />
- </table-element>
- <table-element>
- <table name="medium_orders" start-index="123" stop-index="135"
/>
- <columns start-index="136" stop-index="136" />
- </table-element>
- <table-element>
- <table name="large_orders" start-index="147" stop-index="158"
/>
- <columns start-index="159" stop-index="159" />
- </table-element>
- </multi-table-element>
+ <insert
sql-case-id="insert_all_with_multi_table_with_conditional_when_with_conditional_else">
+ <multi-table-insert-type value="ALL" />
+ <multi-table-conditional-into start-index="7" stop-index="158">
+ <conditional-into-when-then start-index="11" stop-index="59">
+ <when start-index="16" stop-index="36">
+ <binary-operation-expression start-index="16"
stop-index="36">
+ <left>
+ <column name="order_total" start-index="16"
stop-index="26" />
+ </left>
+ <operator><=</operator>
+ <right>
+ <literal-expression value="100000"
start-index="31" stop-index="36" />
+ </right>
+ </binary-operation-expression>
+ </when>
+ <then start-index="43" stop-index="59">
+ <insert-statement>
+ <table name="small_orders" start-index="48"
stop-index="59" />
+ <columns start-index="60" stop-index="60" />
+ </insert-statement>
+ </then>
+ </conditional-into-when-then>
+ <conditional-into-when-then start-index="61" stop-index="135">
+ <when start-index="66" stop-index="111">
+ <binary-operation-expression start-index="66"
stop-index="111">
+ <left>
+ <binary-operation-expression start-index="66"
stop-index="85">
+ <left>
+ <column name="order_total"
start-index="66" stop-index="76" />
+ </left>
+ <operator>></operator>
+ <right>
+ <literal-expression value="100000"
start-index="80" stop-index="85" />
+ </right>
+ </binary-operation-expression>
+ </left>
+ <operator>AND</operator>
+ <right>
+ <binary-operation-expression start-index="91"
stop-index="111">
+ <left>
+ <column name="order_total"
start-index="91" stop-index="101" />
+ </left>
+ <operator><=</operator>
+ <right>
+ <literal-expression value="200000"
start-index="106" stop-index="111" />
+ </right>
+ </binary-operation-expression>
+ </right>
+ </binary-operation-expression>
+ </when>
+ <then start-index="118" stop-index="135">
+ <insert-statement>
+ <table name="medium_orders" start-index="123"
stop-index="135" />
+ <columns start-index="136" stop-index="136" />
+ </insert-statement>
+ </then>
+ </conditional-into-when-then>
+ <conditional-into-else start-index="137" stop-index="158">
+ <insert-statement>
+ <table name="large_orders" start-index="147"
stop-index="158" />
+ <columns start-index="159" stop-index="159" />
+ </insert-statement>
+ </conditional-into-else>
+ </multi-table-conditional-into>
<select>
<from>
<simple-table name="orders" start-index="221" stop-index="226"
/>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
index 7ec25d4c3d7..d5ceb3b464c 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
@@ -84,8 +84,8 @@
<sql-case id="insert_with_dml_table_expr_select" value="INSERT INTO
(SELECT employee_id, last_name, email, hire_date, job_id, salary,
commission_pct FROM employees) VALUES (207, 'Gregory', '[email protected]',
sysdate, 'PU_CLERK', 1.2E3, NULL)" db-types="Oracle" />
<sql-case id="insert_with_select_subquery" value="INSERT INTO bonuses
SELECT employee_id, salary*1.1 FROM employees WHERE commission_pct > 0.25"
db-types="Oracle" />
<sql-case id="insert_with_multitable_element" value="INSERT ALL INTO sales
(prod_id, cust_id, time_id, amount) VALUES (product_id, customer_id,
weekly_start_date, sales_sun) INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, sales_mon, weekly_start_date+1) SELECT
product_id, customer_id, weekly_start_date, sales_sun, sales_mon FROM
sales_input_table" db-types="Oracle" />
- <sql-case id="insert_all_with_multitable_with_conditional_when"
value="INSERT ALL WHEN order_total <= 100000 THEN INTO small_orders WHEN
order_total > 1000000 AND order_total <= 200000 THEN INTO medium_orders WHEN
order_total > 200000 THEN INTO large_orders SELECT order_id, order_total,
sales_rep_id, customer_id FROM orders" db-types="Oracle" />
- <sql-case
id="insert_all_with_multitable_with_conditional_when_with_conditional_else"
value="INSERT ALL WHEN order_total <= 100000 THEN INTO small_orders WHEN
order_total > 100000 AND order_total <= 200000 THEN INTO medium_orders ELSE
INTO large_orders SELECT order_id, order_total, sales_rep_id, customer_id FROM
orders" db-types="Oracle" />
+ <sql-case id="insert_all_with_multi_table_with_conditional_when"
value="INSERT ALL WHEN order_total <= 100000 THEN INTO small_orders WHEN
order_total > 1000000 AND order_total <= 200000 THEN INTO medium_orders WHEN
order_total > 200000 THEN INTO large_orders SELECT order_id, order_total,
sales_rep_id, customer_id FROM orders" db-types="Oracle" />
+ <sql-case
id="insert_all_with_multi_table_with_conditional_when_with_conditional_else"
value="INSERT ALL WHEN order_total <= 100000 THEN INTO small_orders WHEN
order_total > 100000 AND order_total <= 200000 THEN INTO medium_orders ELSE
INTO large_orders SELECT order_id, order_total, sales_rep_id, customer_id FROM
orders" db-types="Oracle" />
<sql-case id="insert_with_rank_column" value="INSERT INTO sales (rank)
VALUES (1)" db-types="Oracle" />
<sql-case id="insert_with_schema" value="INSERT INTO db1.t_order VALUES
(1,2,3)" />
<sql-case id="insert_on_duplicate_key_update_nothing" value="INSERT INTO
t_order (order_id, user_id, status) VALUES (1, 1, 'insert') ON DUPLICATE KEY
UPDATE NOTHING" db-types="openGauss" />