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

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


The following commit(s) were added to refs/heads/2.6.0 by this push:
     new fdbbbee6d4 test: oscar test cases should only run on Druid 1.2.5 and 
higher versions (#7933)
fdbbbee6d4 is described below

commit fdbbbee6d424ebeb6a1c747a72ea4c69edbac386
Author: funkye <[email protected]>
AuthorDate: Thu Jan 15 09:38:02 2026 +0800

    test: oscar test cases should only run on Druid 1.2.5 and higher versions 
(#7933)
---
 .github/workflows/test-druid.yml                   | 48 ++++++-----
 changes/en-us/2.6.0.md                             |  1 +
 changes/zh-cn/2.6.0.md                             |  1 +
 .../http/JakartaSeataWebMvcConfigurer.java         |  3 +-
 .../rm/datasource/xa/DataSourceProxyXATest.java    | 11 +--
 dependencies/pom.xml                               |  6 ++
 .../rm/datasource/PreparedStatementProxyTest.java  | 10 +--
 .../seata/rm/datasource/StatementProxyTest.java    | 11 +--
 .../rm/datasource/exec/DeleteExecutorTest.java     | 92 +++++++++++-----------
 .../rm/datasource/exec/MultiExecutorTest.java      |  6 +-
 .../datasource/exec/MySQLInsertExecutorTest.java   |  8 +-
 .../rm/datasource/exec/PlainExecutorTest.java      |  6 +-
 .../exec/SelectForUpdateExecutorTest.java          |  6 +-
 .../rm/datasource/exec/UpdateExecutorTest.java     |  6 +-
 .../rm/datasource/exec/UpdateJoinExecutorTest.java |  6 +-
 .../rm/datasource/mock/MockExecuteHandlerImpl.java | 11 +--
 .../rm/datasource/sql/struct/TableRecordsTest.java |  6 +-
 .../datasource/undo/dm/DmUndoLogManagerTest.java   |  6 +-
 .../undo/kingbase/KingbaseUndoLogManagerTest.java  |  6 +-
 .../undo/mariadb/MariadbUndoLogManagerTest.java    |  6 +-
 .../undo/mysql/MySQLUndoLogManagerTest.java        |  6 +-
 .../undo/oracle/OracleUndoLogManagerTest.java      |  6 +-
 .../undo/oscar/OscarUndoLogManagerTest.java        | 11 +--
 .../undo/polardbx/PolarDBXUndoLogManagerTest.java  |  6 +-
 .../postgresql/PostgresqlUndoLogManagerTest.java   |  6 +-
 .../rm/datasource/xa/DataSourceProxyXATest.java    |  5 +-
 .../autoconfigure/SeataHttpAutoConfiguration.java  |  2 +-
 .../SeataHttpAutoConfigurationTest.java            |  2 +-
 sqlparser/seata-sqlparser-druid/pom.xml            |  5 +-
 .../druid/DruidSQLRecognizerFactoryTest.java       | 23 ++++++
 30 files changed, 139 insertions(+), 189 deletions(-)

diff --git a/.github/workflows/test-druid.yml b/.github/workflows/test-druid.yml
index 89dd39ed02..ff92270313 100644
--- a/.github/workflows/test-druid.yml
+++ b/.github/workflows/test-druid.yml
@@ -46,28 +46,29 @@ jobs:
 #          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
-          #1.2.17, # Unit test triggered a bug in Druid, see the commit 
https://github.com/alibaba/druid/commit/6c493f852852fb287ed5fd31ee16c27ead0ea5cf
-          1.2.16,
-          1.2.15,
-          1.2.14,
-          1.2.13,
-          1.2.12,
-          1.2.11,
-          1.2.10,
-          1.2.9,
-          1.2.8,
-          1.2.7,
-          1.2.6,
-          1.2.5,
-          1.2.4,
-          1.2.3,
-          1.2.2,
-          1.2.1,
-          1.2.0,
+          1.2.21
+#          not support druid:1.2.20
+#          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
+#          #1.2.17, # Unit test triggered a bug in Druid, see the commit 
https://github.com/alibaba/druid/commit/6c493f852852fb287ed5fd31ee16c27ead0ea5cf
+#          1.2.16,
+#          1.2.15,
+#          1.2.14,
+#          1.2.13,
+#          1.2.12,
+#          1.2.11,
+#          1.2.10,
+#          1.2.9,
+#          1.2.8,
+#          1.2.7,
+#          1.2.6,
+#          1.2.5,
+#          1.2.4,
+#          1.2.3,
+#          1.2.2,
+#          1.2.1,
+#          1.2.0,
 
           # not support druid:1.1.x
           #1.1.24,
@@ -92,9 +93,6 @@ jobs:
       # step 4
       - name: "Test with Maven and Druid ${{ matrix.druid }}"
         run: |
-          if [ "${{ matrix.druid }}" = "1.2.12" ]; then
-          export skip.druid.tests=false;
-          fi
           ./mvnw -T 4C clean test \
                  -Ddruid.version=${{ matrix.druid }} \
                  -e -B 
-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn;
diff --git a/changes/en-us/2.6.0.md b/changes/en-us/2.6.0.md
index 1a10fd3a7e..44f87e5714 100644
--- a/changes/en-us/2.6.0.md
+++ b/changes/en-us/2.6.0.md
@@ -183,6 +183,7 @@ Add changes here for all PR submitted to the 2.x branch.
 - [[#7906](https://github.com/apache/incubator-seata/pull/7906)] add test for 
Fury/Fory
 - [[#7907](https://github.com/apache/incubator-seata/pull/7907)] test: fixes 
CI errors caused by timing issues in ZkConfigurationTest
 - [[#7912](https://github.com/apache/incubator-seata/pull/7912)] test: add 
Antlr tests to improve test coverage
+- [[#7933](https://github.com/apache/incubator-seata/pull/7933)] oscar test 
cases should only run on Druid 1.2.5 and higher versions
 
 
 ### refactor:
diff --git a/changes/zh-cn/2.6.0.md b/changes/zh-cn/2.6.0.md
index 62c09278b1..bcd201d845 100644
--- a/changes/zh-cn/2.6.0.md
+++ b/changes/zh-cn/2.6.0.md
@@ -183,6 +183,7 @@
 - [[#7906](https://github.com/apache/incubator-seata/pull/7906)] Fury/Fory 
增加单元测试
 - [[#7907](https://github.com/apache/incubator-seata/pull/7907)] test: 
修复ZkConfigurationTest的时序问题导致的ci错误
 - [[#7912](https://github.com/apache/incubator-seata/pull/7912)] test: 添加 
Antlr 测试以提高测试覆盖率
+- [[#7933](https://github.com/apache/incubator-seata/pull/7933)] 
oscar数据库测试用例仅运行在druid大于等于1.2.5版本
 
 
 ### refactor:
diff --git 
a/compatible/src/main/java/io/seata/integration/http/JakartaSeataWebMvcConfigurer.java
 
b/compatible/src/main/java/io/seata/integration/http/JakartaSeataWebMvcConfigurer.java
index da4f88c545..41dda54cb2 100644
--- 
a/compatible/src/main/java/io/seata/integration/http/JakartaSeataWebMvcConfigurer.java
+++ 
b/compatible/src/main/java/io/seata/integration/http/JakartaSeataWebMvcConfigurer.java
@@ -20,5 +20,4 @@ package io.seata.integration.http;
  * The type Jakarta seata web mvc configurer.
  */
 @Deprecated
-public class JakartaSeataWebMvcConfigurer
-        extends org.apache.seata.integration.http.JakartaSeataWebMvcConfigurer 
{}
+public class JakartaSeataWebMvcConfigurer extends 
org.apache.seata.integration.http.JakartaSeataWebMvcConfigurer {}
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 3a9b84c7a7..10a705460b 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,7 +17,6 @@
 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;
@@ -80,10 +79,7 @@ public class DataSourceProxyXATest {
         Connection wrappedConnection = 
connectionProxyXA.getWrappedConnection();
         Assertions.assertTrue(wrappedConnection instanceof PooledConnection);
 
-        Connection wrappedPhysicalConn = ((PooledConnection) 
wrappedConnection).getConnection();
-        if (wrappedPhysicalConn instanceof DruidStatementConnection) {
-            wrappedPhysicalConn = ((DruidStatementConnection) 
wrappedPhysicalConn).getConnection();
-        }
+        Connection wrappedPhysicalConn = 
wrappedConnection.unwrap(Connection.class);
         Assertions.assertSame(wrappedPhysicalConn, connection);
 
         XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
@@ -120,10 +116,7 @@ public class DataSourceProxyXATest {
         Connection wrappedConnection = 
connectionProxyXA.getWrappedConnection();
         Assertions.assertTrue(wrappedConnection instanceof PooledConnection);
 
-        Connection wrappedPhysicalConn = ((PooledConnection) 
wrappedConnection).getConnection();
-        if (wrappedPhysicalConn instanceof DruidStatementConnection) {
-            wrappedPhysicalConn = ((DruidStatementConnection) 
wrappedPhysicalConn).getConnection();
-        }
+        Connection wrappedPhysicalConn = 
wrappedConnection.unwrap(Connection.class);
         Assertions.assertSame(wrappedPhysicalConn, connection);
 
         XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
diff --git a/dependencies/pom.xml b/dependencies/pom.xml
index 09f8d431ee..1747087fff 100644
--- a/dependencies/pom.xml
+++ b/dependencies/pom.xml
@@ -257,6 +257,12 @@
                 <groupId>com.alibaba</groupId>
                 <artifactId>druid</artifactId>
                 <version>${druid.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>com.google.guava</groupId>
+                        <artifactId>guava</artifactId>
+                    </exclusion>
+                </exclusions>
             </dependency>
             <dependency>
                 <groupId>org.apache.commons</groupId>
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 bc391dd6c1..b4393c5e3f 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,7 +21,6 @@ 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;
@@ -130,9 +129,7 @@ public class PreparedStatementProxyTest {
         String sql = "update prepared_statement_proxy set name = ?";
 
         Connection targetConnection = connectionProxy.getTargetConnection();
-        if (targetConnection instanceof DruidStatementConnection) {
-            targetConnection = ((DruidStatementConnection) 
targetConnection).getConnection();
-        }
+        targetConnection = targetConnection.unwrap(Connection.class);
 
         PreparedStatement preparedStatement =
                 mockDriver.createSeataMockPreparedStatement((MockConnection) 
targetConnection, sql);
@@ -150,10 +147,7 @@ public class PreparedStatementProxyTest {
 
     private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 f4c965a7b4..58d181505b 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,7 +19,6 @@ 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;
@@ -115,10 +114,7 @@ public class StatementProxyTest {
 
         ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy, 
getPhysicsConnection(dataSource));
 
-        Connection targetConnection = connectionProxy.getTargetConnection();
-        if (targetConnection instanceof DruidStatementConnection) {
-            targetConnection = ((DruidStatementConnection) 
targetConnection).getConnection();
-        }
+        Connection targetConnection = 
connectionProxy.getTargetConnection().unwrap(Connection.class);
 
         Statement statement = mockDriver.createMockStatement((MockConnection) 
targetConnection);
 
@@ -139,10 +135,7 @@ public class StatementProxyTest {
 
     private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @AfterEach
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 360085267d..0fc0714c28 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,9 +19,6 @@ 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;
 import com.google.common.collect.Lists;
 import org.apache.seata.rm.datasource.ConnectionProxy;
@@ -29,8 +26,8 @@ import org.apache.seata.rm.datasource.DataSourceProxy;
 import org.apache.seata.rm.datasource.DataSourceProxyTest;
 import org.apache.seata.rm.datasource.StatementProxy;
 import org.apache.seata.rm.datasource.mock.MockDriver;
+import org.apache.seata.rm.datasource.sql.SQLVisitorFactory;
 import org.apache.seata.rm.datasource.sql.struct.TableRecords;
-import org.apache.seata.sqlparser.druid.mysql.MySQLDeleteRecognizer;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -117,30 +114,26 @@ public class DeleteExecutorTest {
             throw new RuntimeException("init failed");
         }
         String sql = "delete from table_delete_executor_test where id = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
         deleteExecutor = new DeleteExecutor(
                 statementProxy,
                 (statement, args) -> {
                     return null;
                 },
-                recognizer);
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
     }
 
     private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
     public void testBeforeAndAfterImage() throws SQLException {
         String sql = "delete from table_delete_executor_test";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -151,9 +144,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithTableAlias() throws SQLException {
         String sql = "delete from table_delete_executor_test t where t.id = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -164,9 +158,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithTableSchema() throws SQLException {
         String sql = "delete from seata.table_delete_executor_test where id = 
1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -177,9 +172,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithTableSchemaAndTableAlias() throws 
SQLException {
         String sql = "delete from seata.table_delete_executor_test t where 
t.id = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -190,9 +186,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithTableSchemaQuote() throws 
SQLException {
         String sql = "delete from `seata`.table_delete_executor_test where id 
= 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -203,9 +200,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithTableSchemaAndTableNameQuote() 
throws SQLException {
         String sql = "delete from seata.`table_delete_executor_test` where id 
= 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -216,9 +214,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithTableSchemaQuoteAndTableNameQuote() 
throws SQLException {
         String sql = "delete from `seata`.`table_delete_executor_test` where 
id = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -229,9 +228,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithColumnQuote() throws SQLException {
         String sql = "delete from table_delete_executor_test where `id` = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -242,9 +242,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithUpperColumn() throws SQLException {
         String sql = "delete from table_delete_executor_test where ID = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -255,9 +256,11 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithTableAliasAndUpperColumn() throws 
SQLException {
         String sql = "delete from table_delete_executor_test t where t.ID = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
@@ -268,9 +271,10 @@ public class DeleteExecutorTest {
     @Test
     public void testBeforeAndAfterImageWithKeyword() throws SQLException {
         String sql = "delete from table_delete_executor_test where `or` = 1";
-        List<SQLStatement> asts = SQLUtils.parseStatements(sql, 
JdbcConstants.MYSQL);
-        MySQLDeleteRecognizer recognizer = new MySQLDeleteRecognizer(sql, 
asts.get(0));
-        deleteExecutor = new DeleteExecutor(statementProxy, (statement, args) 
-> null, recognizer);
+        deleteExecutor = new DeleteExecutor(
+                statementProxy,
+                (statement, args) -> null,
+                SQLVisitorFactory.get(sql, JdbcConstants.MYSQL.name()).get(0));
 
         TableRecords beforeImage = deleteExecutor.beforeImage();
         TableRecords afterImage = deleteExecutor.afterImage(beforeImage);
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 1709e39cca..2201e86bd4 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,7 +19,6 @@ 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;
@@ -129,10 +128,7 @@ public class MultiExecutorTest {
 
     private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 512cdb2923..dc8e717115 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,7 +19,6 @@ 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;
@@ -260,12 +259,9 @@ public class MySQLInsertExecutorTest {
         }
     }
 
-    protected Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
+    protected static Connection getPhysicsConnection(DruidDataSource 
dataSource) throws SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 053ce71360..026f94c707 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,7 +19,6 @@ 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;
@@ -107,10 +106,7 @@ public class PlainExecutorTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 81c8964430..01c085cdf9 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,7 +18,6 @@ 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;
@@ -136,10 +135,7 @@ public class SelectForUpdateExecutorTest {
 
     private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 1d58b3a401..8be51e9de3 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,7 +19,6 @@ 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;
@@ -179,10 +178,7 @@ public class UpdateExecutorTest {
 
     private static Connection getPhysicsConnection(DruidDataSource dataSource) 
throws SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 4d59b36436..e11d954627 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,7 +19,6 @@ 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;
@@ -223,9 +222,6 @@ public class UpdateJoinExecutorTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 }
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/mock/MockExecuteHandlerImpl.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/mock/MockExecuteHandlerImpl.java
index b138e9873e..abd4f97274 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/mock/MockExecuteHandlerImpl.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/mock/MockExecuteHandlerImpl.java
@@ -20,10 +20,8 @@ import com.alibaba.druid.mock.MockStatementBase;
 import com.alibaba.druid.mock.handler.MockExecuteHandler;
 import com.alibaba.druid.sql.SQLUtils;
 import com.alibaba.druid.sql.ast.SQLStatement;
-import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
 import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
 import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
-import org.apache.seata.sqlparser.druid.mysql.MySQLSelectForUpdateRecognizer;
 import org.apache.seata.sqlparser.util.JdbcConstants;
 
 import java.sql.ResultSet;
@@ -74,13 +72,8 @@ public class MockExecuteHandlerImpl implements 
MockExecuteHandler {
             SQLSelectStatement ast = (SQLSelectStatement) asts.get(0);
             SQLSelectQueryBlock queryBlock = 
ast.getSelect().getFirstQueryBlock();
             String tableName = "";
-            if (queryBlock.getFrom() instanceof SQLExprTableSource) {
-                MySQLSelectForUpdateRecognizer recognizer = new 
MySQLSelectForUpdateRecognizer(sql, ast);
-                tableName = recognizer.getTableName();
-            } else {
-                // select * from t inner join t1...
-                tableName = queryBlock.getFrom().toString();
-            }
+            // select * from t inner join t1...
+            tableName = queryBlock.getFrom().toString();
             for (Object[] meta : mockColumnsMetasReturnValue) {
                 if (tableName.equalsIgnoreCase(meta[2].toString())) {
                     metas.add(meta);
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 4cda675eea..1af246b3ff 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,7 +19,6 @@ 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.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@@ -244,10 +243,7 @@ public class TableRecordsTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/dm/DmUndoLogManagerTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/dm/DmUndoLogManagerTest.java
index 90af788097..46196af591 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/dm/DmUndoLogManagerTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/dm/DmUndoLogManagerTest.java
@@ -17,7 +17,6 @@
 package org.apache.seata.rm.datasource.undo.dm;
 
 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;
@@ -142,10 +141,7 @@ public class DmUndoLogManagerTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/kingbase/KingbaseUndoLogManagerTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/kingbase/KingbaseUndoLogManagerTest.java
index dce44b905a..6430fba95a 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/kingbase/KingbaseUndoLogManagerTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/kingbase/KingbaseUndoLogManagerTest.java
@@ -17,7 +17,6 @@
 package org.apache.seata.rm.datasource.undo.kingbase;
 
 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;
@@ -136,10 +135,7 @@ public class KingbaseUndoLogManagerTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 099fc136a0..89b0c0ae06 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,7 +17,6 @@
 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;
@@ -148,10 +147,7 @@ public class MariadbUndoLogManagerTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 7c6e0e100a..16f8b518d8 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,7 +17,6 @@
 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;
@@ -145,10 +144,7 @@ public class MySQLUndoLogManagerTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/oracle/OracleUndoLogManagerTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/oracle/OracleUndoLogManagerTest.java
index 37fd193b35..727cece980 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/oracle/OracleUndoLogManagerTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/oracle/OracleUndoLogManagerTest.java
@@ -17,7 +17,6 @@
 package org.apache.seata.rm.datasource.undo.oracle;
 
 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;
@@ -136,10 +135,7 @@ public class OracleUndoLogManagerTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/oscar/OscarUndoLogManagerTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/oscar/OscarUndoLogManagerTest.java
index 235222905b..03c0db2d45 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/oscar/OscarUndoLogManagerTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/oscar/OscarUndoLogManagerTest.java
@@ -17,7 +17,6 @@
 package org.apache.seata.rm.datasource.undo.oscar;
 
 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;
@@ -42,6 +41,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledIfSystemProperty;
 
 import java.lang.reflect.Field;
 import java.sql.Connection;
@@ -51,6 +51,10 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+@DisabledIfSystemProperty(
+        named = "druid.version",
+        matches = "[0-1].[1-2].[0-24]",
+        disabledReason = "druid 1.2.24 correct support oscar")
 public class OscarUndoLogManagerTest {
 
     List<String> returnValueColumnLabels = Lists.newArrayList("log_status");
@@ -136,10 +140,7 @@ public class OscarUndoLogManagerTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 732ede75bd..fcad581bd9 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,7 +17,6 @@
 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;
@@ -145,10 +144,7 @@ public class PolarDBXUndoLogManagerTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/postgresql/PostgresqlUndoLogManagerTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/postgresql/PostgresqlUndoLogManagerTest.java
index dccaa8b60a..35957b1210 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/postgresql/PostgresqlUndoLogManagerTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/postgresql/PostgresqlUndoLogManagerTest.java
@@ -17,7 +17,6 @@
 package org.apache.seata.rm.datasource.undo.postgresql;
 
 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;
@@ -136,10 +135,7 @@ public class PostgresqlUndoLogManagerTest {
 
     private Connection getPhysicsConnection(DruidDataSource dataSource) throws 
SQLException {
         Connection connection = dataSource.getConnection().getConnection();
-        if (connection instanceof DruidStatementConnection) {
-            return ((DruidStatementConnection) connection).getConnection();
-        }
-        return connection;
+        return connection.unwrap(Connection.class);
     }
 
     @Test
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 c363ff6145..f211ab92bd 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,7 +17,6 @@
 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;
@@ -146,9 +145,7 @@ public class DataSourceProxyXATest {
         Assertions.assertTrue(wrappedConnection instanceof PooledConnection);
 
         Connection wrappedPhysicalConn = ((PooledConnection) 
wrappedConnection).getConnection();
-        if (wrappedPhysicalConn instanceof DruidStatementConnection) {
-            wrappedPhysicalConn = ((DruidStatementConnection) 
wrappedPhysicalConn).getConnection();
-        }
+        wrappedPhysicalConn = wrappedConnection.unwrap(Connection.class);
         Assertions.assertSame(wrappedPhysicalConn, connection);
 
         XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
diff --git 
a/seata-spring-boot-starter/src/main/java/org/apache/seata/spring/boot/autoconfigure/SeataHttpAutoConfiguration.java
 
b/seata-spring-boot-starter/src/main/java/org/apache/seata/spring/boot/autoconfigure/SeataHttpAutoConfiguration.java
index 9ac1a0e626..393be677e9 100644
--- 
a/seata-spring-boot-starter/src/main/java/org/apache/seata/spring/boot/autoconfigure/SeataHttpAutoConfiguration.java
+++ 
b/seata-spring-boot-starter/src/main/java/org/apache/seata/spring/boot/autoconfigure/SeataHttpAutoConfiguration.java
@@ -16,8 +16,8 @@
  */
 package org.apache.seata.spring.boot.autoconfigure;
 
-import org.apache.seata.integration.http.SeataWebMvcConfigurer;
 import org.apache.seata.integration.http.JakartaSeataWebMvcConfigurer;
+import org.apache.seata.integration.http.SeataWebMvcConfigurer;
 import org.springframework.boot.autoconfigure.AutoConfigureOrder;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
diff --git 
a/seata-spring-boot-starter/src/test/java/org/apache/seata/spring/boot/autoconfigure/SeataHttpAutoConfigurationTest.java
 
b/seata-spring-boot-starter/src/test/java/org/apache/seata/spring/boot/autoconfigure/SeataHttpAutoConfigurationTest.java
index 461f848e17..cce2d0786e 100644
--- 
a/seata-spring-boot-starter/src/test/java/org/apache/seata/spring/boot/autoconfigure/SeataHttpAutoConfigurationTest.java
+++ 
b/seata-spring-boot-starter/src/test/java/org/apache/seata/spring/boot/autoconfigure/SeataHttpAutoConfigurationTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.seata.spring.boot.autoconfigure;
 
-import org.apache.seata.integration.http.SeataWebMvcConfigurer;
 import org.apache.seata.integration.http.JakartaSeataWebMvcConfigurer;
+import org.apache.seata.integration.http.SeataWebMvcConfigurer;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.autoconfigure.AutoConfigurations;
 import org.springframework.boot.test.context.FilteredClassLoader;
diff --git a/sqlparser/seata-sqlparser-druid/pom.xml 
b/sqlparser/seata-sqlparser-druid/pom.xml
index 4d76142522..740c54c397 100644
--- a/sqlparser/seata-sqlparser-druid/pom.xml
+++ b/sqlparser/seata-sqlparser-druid/pom.xml
@@ -28,7 +28,9 @@
     <artifactId>seata-sqlparser-druid</artifactId>
     <name>seata-sqlparser-druid ${project.version}</name>
     <description>sqlparser-druid for Seata built with Maven</description>
-
+    <properties>
+        <druid-sqlparser.version>1.2.25</druid-sqlparser.version>
+    </properties>
     <dependencies>
         <dependency>
             <groupId>${project.groupId}</groupId>
@@ -39,6 +41,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid</artifactId>
+            <version>${druid-sqlparser.version}</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
diff --git 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/DruidSQLRecognizerFactoryTest.java
 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/DruidSQLRecognizerFactoryTest.java
index 2d283beb69..408067c15c 100644
--- 
a/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/DruidSQLRecognizerFactoryTest.java
+++ 
b/sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/DruidSQLRecognizerFactoryTest.java
@@ -29,6 +29,7 @@ import 
org.apache.seata.sqlparser.druid.oracle.OracleOperateRecognizerHolder;
 import org.apache.seata.sqlparser.util.JdbcConstants;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
 
 import java.util.List;
 
@@ -221,6 +222,28 @@ public class DruidSQLRecognizerFactoryTest {
                 NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.KINGBASE));
     }
 
+    @EnabledIfSystemProperty(
+            named = "druid.version",
+            matches = 
"(1\\.[3-9]\\..*)|(2\\..*)|(1\\.2\\.[5-9].*)|(1\\.2\\.[1-9][0-9].*)")
+    @Test
+    public void testIsSqlSyntaxSupportsForOscar() {
+        SQLRecognizerFactory recognizerFactory =
+                EnhancedServiceLoader.load(SQLRecognizerFactory.class, 
SqlParserType.SQL_PARSER_TYPE_DRUID);
+
+        String sql1 = "delete from t where id in (select id from b)";
+
+        Assertions.assertThrows(
+                NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.OSCAR));
+
+        String sql2 = "select * from (select * from t) for update";
+        Assertions.assertThrows(
+                NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.OSCAR));
+
+        String sql5 = "insert into a select * from b";
+        Assertions.assertThrows(
+                NotSupportYetException.class, () -> 
recognizerFactory.create(sql5, JdbcConstants.OSCAR));
+    }
+
     @Test
     public void testInsertFirstNotSupported() {
         SQLRecognizerFactory recognizerFactory =


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

Reply via email to