This is an automated email from the ASF dual-hosted git repository.

jianbin pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/incubator-seata.git


The following commit(s) were added to refs/heads/2.x by this push:
     new b6af418eaa feature: support shentongdatabase xa mode (#7664)
b6af418eaa is described below

commit b6af418eaaa9fa4015087b43786cb64205638c75
Author: hanshaohua <[email protected]>
AuthorDate: Tue Sep 30 17:08:49 2025 +0800

    feature: support shentongdatabase xa mode (#7664)
---
 .github/workflows/test-druid.yml                   |  5 ++
 changes/en-us/2.x.md                               |  2 +
 changes/zh-cn/2.x.md                               |  3 +
 .../rm/datasource/xa/DataSourceProxyXATest.java    |  9 ++
 dependencies/pom.xml                               |  8 +-
 distribution/LICENSE                               |  2 +-
 distribution/LICENSE-server                        |  2 +-
 distribution/NOTICE.md                             |  4 +-
 rm-datasource/pom.xml                              |  5 ++
 .../apache/seata/rm/datasource/util/XAUtils.java   |  7 ++
 .../rm/datasource/PreparedStatementProxyTest.java  | 22 ++++-
 .../seata/rm/datasource/StatementProxyTest.java    | 20 ++++-
 .../rm/datasource/exec/DeleteExecutorTest.java     | 16 +++-
 .../datasource/exec/MariadbInsertExecutorTest.java |  7 +-
 .../rm/datasource/exec/MultiExecutorTest.java      | 16 +++-
 .../datasource/exec/MySQLInsertExecutorTest.java   | 17 +++-
 .../rm/datasource/exec/PlainExecutorTest.java      | 16 +++-
 .../exec/PolarDBXInsertExecutorTest.java           |  7 +-
 .../exec/SelectForUpdateExecutorTest.java          | 17 +++-
 .../rm/datasource/exec/UpdateExecutorTest.java     | 16 +++-
 .../rm/datasource/exec/UpdateJoinExecutorTest.java | 16 +++-
 .../rm/datasource/sql/struct/TableRecordsTest.java | 19 +++--
 .../undo/mariadb/MariadbUndoLogManagerTest.java    | 13 ++-
 .../undo/mysql/MySQLUndoLogManagerTest.java        | 13 ++-
 .../undo/polardbx/PolarDBXUndoLogManagerTest.java  | 13 ++-
 .../seata/rm/datasource/util/XAUtilsTest.java      |  5 ++
 .../rm/datasource/xa/DataSourceProxyXATest.java    | 95 ++++++++--------------
 .../druid/oscar/OscarOperateRecognizerHolder.java  | 16 +++-
 .../sqlparser/druid/dm/DmInsertRecognizerTest.java |  3 +-
 .../kingbase/KingbaseInsertRecognizerTest.java     |  3 +-
 .../oceanbase/OceanBaseInsertRecognizerTest.java   |  3 +-
 .../druid/oracle/OracleInsertRecognizerTest.java   |  6 +-
 .../druid/oscar/AbstractOscarRecognizerTest.java   | 31 +++++++
 .../druid/oscar/OscarDeleteRecognizerTest.java     | 75 ++++++-----------
 .../druid/oscar/OscarInsertRecognizerTest.java     | 42 +++++-----
 .../oscar/OscarOperateRecognizerHolderTest.java    | 88 ++++++++++++++++++++
 .../oscar/OscarSelectForUpdateRecognizerTest.java  | 45 ++++------
 .../druid/oscar/OscarUpdateRecognizerTest.java     | 38 ++++-----
 38 files changed, 477 insertions(+), 248 deletions(-)

diff --git a/.github/workflows/test-druid.yml b/.github/workflows/test-druid.yml
index 70d29b10f7..89dd39ed02 100644
--- a/.github/workflows/test-druid.yml
+++ b/.github/workflows/test-druid.yml
@@ -42,6 +42,11 @@ jobs:
       fail-fast: false
       matrix:
         druid: [
+          1.2.25,
+#          1.2.24, #The source code depends on guava, resulting in a class not 
found, see the commit 
https://github.com/alibaba/druid/commit/f060c2701587948380bd0d07d5baf4f774c06e8a#diff-5200f514252efbc0c4b2dc51ebad5d840b4b3065b9556eb4368bd3476d4c220eR25
+          1.2.23,
+          1.2.22,
+          1.2.21,
           1.2.20,
           1.2.19,
           #1.2.18, # Unit test triggered a bug in Druid, see the commit 
https://github.com/alibaba/druid/commit/6c493f852852fb287ed5fd31ee16c27ead0ea5cf
diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index b7a40ff183..bb5daaa145 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -26,6 +26,7 @@ Add changes here for all PR submitted to the 2.x branch.
 - [[#7551](https://github.com/apache/incubator-seata/pull/7551)] XAUtils add 
support for DM Database
 - [[#7559](https://github.com/apache/incubator-seata/pull/7559)] Introduce 
Cleanup API for TableMetaRefreshHolder Instance
 - [[#7669](https://github.com/apache/incubator-seata/pull/7669)] add support 
for Jackson serialization and deserialization of PostgreSQL array types
+- [[#7664](https://github.com/apache/incubator-seata/pull/7664)] support 
shentongdatabase XA mode
 
 ### bugfix:
 
@@ -107,5 +108,6 @@ Thanks to these contributors for their code commits. Please 
report an unintended
 - [YoWuwuuuw](https://github.com/YoWuwuuuw)
 - [jihun4452](https://github.com/jihun4452)
 - [psxjoy](https://github.com/psxjoy)
+- [dsomehan](https://github.com/dsomehan)
 
 Also, we receive many valuable issues, questions and advices from our 
community. Thanks for you all.
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index e1ffe61658..9051474a3c 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -26,6 +26,7 @@
 - [[#7551](https://github.com/apache/incubator-seata/pull/7551)] XAUtils支持达梦数据库
 - [[#7559](https://github.com/apache/incubator-seata/pull/7559)] 为 
TableMetaRefreshHolder 实例引入清理 API
 - [[#7669](https://github.com/apache/incubator-seata/pull/7669)] 添加对 Jackson 
序列化和反序列化 PostgreSQL 数组类型的支持
+- [[#7664](https://github.com/apache/incubator-seata/pull/7565)] 支持神通数据库的XA模式
 
 
 ### bugfix:
@@ -109,5 +110,7 @@
 - [YoWuwuuuw](https://github.com/YoWuwuuuw)
 - [jihun4452](https://github.com/jihun4452)
 - [psxjoy](https://github.com/psxjoy)
+- [dsomehan](https://github.com/dsomehan)
+
 
 同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。
diff --git 
a/compatible/src/test/java/io/seata/rm/datasource/xa/DataSourceProxyXATest.java 
b/compatible/src/test/java/io/seata/rm/datasource/xa/DataSourceProxyXATest.java
index ee9ba9b787..3a9b84c7a7 100644
--- 
a/compatible/src/test/java/io/seata/rm/datasource/xa/DataSourceProxyXATest.java
+++ 
b/compatible/src/test/java/io/seata/rm/datasource/xa/DataSourceProxyXATest.java
@@ -17,6 +17,7 @@
 package io.seata.rm.datasource.xa;
 
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.mysql.jdbc.JDBC4MySQLConnection;
 import com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper;
 import io.seata.core.context.RootContext;
@@ -66,6 +67,7 @@ public class DataSourceProxyXATest {
 
         DruidDataSource druidDataSource = new DruidDataSource();
         druidDataSource.setDriver(driver);
+        druidDataSource.setUrl("jdbc:mysql:xxx");
         DataSourceProxyXA dataSourceProxyXA = new 
DataSourceProxyXA(druidDataSource);
         RootContext.unbind();
         Connection connFromDataSourceProxyXA = 
dataSourceProxyXA.getConnection();
@@ -79,6 +81,9 @@ public class DataSourceProxyXATest {
         Assertions.assertTrue(wrappedConnection instanceof PooledConnection);
 
         Connection wrappedPhysicalConn = ((PooledConnection) 
wrappedConnection).getConnection();
+        if (wrappedPhysicalConn instanceof DruidStatementConnection) {
+            wrappedPhysicalConn = ((DruidStatementConnection) 
wrappedPhysicalConn).getConnection();
+        }
         Assertions.assertSame(wrappedPhysicalConn, connection);
 
         XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
@@ -101,6 +106,7 @@ public class DataSourceProxyXATest {
 
         DruidDataSource druidDataSource = new DruidDataSource();
         druidDataSource.setDriver(driver);
+        druidDataSource.setUrl("jdbc:mariadb:xxx");
         DataSourceProxyXA dataSourceProxyXA = new 
DataSourceProxyXA(druidDataSource);
         RootContext.unbind();
         Connection connFromDataSourceProxyXA = 
dataSourceProxyXA.getConnection();
@@ -115,6 +121,9 @@ public class DataSourceProxyXATest {
         Assertions.assertTrue(wrappedConnection instanceof PooledConnection);
 
         Connection wrappedPhysicalConn = ((PooledConnection) 
wrappedConnection).getConnection();
+        if (wrappedPhysicalConn instanceof DruidStatementConnection) {
+            wrappedPhysicalConn = ((DruidStatementConnection) 
wrappedPhysicalConn).getConnection();
+        }
         Assertions.assertSame(wrappedPhysicalConn, connection);
 
         XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
diff --git a/dependencies/pom.xml b/dependencies/pom.xml
index 163fdb3f18..8a0d55ae71 100644
--- a/dependencies/pom.xml
+++ b/dependencies/pom.xml
@@ -114,8 +114,9 @@
         <h2.version>1.4.181</h2.version>
         <mariadb.version>2.7.2</mariadb.version>
         <kingbase.version>9.0.0</kingbase.version>
+        <oscar.version>4.1.152</oscar.version>
         <!-- db connection pool -->
-        <druid.version>1.2.20</druid.version>
+        <druid.version>1.2.25</druid.version>
         <commons-dbcp2.version>2.9.0</commons-dbcp2.version>
         <hikari.version>3.4.3</hikari.version>
         <caffeine.version>2.9.3</caffeine.version>
@@ -924,6 +925,11 @@
                 <artifactId>kingbase8</artifactId>
                 <version>${kingbase.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.shentongdata</groupId>
+                <artifactId>oscarJDBC8</artifactId>
+                <version>${oscar.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 </project>
diff --git a/distribution/LICENSE b/distribution/LICENSE
index 028da8e1d4..85ccd9f346 100644
--- a/distribution/LICENSE
+++ b/distribution/LICENSE
@@ -221,7 +221,7 @@ Apache-2.0 licenses
     com.alibaba.nacos:nacos-api 1.4.6 Apache-2.0
     com.alibaba.nacos:nacos-client 1.4.6 Apache-2.0
     com.alibaba.nacos:nacos-common 1.4.6 Apache-2.0
-    com.alibaba:druid 1.2.20 Apache-2.0
+    com.alibaba:druid 1.2.25 Apache-2.0
     com.alibaba:fastjson 1.2.83 Apache-2.0
     com.alibaba.fastjson2:fastjson2 2.0.52 Apache-2.0
     com.alipay.sofa.common:sofa-common-tools 1.0.12 Apache-2.0
diff --git a/distribution/LICENSE-server b/distribution/LICENSE-server
index 0051484384..1fbffde572 100644
--- a/distribution/LICENSE-server
+++ b/distribution/LICENSE-server
@@ -243,7 +243,7 @@ Apache-2.0 licenses
     org.apache.curator:curator-test 5.1.0 Apache-2.0
     com.lmax:disruptor 3.3.7 Apache-2.0
     com.dameng:DmJdbcDriver18 8.1.2.192 Apache-2.0
-    com.alibaba:druid 1.2.20 Apache-2.0
+    com.alibaba:druid 1.2.25 Apache-2.0
     com.google.errorprone:error_prone_annotations 2.21.1 Apache-2.0
     com.netflix.eureka:eureka-client 1.10.18 Apache-2.0
     net.jodah:failsafe 2.3.3 Apache-2.0
diff --git a/distribution/NOTICE.md b/distribution/NOTICE.md
index c4d1e2d338..d0cf3cb23c 100644
--- a/distribution/NOTICE.md
+++ b/distribution/NOTICE.md
@@ -562,7 +562,7 @@ Please copy database driver dependencies, such as 
`mysql-connector-java.jar`, to
     │   ├── curator-test-5.1.0.jar
     │   ├── dexx-collections-0.2.jar
     │   ├── disruptor-3.3.7.jar
-    │   ├── druid-1.2.20.jar
+    │   ├── druid-1.2.25.jar
     │   ├── error_prone_annotations-2.21.1.jar
     │   ├── eureka-client-1.10.18.jar
     │   ├── failsafe-2.3.3.jar
@@ -1719,7 +1719,7 @@ Please copy database driver dependencies, such as 
`mysql-connector-java.jar`, to
     │   ├── curator-test-5.1.0.jar
     │   ├── dexx-collections-0.2.jar
     │   ├── disruptor-3.3.7.jar
-    │   ├── druid-1.2.20.jar
+    │   ├── druid-1.2.25.jar
     │   ├── error_prone_annotations-2.21.1.jar
     │   ├── eureka-client-1.10.18.jar
     │   ├── failsafe-2.3.3.jar
diff --git a/rm-datasource/pom.xml b/rm-datasource/pom.xml
index 73cc086576..28da98f41e 100644
--- a/rm-datasource/pom.xml
+++ b/rm-datasource/pom.xml
@@ -154,5 +154,10 @@
             <artifactId>kingbase8</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>com.shentongdata</groupId>
+            <artifactId>oscarJDBC8</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/util/XAUtils.java 
b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/util/XAUtils.java
index 9eaac69bff..f851600625 100644
--- 
a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/util/XAUtils.java
+++ 
b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/util/XAUtils.java
@@ -70,6 +70,8 @@ public class XAUtils {
                         return PGUtils.createXAConnection(physicalConn);
                     case JdbcConstants.KINGBASE:
                         return createXAConnection(physicalConn, 
"com.kingbase8.xa.KBXAConnection", dbType);
+                    case JdbcConstants.OSCAR:
+                        return createXAConnection(physicalConn, 
"com.oscar.xa.Jdbc3XAConnection", dbType);
                     case JdbcConstants.DM:
                         return createXAConnection(physicalConn, 
"dm.jdbc.driver.DmdbXAConnection", dbType);
                     default:
@@ -118,6 +120,8 @@ public class XAUtils {
                     return 
xaConnectionClass.getConstructor(kingbaseConnectionClass);
                 case JdbcConstants.DM:
                     return xaConnectionClass.getConstructor(Connection.class);
+                case JdbcConstants.OSCAR:
+                    return xaConnectionClass.getConstructor(Connection.class);
                 default:
                     throw new SQLException("xa reflect not support dbType: " + 
dbType);
             }
@@ -143,6 +147,9 @@ public class XAUtils {
                 case JdbcConstants.KINGBASE:
                     result.add(params[0]);
                     return result;
+                case JdbcConstants.OSCAR:
+                    result.add(params[0]);
+                    return result;
                 case JdbcConstants.MARIADB:
                     Class mariaDbConnectionClass = 
Class.forName("org.mariadb.jdbc.MariaDbConnection");
                     if (mariaDbConnectionClass.isInstance(params[0])) {
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/PreparedStatementProxyTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/PreparedStatementProxyTest.java
index 1ee4f473f5..bc391dd6c1 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/PreparedStatementProxyTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/PreparedStatementProxyTest.java
@@ -21,6 +21,7 @@ import com.alibaba.druid.mock.MockNClob;
 import com.alibaba.druid.mock.MockRef;
 import com.alibaba.druid.mock.MockSQLXML;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.google.common.collect.Lists;
 import org.apache.seata.common.loader.EnhancedServiceLoader;
 import org.apache.seata.rm.datasource.mock.MockBlob;
@@ -43,6 +44,7 @@ import java.io.CharArrayReader;
 import java.math.BigDecimal;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.sql.Connection;
 import java.sql.Date;
 import java.sql.JDBCType;
 import java.sql.PreparedStatement;
@@ -123,13 +125,17 @@ public class PreparedStatementProxyTest {
         dataSource.setDriver(mockDriver);
         DataSourceProxy dataSourceProxy = 
DataSourceProxyTest.getDataSourceProxy(dataSource);
 
-        ConnectionProxy connectionProxy =
-                new ConnectionProxy(dataSourceProxy, 
dataSource.getConnection().getConnection());
+        ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
 
         String sql = "update prepared_statement_proxy set name = ?";
 
-        PreparedStatement preparedStatement = 
mockDriver.createSeataMockPreparedStatement(
-                (MockConnection) connectionProxy.getTargetConnection(), sql);
+        Connection targetConnection = connectionProxy.getTargetConnection();
+        if (targetConnection instanceof DruidStatementConnection) {
+            targetConnection = ((DruidStatementConnection) 
targetConnection).getConnection();
+        }
+
+        PreparedStatement preparedStatement =
+                mockDriver.createSeataMockPreparedStatement((MockConnection) 
targetConnection, sql);
 
         preparedStatementProxy = new PreparedStatementProxy(connectionProxy, 
preparedStatement, sql);
         unusedConstructorPreparedStatementProxy =
@@ -142,6 +148,14 @@ public class PreparedStatementProxyTest {
                 EnhancedServiceLoader.load(SQLRecognizerFactory.class, 
SqlParserType.SQL_PARSER_TYPE_DRUID);
     }
 
+    private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testPreparedStatementProxy() {
         Assertions.assertNotNull(preparedStatementProxy);
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/StatementProxyTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/StatementProxyTest.java
index 7d0421dc67..f4c965a7b4 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/StatementProxyTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/StatementProxyTest.java
@@ -19,6 +19,7 @@ package org.apache.seata.rm.datasource;
 import com.alibaba.druid.mock.MockResultSet;
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.alibaba.druid.util.jdbc.ResultSetMetaDataBase;
 import com.google.common.collect.Lists;
 import org.apache.seata.common.loader.EnhancedServiceLoader;
@@ -37,6 +38,7 @@ import org.junit.jupiter.api.MethodOrderer;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestMethodOrder;
 
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.sql.Statement;
@@ -111,10 +113,14 @@ public class StatementProxyTest {
 
         DataSourceProxy dataSourceProxy = 
DataSourceProxyTest.getDataSourceProxy(dataSource);
 
-        ConnectionProxy connectionProxy =
-                new ConnectionProxy(dataSourceProxy, 
dataSource.getConnection().getConnection());
+        ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
 
-        Statement statement = mockDriver.createMockStatement((MockConnection) 
connectionProxy.getTargetConnection());
+        Connection targetConnection = connectionProxy.getTargetConnection();
+        if (targetConnection instanceof DruidStatementConnection) {
+            targetConnection = ((DruidStatementConnection) 
targetConnection).getConnection();
+        }
+
+        Statement statement = mockDriver.createMockStatement((MockConnection) 
targetConnection);
 
         MockResultSet mockResultSet = new MockResultSet(statement);
         ((ResultSetMetaDataBase) mockResultSet.getMetaData())
@@ -131,6 +137,14 @@ public class StatementProxyTest {
                 EnhancedServiceLoader.load(SQLRecognizerFactory.class, 
SqlParserType.SQL_PARSER_TYPE_DRUID);
     }
 
+    private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @AfterEach
     public void clear() throws SQLException {
         statementProxy.clearBatch();
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/DeleteExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/DeleteExecutorTest.java
index 09a3d7e3c3..360085267d 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/DeleteExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/DeleteExecutorTest.java
@@ -19,6 +19,7 @@ package org.apache.seata.rm.datasource.exec;
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.mock.MockStatementBase;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.util.JdbcConstants;
@@ -35,6 +36,7 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Field;
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.List;
@@ -108,10 +110,8 @@ public class DeleteExecutorTest {
             Field field = 
dataSourceProxy.getClass().getDeclaredField("dbType");
             field.setAccessible(true);
             field.set(dataSourceProxy, "mysql");
-            ConnectionProxy connectionProxy = new ConnectionProxy(
-                    dataSourceProxy, 
dataSource.getConnection().getConnection());
-            MockStatementBase mockStatement =
-                    new 
MockStatement(dataSource.getConnection().getConnection());
+            ConnectionProxy connectionProxy = new 
ConnectionProxy(dataSourceProxy, getPhysicsConnection(dataSource));
+            MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
             statementProxy = new StatementProxy(connectionProxy, 
mockStatement);
         } catch (Exception e) {
             throw new RuntimeException("init failed");
@@ -127,6 +127,14 @@ public class DeleteExecutorTest {
                 recognizer);
     }
 
+    private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testBeforeAndAfterImage() throws SQLException {
         String sql = "delete from table_delete_executor_test";
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MariadbInsertExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MariadbInsertExecutorTest.java
index e4c4ccc8c3..9e311cf1ed 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MariadbInsertExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MariadbInsertExecutorTest.java
@@ -208,10 +208,9 @@ public class MariadbInsertExecutorTest extends 
MySQLInsertExecutorTest {
             Field field = 
dataSourceProxy.getClass().getDeclaredField("dbType");
             field.setAccessible(true);
             field.set(newDataSourceProxy, "mysql");
-            ConnectionProxy newConnectionProxy = new ConnectionProxy(
-                    newDataSourceProxy, 
dataSource.getConnection().getConnection());
-            MockStatementBase mockStatement =
-                    new 
MockStatement(dataSource.getConnection().getConnection());
+            ConnectionProxy newConnectionProxy =
+                    new ConnectionProxy(newDataSourceProxy, 
getPhysicsConnection(dataSource));
+            MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
             newStatementProxy = new StatementProxy(newConnectionProxy, 
mockStatement);
         } catch (Exception e) {
             throw new RuntimeException("init failed");
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MultiExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MultiExecutorTest.java
index 7522486a65..1709e39cca 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MultiExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MultiExecutorTest.java
@@ -19,6 +19,7 @@ package org.apache.seata.rm.datasource.exec;
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.mock.MockStatementBase;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.google.common.collect.Lists;
 import org.apache.seata.common.exception.NotSupportYetException;
 import org.apache.seata.rm.datasource.ConnectionProxy;
@@ -37,6 +38,7 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Field;
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.List;
@@ -117,16 +119,22 @@ public class MultiExecutorTest {
             Field field = 
dataSourceProxy.getClass().getDeclaredField("dbType");
             field.setAccessible(true);
             field.set(dataSourceProxy, "mysql");
-            connectionProxy = new ConnectionProxy(
-                    dataSourceProxy, 
dataSource.getConnection().getConnection());
-            MockStatementBase mockStatement =
-                    new 
MockStatement(dataSource.getConnection().getConnection());
+            connectionProxy = new ConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
+            MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
             statementProxy = new StatementProxy(connectionProxy, 
mockStatement);
         } catch (Exception e) {
             throw new RuntimeException("init failed");
         }
     }
 
+    private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testBeforeImageAndAfterImages() throws SQLException {
         // same table and same type
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MySQLInsertExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MySQLInsertExecutorTest.java
index 0b8d7ab6a7..a49906716a 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MySQLInsertExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/MySQLInsertExecutorTest.java
@@ -19,6 +19,7 @@ package org.apache.seata.rm.datasource.exec;
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.mock.MockStatementBase;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.google.common.collect.Lists;
@@ -51,6 +52,7 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
+import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -249,16 +251,23 @@ public class MySQLInsertExecutorTest {
             Field field = 
dataSourceProxy.getClass().getDeclaredField("dbType");
             field.setAccessible(true);
             field.set(newDataSourceProxy, "mysql");
-            ConnectionProxy newConnectionProxy = new ConnectionProxy(
-                    newDataSourceProxy, 
dataSource.getConnection().getConnection());
-            MockStatementBase mockStatement =
-                    new 
MockStatement(dataSource.getConnection().getConnection());
+            ConnectionProxy newConnectionProxy =
+                    new ConnectionProxy(newDataSourceProxy, 
getPhysicsConnection(dataSource));
+            MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
             newStatementProxy = new StatementProxy(newConnectionProxy, 
mockStatement);
         } catch (Exception e) {
             throw new RuntimeException("init failed");
         }
     }
 
+    protected Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testBeforeAndAfterImage() throws SQLException {
         System.out.println(newStatementProxy);
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/PlainExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/PlainExecutorTest.java
index 7c7be24d69..053ce71360 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/PlainExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/PlainExecutorTest.java
@@ -19,6 +19,7 @@ package org.apache.seata.rm.datasource.exec;
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.mock.MockStatementBase;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.google.common.collect.Lists;
 import org.apache.seata.rm.datasource.ConnectionProxy;
 import org.apache.seata.rm.datasource.DataSourceProxy;
@@ -28,6 +29,7 @@ import org.apache.seata.rm.datasource.mock.MockDriver;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.List;
@@ -96,15 +98,21 @@ public class PlainExecutorTest {
 
         DataSourceProxy dataSourceProxy = 
DataSourceProxyTest.getDataSourceProxy(dataSource);
 
-        ConnectionProxy connectionProxy =
-                new ConnectionProxy(dataSourceProxy, 
dataSource.getConnection().getConnection());
-        MockStatementBase mockStatement =
-                new MockStatement(dataSource.getConnection().getConnection());
+        ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
+        MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
         StatementProxy statementProxy = new StatementProxy(connectionProxy, 
mockStatement);
 
         plainExecutor = new PlainExecutor(statementProxy, (statement, args) -> 
null);
     }
 
+    private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testExecute() throws Throwable {
         plainExecutor.execute((Object) null);
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/PolarDBXInsertExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/PolarDBXInsertExecutorTest.java
index 8b188d2aef..1841d184a0 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/PolarDBXInsertExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/PolarDBXInsertExecutorTest.java
@@ -214,10 +214,9 @@ public class PolarDBXInsertExecutorTest extends 
MySQLInsertExecutorTest {
             Field field = 
dataSourceProxy.getClass().getDeclaredField("dbType");
             field.setAccessible(true);
             field.set(newDataSourceProxy, "mysql");
-            ConnectionProxy newConnectionProxy = new ConnectionProxy(
-                    newDataSourceProxy, 
dataSource.getConnection().getConnection());
-            MockStatementBase mockStatement =
-                    new 
MockStatement(dataSource.getConnection().getConnection());
+            ConnectionProxy newConnectionProxy =
+                    new ConnectionProxy(newDataSourceProxy, 
getPhysicsConnection(dataSource));
+            MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
             newStatementProxy = new StatementProxy(newConnectionProxy, 
mockStatement);
         } catch (Exception e) {
             throw new RuntimeException("init failed");
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/SelectForUpdateExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/SelectForUpdateExecutorTest.java
index c9983eb666..81c8964430 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/SelectForUpdateExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/SelectForUpdateExecutorTest.java
@@ -18,6 +18,7 @@ package org.apache.seata.rm.datasource.exec;
 
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.util.JdbcConstants;
@@ -36,6 +37,8 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Field;
+import java.sql.Connection;
+import java.sql.SQLException;
 import java.sql.Types;
 import java.util.List;
 
@@ -112,11 +115,9 @@ public class SelectForUpdateExecutorTest {
             Field field = 
dataSourceProxy.getClass().getDeclaredField("dbType");
             field.setAccessible(true);
             field.set(dataSourceProxy, "mysql");
-            connectionProxy = new MockConnectionProxy(
-                    dataSourceProxy, 
dataSource.getConnection().getConnection());
+            connectionProxy = new MockConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
             connectionProxy.bind("xid");
-            MockStatement mockStatement =
-                    new 
MockStatement(dataSource.getConnection().getConnection());
+            MockStatement mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
             statementProxy = new StatementProxy(connectionProxy, 
mockStatement);
         } catch (Exception e) {
             throw new RuntimeException("init failed");
@@ -133,6 +134,14 @@ public class SelectForUpdateExecutorTest {
                 recognizer);
     }
 
+    private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testDoExecute() throws Throwable {
         Assertions.assertThrows(RuntimeException.class, () -> 
selectForUpdateExecutor.doExecute((Object) null));
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/UpdateExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/UpdateExecutorTest.java
index e1ab7d0838..1d58b3a401 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/UpdateExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/UpdateExecutorTest.java
@@ -19,6 +19,7 @@ package org.apache.seata.rm.datasource.exec;
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.mock.MockStatementBase;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.util.JdbcConstants;
@@ -35,6 +36,7 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Field;
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.List;
@@ -158,10 +160,8 @@ public class UpdateExecutorTest {
             Field field = 
dataSourceProxy.getClass().getDeclaredField("dbType");
             field.setAccessible(true);
             field.set(dataSourceProxy, "mysql");
-            ConnectionProxy connectionProxy = new ConnectionProxy(
-                    dataSourceProxy, 
dataSource.getConnection().getConnection());
-            MockStatementBase mockStatement =
-                    new 
MockStatement(dataSource.getConnection().getConnection());
+            ConnectionProxy connectionProxy = new 
ConnectionProxy(dataSourceProxy, getPhysicsConnection(dataSource));
+            MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
             statementProxy = new StatementProxy(connectionProxy, 
mockStatement);
         } catch (Exception e) {
             throw new RuntimeException("init failed");
@@ -177,6 +177,14 @@ public class UpdateExecutorTest {
                 recognizer);
     }
 
+    private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testBeforeAndAfterImage() throws SQLException {
         Assertions.assertNotNull(updateExecutor.beforeImage());
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/UpdateJoinExecutorTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/UpdateJoinExecutorTest.java
index 49d1381dd7..4d59b36436 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/UpdateJoinExecutorTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/exec/UpdateJoinExecutorTest.java
@@ -19,6 +19,7 @@ package org.apache.seata.rm.datasource.exec;
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.mock.MockStatementBase;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.util.JdbcConstants;
@@ -35,6 +36,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Field;
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.List;
@@ -211,13 +213,19 @@ public class UpdateJoinExecutorTest {
             Field field = 
dataSourceProxy.getClass().getDeclaredField("dbType");
             field.setAccessible(true);
             field.set(dataSourceProxy, "mysql");
-            ConnectionProxy connectionProxy = new ConnectionProxy(
-                    dataSourceProxy, 
dataSource.getConnection().getConnection());
-            MockStatementBase mockStatement =
-                    new 
MockStatement(dataSource.getConnection().getConnection());
+            ConnectionProxy connectionProxy = new 
ConnectionProxy(dataSourceProxy, getPhysicsConnection(dataSource));
+            MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
             return new StatementProxy(connectionProxy, mockStatement);
         } catch (Exception e) {
             throw new RuntimeException("init failed");
         }
     }
+
+    private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
 }
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/sql/struct/TableRecordsTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/sql/struct/TableRecordsTest.java
index 9b74d27011..db1d21d6b3 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/sql/struct/TableRecordsTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/sql/struct/TableRecordsTest.java
@@ -19,6 +19,7 @@ package org.apache.seata.rm.datasource.sql.struct;
 import com.alibaba.druid.mock.MockStatement;
 import com.alibaba.druid.mock.MockStatementBase;
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.google.common.collect.Lists;
 import org.apache.seata.common.exception.ShouldNeverHappenException;
 import org.apache.seata.rm.datasource.DataSourceProxy;
@@ -31,6 +32,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
@@ -218,8 +220,7 @@ public class TableRecordsTest {
         dataSource.setUrl("jdbc:mock:xxx");
         dataSource.setDriver(mockDriver);
 
-        MockStatementBase mockStatement =
-                new MockStatement(dataSource.getConnection().getConnection());
+        MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
         DataSourceProxy proxy = 
DataSourceProxyTest.getDataSourceProxy(dataSource);
 
         TableMeta tableMeta = 
TableMetaCacheFactory.getTableMetaCache(JdbcConstants.MYSQL)
@@ -232,14 +233,21 @@ public class TableRecordsTest {
         Assertions.assertEquals(returnValue.length, 
tableRecords.pkRows().size());
     }
 
+    private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testBuildRecords() throws SQLException {
         MockDriver mockDriver = new MockDriver(returnValueColumnLabels, 
returnValue, columnMetas, indexMetas);
         DruidDataSource dataSource = new DruidDataSource();
         dataSource.setUrl("jdbc:mock:xxx");
         dataSource.setDriver(mockDriver);
-        MockStatementBase mockStatement =
-                new MockStatement(dataSource.getConnection().getConnection());
+        MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
         DataSourceProxy proxy = 
DataSourceProxyTest.getDataSourceProxy(dataSource);
 
         TableMeta tableMeta = 
TableMetaCacheFactory.getTableMetaCache(JdbcConstants.MYSQL)
@@ -258,8 +266,7 @@ public class TableRecordsTest {
         DruidDataSource dataSource = new DruidDataSource();
         dataSource.setUrl("jdbc:mock:xxx");
         dataSource.setDriver(mockDriver);
-        MockStatementBase mockStatement =
-                new MockStatement(dataSource.getConnection().getConnection());
+        MockStatementBase mockStatement = new 
MockStatement(getPhysicsConnection(dataSource));
         DataSourceProxy proxy = 
DataSourceProxyTest.getDataSourceProxy(dataSource);
 
         TableMeta tableMeta = 
TableMetaCacheFactory.getTableMetaCache(JdbcConstants.MYSQL)
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/mariadb/MariadbUndoLogManagerTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/mariadb/MariadbUndoLogManagerTest.java
index 42dfc0911f..099fc136a0 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/mariadb/MariadbUndoLogManagerTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/mariadb/MariadbUndoLogManagerTest.java
@@ -17,6 +17,7 @@
 package org.apache.seata.rm.datasource.undo.mariadb;
 
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.seata.common.loader.EnhancedServiceLoader;
@@ -50,6 +51,7 @@ import org.junit.jupiter.api.Test;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.ArrayList;
@@ -138,13 +140,20 @@ public class MariadbUndoLogManagerTest {
 
         dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
 
-        connectionProxy =
-                new ConnectionProxy(dataSourceProxy, 
dataSource.getConnection().getConnection());
+        connectionProxy = new ConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
         undoLogManager = new MariadbUndoLogManager();
         tableMeta = new TableMeta();
         tableMeta.setTableName("table_plain_executor_test");
     }
 
+    private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testDeleteUndoLogByLogCreated() throws SQLException {
         Assertions.assertEquals(
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/mysql/MySQLUndoLogManagerTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/mysql/MySQLUndoLogManagerTest.java
index 4a4578bbc3..7c6e0e100a 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/mysql/MySQLUndoLogManagerTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/mysql/MySQLUndoLogManagerTest.java
@@ -17,6 +17,7 @@
 package org.apache.seata.rm.datasource.undo.mysql;
 
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.seata.common.loader.EnhancedServiceLoader;
@@ -47,6 +48,7 @@ import org.junit.jupiter.api.Test;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.ArrayList;
@@ -135,13 +137,20 @@ public class MySQLUndoLogManagerTest {
 
         dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
 
-        connectionProxy =
-                new ConnectionProxy(dataSourceProxy, 
dataSource.getConnection().getConnection());
+        connectionProxy = new ConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
         undoLogManager = new MySQLUndoLogManager();
         tableMeta = new TableMeta();
         tableMeta.setTableName("table_plain_executor_test");
     }
 
+    private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testDeleteUndoLogByLogCreated() throws SQLException {
         Assertions.assertEquals(
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/polardbx/PolarDBXUndoLogManagerTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/polardbx/PolarDBXUndoLogManagerTest.java
index 2b0bcd5c12..732ede75bd 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/polardbx/PolarDBXUndoLogManagerTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/polardbx/PolarDBXUndoLogManagerTest.java
@@ -17,6 +17,7 @@
 package org.apache.seata.rm.datasource.undo.polardbx;
 
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.seata.common.loader.EnhancedServiceLoader;
@@ -46,6 +47,7 @@ import org.junit.jupiter.api.Test;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.ArrayList;
@@ -135,13 +137,20 @@ public class PolarDBXUndoLogManagerTest {
         dataSource.setDriver(mockDriver);
 
         dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
-        connectionProxy =
-                new ConnectionProxy(dataSourceProxy, 
dataSource.getConnection().getConnection());
+        connectionProxy = new ConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
         undoLogManager = new PolarDBXUndoLogManager();
         tableMeta = new TableMeta();
         tableMeta.setTableName("table_plain_executor_test");
     }
 
+    private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
+        Connection connection = dataSource.getConnection().getConnection();
+        if (connection instanceof DruidStatementConnection) {
+            return ((DruidStatementConnection) connection).getConnection();
+        }
+        return connection;
+    }
+
     @Test
     public void testDeleteUndoLogByLogCreated() throws SQLException {
         Assertions.assertEquals(
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
index 963aa5d601..8bf3e489c0 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
@@ -112,4 +112,9 @@ public class XAUtilsTest {
     public void testCreateXAConnectionDM() throws SQLException, 
ClassNotFoundException {
         testCreateXAConnectionForDbType(DM, "dm.jdbc.driver.DmdbConnection", 
"dm.jdbc.driver.DmdbXAConnection");
     }
+
+    @Test
+    public void testCreateXAConnectionOscar() throws SQLException, 
ClassNotFoundException {
+        testCreateXAConnectionForDbType(OSCAR, 
"com.oscar.jdbc.OscarJdbc2Connection", "com.oscar.xa.Jdbc3XAConnection");
+    }
 }
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/xa/DataSourceProxyXATest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/xa/DataSourceProxyXATest.java
index 457472d615..bb9a740c93 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/xa/DataSourceProxyXATest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/xa/DataSourceProxyXATest.java
@@ -17,9 +17,12 @@
 package org.apache.seata.rm.datasource.xa;
 
 import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidStatementConnection;
 import com.kingbase8.xa.KBXAConnection;
 import com.mysql.jdbc.JDBC4MySQLConnection;
 import com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper;
+import com.mysql.jdbc.jdbc2.optional.MysqlXAConnection;
+import com.oscar.xa.Jdbc3XAConnection;
 import org.apache.seata.core.context.RootContext;
 import org.apache.seata.rm.datasource.combine.CombineConnectionHolder;
 import org.apache.seata.rm.datasource.mock.MockDataSource;
@@ -28,6 +31,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledIfSystemProperty;
+import org.mariadb.jdbc.MariaXaConnection;
 import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 
@@ -67,34 +71,9 @@ public class DataSourceProxyXATest {
     }
 
     @Test
-    public void testGetConnection() throws SQLException {
-        // Mock
-        Driver driver = mock(Driver.class);
-        JDBC4MySQLConnection connection = mock(JDBC4MySQLConnection.class);
-        Mockito.when(connection.getAutoCommit()).thenReturn(true);
-        DatabaseMetaData metaData = mock(DatabaseMetaData.class);
-        Mockito.when(metaData.getURL()).thenReturn("jdbc:mysql:xxx");
-        Mockito.when(connection.getMetaData()).thenReturn(metaData);
-        Mockito.when(driver.connect(any(), any())).thenReturn(connection);
-
-        DruidDataSource druidDataSource = new DruidDataSource();
-        druidDataSource.setDriver(driver);
-        DataSourceProxyXA dataSourceProxyXA = new 
DataSourceProxyXA(druidDataSource);
-        Connection connFromDataSourceProxyXA = 
dataSourceProxyXA.getConnection();
-        Assertions.assertFalse(connFromDataSourceProxyXA instanceof 
ConnectionProxyXA);
-        RootContext.bind("test");
-        connFromDataSourceProxyXA = dataSourceProxyXA.getConnection();
-
-        Assertions.assertTrue(connFromDataSourceProxyXA instanceof 
ConnectionProxyXA);
-        ConnectionProxyXA connectionProxyXA = (ConnectionProxyXA) 
dataSourceProxyXA.getConnection();
-
-        Connection wrappedConnection = 
connectionProxyXA.getWrappedConnection();
-        Assertions.assertTrue(wrappedConnection instanceof PooledConnection);
-
-        Connection wrappedPhysicalConn = ((PooledConnection) 
wrappedConnection).getConnection();
-        Assertions.assertSame(wrappedPhysicalConn, connection);
-
-        XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
+    public void testGetConnection() throws SQLException, 
ClassNotFoundException {
+        XAConnection xaConnection =
+                testGetXaConnection(MysqlXAConnection.class, "jdbc:mysql:xxx", 
JDBC4MySQLConnection.class.getName());
         Connection connectionInXA = xaConnection.getConnection();
         Assertions.assertTrue(connectionInXA instanceof 
JDBC4ConnectionWrapper);
         tearDown();
@@ -102,34 +81,8 @@ public class DataSourceProxyXATest {
 
     @Test
     public void testGetMariaXaConnection() throws SQLException, 
ClassNotFoundException {
-        // Mock
-        Driver driver = mock(Driver.class);
-        Class clazz = Class.forName("org.mariadb.jdbc.MariaDbConnection");
-        Connection connection = (Connection) (mock(clazz));
-        Mockito.when(connection.getAutoCommit()).thenReturn(true);
-        DatabaseMetaData metaData = mock(DatabaseMetaData.class);
-        Mockito.when(metaData.getURL()).thenReturn("jdbc:mariadb:xxx");
-        Mockito.when(connection.getMetaData()).thenReturn(metaData);
-        Mockito.when(driver.connect(any(), any())).thenReturn(connection);
-
-        DruidDataSource druidDataSource = new DruidDataSource();
-        druidDataSource.setDriver(driver);
-        DataSourceProxyXA dataSourceProxyXA = new 
DataSourceProxyXA(druidDataSource);
-        Connection connFromDataSourceProxyXA = 
dataSourceProxyXA.getConnection();
-        Assertions.assertFalse(connFromDataSourceProxyXA instanceof 
ConnectionProxyXA);
-        RootContext.bind("test");
-        connFromDataSourceProxyXA = dataSourceProxyXA.getConnection();
-
-        Assertions.assertTrue(connFromDataSourceProxyXA instanceof 
ConnectionProxyXA);
-        ConnectionProxyXA connectionProxyXA = (ConnectionProxyXA) 
dataSourceProxyXA.getConnection();
-
-        Connection wrappedConnection = 
connectionProxyXA.getWrappedConnection();
-        Assertions.assertTrue(wrappedConnection instanceof PooledConnection);
-
-        Connection wrappedPhysicalConn = ((PooledConnection) 
wrappedConnection).getConnection();
-        Assertions.assertSame(wrappedPhysicalConn, connection);
-
-        XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
+        XAConnection xaConnection =
+                testGetXaConnection(MariaXaConnection.class, 
"jdbc:mariadb:xxx", "org.mariadb.jdbc.MariaDbConnection");
         Connection connectionInXA = xaConnection.getConnection();
         Assertions.assertEquals(
                 "org.mariadb.jdbc.MariaDbConnection", 
connectionInXA.getClass().getName());
@@ -142,18 +95,36 @@ public class DataSourceProxyXATest {
             matches = "[0-1].[1-2].[0-7]",
             disabledReason = "druid 1.2.8 correct support kingbase")
     public void testGetKingbaseXaConnection() throws SQLException, 
ClassNotFoundException {
+        testGetXaConnection(KBXAConnection.class, "jdbc:kingbase8:xxx", 
"com.kingbase8.jdbc.KbConnection");
+        tearDown();
+    }
+
+    @Test
+    @DisabledIfSystemProperty(
+            named = "druid.version",
+            matches = "[0-1].[1-2].[0-24]",
+            disabledReason = "druid 1.2.24 correct support oscar")
+    public void testGetOscarXaConnection() throws SQLException, 
ClassNotFoundException {
+        testGetXaConnection(Jdbc3XAConnection.class, "jdbc:oscar:xxx", 
"com.oscar.jdbc.OscarJdbc2Connection");
+        tearDown();
+    }
+
+    private XAConnection testGetXaConnection(
+            Class<? extends XAConnection> xaConnectionClass, String 
mockJdbcUrl, String connectionClassName)
+            throws SQLException, ClassNotFoundException {
         // Mock
         Driver driver = mock(Driver.class);
-        Class clazz = Class.forName("com.kingbase8.jdbc.KbConnection");
+        Class clazz = Class.forName(connectionClassName);
         Connection connection = (Connection) (mock(clazz));
         Mockito.when(connection.getAutoCommit()).thenReturn(true);
         DatabaseMetaData metaData = mock(DatabaseMetaData.class);
-        Mockito.when(metaData.getURL()).thenReturn("jdbc:kingbase8:xxx");
+        Mockito.when(metaData.getURL()).thenReturn(mockJdbcUrl);
         Mockito.when(connection.getMetaData()).thenReturn(metaData);
         Mockito.when(driver.connect(any(), any())).thenReturn(connection);
 
         DruidDataSource druidDataSource = new DruidDataSource();
         druidDataSource.setDriver(driver);
+        druidDataSource.setUrl(mockJdbcUrl);
         DataSourceProxyXA dataSourceProxyXA = new 
DataSourceProxyXA(druidDataSource);
         Connection connFromDataSourceProxyXA = 
dataSourceProxyXA.getConnection();
         Assertions.assertFalse(connFromDataSourceProxyXA instanceof 
ConnectionProxyXA);
@@ -167,11 +138,14 @@ public class DataSourceProxyXATest {
         Assertions.assertTrue(wrappedConnection instanceof PooledConnection);
 
         Connection wrappedPhysicalConn = ((PooledConnection) 
wrappedConnection).getConnection();
+        if (wrappedPhysicalConn instanceof DruidStatementConnection) {
+            wrappedPhysicalConn = ((DruidStatementConnection) 
wrappedPhysicalConn).getConnection();
+        }
         Assertions.assertSame(wrappedPhysicalConn, connection);
 
         XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
-        Assertions.assertEquals(xaConnection.getClass(), KBXAConnection.class);
-        tearDown();
+        Assertions.assertEquals(xaConnection.getClass(), xaConnectionClass);
+        return xaConnection;
     }
 
     @Test
@@ -196,6 +170,7 @@ public class DataSourceProxyXATest {
 
             DruidDataSource realDataSource = new DruidDataSource();
             realDataSource.setDriver(driver);
+            realDataSource.setUrl("jdbc:mysql:xxx");
             DataSourceProxyXA proxyDataSource = new 
DataSourceProxyXA(realDataSource);
 
             Connection result = proxyDataSource.getConnection();
diff --git 
a/sqlparser/seata-sqlparser-druid/src/main/java/org/apache/seata/sqlparser/druid/oscar/OscarOperateRecognizerHolder.java
 
b/sqlparser/seata-sqlparser-druid/src/main/java/org/apache/seata/sqlparser/druid/oscar/OscarOperateRecognizerHolder.java
index 4cffed0377..8403aa038e 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/main/java/org/apache/seata/sqlparser/druid/oscar/OscarOperateRecognizerHolder.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/main/java/org/apache/seata/sqlparser/druid/oscar/OscarOperateRecognizerHolder.java
@@ -18,6 +18,7 @@ package org.apache.seata.sqlparser.druid.oscar;
 
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
+import com.alibaba.druid.sql.dialect.oscar.ast.stmt.OscarSelectQueryBlock;
 import org.apache.seata.common.loader.LoadLevel;
 import org.apache.seata.sqlparser.SQLRecognizer;
 import org.apache.seata.sqlparser.druid.SQLOperateRecognizerHolder;
@@ -47,8 +48,19 @@ public class OscarOperateRecognizerHolder implements 
SQLOperateRecognizerHolder
 
     @Override
     public SQLRecognizer getSelectForUpdateRecognizer(String sql, SQLStatement 
ast) {
-        if (((SQLSelectStatement) 
ast).getSelect().getFirstQueryBlock().isForUpdate()) {
-            return new OscarSelectForUpdateRecognizer(sql, ast);
+        if ((ast instanceof SQLSelectStatement)) {
+            SQLSelectStatement selectStatement = (SQLSelectStatement) ast;
+            if (selectStatement.getSelect() != null) {
+                if (selectStatement.getSelect().getFirstQueryBlock() != null) {
+                    OscarSelectQueryBlock queryBlock =
+                            (OscarSelectQueryBlock) 
selectStatement.getSelect().getFirstQueryBlock();
+                    if (queryBlock.getForClause() != null) {
+                        if (queryBlock.getForClause().getOption() == 
OscarSelectQueryBlock.ForClause.Option.UPDATE) {
+                            return new OscarSelectForUpdateRecognizer(sql, 
ast);
+                        }
+                    }
+                }
+            }
         }
         return null;
     }
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/dm/DmInsertRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/dm/DmInsertRecognizerTest.java
index 1ae9e55623..8d1332a459 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/dm/DmInsertRecognizerTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/dm/DmInsertRecognizerTest.java
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
 import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr;
+import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
 import org.apache.seata.sqlparser.SQLParsingException;
 import org.apache.seata.sqlparser.SQLType;
 import org.apache.seata.sqlparser.struct.NotPlaceholderExpr;
@@ -107,7 +108,7 @@ public class DmInsertRecognizerTest {
             String s = "insert into t(a) values (?)";
             List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
             SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
sqlStatements.get(0);
-            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleBinaryDoubleExpr());
+            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleIntervalExpr());
 
             DmInsertRecognizer dmInsertRecognizer = new DmInsertRecognizer(s, 
sqlInsertStatement);
             
dmInsertRecognizer.getInsertRows(Collections.singletonList(pkIndex));
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/kingbase/KingbaseInsertRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/kingbase/KingbaseInsertRecognizerTest.java
index 34716d3f2c..c5fb87c90c 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/kingbase/KingbaseInsertRecognizerTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/kingbase/KingbaseInsertRecognizerTest.java
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
 import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr;
+import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
 import org.apache.seata.sqlparser.SQLParsingException;
 import org.apache.seata.sqlparser.SQLType;
 import org.apache.seata.sqlparser.struct.NotPlaceholderExpr;
@@ -107,7 +108,7 @@ public class KingbaseInsertRecognizerTest {
             String s = "insert into t(a) values (?)";
             List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
             SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
sqlStatements.get(0);
-            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleBinaryDoubleExpr());
+            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleIntervalExpr());
 
             KingbaseInsertRecognizer kingbaseInsertRecognizer = new 
KingbaseInsertRecognizer(s, sqlInsertStatement);
             
kingbaseInsertRecognizer.getInsertRows(Collections.singletonList(pkIndex));
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oceanbase/OceanBaseInsertRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oceanbase/OceanBaseInsertRecognizerTest.java
index 4a53f291ae..8e43b94215 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oceanbase/OceanBaseInsertRecognizerTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oceanbase/OceanBaseInsertRecognizerTest.java
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
 import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr;
+import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
 import org.apache.seata.sqlparser.SQLParsingException;
 import org.apache.seata.sqlparser.SQLType;
 import org.apache.seata.sqlparser.struct.NotPlaceholderExpr;
@@ -107,7 +108,7 @@ public class OceanBaseInsertRecognizerTest {
             String s = "insert into t(a) values (?)";
             List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
             SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
sqlStatements.get(0);
-            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleBinaryDoubleExpr());
+            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleIntervalExpr());
 
             OceanBaseInsertRecognizer OceanBaseInsertRecognizer = new 
OceanBaseInsertRecognizer(s, sqlInsertStatement);
             
OceanBaseInsertRecognizer.getInsertRows(Collections.singletonList(pkIndex));
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oracle/OracleInsertRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oracle/OracleInsertRecognizerTest.java
index 46e4ed33fe..174757fe9c 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oracle/OracleInsertRecognizerTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oracle/OracleInsertRecognizerTest.java
@@ -19,7 +19,7 @@ package org.apache.seata.sqlparser.druid.oracle;
 import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
-import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr;
+import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
 import org.apache.seata.sqlparser.SQLParsingException;
 import org.apache.seata.sqlparser.SQLType;
 import org.apache.seata.sqlparser.struct.NotPlaceholderExpr;
@@ -84,7 +84,7 @@ public class OracleInsertRecognizerTest {
             String s = "insert into t(a) values (?)";
             List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
             SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
sqlStatements.get(0);
-            sqlInsertStatement.getColumns().add(new OracleBinaryDoubleExpr());
+            sqlInsertStatement.getColumns().add(new OracleIntervalExpr());
 
             OracleInsertRecognizer oracleInsertRecognizer = new 
OracleInsertRecognizer(s, sqlInsertStatement);
             oracleInsertRecognizer.getInsertColumns();
@@ -107,7 +107,7 @@ public class OracleInsertRecognizerTest {
             String s = "insert into t(a) values (?)";
             List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
             SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
sqlStatements.get(0);
-            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleBinaryDoubleExpr());
+            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleIntervalExpr());
 
             OracleInsertRecognizer oracleInsertRecognizer = new 
OracleInsertRecognizer(s, sqlInsertStatement);
             
oracleInsertRecognizer.getInsertRows(Collections.singletonList(pkIndex));
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/AbstractOscarRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/AbstractOscarRecognizerTest.java
new file mode 100644
index 0000000000..5bdff58bd9
--- /dev/null
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/AbstractOscarRecognizerTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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.seata.sqlparser.druid.oscar;
+
+import org.apache.seata.sqlparser.druid.AbstractRecognizerTest;
+import org.apache.seata.sqlparser.util.JdbcConstants;
+
+/**
+ * Base Test for recognizer of Oscar
+ *
+ **/
+public class AbstractOscarRecognizerTest extends AbstractRecognizerTest {
+    @Override
+    public String getDbType() {
+        return JdbcConstants.OSCAR;
+    }
+}
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarDeleteRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarDeleteRecognizerTest.java
index 18d910c7b9..4cd1ea7609 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarDeleteRecognizerTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarDeleteRecognizerTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.seata.sqlparser.druid.oscar;
 
-import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
 import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr;
@@ -27,65 +26,55 @@ import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
  * The type Oscar delete recognizer test.
  */
-public class OscarDeleteRecognizerTest {
-
-    private static final String DB_TYPE = "oscar";
+public class OscarDeleteRecognizerTest extends AbstractOscarRecognizerTest {
 
     @Test
     public void testGetSqlType() {
         String sql = "delete from t where id = ?";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
asts.get(0));
+        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
sqlStatement);
         Assertions.assertEquals(recognizer.getSQLType(), SQLType.DELETE);
     }
 
     @Test
     public void testGetTableAlias() {
         String sql = "delete from t where id = ?";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
asts.get(0));
+        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
sqlStatement);
         Assertions.assertNull(recognizer.getTableAlias());
     }
 
     @Test
     public void testGetTableName() {
         String sql = "delete from t where id = ?";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
asts.get(0));
+        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
sqlStatement);
         Assertions.assertEquals(recognizer.getTableName(), "t");
     }
 
     @Test
     public void testGetWhereCondition_0() {
         String sql = "delete from t";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
asts.get(0));
-        String whereCondition = recognizer.getWhereCondition(
-                new ParametersHolder() {
-                    @Override
-                    public Map<Integer, ArrayList<Object>> getParameters() {
-                        return null;
-                    }
-                },
-                new ArrayList<>());
+        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
sqlStatement);
+        String whereCondition = recognizer.getWhereCondition(() -> null, new 
ArrayList<>());
 
         // test for no condition
         Assertions.assertEquals("", whereCondition);
 
         sql = "delete from t where id = ?";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        sqlStatement = getSQLStatement(sql);
 
-        recognizer = new OscarDeleteRecognizer(sql, asts.get(0));
+        recognizer = new OscarDeleteRecognizer(sql, sqlStatement);
         whereCondition = recognizer.getWhereCondition(
                 new ParametersHolder() {
                     @Override
@@ -103,8 +92,8 @@ public class OscarDeleteRecognizerTest {
         Assertions.assertEquals("id = ?", whereCondition);
 
         sql = "delete from t where id in (?)";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
-        recognizer = new OscarDeleteRecognizer(sql, asts.get(0));
+        sqlStatement = getSQLStatement(sql);
+        recognizer = new OscarDeleteRecognizer(sql, sqlStatement);
         whereCondition = recognizer.getWhereCondition(
                 new ParametersHolder() {
                     @Override
@@ -122,8 +111,8 @@ public class OscarDeleteRecognizerTest {
         Assertions.assertEquals("id IN (?)", whereCondition);
 
         sql = "delete from t where id between ? and ?";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
-        recognizer = new OscarDeleteRecognizer(sql, asts.get(0));
+        sqlStatement = getSQLStatement(sql);
+        recognizer = new OscarDeleteRecognizer(sql, sqlStatement);
         whereCondition = recognizer.getWhereCondition(
                 new ParametersHolder() {
                     @Override
@@ -145,18 +134,9 @@ public class OscarDeleteRecognizerTest {
         // test for exception
         Assertions.assertThrows(IllegalArgumentException.class, () -> {
             String s = "delete from t where id in (?)";
-            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
-            SQLDeleteStatement deleteAst = (SQLDeleteStatement) 
sqlStatements.get(0);
+            SQLDeleteStatement deleteAst = (SQLDeleteStatement) 
getSQLStatement(s);
             deleteAst.setWhere(new OracleArgumentExpr());
-            new OscarDeleteRecognizer(s, deleteAst)
-                    .getWhereCondition(
-                            new ParametersHolder() {
-                                @Override
-                                public Map<Integer, ArrayList<Object>> 
getParameters() {
-                                    return new HashMap<>();
-                                }
-                            },
-                            new ArrayList<>());
+            new OscarDeleteRecognizer(s, deleteAst).getWhereCondition(() -> 
new HashMap<>(), new ArrayList<>());
         });
     }
 
@@ -164,34 +144,34 @@ public class OscarDeleteRecognizerTest {
     public void testGetWhereCondition_1() {
 
         String sql = "delete from t";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
asts.get(0));
+        OscarDeleteRecognizer recognizer = new OscarDeleteRecognizer(sql, 
sqlStatement);
         String whereCondition = recognizer.getWhereCondition();
 
         // test for no condition
         Assertions.assertEquals("", whereCondition);
 
         sql = "delete from t where id = 1";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        sqlStatement = getSQLStatement(sql);
 
-        recognizer = new OscarDeleteRecognizer(sql, asts.get(0));
+        recognizer = new OscarDeleteRecognizer(sql, sqlStatement);
         whereCondition = recognizer.getWhereCondition();
 
         // test for normal sql
         Assertions.assertEquals("id = 1", whereCondition);
 
         sql = "delete from t where id in (1)";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
-        recognizer = new OscarDeleteRecognizer(sql, asts.get(0));
+        sqlStatement = getSQLStatement(sql);
+        recognizer = new OscarDeleteRecognizer(sql, sqlStatement);
         whereCondition = recognizer.getWhereCondition();
 
         // test for sql with in
         Assertions.assertEquals("id IN (1)", whereCondition);
 
         sql = "delete from t where id between 1 and 2";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
-        recognizer = new OscarDeleteRecognizer(sql, asts.get(0));
+        sqlStatement = getSQLStatement(sql);
+        recognizer = new OscarDeleteRecognizer(sql, sqlStatement);
         whereCondition = recognizer.getWhereCondition();
         // test for sql with in
         Assertions.assertEquals("id BETWEEN 1 AND 2", whereCondition);
@@ -199,8 +179,7 @@ public class OscarDeleteRecognizerTest {
         // test for exception
         Assertions.assertThrows(IllegalArgumentException.class, () -> {
             String s = "delete from t where id in (1)";
-            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
-            SQLDeleteStatement deleteAst = (SQLDeleteStatement) 
sqlStatements.get(0);
+            SQLDeleteStatement deleteAst = (SQLDeleteStatement) 
getSQLStatement(s);
             deleteAst.setWhere(new OracleArgumentExpr());
             new OscarDeleteRecognizer(s, deleteAst).getWhereCondition();
         });
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarInsertRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarInsertRecognizerTest.java
index ab3c3a2e8b..63bc0003b5 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarInsertRecognizerTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarInsertRecognizerTest.java
@@ -16,10 +16,10 @@
  */
 package org.apache.seata.sqlparser.druid.oscar;
 
-import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
 import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr;
+import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
 import org.apache.seata.sqlparser.SQLParsingException;
 import org.apache.seata.sqlparser.SQLType;
 import org.apache.seata.sqlparser.struct.NotPlaceholderExpr;
@@ -32,34 +32,32 @@ import java.util.List;
 /**
  * The type Oscar insert recognizer test.
  */
-public class OscarInsertRecognizerTest {
-
-    private static final String DB_TYPE = "oscar";
+public class OscarInsertRecognizerTest extends AbstractOscarRecognizerTest {
 
     @Test
     public void testGetSqlType() {
         String sql = "insert into t(id) values (?)";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
asts.get(0));
+        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
sqlStatement);
         Assertions.assertEquals(recognizer.getSQLType(), SQLType.INSERT);
     }
 
     @Test
     public void testGetTableAlias() {
         String sql = "insert into t(id) values (?)";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
asts.get(0));
+        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
sqlStatement);
         Assertions.assertNull(recognizer.getTableAlias());
     }
 
     @Test
     public void testGetTableName() {
         String sql = "insert into t(id) values (?)";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
asts.get(0));
+        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
sqlStatement);
         Assertions.assertEquals(recognizer.getTableName(), "t");
     }
 
@@ -68,25 +66,24 @@ public class OscarInsertRecognizerTest {
 
         // test for no column
         String sql = "insert into t values (?)";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
asts.get(0));
+        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
sqlStatement);
         List<String> insertColumns = recognizer.getInsertColumns();
         Assertions.assertNull(insertColumns);
 
         // test for normal
         sql = "insert into t(a) values (?)";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        sqlStatement = getSQLStatement(sql);
 
-        recognizer = new OscarInsertRecognizer(sql, asts.get(0));
+        recognizer = new OscarInsertRecognizer(sql, sqlStatement);
         insertColumns = recognizer.getInsertColumns();
         Assertions.assertEquals(1, insertColumns.size());
 
         // test for exception
         Assertions.assertThrows(SQLParsingException.class, () -> {
             String s = "insert into t(a) values (?)";
-            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
-            SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
sqlStatements.get(0);
+            SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
getSQLStatement(s);
             sqlInsertStatement.getColumns().add(new OracleBinaryDoubleExpr());
 
             OscarInsertRecognizer oscarInsertRecognizer = new 
OscarInsertRecognizer(s, sqlInsertStatement);
@@ -99,18 +96,17 @@ public class OscarInsertRecognizerTest {
         final int pkIndex = 0;
         // test for null value
         String sql = "insert into t(id, no, name, age, time) values 
(id_seq.nextval, null, 'a', ?, now())";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
asts.get(0));
+        OscarInsertRecognizer recognizer = new OscarInsertRecognizer(sql, 
sqlStatement);
         List<List<Object>> insertRows = 
recognizer.getInsertRows(Collections.singletonList(pkIndex));
         Assertions.assertEquals(1, insertRows.size());
 
         // test for exception
         Assertions.assertThrows(SQLParsingException.class, () -> {
             String s = "insert into t(a) values (?)";
-            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
-            SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
sqlStatements.get(0);
-            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleBinaryDoubleExpr());
+            SQLInsertStatement sqlInsertStatement = (SQLInsertStatement) 
getSQLStatement(s);
+            sqlInsertStatement.getValuesList().get(0).getValues().set(pkIndex, 
new OracleIntervalExpr());
 
             OscarInsertRecognizer oscarInsertRecognizer = new 
OscarInsertRecognizer(s, sqlInsertStatement);
             
oscarInsertRecognizer.getInsertRows(Collections.singletonList(pkIndex));
@@ -120,9 +116,9 @@ public class OscarInsertRecognizerTest {
     @Test
     public void testNotPlaceholder_giveValidPkIndex() {
         String sql = "insert into test(create_time) values(sysdate)";
-        List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql, 
DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarInsertRecognizer oscar = new OscarInsertRecognizer(sql, 
sqlStatements.get(0));
+        OscarInsertRecognizer oscar = new OscarInsertRecognizer(sql, 
sqlStatement);
         List<List<Object>> insertRows = 
oscar.getInsertRows(Collections.singletonList(-1));
         Assertions.assertTrue(insertRows.get(0).get(0) instanceof 
NotPlaceholderExpr);
     }
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarOperateRecognizerHolderTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarOperateRecognizerHolderTest.java
new file mode 100644
index 0000000000..608f121477
--- /dev/null
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarOperateRecognizerHolderTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.seata.sqlparser.druid.oscar;
+
+import com.alibaba.druid.sql.SQLUtils;
+import com.alibaba.druid.sql.ast.SQLStatement;
+import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
+import com.alibaba.druid.sql.dialect.oscar.ast.stmt.OscarSelectQueryBlock;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+/**
+ * Test cases for recognizer holder of Oscar
+ *
+ */
+public class OscarOperateRecognizerHolderTest extends 
AbstractOscarRecognizerTest {
+    @Test
+    public void getDeleteRecognizerTest() {
+        String sql = "DELETE FROM t WHERE id = 1";
+        List<SQLStatement> stats = SQLUtils.parseStatements(sql, getDbType());
+        SQLStatement sqlStatement = stats.get(0);
+        Assertions.assertNotNull(new 
OscarOperateRecognizerHolder().getDeleteRecognizer(sql, sqlStatement));
+    }
+
+    @Test
+    public void getInsertRecognizerTest() {
+        String sql = "INSERT INTO t (name) VALUES ('test')";
+        SQLStatement sqlStatement = getSQLStatement(sql);
+        Assertions.assertNotNull(new 
OscarOperateRecognizerHolder().getInsertRecognizer(sql, sqlStatement));
+    }
+
+    @Test
+    public void getUpdateRecognizerTest() {
+        String sql = "UPDATE t SET name = 'test' WHERE id = 1";
+        SQLStatement sqlStatement = getSQLStatement(sql);
+        Assertions.assertNotNull(new 
OscarOperateRecognizerHolder().getUpdateRecognizer(sql, sqlStatement));
+    }
+
+    @Test
+    public void getSelectForUpdateTest() {
+        // not select clause
+        String sql = "DELETE FROM t WHERE id = 1";
+        SQLStatement sqlStatement = getSQLStatement(sql);
+        Assertions.assertNull(new 
OscarOperateRecognizerHolder().getSelectForUpdateRecognizer(sql, sqlStatement));
+
+        // common select without lock
+        sql = "SELECT name FROM t1 WHERE id = 1";
+        sqlStatement = getSQLStatement(sql);
+        Assertions.assertNull(new 
OscarOperateRecognizerHolder().getSelectForUpdateRecognizer(sql, sqlStatement));
+
+        // set select is null
+        SQLSelectStatement selectStatement = (SQLSelectStatement) 
getSQLStatement(sql);
+        selectStatement.setSelect(null);
+        Assertions.assertNull(new 
OscarOperateRecognizerHolder().getSelectForUpdateRecognizer(sql, sqlStatement));
+
+        // set select query is null
+        selectStatement = (SQLSelectStatement) getSQLStatement(sql);
+        selectStatement.getSelect().setQuery(null);
+        Assertions.assertNull(new 
OscarOperateRecognizerHolder().getSelectForUpdateRecognizer(sql, sqlStatement));
+
+        // select for update
+        sql += " FOR UPDATE";
+        selectStatement = (SQLSelectStatement) getSQLStatement(sql);
+        Assertions.assertNotNull(new 
OscarOperateRecognizerHolder().getSelectForUpdateRecognizer(sql, 
selectStatement));
+
+        // set getForClause is null
+        OscarSelectQueryBlock queryBlock =
+                (OscarSelectQueryBlock) 
selectStatement.getSelect().getFirstQueryBlock();
+        queryBlock.setForClause(null);
+        Assertions.assertNull(new 
OscarOperateRecognizerHolder().getSelectForUpdateRecognizer(sql, 
selectStatement));
+    }
+}
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarSelectForUpdateRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarSelectForUpdateRecognizerTest.java
index 85db7ff98c..7e53e58ce5 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarSelectForUpdateRecognizerTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarSelectForUpdateRecognizerTest.java
@@ -16,58 +16,45 @@
  */
 package org.apache.seata.sqlparser.druid.oscar;
 
-import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
 import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
-import org.apache.seata.sqlparser.ParametersHolder;
 import org.apache.seata.sqlparser.SQLParsingException;
 import org.apache.seata.sqlparser.SQLType;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
 
 /**
  * The type Oscar select for update recognizer test.
  */
-public class OscarSelectForUpdateRecognizerTest {
-
-    private static final String DB_TYPE = "oscar";
+public class OscarSelectForUpdateRecognizerTest extends 
AbstractOscarRecognizerTest {
 
     @Test
     public void testGetSqlType() {
         String sql = "select * from t where id = ? for update";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, asts.get(0));
+        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, sqlStatement);
         Assertions.assertEquals(recognizer.getSQLType(), 
SQLType.SELECT_FOR_UPDATE);
     }
 
     @Test
     public void testGetWhereCondition_0() {
         String sql = "select * from t for update";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
-
-        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, asts.get(0));
-        String whereCondition = recognizer.getWhereCondition(
-                new ParametersHolder() {
-                    @Override
-                    public Map<Integer, ArrayList<Object>> getParameters() {
-                        return null;
-                    }
-                },
-                new ArrayList<>());
+        SQLStatement sqlStatement = getSQLStatement(sql);
+
+        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, sqlStatement);
+        String whereCondition = recognizer.getWhereCondition(() -> null, new 
ArrayList<>());
         Assertions.assertEquals("", whereCondition);
     }
 
     @Test
     public void testGetWhereCondition_1() {
         String sql = "select * from t for update";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, asts.get(0));
+        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, sqlStatement);
         String whereCondition = recognizer.getWhereCondition();
 
         Assertions.assertEquals("", whereCondition);
@@ -75,8 +62,7 @@ public class OscarSelectForUpdateRecognizerTest {
         // test for select was null
         Assertions.assertThrows(SQLParsingException.class, () -> {
             String s = "select * from t for update";
-            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
-            SQLSelectStatement selectAst = (SQLSelectStatement) 
sqlStatements.get(0);
+            SQLSelectStatement selectAst = (SQLSelectStatement) 
getSQLStatement(s);
             selectAst.setSelect(null);
             new OscarSelectForUpdateRecognizer(s, 
selectAst).getWhereCondition();
         });
@@ -84,8 +70,7 @@ public class OscarSelectForUpdateRecognizerTest {
         // test for query was null
         Assertions.assertThrows(SQLParsingException.class, () -> {
             String s = "select * from t";
-            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(s, 
DB_TYPE);
-            SQLSelectStatement selectAst = (SQLSelectStatement) 
sqlStatements.get(0);
+            SQLSelectStatement selectAst = (SQLSelectStatement) 
getSQLStatement(s);
             selectAst.getSelect().setQuery(null);
             new OscarSelectForUpdateRecognizer(s, 
selectAst).getWhereCondition();
         });
@@ -94,18 +79,18 @@ public class OscarSelectForUpdateRecognizerTest {
     @Test
     public void testGetTableAlias() {
         String sql = "select * from t where id = ? for update";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, asts.get(0));
+        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, sqlStatement);
         Assertions.assertNull(recognizer.getTableAlias());
     }
 
     @Test
     public void testGetTableName() {
         String sql = "select * from t where id = ? for update";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, asts.get(0));
+        OscarSelectForUpdateRecognizer recognizer = new 
OscarSelectForUpdateRecognizer(sql, sqlStatement);
         Assertions.assertEquals(recognizer.getTableName(), "t");
     }
 }
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarUpdateRecognizerTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarUpdateRecognizerTest.java
index ffcbe378c9..c3dba25f68 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarUpdateRecognizerTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/oscar/OscarUpdateRecognizerTest.java
@@ -34,16 +34,16 @@ import java.util.Map;
 /**
  * The Oscar Update Recognizer Test.
  */
-public class OscarUpdateRecognizerTest {
+public class OscarUpdateRecognizerTest extends AbstractOscarRecognizerTest {
 
     private static final String DB_TYPE = "oscar";
 
     @Test
     public void testGetSqlType() {
         String sql = "update t set n = ?";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
asts.get(0));
+        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
sqlStatement);
         Assertions.assertEquals(recognizer.getSQLType(), SQLType.UPDATE);
     }
 
@@ -51,15 +51,15 @@ public class OscarUpdateRecognizerTest {
     public void testGetUpdateColumns() {
         // test with normal
         String sql = "update t set a = ?, b = ?, c = ?";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
-        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
asts.get(0));
+        SQLStatement sqlStatement = getSQLStatement(sql);
+        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
sqlStatement);
         List<String> updateColumns = recognizer.getUpdateColumns();
         Assertions.assertEquals(updateColumns.size(), 3);
 
         // test with alias
         sql = "update t set a.a = ?, a.b = ?, a.c = ?";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
-        recognizer = new OscarUpdateRecognizer(sql, asts.get(0));
+        sqlStatement = getSQLStatement(sql);
+        recognizer = new OscarUpdateRecognizer(sql, sqlStatement);
         updateColumns = recognizer.getUpdateColumns();
         Assertions.assertEquals(updateColumns.size(), 3);
 
@@ -81,15 +81,15 @@ public class OscarUpdateRecognizerTest {
     public void testGetUpdateValues() {
         // test with normal
         String sql = "update t set a = ?, b = ?, c = ?";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
-        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
asts.get(0));
+        SQLStatement sqlStatement = getSQLStatement(sql);
+        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
sqlStatement);
         List<Object> updateValues = recognizer.getUpdateValues();
         Assertions.assertEquals(updateValues.size(), 3);
 
         // test with values
         sql = "update t set a = 1, b = 2, c = 3";
-        asts = SQLUtils.parseStatements(sql, DB_TYPE);
-        recognizer = new OscarUpdateRecognizer(sql, asts.get(0));
+        sqlStatement = getSQLStatement(sql);
+        recognizer = new OscarUpdateRecognizer(sql, sqlStatement);
         updateValues = recognizer.getUpdateValues();
         Assertions.assertEquals(updateValues.size(), 3);
 
@@ -111,9 +111,9 @@ public class OscarUpdateRecognizerTest {
     public void testGetWhereCondition_0() {
 
         String sql = "update t set a = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
asts.get(0));
+        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
sqlStatement);
         String whereCondition = recognizer.getWhereCondition(
                 new ParametersHolder() {
                     @Override
@@ -130,9 +130,9 @@ public class OscarUpdateRecognizerTest {
     public void testGetWhereCondition_1() {
 
         String sql = "update t set a = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
asts.get(0));
+        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
sqlStatement);
         String whereCondition = recognizer.getWhereCondition();
 
         Assertions.assertEquals("", whereCondition);
@@ -141,18 +141,18 @@ public class OscarUpdateRecognizerTest {
     @Test
     public void testGetTableAlias() {
         String sql = "update t set a = ?, b = ?, c = ?";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
asts.get(0));
+        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
sqlStatement);
         Assertions.assertNull(recognizer.getTableAlias());
     }
 
     @Test
     public void testGetTableName() {
         String sql = "update t set a = ?, b = ?, c = ?";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, DB_TYPE);
+        SQLStatement sqlStatement = getSQLStatement(sql);
 
-        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
asts.get(0));
+        OscarUpdateRecognizer recognizer = new OscarUpdateRecognizer(sql, 
sqlStatement);
         Assertions.assertEquals(recognizer.getTableName(), "t");
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to