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" 
/>

Reply via email to