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

chengzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 74171206f65 Add support for data source unicast route in DAL statement 
broadcast decider (#38304)
74171206f65 is described below

commit 74171206f659eefaa5d6a117998df2c509c52477
Author: Cong Hu <[email protected]>
AuthorDate: Tue Mar 3 11:02:40 2026 +0800

    Add support for data source unicast route in DAL statement broadcast 
decider (#38304)
---
 .../DialectDALStatementBroadcastRouteDecider.java  |  8 ++++++++
 .../tableless/TablelessRouteEngineFactory.java     |  3 +++
 .../tableless/TablelessRouteEngineFactoryTest.java | 14 +++++++++++++
 .../MySQLDALStatementBroadcastRouteDecider.java    |  6 ++++++
 ...ostgreSQLDALStatementBroadcastRouteDecider.java |  5 +++++
 .../resources/cases/dal/dataset/show_variables.xml | 24 ++++++++++++++++++++++
 .../src/test/resources/cases/dal/e2e-dal-show.xml  |  4 ++++
 7 files changed, 64 insertions(+)

diff --git 
a/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/DialectDALStatementBroadcastRouteDecider.java
 
b/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/DialectDALStatementBroadcastRouteDecider.java
index ae1ba0d79b2..02b9a85b17f 100644
--- 
a/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/DialectDALStatementBroadcastRouteDecider.java
+++ 
b/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/DialectDALStatementBroadcastRouteDecider.java
@@ -42,4 +42,12 @@ public interface DialectDALStatementBroadcastRouteDecider 
extends DatabaseTypedS
      * @return broadcast route or not
      */
     boolean isInstanceBroadcastRoute(DALStatement sqlStatement);
+    
+    /**
+     * Whether data source unicast route.
+     *
+     * @param sqlStatement SQL statement
+     * @return unicast route or not
+     */
+    boolean isDataSourceUnicastRoute(DALStatement sqlStatement);
 }
diff --git 
a/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java
 
b/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java
index c3ee0dceb43..e5948844b64 100644
--- 
a/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java
+++ 
b/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java
@@ -130,6 +130,9 @@ public final class TablelessRouteEngineFactory {
         if (dialectDALStatementBroadcastRouteDecider.map(optional -> 
optional.isInstanceBroadcastRoute(sqlStatement)).orElse(false)) {
             return new TablelessInstanceBroadcastRouteEngine(database);
         }
+        if (dialectDALStatementBroadcastRouteDecider.map(optional -> 
optional.isDataSourceUnicastRoute(sqlStatement)).orElse(false)) {
+            return new TablelessDataSourceUnicastRouteEngine();
+        }
         throw new NoTablelessRouteInfoException();
     }
 }
diff --git 
a/infra/route/core/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java
 
b/infra/route/core/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java
index e48052b768f..7be9bfa7a1e 100644
--- 
a/infra/route/core/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java
+++ 
b/infra/route/core/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java
@@ -147,6 +147,20 @@ class TablelessRouteEngineFactoryTest {
         assertThat(actual, isA(TablelessInstanceBroadcastRouteEngine.class));
     }
     
+    @Test
+    void assertNewInstanceForDataSourceUnicastRoute() {
+        DALStatement sqlStatement = mock(DALStatement.class);
+        when(sqlStatement.getDatabaseType()).thenReturn(databaseType);
+        when(sqlStatement.getAttributes()).thenReturn(new 
SQLStatementAttributes());
+        DialectDALStatementBroadcastRouteDecider 
dialectDALStatementBroadcastRouteDecider = 
mock(DialectDALStatementBroadcastRouteDecider.class);
+        
when(dialectDALStatementBroadcastRouteDecider.isDataSourceUnicastRoute(sqlStatement)).thenReturn(true);
+        
when(DatabaseTypedSPILoader.findService(DialectDALStatementBroadcastRouteDecider.class,
 
databaseType)).thenReturn(Optional.of(dialectDALStatementBroadcastRouteDecider));
+        when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
+        QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class));
+        TablelessRouteEngine actual = 
TablelessRouteEngineFactory.newInstance(queryContext, database);
+        assertThat(actual, isA(TablelessDataSourceUnicastRouteEngine.class));
+    }
+    
     @Test
     void assertNewInstanceForCloseAllStatement() {
         CursorHeldSQLStatementContext closeStatementContext = 
mock(CursorHeldSQLStatementContext.class, RETURNS_DEEP_STUBS);
diff --git 
a/infra/route/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/route/mysql/MySQLDALStatementBroadcastRouteDecider.java
 
b/infra/route/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/route/mysql/MySQLDALStatementBroadcastRouteDecider.java
index ebe61457a2f..cb8214b6d19 100644
--- 
a/infra/route/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/route/mysql/MySQLDALStatementBroadcastRouteDecider.java
+++ 
b/infra/route/dialect/mysql/src/main/java/org/apache/shardingsphere/infra/route/mysql/MySQLDALStatementBroadcastRouteDecider.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.resource.MySQLAl
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.resource.MySQLCreateResourceGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.resource.MySQLDropResourceGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.resource.MySQLSetResourceGroupStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.variable.MySQLShowVariablesStatement;
 
 import java.util.Optional;
 
@@ -48,6 +49,11 @@ public final class MySQLDALStatementBroadcastRouteDecider 
implements DialectDALS
                 || sqlStatement instanceof MySQLSetResourceGroupStatement;
     }
     
