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>