This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 00e4ffb2250 Refactor merge statement. (#28486)
00e4ffb2250 is described below
commit 00e4ffb2250abb7e001b6d655490467a191e5c16
Author: Chuxin Chen <[email protected]>
AuthorDate: Thu Sep 21 17:02:15 2023 +0800
Refactor merge statement. (#28486)
---
.../statement/dml/MergeStatementContext.java | 2 +-
.../binder/statement/dml/MergeStatementBinder.java | 10 ++++++-
.../binder/statement/MergeStatementBinderTest.java | 34 ++++++++++++++++++++--
.../statement/type/OracleDMLStatementVisitor.java | 11 +++++--
.../dml/expr/ExpressionWithParamsSegment.java} | 28 +++++++++---------
.../sql/common/statement/dml/MergeStatement.java | 4 +--
.../handler/dml/UpdateStatementHandler.java | 27 +++++++++++++++++
.../statement/dml/impl/MergeStatementAssert.java | 4 +--
.../parser/src/main/resources/case/dml/merge.xml | 20 +++++++++++++
9 files changed, 116 insertions(+), 24 deletions(-)
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/MergeStatementContext.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/MergeStatementContext.java
index 40ab28d71d2..58f6d5ff6a0 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/MergeStatementContext.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/MergeStatementContext.java
@@ -22,7 +22,7 @@ import
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStateme
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml.OracleMergeStatement;
/**
- * Load xml statement context.
+ * Merge statement context.
*/
@Getter
public final class MergeStatementContext extends CommonSQLStatementContext {
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 7a38ca7e139..1cbbfc18dd0 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
@@ -34,6 +34,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.In
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionWithParamsSegment;
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.dml.InsertStatement;
@@ -76,7 +77,12 @@ public final class MergeStatementBinder implements
SQLStatementBinder<MergeState
Map<String, TableSegmentBinderContext> tableBinderContexts = new
LinkedHashMap<>();
tableBinderContexts.putAll(sourceTableBinderContexts);
tableBinderContexts.putAll(targetTableBinderContexts);
- result.setExpr(ExpressionSegmentBinder.bind(sqlStatement.getExpr(),
SegmentType.JOIN_ON, statementBinderContext, tableBinderContexts,
Collections.emptyMap()));
+ if (sqlStatement.getExpression() != null) {
+ ExpressionWithParamsSegment expression = new
ExpressionWithParamsSegment(sqlStatement.getExpression().getStartIndex(),
sqlStatement.getExpression().getStopIndex(),
+
ExpressionSegmentBinder.bind(sqlStatement.getExpression().getExpr(),
SegmentType.JOIN_ON, statementBinderContext, tableBinderContexts,
Collections.emptyMap()));
+
expression.getParameterMarkerSegments().addAll(sqlStatement.getExpression().getParameterMarkerSegments());
+ result.setExpression(expression);
+ }
result.setInsert(Optional.ofNullable(sqlStatement.getInsert()).map(optional ->
bindMergeInsert(optional,
(SimpleTableSegment) boundedTargetTableSegment,
statementBinderContext, targetTableBinderContexts,
sourceTableBinderContexts)).orElse(null));
result.setUpdate(Optional.ofNullable(sqlStatement.getUpdate()).map(optional ->
bindMergeUpdate(optional,
@@ -142,6 +148,8 @@ public final class MergeStatementBinder implements
SQLStatementBinder<MergeState
SetAssignmentSegment setAssignmentSegment = new
SetAssignmentSegment(sqlStatement.getSetAssignment().getStartIndex(),
sqlStatement.getSetAssignment().getStopIndex(), assignments);
result.setSetAssignment(setAssignmentSegment);
sqlStatement.getWhere().ifPresent(optional ->
result.setWhere(WhereSegmentBinder.bind(optional, updateStatementBinderContext,
targetTableBinderContexts, Collections.emptyMap())));
+
UpdateStatementHandler.getDeleteWhereSegment(sqlStatement).ifPresent(optional
-> UpdateStatementHandler.setDeleteWhereSegment(result,
+ WhereSegmentBinder.bind(optional,
updateStatementBinderContext, targetTableBinderContexts,
Collections.emptyMap())));
UpdateStatementHandler.getOrderBySegment(sqlStatement).ifPresent(optional ->
UpdateStatementHandler.setOrderBySegment(result, optional));
UpdateStatementHandler.getLimitSegment(sqlStatement).ifPresent(optional ->
UpdateStatementHandler.setLimitSegment(result, optional));
UpdateStatementHandler.getWithSegment(sqlStatement).ifPresent(optional
-> UpdateStatementHandler.setWithSegment(result, optional));
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/MergeStatementBinderTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/MergeStatementBinderTest.java
index e5671c97ad2..42216afd2f5 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/MergeStatementBinderTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/MergeStatementBinderTest.java
@@ -26,6 +26,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.Co
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.SetAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionWithParamsSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
@@ -67,8 +68,8 @@ class MergeStatementBinderTest {
SimpleTableSegment sourceTable = new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order_item")));
sourceTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("b")));
mergeStatement.setSource(sourceTable);
- mergeStatement.setExpr(new BinaryOperationExpression(0, 0, new
ColumnSegment(0, 0, new IdentifierValue("id")),
- new ColumnSegment(0, 0, new IdentifierValue("order_id")), "=",
"id = order_id"));
+ mergeStatement.setExpression(new ExpressionWithParamsSegment(0, 0, new
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new
IdentifierValue("id")),
+ new ColumnSegment(0, 0, new IdentifierValue("order_id")), "=",
"id = order_id")));
UpdateStatement updateStatement = new OracleUpdateStatement();
updateStatement.setTable(targetTable);
ColumnSegment targetTableColumn = new ColumnSegment(0, 0, new
IdentifierValue("status"));
@@ -139,4 +140,33 @@ class MergeStatementBinderTest {
MergeStatement actual = new
MergeStatementBinder().bind(mergeStatement, createMetaData(),
DefaultDatabase.LOGIC_NAME);
assertThat(actual, not(mergeStatement));
}
+
+ @Test
+ void assertBindUpdateDeleteWhere() {
+ MergeStatement mergeStatement = new OracleMergeStatement();
+ SimpleTableSegment targetTable = new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order")));
+ targetTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("a")));
+ mergeStatement.setTarget(targetTable);
+ SimpleTableSegment sourceTable = new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order_item")));
+ sourceTable.setAlias(new AliasSegment(0, 0, new IdentifierValue("b")));
+ mergeStatement.setSource(sourceTable);
+ OracleUpdateStatement updateStatement = new OracleUpdateStatement();
+ updateStatement.setTable(targetTable);
+ ColumnSegment targetTableColumn = new ColumnSegment(0, 0, new
IdentifierValue("status"));
+ targetTableColumn.setOwner(new OwnerSegment(0, 0, new
IdentifierValue("a")));
+ ColumnSegment sourceTableColumn = new ColumnSegment(0, 0, new
IdentifierValue("status"));
+ sourceTableColumn.setOwner(new OwnerSegment(0, 0, new
IdentifierValue("b")));
+ SetAssignmentSegment setAssignmentSegment = new
SetAssignmentSegment(0, 0,
+ Collections.singletonList(new ColumnAssignmentSegment(0, 0,
Collections.singletonList(targetTableColumn), sourceTableColumn)));
+ updateStatement.setSetAssignment(setAssignmentSegment);
+ updateStatement.setDeleteWhere(new WhereSegment(0, 0, new
BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new
IdentifierValue("item_id")),
+ new LiteralExpressionSegment(0, 0, 1), "=", "item_id = 1")));
+ mergeStatement.setUpdate(updateStatement);
+ MergeStatement actual = new
MergeStatementBinder().bind(mergeStatement, createMetaData(),
DefaultDatabase.LOGIC_NAME);
+ assertThat(actual.getUpdate(),
instanceOf(OracleUpdateStatement.class));
+ assertThat(((OracleUpdateStatement)
actual.getUpdate()).getDeleteWhere().getExpr(),
instanceOf(BinaryOperationExpression.class));
+ assertThat(((BinaryOperationExpression) ((OracleUpdateStatement)
actual.getUpdate()).getDeleteWhere().getExpr()).getLeft(),
instanceOf(ColumnSegment.class));
+ assertThat(((ColumnSegment) ((BinaryOperationExpression)
((OracleUpdateStatement)
actual.getUpdate()).getDeleteWhere().getExpr()).getLeft())
+ .getColumnBoundedInfo().getOriginalTable().getValue(),
is("t_order_item"));
+ }
}
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 d97e9933e76..5f4f95df0be 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
@@ -123,6 +123,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.CaseWhen
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.CollateExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.DatetimeExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionWithParamsSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.MultisetExpression;
@@ -1215,7 +1216,10 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
OracleMergeStatement result = new OracleMergeStatement();
result.setTarget((TableSegment) visit(ctx.intoClause()));
result.setSource((TableSegment) visit(ctx.usingClause()));
- result.setExpr((ExpressionSegment) visit(ctx.usingClause().expr()));
+ ExpressionWithParamsSegment onExpression = new
ExpressionWithParamsSegment(ctx.usingClause().expr().start.getStartIndex(),
ctx.usingClause().expr().stop.getStopIndex(),
+ (ExpressionSegment) visit(ctx.usingClause().expr()));
+
onExpression.getParameterMarkerSegments().addAll(popAllStatementParameterMarkerSegments());
+ result.setExpression(onExpression);
if (null != ctx.mergeUpdateClause()) {
result.setUpdate((UpdateStatement)
visitMergeUpdateClause(ctx.mergeUpdateClause()));
}
@@ -1238,6 +1242,7 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
if (null != ctx.whereClause()) {
result.setWhere((WhereSegment) visit(ctx.whereClause()));
}
+
result.getParameterMarkerSegments().addAll(popAllStatementParameterMarkerSegments());
return result;
}
@@ -1259,7 +1264,7 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
for (ExprContext each : ctx.expr()) {
segments.add(null == each ? new
CommonExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.getText()) : (ExpressionSegment) visit(each));
}
- result.getValue().add(new
InsertValuesSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), segments));
+ result.getValue().add(new
InsertValuesSegment(ctx.LP_().getSymbol().getStartIndex(),
ctx.RP_().getSymbol().getStopIndex(), segments));
return result;
}
@@ -1306,6 +1311,7 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
}
OracleSelectStatement subquery = (OracleSelectStatement)
visit(ctx.subquery());
SubquerySegment subquerySegment = new
SubquerySegment(ctx.subquery().start.getStartIndex(),
ctx.subquery().stop.getStopIndex(), subquery);
+
subquerySegment.getSelect().getParameterMarkerSegments().addAll(popAllStatementParameterMarkerSegments());
SubqueryTableSegment result = new
SubqueryTableSegment(subquerySegment);
if (null != ctx.alias()) {
result.setAlias((AliasSegment) visit(ctx.alias()));
@@ -1323,6 +1329,7 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
if (null != ctx.deleteWhereClause()) {
result.setDeleteWhere((WhereSegment)
visit(ctx.deleteWhereClause()));
}
+
result.getParameterMarkerSegments().addAll(popAllStatementParameterMarkerSegments());
return result;
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ExpressionWithParamsSegment.java
similarity index 59%
copy from
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
copy to
parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ExpressionWithParamsSegment.java
index c9dd114ae7b..56f0b592f7d 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ExpressionWithParamsSegment.java
@@ -15,28 +15,28 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.sql.parser.sql.common.statement.dml;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr;
import lombok.Getter;
-import lombok.Setter;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ParameterMarkerSegment;
+
+import java.util.Collection;
+import java.util.LinkedList;
/**
- * Merge statement.
+ * Expression with parameters segment.
*/
+@RequiredArgsConstructor
@Getter
-@Setter
-public abstract class MergeStatement extends AbstractSQLStatement implements
DMLStatement {
-
- private TableSegment target;
+public final class ExpressionWithParamsSegment implements SQLSegment {
- private TableSegment source;
+ private final int startIndex;
- private ExpressionSegment expr;
+ private final int stopIndex;
- private UpdateStatement update;
+ private final ExpressionSegment expr;
- private InsertStatement insert;
+ private final Collection<ParameterMarkerSegment> parameterMarkerSegments =
new LinkedList<>();
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
index c9dd114ae7b..e43a4fedc5a 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/dml/MergeStatement.java
@@ -19,7 +19,7 @@ package
org.apache.shardingsphere.sql.parser.sql.common.statement.dml;
import lombok.Getter;
import lombok.Setter;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionWithParamsSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
@@ -34,7 +34,7 @@ public abstract class MergeStatement extends
AbstractSQLStatement implements DML
private TableSegment source;
- private ExpressionSegment expr;
+ private ExpressionWithParamsSegment expression;
private UpdateStatement update;
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/UpdateStatementHandler.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/UpdateStatementHandler.java
index 3eeea17682a..3ef7524e335 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/UpdateStatementHandler.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/dml/UpdateStatementHandler.java
@@ -21,11 +21,13 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.OrderBySegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.handler.SQLStatementHandler;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLUpdateStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.dml.OracleUpdateStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.SQLServerStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerUpdateStatement;
@@ -76,6 +78,19 @@ public final class UpdateStatementHandler implements
SQLStatementHandler {
return Optional.empty();
}
+ /**
+ * Get delete where segment.
+ *
+ * @param updateStatement update statement
+ * @return delete where segment
+ */
+ public static Optional<WhereSegment> getDeleteWhereSegment(final
UpdateStatement updateStatement) {
+ if (updateStatement instanceof OracleUpdateStatement) {
+ return Optional.ofNullable(((OracleUpdateStatement)
updateStatement).getDeleteWhere());
+ }
+ return Optional.empty();
+ }
+
/**
* Set order by segment.
*
@@ -111,4 +126,16 @@ public final class UpdateStatementHandler implements
SQLStatementHandler {
((SQLServerUpdateStatement)
updateStatement).setWithSegment(withSegment);
}
}
+
+ /**
+ * Set delete where segment.
+ *
+ * @param updateStatement update statement
+ * @param deleteWhereSegment delete where segment
+ */
+ public static void setDeleteWhereSegment(final UpdateStatement
updateStatement, final WhereSegment deleteWhereSegment) {
+ if (updateStatement instanceof OracleUpdateStatement) {
+ ((OracleUpdateStatement)
updateStatement).setDeleteWhere(deleteWhereSegment);
+ }
+ }
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/MergeStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/MergeStatementAssert.java
index d65dacf1666..26a01d1d48c 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/MergeStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/MergeStatementAssert.java
@@ -67,9 +67,9 @@ public final class MergeStatementAssert {
private static void assertExpression(final SQLCaseAssertContext
assertContext, final MergeStatement actual, final MergeStatementTestCase
expected) {
if (null == expected.getExpr()) {
- assertNull(actual.getExpr(), assertContext.getText("Actual
expression should not exist."));
+ assertNull(actual.getExpression(), assertContext.getText("Actual
expression should not exist."));
} else {
- ExpressionAssert.assertExpression(assertContext, actual.getExpr(),
expected.getExpr());
+ ExpressionAssert.assertExpression(assertContext,
actual.getExpression().getExpr(), expected.getExpr());
}
}
diff --git a/test/it/parser/src/main/resources/case/dml/merge.xml
b/test/it/parser/src/main/resources/case/dml/merge.xml
index 005ea1d2703..809c3366df6 100644
--- a/test/it/parser/src/main/resources/case/dml/merge.xml
+++ b/test/it/parser/src/main/resources/case/dml/merge.xml
@@ -296,6 +296,26 @@
</binary-operation-expression>
</expr>
<insert>
+ <values>
+ <value>
+ <assignment-value>
+ <column name="employee_id" start-index="331"
stop-index="343">
+ <owner name="S" start-index="331" stop-index="331"
/>
+ </column>
+ <binary-operation-expression start-index="67"
stop-index="74">
+ <left>
+ <column name="salary" start-index="346"
stop-index="353">
+ <owner name="S" start-index="346"
stop-index="346" />
+ </column>
+ </left>
+ <operator>*</operator>
+ <right>
+ <literal-expression value=".01"
start-index="355" stop-index="357" />
+ </right>
+ </binary-operation-expression>
+ </assignment-value>
+ </value>
+ </values>
<where start-index="365" stop-index="388"
literal-start-index="365" literal-stop-index="388">
<expr>
<binary-operation-expression start-index="372"
stop-index="387" literal-start-index="372" literal-stop-index="387">