This is an automated email from the ASF dual-hosted git repository.
strongduanmu 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 51e3d029955 Support Oracle DML error logging parser model and binder
(#39711)
51e3d029955 is described below
commit 51e3d0299556541836eb07fddb0b9101f679148c
Author: ZhangCheng <[email protected]>
AuthorDate: Fri Sep 4 08:42:57 2026 +0800
Support Oracle DML error logging parser model and binder (#39711)
* Support Oracle DML error logging parser model and binder
* Fix Spotless import order
---
RELEASE-NOTES.md | 3 +
.../statement/dml/DeleteStatementBinder.java | 3 +-
.../statement/dml/InsertStatementBinder.java | 1 +
.../statement/dml/UpdateStatementBinder.java | 1 +
.../statement/dml/DeleteStatementBinderTest.java | 4 ++
.../statement/dml/InsertStatementBinderTest.java | 4 ++
.../statement/dml/UpdateStatementBinderTest.java | 4 ++
.../statement/type/OracleDMLStatementVisitor.java | 32 ++++++++-
.../type/OracleDMLStatementVisitorTest.java | 56 +++++++++++++++
.../core/segment/dml/ErrorLoggingSegment.java | 42 +++++++++++
.../core/statement/type/dml/DeleteStatement.java | 16 ++++-
.../core/statement/type/dml/InsertStatement.java | 15 +++-
.../core/statement/type/dml/MergeStatement.java | 15 +++-
.../core/statement/type/dml/UpdateStatement.java | 16 ++++-
.../segment/error/ErrorLoggingClauseAssert.java | 81 ++++++++++++++++++++++
.../dml/standard/type/DeleteStatementAssert.java | 2 +
.../dml/standard/type/InsertStatementAssert.java | 2 +
.../dml/standard/type/MergeStatementAssert.java | 2 +
.../dml/standard/type/UpdateStatementAssert.java | 2 +
.../impl/error/ExpectedErrorLoggingClause.java | 44 ++++++++++++
.../dml/standard/DeleteStatementTestCase.java | 4 ++
.../dml/standard/InsertStatementTestCase.java | 4 ++
.../dml/standard/MergeStatementTestCase.java | 4 ++
.../dml/standard/UpdateStatementTestCase.java | 4 ++
.../parser/src/main/resources/case/dml/delete.xml | 25 +++++++
.../parser/src/main/resources/case/dml/insert.xml | 20 ++++++
.../parser/src/main/resources/case/dml/merge.xml | 32 +++++++++
.../parser/src/main/resources/case/dml/update.xml | 35 ++++++++++
.../main/resources/sql/supported/dml/delete.xml | 1 +
.../main/resources/sql/supported/dml/insert.xml | 1 +
.../src/main/resources/sql/supported/dml/merge.xml | 1 +
.../main/resources/sql/supported/dml/update.xml | 1 +
32 files changed, 469 insertions(+), 8 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 67e4e6bcaf3..a48fe37fdf0 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -28,6 +28,7 @@
1. SQL Parser: Preserve PostgreSQL `ALTER TABLE ALTER COLUMN` nullability
metadata - [#39432](https://github.com/apache/shardingsphere/pull/39432)
1. SQL Parser: Preserve openGauss `ALTER TABLE ALTER COLUMN` nullability
metadata - [#39435](https://github.com/apache/shardingsphere/pull/39435)
1. SQL Parser: Preserve Firebird `ALTER TABLE ALTER COLUMN` nullability
metadata - [#39436](https://github.com/apache/shardingsphere/pull/39436)
+1. SQL Parser: Fix Oracle DML scalar subqueries and system datetime functions
- [#39710](https://github.com/apache/shardingsphere/pull/39710)
1. SQL Parser: Fix No value specified for parameter exception when sql is
'INSERT INTO tableName ON CONFLICT DO UPDATE set WHERE ' -
[#38668](https://github.com/apache/shardingsphere/pull/38668)
1. SQL Binder: Add DialectFunctionOption to handle wrong skip column bind in
ColumnSegmentBinder -
[#38350](https://github.com/apache/shardingsphere/pull/38350)
1. SQL Binder: Fix wrong bind info when order by refer column from with
temporary table - [#38353](https://github.com/apache/shardingsphere/pull/38353)
@@ -108,9 +109,11 @@
1. SQL Parser: Support MySQL and Oracle CTAS parsing and binding enhancements,
and Doris TABLE statement segment extraction -
[#39332](https://github.com/apache/shardingsphere/pull/39332)
1. SQL Parser: Support Oracle full width SQL symbols parsing -
[#39349](https://github.com/apache/shardingsphere/pull/39349)
1. SQL Parser: Support Oracle pseudo-record collection index parsing -
[#39566](https://github.com/apache/shardingsphere/pull/39566)
+1. SQL Parser: Support Oracle DML error logging parser model and binder -
[#39711](https://github.com/apache/shardingsphere/pull/39711)
1. SQL Binder: Support select order by index bind metadata -
[#38386](https://github.com/apache/shardingsphere/pull/38386)
1. SQL Binder: Support SQL bind when with temp table name is same with
physical table - [#38411](https://github.com/apache/shardingsphere/pull/38411)
1. SQL Binder: Support PostgreSQL whole-row projection binding -
[#39276](https://github.com/apache/shardingsphere/pull/39276)
+1. SQL Binder: Preserve parameter marker projection metadata in column binder
- [#39709](https://github.com/apache/shardingsphere/pull/39709)
1. Metadata: Support Oracle dictionary views by adding SYS default system
schema and YAML definitions -
[#38388](https://github.com/apache/shardingsphere/pull/38388)
1. Metadata: Support parsing query properties from Oracle JDBC URLs -
[#38901](https://github.com/apache/shardingsphere/pull/38901)
1. JDBC: Support setMaxRows and getMaxRows method in jdbc when not execute SQL
- [#38337](https://github.com/apache/shardingsphere/pull/38337)
diff --git
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java
index 0b2e05bc4fa..8b32891e069 100644
---
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java
+++
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java
@@ -53,7 +53,8 @@ public final class DeleteStatementBinder implements
SQLStatementBinder<DeleteSta
private DeleteStatement copy(final DeleteStatement sqlStatement, final
WithSegment boundWith, final TableSegment boundTable, final WhereSegment
boundWhere, final OrderBySegment boundOrderBy) {
DeleteStatement result =
DeleteStatement.builder().databaseType(sqlStatement.getDatabaseType()).with(boundWith).table(boundTable)
-
.where(boundWhere).orderBy(boundOrderBy).limit(sqlStatement.getLimit().orElse(null)).output(sqlStatement.getOutput().orElse(null)).build();
+
.where(boundWhere).orderBy(boundOrderBy).limit(sqlStatement.getLimit().orElse(null)).errorLogging(sqlStatement.getErrorLogging().orElse(null))
+ .output(sqlStatement.getOutput().orElse(null)).build();
SQLStatementCopyUtils.copyAttributes(sqlStatement, result);
return result;
}
diff --git
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java
index a66c731d5f0..ec71a3d1771 100644
---
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java
+++
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java
@@ -97,6 +97,7 @@ public final class InsertStatementBinder implements
SQLStatementBinder<InsertSta
InsertStatement result =
InsertStatement.builder().databaseType(sqlStatement.getDatabaseType()).table(boundTable).insertColumns(boundInsertColumns)
.insertSelect(boundInsertSelect).setAssignment(boundSetAssignment).onDuplicateKeyColumns(boundOnDuplicateKeyColumns)
.valueReference(sqlStatement.getValueReference().orElse(null)).returning(sqlStatement.getReturning().orElse(null))
+ .errorLogging(sqlStatement.getErrorLogging().orElse(null))
.output(sqlStatement.getOutput().orElse(null)).with(boundWith).multiTableInsertType(sqlStatement.getMultiTableInsertType().orElse(null))
.multiTableInsertInto(sqlStatement.getMultiTableInsertInto().orElse(null)).multiTableConditionalInto(sqlStatement.getMultiTableConditionalInto().orElse(null))
.where(sqlStatement.getWhere().orElse(null)).exec(sqlStatement.getExec().orElse(null)).withTableHint(sqlStatement.getWithTableHint().orElse(null))
diff --git
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java
index 2bdb69e36f0..a81af9e964f 100644
---
a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java
+++
b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java
@@ -67,6 +67,7 @@ public final class UpdateStatementBinder implements
SQLStatementBinder<UpdateSta
final SetAssignmentSegment
boundSetAssignment, final WhereSegment boundWhere, final OrderBySegment
boundOrderBy) {
UpdateStatement result =
UpdateStatement.builder().databaseType(sqlStatement.getDatabaseType()).with(boundWith).table(boundTable)
.from(boundFrom).setAssignment(boundSetAssignment).where(boundWhere).orderBy(boundOrderBy).limit(sqlStatement.getLimit().orElse(null))
+ .errorLogging(sqlStatement.getErrorLogging().orElse(null))
.targetTableIsFromAlias(sqlStatement.isTargetTableIsFromAlias()).build();
SQLStatementCopyUtils.copyAttributes(sqlStatement, result);
return result;
diff --git
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java
index 26bda79725b..34e67e2a33c 100644
---
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java
+++
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java
@@ -25,6 +25,7 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.OrderDirection;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment;
@@ -65,14 +66,17 @@ class DeleteStatementBinderTest {
@Test
void assertBind() {
SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order")));
+ ErrorLoggingSegment errorLogging = new ErrorLoggingSegment(0, 0, null,
null, "UNLIMITED");
DeleteStatement deleteStatement = DeleteStatement.builder()
.databaseType(databaseType)
.table(simpleTableSegment)
.where(new WhereSegment(0, 0, new BinaryOperationExpression(0,
0, new ColumnSegment(0, 0, new IdentifierValue("status")),
new LiteralExpressionSegment(0, 0, 0), "=", "status =
1")))
+ .errorLogging(errorLogging)
.build();
DeleteStatement actual = new
DeleteStatementBinder().bind(deleteStatement, new
SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(),
deleteStatement));
assertThat(actual, not(deleteStatement));
+ assertThat(actual.getErrorLogging().get(), is(errorLogging));
assertThat(actual.getTable(), not(deleteStatement.getTable()));
assertThat(actual.getTable(), isA(SimpleTableSegment.class));
assertTrue(actual.getWhere().isPresent());
diff --git
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java
index f64dd45ea8d..e7d6bb3504d 100644
---
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java
+++
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.InsertValuesSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
@@ -66,6 +67,7 @@ class InsertStatementBinderTest {
@Test
void assertBindInsertValues() {
+ ErrorLoggingSegment errorLogging = new ErrorLoggingSegment(0, 0, null,
null, "UNLIMITED");
InsertStatement insertStatement =
InsertStatement.builder().databaseType(databaseType)
.table(new SimpleTableSegment(new TableNameSegment(0, 0, new
IdentifierValue("t_order"))))
.insertColumns(new InsertColumnsSegment(0, 0,
Arrays.asList(new ColumnSegment(0, 0, new IdentifierValue("order_id")),
@@ -73,10 +75,12 @@ class InsertStatementBinderTest {
.values(Collections.singletonList(new InsertValuesSegment(0,
0, Arrays.asList(new LiteralExpressionSegment(0, 0, 1),
new LiteralExpressionSegment(0, 0, 1), new
LiteralExpressionSegment(0, 0, "OK")))))
.overwrite(true)
+ .errorLogging(errorLogging)
.build();
InsertStatement actual = new
InsertStatementBinder().bind(insertStatement, new
SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(),
insertStatement));
assertThat(actual, not(insertStatement));
assertTrue(actual.isOverwrite());
+ assertThat(actual.getErrorLogging().get(), is(errorLogging));
assertTrue(actual.getTable().isPresent());
assertTrue(insertStatement.getTable().isPresent());
assertThat(actual.getTable().get().getTableName(),
not(insertStatement.getTable().get().getTableName()));
diff --git
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java
index 0dbdbcaf75f..0fe17a09f8c 100644
---
a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java
+++
b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java
@@ -25,6 +25,7 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.OrderDirection;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
@@ -68,14 +69,17 @@ class UpdateStatementBinderTest {
@Test
void assertBind() {
SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new
TableNameSegment(0, 0, new IdentifierValue("t_order")));
+ ErrorLoggingSegment errorLogging = new ErrorLoggingSegment(0, 0, null,
null, "UNLIMITED");
UpdateStatement updateStatement = UpdateStatement.builder()
.databaseType(databaseType)
.table(simpleTableSegment)
.where(new WhereSegment(0, 0, new BinaryOperationExpression(0,
0, new ColumnSegment(0, 0, new IdentifierValue("status")),
new LiteralExpressionSegment(0, 0, 0), "=", "status =
1")))
+ .errorLogging(errorLogging)
.build();
UpdateStatement actual = new
UpdateStatementBinder().bind(updateStatement, new
SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(),
updateStatement));
assertThat(actual, not(updateStatement));
+ assertThat(actual.getErrorLogging().get(), is(errorLogging));
assertThat(actual.getTable(), not(updateStatement.getTable()));
assertThat(actual.getTable(), isA(SimpleTableSegment.class));
assertTrue(actual.getWhere().isPresent());
diff --git
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
index 5859d542aa9..2f6e6b0de4e 100644
---
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
+++
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
@@ -43,6 +43,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DmlSub
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DmlTableAliasContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DmlTableClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DuplicateSpecificationContext;
+import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ErrorLoggingClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExecuteContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExprContext;
import
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExpressionListContext;
@@ -130,6 +131,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtra
import
org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.InsertValuesSegment;
@@ -273,12 +275,27 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
if (null != ctx.returningClause()) {
result.returning((ReturningSegment) visit(ctx.returningClause()));
}
+ if (null != ctx.errorLoggingClause()) {
+
result.errorLogging(createErrorLoggingSegment(ctx.errorLoggingClause()));
+ }
UpdateStatement updateStatement = result.build();
updateStatement.addParameterMarkers(ctx.getParent() instanceof
ExecuteContext ? getGlobalParameterMarkerSegments() :
popAllStatementParameterMarkerSegments());
updateStatement.getVariableNames().addAll(getVariableNames());
return updateStatement;
}
+ private ErrorLoggingSegment createErrorLoggingSegment(final
ErrorLoggingClauseContext ctx) {
+ SimpleTableSegment table = null == ctx.tableName() ? null :
(SimpleTableSegment) visit(ctx.tableName());
+ ExpressionSegment tag = null == ctx.simpleExpr() ? null :
(ExpressionSegment) visit(ctx.simpleExpr());
+ String rejectLimit = null;
+ if (null != ctx.INTEGER_()) {
+ rejectLimit = ctx.INTEGER_().getText();
+ } else if (null != ctx.UNLIMITED()) {
+ rejectLimit = ctx.UNLIMITED().getText();
+ }
+ return new ErrorLoggingSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), table, tag, rejectLimit);
+ }
+
@Override
public ASTNode visitUpdateSpecification(final UpdateSpecificationContext
ctx) {
if (null != ctx.dmlTableExprClause().dmlTableClause()) {
@@ -390,6 +407,7 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
.insertColumns(insertStatement.getInsertColumns().orElse(null))
.insertSelect(insertSelect)
.returning(null == ctx.returningClause() ? null :
(ReturningSegment) visit(ctx.returningClause()))
+ .errorLogging(null == ctx.errorLoggingClause() ? null :
createErrorLoggingSegment(ctx.errorLoggingClause()))
.values(insertValues)
.build();
result.getVariableNames().addAll(getVariableNames());
@@ -514,6 +532,9 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
if (null != ctx.returningClause()) {
result.returning((ReturningSegment) visit(ctx.returningClause()));
}
+ if (null != ctx.errorLoggingClause()) {
+
result.errorLogging(createErrorLoggingSegment(ctx.errorLoggingClause()));
+ }
DeleteStatement deleteStatement = result.build();
deleteStatement.addParameterMarkers(ctx.getParent() instanceof
ExecuteContext ? getGlobalParameterMarkerSegments() :
popAllStatementParameterMarkerSegments());
deleteStatement.getVariableNames().addAll(getVariableNames());
@@ -571,10 +592,14 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
@Override
public ASTNode visitMultiTableElement(final MultiTableElementContext ctx) {
- InsertStatement result = (InsertStatement)
visit(ctx.multiTableInsertIntoClause());
+ InsertStatement insertStatement = (InsertStatement)
visit(ctx.multiTableInsertIntoClause());
+ Collection<InsertValuesSegment> insertValues = new
LinkedList<>(insertStatement.getValues());
if (null != ctx.insertValuesClause()) {
-
result.getValues().addAll(createInsertValuesSegments(ctx.insertValuesClause().assignmentValues()));
+
insertValues.addAll(createInsertValuesSegments(ctx.insertValuesClause().assignmentValues()));
}
+ InsertStatement result =
InsertStatement.builder().databaseType(insertStatement.getDatabaseType()).table(insertStatement.getTable().orElse(null))
+
.insertColumns(insertStatement.getInsertColumns().orElse(null)).insertSelect(insertStatement.getInsertSelect().orElse(null))
+ .errorLogging(null == ctx.errorLoggingClause() ? null :
createErrorLoggingSegment(ctx.errorLoggingClause())).values(insertValues).build();
result.addParameterMarkers(ctx.getParent() instanceof ExecuteContext ?
getGlobalParameterMarkerSegments() : popAllStatementParameterMarkerSegments());
result.getVariableNames().addAll(getVariableNames());
return result;
@@ -1633,7 +1658,8 @@ public final class OracleDMLStatementVisitor extends
OracleStatementVisitor impl
insert = (InsertStatement)
visitMergeInsertClause(ctx.mergeInsertClause());
}
}
- MergeStatement result =
MergeStatement.builder().databaseType(getDatabaseType()).target(target).source(source).expression(onExpression).update(update).insert(insert).build();
+ MergeStatement result =
MergeStatement.builder().databaseType(getDatabaseType()).target(target).source(source).expression(onExpression).update(update).insert(insert)
+ .errorLogging(null == ctx.errorLoggingClause() ? null :
createErrorLoggingSegment(ctx.errorLoggingClause())).build();
result.addParameterMarkers(ctx.getParent() instanceof ExecuteContext ?
getGlobalParameterMarkerSegments() : popAllStatementParameterMarkerSegments());
return result;
}
diff --git
a/parser/sql/engine/dialect/oracle/src/test/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitorTest.java
b/parser/sql/engine/dialect/oracle/src/test/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitorTest.java
index 7f83dbd5825..384808db03a 100644
---
a/parser/sql/engine/dialect/oracle/src/test/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitorTest.java
+++
b/parser/sql/engine/dialect/oracle/src/test/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/type/OracleDMLStatementVisitorTest.java
@@ -20,17 +20,24 @@ package
org.apache.shardingsphere.sql.parser.engine.oracle.visitor.statement.typ
import org.apache.shardingsphere.sql.parser.engine.api.CacheOption;
import org.apache.shardingsphere.sql.parser.engine.api.SQLParserEngine;
import
org.apache.shardingsphere.sql.parser.engine.api.SQLStatementVisitorEngine;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubqueryExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.DeleteStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.InsertStatement;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.MergeStatement;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.UpdateStatement;
import org.junit.jupiter.api.Test;
+import java.util.Iterator;
+
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.isA;
+import static org.junit.jupiter.api.Assertions.assertNull;
class OracleDMLStatementVisitorTest {
@@ -89,6 +96,48 @@ class OracleDMLStatementVisitorTest {
assertThat(actual.getAssignment().get().getAssignments().iterator().next().getColumns().size(),
is(1));
}
+ @Test
+ void assertVisitInsertErrorLogging() {
+ InsertStatement actual = (InsertStatement) parse("INSERT INTO t_user
VALUES (?) LOG ERRORS INTO ERR$_T_USER (?) REJECT LIMIT UNLIMITED");
+ assertThat(actual.getParameterCount(), is(2));
+ assertErrorLogging(actual.getErrorLogging().get(), "ERR$_T_USER", 1,
"UNLIMITED");
+ }
+
+ @Test
+ void assertVisitMultiTableInsertErrorLogging() {
+ InsertStatement actual = (InsertStatement) parse("INSERT ALL INTO
t_order VALUES (?) LOG ERRORS INTO ERR$_T_ORDER (?) REJECT LIMIT 1 "
+ + "INTO t_order VALUES (2) LOG ERRORS REJECT LIMIT UNLIMITED
SELECT 1 FROM dual");
+ Iterator<InsertStatement> insertStatements =
actual.getMultiTableInsertInto().get().getInsertStatements().iterator();
+ assertErrorLogging(insertStatements.next().getErrorLogging().get(),
"ERR$_T_ORDER", 1, "1");
+ ErrorLoggingSegment actualErrorLogging =
insertStatements.next().getErrorLogging().get();
+ assertNull(actualErrorLogging.getTable());
+ assertNull(actualErrorLogging.getTag());
+ assertThat(actualErrorLogging.getRejectLimit(), is("UNLIMITED"));
+ assertThat(actual.getParameterCount(), is(2));
+ }
+
+ @Test
+ void assertVisitUpdateErrorLogging() {
+ UpdateStatement actual = parseUpdate("UPDATE t_user SET email = ?
WHERE user_id = ? LOG ERRORS INTO ERR$_T_USER (?) REJECT LIMIT 2");
+ assertThat(actual.getParameterCount(), is(3));
+ assertErrorLogging(actual.getErrorLogging().get(), "ERR$_T_USER", 2,
"2");
+ }
+
+ @Test
+ void assertVisitDeleteErrorLogging() {
+ DeleteStatement actual = (DeleteStatement) parse("DELETE FROM t_user
WHERE user_id = ? LOG ERRORS INTO ERR$_T_USER (?) REJECT LIMIT UNLIMITED");
+ assertThat(actual.getParameterCount(), is(2));
+ assertErrorLogging(actual.getErrorLogging().get(), "ERR$_T_USER", 1,
"UNLIMITED");
+ }
+
+ @Test
+ void assertVisitMergeErrorLogging() {
+ MergeStatement actual = parseMerge("MERGE INTO t_user target USING
t_user source ON (target.user_id = source.user_id) "
+ + "WHEN MATCHED THEN UPDATE SET target.email = source.email
LOG ERRORS INTO ERR$_T_USER (?) REJECT LIMIT 3");
+ assertThat(actual.getParameterCount(), is(1));
+ assertErrorLogging(actual.getErrorLogging().get(), "ERR$_T_USER", 0,
"3");
+ }
+
private MergeStatement parseMerge(final String sql) {
return (MergeStatement) parse(sql);
}
@@ -100,4 +149,11 @@ class OracleDMLStatementVisitorTest {
private Object parse(final String sql) {
return new SQLStatementVisitorEngine("Oracle").visit(new
SQLParserEngine("Oracle", CACHE_OPTION).parse(sql, false));
}
+
+ private void assertErrorLogging(final ErrorLoggingSegment actual, final
String expectedTable, final int expectedParameterIndex, final String
expectedRejectLimit) {
+
assertThat(actual.getTable().getTableName().getIdentifier().getValue(),
is(expectedTable));
+ assertThat(actual.getTag(),
isA(ParameterMarkerExpressionSegment.class));
+ assertThat(((ParameterMarkerExpressionSegment)
actual.getTag()).getParameterMarkerIndex(), is(expectedParameterIndex));
+ assertThat(actual.getRejectLimit(), is(expectedRejectLimit));
+ }
}
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/ErrorLoggingSegment.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/ErrorLoggingSegment.java
new file mode 100644
index 00000000000..4a9c301c830
--- /dev/null
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/dml/ErrorLoggingSegment.java
@@ -0,0 +1,42 @@
+/*
+ * 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.sql.parser.statement.core.segment.dml;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.SQLSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
+
+/**
+ * Error logging segment.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class ErrorLoggingSegment implements SQLSegment {
+
+ private final int startIndex;
+
+ private final int stopIndex;
+
+ private final SimpleTableSegment table;
+
+ private final ExpressionSegment tag;
+
+ private final String rejectLimit;
+}
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/DeleteStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/DeleteStatement.java
index c681ed622f5..3243e5f33ae 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/DeleteStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/DeleteStatement.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml;
import lombok.Builder;
import lombok.Getter;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.OrderBySegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.limit.LimitSegment;
@@ -50,13 +51,16 @@ public final class DeleteStatement extends DMLStatement {
private final ReturningSegment returning;
+ private final ErrorLoggingSegment errorLogging;
+
private final OutputSegment output;
private final SQLStatementAttributes attributes;
@Builder
private DeleteStatement(final DatabaseType databaseType, final
TableSegment table, final WhereSegment where,
- final OrderBySegment orderBy, final LimitSegment
limit, final WithSegment with, final ReturningSegment returning, final
OutputSegment output) {
+ final OrderBySegment orderBy, final LimitSegment
limit, final WithSegment with, final ReturningSegment returning,
+ final ErrorLoggingSegment errorLogging, final
OutputSegment output) {
super(databaseType);
this.table = table;
this.where = where;
@@ -64,6 +68,7 @@ public final class DeleteStatement extends DMLStatement {
this.limit = limit;
this.with = with;
this.returning = returning;
+ this.errorLogging = errorLogging;
this.output = output;
attributes = new SQLStatementAttributes(new
WithSQLStatementAttribute(with));
}
@@ -113,6 +118,15 @@ public final class DeleteStatement extends DMLStatement {
return Optional.ofNullable(returning);
}
+ /**
+ * Get error logging segment.
+ *
+ * @return error logging segment
+ */
+ public Optional<ErrorLoggingSegment> getErrorLogging() {
+ return Optional.ofNullable(errorLogging);
+ }
+
/**
* Get output.
*
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/InsertStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/InsertStatement.java
index 18adfa4e42a..6c005f73bff 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/InsertStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/InsertStatement.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml;
import lombok.Builder;
import lombok.Getter;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.InsertValuesSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment;
@@ -66,6 +67,8 @@ public final class InsertStatement extends DMLStatement {
private final ReturningSegment returning;
+ private final ErrorLoggingSegment errorLogging;
+
private final OutputSegment output;
private final WithSegment with;
@@ -99,7 +102,7 @@ public final class InsertStatement extends DMLStatement {
@Builder
private InsertStatement(final DatabaseType databaseType, final
SimpleTableSegment table, final InsertColumnsSegment insertColumns,
final SubquerySegment insertSelect, final
SetAssignmentSegment setAssignment, final OnDuplicateKeyColumnsSegment
onDuplicateKeyColumns,
- final ValueReferenceSegment valueReference, final
ReturningSegment returning, final OutputSegment output, final WithSegment with,
+ final ValueReferenceSegment valueReference, final
ReturningSegment returning, final ErrorLoggingSegment errorLogging, final
OutputSegment output, final WithSegment with,
final MultiTableInsertType multiTableInsertType,
final MultiTableInsertIntoSegment multiTableInsertInto,
final MultiTableConditionalIntoSegment
multiTableConditionalInto, final WhereSegment where, final ExecSegment exec,
final WithTableHintSegment withTableHint, final
FunctionSegment rowSetFunction, final boolean ignore, final boolean replace,
@@ -112,6 +115,7 @@ public final class InsertStatement extends DMLStatement {
this.onDuplicateKeyColumns = onDuplicateKeyColumns;
this.valueReference = valueReference;
this.returning = returning;
+ this.errorLogging = errorLogging;
this.output = output;
this.with = with;
this.multiTableInsertType = multiTableInsertType;
@@ -246,6 +250,15 @@ public final class InsertStatement extends DMLStatement {
return Optional.ofNullable(returning);
}
+ /**
+ * Get error logging segment.
+ *
+ * @return error logging segment
+ */
+ public Optional<ErrorLoggingSegment> getErrorLogging() {
+ return Optional.ofNullable(errorLogging);
+ }
+
/**
* Get where segment.
*
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/MergeStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/MergeStatement.java
index 93ffc599d56..73758ee46e2 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/MergeStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/MergeStatement.java
@@ -21,6 +21,7 @@ import lombok.Builder;
import lombok.Getter;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionWithParamsSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.hint.OptionHintSegment;
@@ -52,6 +53,8 @@ public final class MergeStatement extends DMLStatement {
private final InsertStatement insert;
+ private final ErrorLoggingSegment errorLogging;
+
private final WithSegment with;
private final WithTableHintSegment withTableHint;
@@ -70,7 +73,7 @@ public final class MergeStatement extends DMLStatement {
@Builder
private MergeStatement(final DatabaseType databaseType, final TableSegment
target, final TableSegment source, final ExpressionWithParamsSegment expression,
- final UpdateStatement update, final InsertStatement
insert, final WithSegment with, final WithTableHintSegment withTableHint,
+ final UpdateStatement update, final InsertStatement
insert, final ErrorLoggingSegment errorLogging, final WithSegment with, final
WithTableHintSegment withTableHint,
final Collection<IndexSegment> indexes, final
OutputSegment output, final OptionHintSegment optionHint, final
ReturningSegment returning,
final Collection<MergeWhenAndThenSegment>
whenAndThens) {
super(databaseType);
@@ -79,6 +82,7 @@ public final class MergeStatement extends DMLStatement {
this.expression = expression;
this.update = update;
this.insert = insert;
+ this.errorLogging = errorLogging;
this.with = with;
this.withTableHint = withTableHint;
this.indexes = null == indexes ? new LinkedList<>() : indexes;
@@ -107,6 +111,15 @@ public final class MergeStatement extends DMLStatement {
return Optional.ofNullable(insert);
}
+ /**
+ * Get error logging segment.
+ *
+ * @return error logging segment
+ */
+ public Optional<ErrorLoggingSegment> getErrorLogging() {
+ return Optional.ofNullable(errorLogging);
+ }
+
/**
* Get with.
*
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/UpdateStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/UpdateStatement.java
index ba3c84d56ac..f0d6711f6ef 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/UpdateStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/dml/UpdateStatement.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml;
import lombok.Builder;
import lombok.Getter;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ReturningSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.hint.OptionHintSegment;
@@ -59,6 +60,8 @@ public final class UpdateStatement extends DMLStatement {
private final ReturningSegment returning;
+ private final ErrorLoggingSegment errorLogging;
+
private final WithTableHintSegment withTableHint;
private final OptionHintSegment optionHint;
@@ -72,7 +75,8 @@ public final class UpdateStatement extends DMLStatement {
@Builder
private UpdateStatement(final DatabaseType databaseType, final
TableSegment table, final SetAssignmentSegment setAssignment, final
WhereSegment where,
final OrderBySegment orderBy, final LimitSegment
limit, final TableSegment from, final WhereSegment deleteWhere, final
WithSegment with,
- final ReturningSegment returning, final
WithTableHintSegment withTableHint, final OptionHintSegment optionHint, final
OutputSegment output,
+ final ReturningSegment returning, final
ErrorLoggingSegment errorLogging, final WithTableHintSegment withTableHint,
final OptionHintSegment optionHint,
+ final OutputSegment output,
final boolean targetTableIsFromAlias) {
super(databaseType);
this.table = table;
@@ -84,6 +88,7 @@ public final class UpdateStatement extends DMLStatement {
this.deleteWhere = deleteWhere;
this.with = with;
this.returning = returning;
+ this.errorLogging = errorLogging;
this.withTableHint = withTableHint;
this.optionHint = optionHint;
this.output = output;
@@ -181,6 +186,15 @@ public final class UpdateStatement extends DMLStatement {
return Optional.ofNullable(returning);
}
+ /**
+ * Get error logging segment.
+ *
+ * @return error logging segment
+ */
+ public Optional<ErrorLoggingSegment> getErrorLogging() {
+ return Optional.ofNullable(errorLogging);
+ }
+
/**
* Get with table hint.
*
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/error/ErrorLoggingClauseAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/error/ErrorLoggingClauseAssert.java
new file mode 100644
index 00000000000..6d34cbe1979
--- /dev/null
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/error/ErrorLoggingClauseAssert.java
@@ -0,0 +1,81 @@
+/*
+ * 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.error;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.ErrorLoggingSegment;
+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.asserts.segment.table.TableAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.error.ExpectedErrorLoggingClause;
+
+import java.util.Optional;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Error logging clause assert.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ErrorLoggingClauseAssert {
+
+ /**
+ * Assert optional error logging segment is correct with expected error
logging clause.
+ *
+ * @param assertContext assert context
+ * @param actual actual optional error logging segment
+ * @param expected expected error logging clause
+ */
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final Optional<ErrorLoggingSegment> actual, final ExpectedErrorLoggingClause
expected) {
+ if (null == expected) {
+ assertFalse(actual.isPresent(), assertContext.getText("Actual
error logging segment should not exist."));
+ } else {
+ assertTrue(actual.isPresent(), assertContext.getText("Actual error
logging segment should exist."));
+ assertIs(assertContext, actual.get(), expected);
+ }
+ }
+
+ /**
+ * Assert error logging segment is correct with expected error logging
clause.
+ *
+ * @param assertContext assert context
+ * @param actual actual error logging segment
+ * @param expected expected error logging clause
+ */
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final ErrorLoggingSegment actual, final ExpectedErrorLoggingClause expected) {
+ SQLSegmentAssert.assertIs(assertContext, actual, expected);
+ if (null == expected.getTable()) {
+ assertNull(actual.getTable(), assertContext.getText("Actual error
logging table should not exist."));
+ } else {
+ TableAssert.assertIs(assertContext, actual.getTable(),
expected.getTable());
+ }
+ if (null == expected.getTag()) {
+ assertNull(actual.getTag(), assertContext.getText("Actual error
logging tag should not exist."));
+ } else {
+ assertTrue(null != actual.getTag(), assertContext.getText("Actual
error logging tag should exist."));
+ ExpressionAssert.assertExpression(assertContext, actual.getTag(),
expected.getTag());
+ }
+ assertThat(assertContext.getText("Error logging reject limit assertion
error: "), actual.getRejectLimit(), is(expected.getRejectLimit()));
+ }
+}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/DeleteStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/DeleteStatementAssert.java
index a7dd2537e2d..b7038a8eadd 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/DeleteStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/DeleteStatementAssert.java
@@ -29,6 +29,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table
import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.DeleteStatement;
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.error.ErrorLoggingClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.limit.LimitClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.orderby.OrderByClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.output.OutputClauseAssert;
@@ -65,6 +66,7 @@ public final class DeleteStatementAssert {
assertTable(assertContext, actual, expected);
assertOutput(assertContext, actual, expected);
assertWhereClause(assertContext, actual, expected);
+ ErrorLoggingClauseAssert.assertIs(assertContext,
actual.getErrorLogging(), expected.getErrorLoggingClause());
assertOrderByClause(assertContext, actual, expected);
assertLimitClause(assertContext, actual, expected);
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/InsertStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/InsertStatementAssert.java
index 5a9beb66344..f277a40288b 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/InsertStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/InsertStatementAssert.java
@@ -34,6 +34,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithS
import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.InsertStatement;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.assignment.ValueReferenceSegmentAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.error.ErrorLoggingClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.hint.WithTableHintClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.DerivedInsertColumnsAssert;
@@ -86,6 +87,7 @@ public final class InsertStatementAssert {
assertMultiTableInsertIntoClause(assertContext, actual, expected);
assertMultiTableConditionalIntoClause(assertContext, actual, expected);
assertReturningClause(assertContext, actual, expected);
+ ErrorLoggingClauseAssert.assertIs(assertContext,
actual.getErrorLogging(), expected.getErrorLoggingClause());
assertInsertExecClause(assertContext, actual, expected);
assertWithTableHintClause(assertContext, actual, expected);
assertRowSetFunctionClause(assertContext, actual, expected);
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/MergeStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/MergeStatementAssert.java
index 300e4718a24..528969fc311 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/MergeStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/MergeStatementAssert.java
@@ -27,6 +27,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.Outpu
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.MergeStatement;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.error.ErrorLoggingClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.hint.WithTableHintClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.index.IndexAssert;
@@ -70,6 +71,7 @@ public final class MergeStatementAssert {
assertWithTableHintClause(assertContext, actual, expected);
assertOutputClause(assertContext, actual, expected);
assertReturningClause(assertContext, actual, expected);
+ ErrorLoggingClauseAssert.assertIs(assertContext,
actual.getErrorLogging(), expected.getErrorLoggingClause());
assertWhenAndThenSegments(assertContext, actual, expected);
assertIndexes(assertContext, actual, expected);
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/UpdateStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/UpdateStatementAssert.java
index f7fe0c8a55e..026a56a177f 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/UpdateStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/UpdateStatementAssert.java
@@ -26,6 +26,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.Outpu
import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.UpdateStatement;
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.error.ErrorLoggingClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.limit.LimitClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.orderby.OrderByClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.output.OutputClauseAssert;
@@ -64,6 +65,7 @@ public final class UpdateStatementAssert {
assertLimitClause(assertContext, actual, expected);
assertOptionHint(assertContext, actual, expected);
assertOutputClause(assertContext, actual, expected);
+ ErrorLoggingClauseAssert.assertIs(assertContext,
actual.getErrorLogging(), expected.getErrorLoggingClause());
}
private static void assertTable(final SQLCaseAssertContext assertContext,
final UpdateStatement actual, final UpdateStatementTestCase expected) {
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/error/ExpectedErrorLoggingClause.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/error/ExpectedErrorLoggingClause.java
new file mode 100644
index 00000000000..fda5da352e3
--- /dev/null
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/error/ExpectedErrorLoggingClause.java
@@ -0,0 +1,44 @@
+/*
+ * 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.cases.parser.jaxb.segment.impl.error;
+
+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.segment.impl.expr.ExpectedExpression;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedTable;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * Expected error logging clause.
+ */
+@Getter
+@Setter
+public final class ExpectedErrorLoggingClause extends
AbstractExpectedSQLSegment {
+
+ @XmlElement
+ private ExpectedTable table;
+
+ @XmlElement
+ private ExpectedExpression tag;
+
+ @XmlAttribute(name = "reject-limit")
+ private String rejectLimit;
+}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/DeleteStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/DeleteStatementTestCase.java
index a234a41a81e..98331e430c4 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/DeleteStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/DeleteStatementTestCase.java
@@ -20,6 +20,7 @@ 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.error.ExpectedErrorLoggingClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.limit.ExpectedLimitClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.orderby.ExpectedOrderByClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.output.ExpectedOutputClause;
@@ -63,4 +64,7 @@ public final class DeleteStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "function-table")
private ExpectedFunctionTable functionTable;
+
+ @XmlElement(name = "error-logging")
+ private ExpectedErrorLoggingClause errorLoggingClause;
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/InsertStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/InsertStatementTestCase.java
index 704f3e94af8..9ef727547ce 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/InsertStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/InsertStatementTestCase.java
@@ -21,6 +21,7 @@ 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.assignment.ExpectedValueReference;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.error.ExpectedErrorLoggingClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.exec.ExpectedExecClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.function.ExpectedFunction;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.hint.ExpectedWithTableHintClause;
@@ -92,6 +93,9 @@ public final class InsertStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "returning")
private ExpectedReturningClause returningClause;
+ @XmlElement(name = "error-logging")
+ private ExpectedErrorLoggingClause errorLoggingClause;
+
@XmlElement(name = "where")
private ExpectedWhereClause whereClause;
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/MergeStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/MergeStatementTestCase.java
index 4752d16479e..9b6cb0c3a56 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/MergeStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/MergeStatementTestCase.java
@@ -20,6 +20,7 @@ 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.error.ExpectedErrorLoggingClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedExpression;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedMergeWhenAndThenSegment;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.hint.ExpectedWithTableHintClause;
@@ -55,6 +56,9 @@ public final class MergeStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "insert")
private InsertStatementTestCase insertClause;
+ @XmlElement(name = "error-logging")
+ private ExpectedErrorLoggingClause errorLoggingClause;
+
@XmlElement(name = "merge-items")
private List<ExpectedMergeWhenAndThenSegment> mergeWhenAndThenSegments =
new LinkedList<>();
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/UpdateStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/UpdateStatementTestCase.java
index f2fb8705242..9acdf8c23d8 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/UpdateStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/UpdateStatementTestCase.java
@@ -20,6 +20,7 @@ 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.error.ExpectedErrorLoggingClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.hint.ExpectedOptionHint;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.limit.ExpectedLimitClause;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.orderby.ExpectedOrderByClause;
@@ -64,4 +65,7 @@ public final class UpdateStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "output")
private ExpectedOutputClause outputClause;
+
+ @XmlElement(name = "error-logging")
+ private ExpectedErrorLoggingClause errorLoggingClause;
}
diff --git a/test/it/parser/src/main/resources/case/dml/delete.xml
b/test/it/parser/src/main/resources/case/dml/delete.xml
index 2065465739c..823872eb65a 100644
--- a/test/it/parser/src/main/resources/case/dml/delete.xml
+++ b/test/it/parser/src/main/resources/case/dml/delete.xml
@@ -17,6 +17,31 @@
-->
<sql-parser-test-cases>
+ <delete sql-case-id="delete_with_error_logging" parameters="1,
'delete_tag'">
+ <table name="t_user" start-index="12" stop-index="17" />
+ <where start-index="19" stop-index="35">
+ <expr>
+ <binary-operation-expression start-index="25" stop-index="35">
+ <left>
+ <column name="user_id" start-index="25"
stop-index="31" />
+ </left>
+ <operator>=</operator>
+ <right>
+ <parameter-marker-expression parameter-index="0"
start-index="35" stop-index="35" />
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ <error-logging reject-limit="UNLIMITED" start-index="37"
stop-index="90">
+ <table>
+ <simple-table name="ERR$_T_USER" start-index="53"
stop-index="63" />
+ </table>
+ <tag>
+ <parameter-marker-expression parameter-index="1"
start-index="66" stop-index="66" />
+ </tag>
+ </error-logging>
+ </delete>
+
<delete sql-case-id="delete_with_sharding_value" parameters="1000, 1001,
'init'">
<table name="t_order" start-index="12" stop-index="18" />
<where start-index="20" stop-index="66" literal-stop-index="77">
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 8f4bd5d3263..c3f041a74cd 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -17,6 +17,26 @@
-->
<sql-parser-test-cases>
+ <insert sql-case-id="insert_with_error_logging" parameters="1,
'insert_tag'">
+ <table name="t_user" start-index="12" stop-index="17" />
+ <columns start-index="18" stop-index="18" />
+ <values>
+ <value>
+ <assignment-value>
+ <parameter-marker-expression parameter-index="0"
start-index="27" stop-index="27" />
+ </assignment-value>
+ </value>
+ </values>
+ <error-logging reject-limit="UNLIMITED" start-index="30"
stop-index="83">
+ <table>
+ <simple-table name="ERR$_T_USER" start-index="46"
stop-index="56" />
+ </table>
+ <tag>
+ <parameter-marker-expression parameter-index="1"
start-index="59" stop-index="59" />
+ </tag>
+ </error-logging>
+ </insert>
+
<insert sql-case-id="insert_into_values1">
<table name="test_nested" start-index="12" stop-index="22" />
<columns start-index="23" stop-index="23" />
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 2323e73a3ba..6ed4f7254b7 100644
--- a/test/it/parser/src/main/resources/case/dml/merge.xml
+++ b/test/it/parser/src/main/resources/case/dml/merge.xml
@@ -18,6 +18,38 @@
<sql-parser-test-cases>
+ <merge sql-case-id="merge_with_error_logging">
+ <target>
+ <simple-table name="t_user" alias="target" start-index="11"
stop-index="23" />
+ </target>
+ <source>
+ <simple-table name="t_user_source" alias="source" start-index="31"
stop-index="50" />
+ </source>
+ <expr>
+ <binary-operation-expression start-index="56" stop-index="86">
+ <left>
+ <column name="user_id" start-index="56" stop-index="69">
+ <owner name="target" start-index="56" stop-index="61"
/>
+ </column>
+ </left>
+ <operator>=</operator>
+ <right>
+ <column name="user_id" start-index="73" stop-index="86">
+ <owner name="source" start-index="73" stop-index="78"
/>
+ </column>
+ </right>
+ </binary-operation-expression>
+ </expr>
+ <error-logging reject-limit="UNLIMITED" start-index="146"
stop-index="199">
+ <table>
+ <simple-table name="ERR$_T_USER" start-index="162"
stop-index="172" />
+ </table>
+ <tag>
+ <parameter-marker-expression parameter-index="0"
start-index="175" stop-index="175" />
+ </tag>
+ </error-logging>
+ </merge>
+
<merge sql-case-id="merge_into_table_using_table" >
<target>
<simple-table name="people_target" start-index="11"
stop-index="23" />
diff --git a/test/it/parser/src/main/resources/case/dml/update.xml
b/test/it/parser/src/main/resources/case/dml/update.xml
index ce187046a63..5fbb8e0ed26 100644
--- a/test/it/parser/src/main/resources/case/dml/update.xml
+++ b/test/it/parser/src/main/resources/case/dml/update.xml
@@ -17,6 +17,41 @@
-->
<sql-parser-test-cases>
+ <update sql-case-id="update_with_error_logging" parameters="'email', 1,
'update_tag'">
+ <table start-index="7" stop-index="12">
+ <simple-table name="t_user" start-index="7" stop-index="12" />
+ </table>
+ <set start-index="14" stop-index="26">
+ <assignment start-index="18" stop-index="26">
+ <column name="email" start-index="18" stop-index="22" />
+ <assignment-value>
+ <parameter-marker-expression parameter-index="0"
start-index="26" stop-index="26" />
+ </assignment-value>
+ </assignment>
+ </set>
+ <where start-index="28" stop-index="44">
+ <expr>
+ <binary-operation-expression start-index="34" stop-index="44">
+ <left>
+ <column name="user_id" start-index="34"
stop-index="40" />
+ </left>
+ <operator>=</operator>
+ <right>
+ <parameter-marker-expression parameter-index="1"
start-index="44" stop-index="44" />
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ <error-logging reject-limit="2" start-index="46" stop-index="91">
+ <table>
+ <simple-table name="ERR$_T_USER" start-index="62"
stop-index="72" />
+ </table>
+ <tag>
+ <parameter-marker-expression parameter-index="2"
start-index="75" stop-index="75" />
+ </tag>
+ </error-logging>
+ </update>
+
<update sql-case-id="update_cast_assignment_hive" parameters="1, 2">
<table start-index="7" stop-index="22">
<simple-table name="t_product_detail" start-index="7"
stop-index="22" />
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
b/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
index bf3e5d1c217..caa718160e0 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
@@ -17,6 +17,7 @@
-->
<sql-cases>
+ <sql-case id="delete_with_error_logging" value="DELETE FROM t_user WHERE
user_id = ? LOG ERRORS INTO ERR$_T_USER (?) REJECT LIMIT UNLIMITED"
db-types="Oracle" case-types="PLACEHOLDER" />
<sql-case id="delete_with_sharding_value" value="DELETE FROM t_order WHERE
order_id = ? AND user_id = ? AND status=?" />
<sql-case id="delete_without_sharding_value" value="DELETE FROM t_order
WHERE status=?" />
<sql-case id="delete_with_special_character_without_sharding_value"
value="DELETE FROM `t_order` WHERE `status`='init'" db-types="MySQL,Doris" />
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 45c09ecbd31..2822c366b19 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
@@ -17,6 +17,7 @@
-->
<sql-cases>
+ <sql-case id="insert_with_error_logging" value="INSERT INTO t_user VALUES
(?) LOG ERRORS INTO ERR$_T_USER (?) REJECT LIMIT UNLIMITED" db-types="Oracle"
case-types="PLACEHOLDER" />
<sql-case id="insert_into_values1" value="INSERT INTO test_nested
VALUES(1)" db-types="MySQL,Presto" />
<sql-case id="insert_into_values2" value="insert into emp_table
values(1,'John',1000.00,'Architect')" db-types="Oracle" />
<sql-case id="insert_into_values3" value="insert into emp_table
values(2,'Robert',900.00,'Developer')" db-types="Oracle" />
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/merge.xml
b/test/it/parser/src/main/resources/sql/supported/dml/merge.xml
index 066fb932647..520827da795 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/merge.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/merge.xml
@@ -17,6 +17,7 @@
-->
<sql-cases>
+ <sql-case id="merge_with_error_logging" value="MERGE INTO t_user target
USING t_user_source source ON (target.user_id = source.user_id) WHEN MATCHED
THEN UPDATE SET target.email = source.email LOG ERRORS INTO ERR$_T_USER (?)
REJECT LIMIT UNLIMITED" db-types="Oracle" case-types="PLACEHOLDER" />
<sql-case id="merge_into_table_using_table" value="MERGE INTO
people_target USING people_source ON (people_target.person_id =
people_source.person_id)" db-types="Oracle" />
<sql-case id="merge_into_table_using_subquery_alias" value="MERGE INTO
bonuses D USING (SELECT employee_id, salary, department_id FROM employees WHERE
department_id = 80) S ON (D.employee_id = S.employee_id)" db-types="Oracle" />
<sql-case id="merge_update_table" value="MERGE INTO people_target pt USING
people_source ps ON (pt.person_id = ps.person_id) WHEN MATCHED THEN UPDATE SET
pt.first_name = ps.first_name, pt.last_name = ps.last_name, pt.title =
ps.title" db-types="Oracle" />
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/update.xml
b/test/it/parser/src/main/resources/sql/supported/dml/update.xml
index bd3f96db85d..d850d8bbc97 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/update.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/update.xml
@@ -17,6 +17,7 @@
-->
<sql-cases>
+ <sql-case id="update_with_error_logging" value="UPDATE t_user SET email =
? WHERE user_id = ? LOG ERRORS INTO ERR$_T_USER (?) REJECT LIMIT 2"
db-types="Oracle" case-types="PLACEHOLDER" />
<sql-case id="update_cast_assignment_hive" value="UPDATE t_product_detail
SET description = cast(? AS STRING) WHERE detail_id = ?"
case-types="placeholder" db-types="Hive" />
<sql-case id="update_case_when_assignment_hive" value="UPDATE t_user SET
user_name = CASE WHEN user_id = ? THEN concat(user_name, ?) ELSE user_name END
WHERE user_id IN (?, ?)" case-types="placeholder" db-types="Hive" />
<sql-case id="update_values_derived_table_aliases_postgresql"
value="UPDATE t_order SET status = t.status FROM (VALUES (1, 'PAID')) AS
t(order_id, status) WHERE t_order.order_id = t.order_id" db-types="PostgreSQL"
/>