+    @Override
+    public boolean isDataSourceUnicastRoute(final DALStatement sqlStatement) {
+        return sqlStatement instanceof MySQLShowVariablesStatement;
+    }
+    
     @Override
     public String getDatabaseType() {
         return "MySQL";
diff --git 
a/infra/route/dialect/postgresql/src/main/java/org/apache/shardingsphere/infra/route/postgresql/PostgreSQLDALStatementBroadcastRouteDecider.java
 
b/infra/route/dialect/postgresql/src/main/java/org/apache/shardingsphere/infra/route/postgresql/PostgreSQLDALStatementBroadcastRouteDecider.java
index d15be265d51..f75ab3195d1 100644
--- 
a/infra/route/dialect/postgresql/src/main/java/org/apache/shardingsphere/infra/route/postgresql/PostgreSQLDALStatementBroadcastRouteDecider.java
+++ 
b/infra/route/dialect/postgresql/src/main/java/org/apache/shardingsphere/infra/route/postgresql/PostgreSQLDALStatementBroadcastRouteDecider.java
@@ -37,6 +37,11 @@ public final class 
PostgreSQLDALStatementBroadcastRouteDecider implements Dialec
         return false;
     }
     
+    @Override
+    public boolean isDataSourceUnicastRoute(final DALStatement sqlStatement) {
+        return false;
+    }
+    
     @Override
     public String getDatabaseType() {
         return "PostgreSQL";
diff --git 
a/test/e2e/sql/src/test/resources/cases/dal/dataset/show_variables.xml 
b/test/e2e/sql/src/test/resources/cases/dal/dataset/show_variables.xml
new file mode 100644
index 00000000000..2ad5127b637
--- /dev/null
+++ b/test/e2e/sql/src/test/resources/cases/dal/dataset/show_variables.xml
@@ -0,0 +1,24 @@
+<!--
+  ~ 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.
+  -->
+
+<dataset>
+    <metadata>
+        <column name="Variable_name" />
+        <column name="Value" />
+    </metadata>
+    <row values="character_set_client, NOT_VERIFY" />
+</dataset>
diff --git a/test/e2e/sql/src/test/resources/cases/dal/e2e-dal-show.xml 
b/test/e2e/sql/src/test/resources/cases/dal/e2e-dal-show.xml
index f8379381dbc..bd8a1f7795e 100644
--- a/test/e2e/sql/src/test/resources/cases/dal/e2e-dal-show.xml
+++ b/test/e2e/sql/src/test/resources/cases/dal/e2e-dal-show.xml
@@ -46,4 +46,8 @@
     <test-case db-types="MySQL" scenario-types="db,tbl" sql="SHOW CREATE TABLE 
t_order">
         <assertion expected-data-file="show_create_table.xml" />
     </test-case>
+
+    <test-case sql="SHOW VARIABLES LIKE 'character_set_client'" 
db-types="MySQL" scenario-types="db,tbl,dbtbl_with_readwrite_splitting" 
adapters="proxy">
+        <assertion expected-data-file="show_variables.xml" />
+    </test-case>
 </e2e-test-cases>

Reply via email to