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

terrymanu 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 2a4cee71611 Add database-only join routing integration tests (#40327)
2a4cee71611 is described below

commit 2a4cee716117a5b4e2737c13cea9690b7c8e76de
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Oct 22 12:05:57 2026 +0800

    Add database-only join routing integration tests (#40327)
---
 .../test/it/router/ShardingSQLRouterIT.java        | 49 +++++++++++++++++++++-
 1 file changed, 48 insertions(+), 1 deletion(-)

diff --git 
a/test/it/router/src/test/java/org/apache/shardingsphere/test/it/router/ShardingSQLRouterIT.java
 
b/test/it/router/src/test/java/org/apache/shardingsphere/test/it/router/ShardingSQLRouterIT.java
index 935232caff7..50728d8dd1a 100644
--- 
a/test/it/router/src/test/java/org/apache/shardingsphere/test/it/router/ShardingSQLRouterIT.java
+++ 
b/test/it/router/src/test/java/org/apache/shardingsphere/test/it/router/ShardingSQLRouterIT.java
@@ -45,6 +45,7 @@ import 
org.apache.shardingsphere.infra.util.props.PropertiesBuilder;
 import org.apache.shardingsphere.infra.util.props.PropertiesBuilder.Property;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
+import 
org.apache.shardingsphere.sharding.algorithm.sharding.mod.ModShardingAlgorithm;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableReferenceRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
@@ -59,6 +60,7 @@ import org.junit.jupiter.params.provider.MethodSource;
 
 import javax.sql.DataSource;
 import java.sql.Types;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -155,11 +157,56 @@ class ShardingSQLRouterIT {
         }
     }
     
+    @Test
+    void assertRouteDatabaseOnlyJoin() {
+        RouteContext actual = routeDatabaseOnlyJoin("SELECT i.* FROM t_order 
o, t_order_item i WHERE o.order_id = i.order_id AND o.user_id = i.user_id", 
Collections.emptyList());
+        assertThat(actual.getRouteUnits().size(), is(3));
+        assertThat(getRouteUnitSignatures(actual), 
is(createRouteUnits("ds_0:t_order=t_order,t_order_item=t_order_item", 
"ds_1:t_order=t_order,t_order_item=t_order_item",
+                "ds_2:t_order=t_order,t_order_item=t_order_item")));
+    }
+    
+    @Test
+    void assertRouteDatabaseOnlyJoinWithShardingCondition() {
+        RouteContext actual = routeDatabaseOnlyJoin("SELECT i.* FROM t_order 
o, t_order_item i WHERE o.order_id = i.order_id AND o.user_id = i.user_id AND 
o.user_id = ?",
+                Collections.singletonList(1));
+        assertThat(actual.getRouteUnits().size(), is(1));
+        assertThat(getRouteUnitSignatures(actual), 
is(createRouteUnits("ds_1:t_order=t_order,t_order_item=t_order_item")));
+    }
+    
+    private static RouteContext routeDatabaseOnlyJoin(final String sql, final 
List<Object> params) {
+        DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "MySQL");
+        ShardingRuleConfiguration config = new ShardingRuleConfiguration();
+        Collection<ShardingSphereTable> tables = new ArrayList<>(2);
+        for (String each : Arrays.asList("t_order", "t_order_item")) {
+            config.getTables().add(new ShardingTableRuleConfiguration(each, 
String.format("<LITERAL>ds_0.%s, ds_1.%s, ds_2.%s", each, each, each)));
+            tables.add(new ShardingSphereTable(each, Arrays.asList(new 
ShardingSphereColumn("order_id", Types.BIGINT, false, false, false, true, 
false, false),
+                    new ShardingSphereColumn("user_id", Types.INTEGER, false, 
false, false, true, false, false)), Collections.emptyList(), 
Collections.emptyList()));
+        }
+        config.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("user_id", "database_mod"));
+        config.getShardingAlgorithms().put("database_mod", new 
AlgorithmConfiguration("CLASS_BASED", PropertiesBuilder.build(new 
Property("strategy", "STANDARD"),
+                new Property("algorithmClassName", 
ModShardingAlgorithm.class.getName()), new Property("sharding-count", "2"))));
+        Map<String, DataSource> dataSources = new LinkedHashMap<>(3, 1F);
+        for (String each : Arrays.asList("ds_0", "ds_1", "ds_2")) {
+            dataSources.put(each, new MockedDataSource());
+        }
+        ShardingRule shardingRule = new ShardingRule(config, dataSources, 
mock(ComputeNodeInstanceContext.class), Collections.emptyList());
+        ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
+        ShardingSphereSchema schema = new ShardingSphereSchema(DATABASE_NAME, 
databaseType, tables, Collections.emptyList());
+        ShardingSphereDatabase database = new 
ShardingSphereDatabase(DATABASE_NAME, databaseType, 
mock(ResourceMetaData.class, RETURNS_DEEP_STUBS),
+                new RuleMetaData(Collections.singleton(shardingRule)), 
Collections.singleton(schema), props);
+        return route(sql, params, database, props);
+    }
+    
     private static RouteContext route(final String sql, final List<Object> 
params) {
         DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "MySQL");
         ShardingRule shardingRule = createShardingRule();
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
         ShardingSphereDatabase database = createDatabase(databaseType, 
shardingRule, props);
+        return route(sql, params, database, props);
+    }
+    
+    private static RouteContext route(final String sql, final List<Object> 
params, final ShardingSphereDatabase database, final ConfigurationProperties 
props) {
+        DatabaseType databaseType = database.getProtocolType();
         RuleMetaData globalRuleMetaData = mock(RuleMetaData.class);
         ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), 
globalRuleMetaData, props);
         SQLParserEngine parserEngine = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()).getSQLParserEngine(databaseType);
@@ -167,7 +214,7 @@ class ShardingSQLRouterIT {
         ConnectionContext connectionContext = new 
ConnectionContext(Collections::emptySet);
         connectionContext.setCurrentDatabaseName(DATABASE_NAME);
         QueryContext queryContext = new QueryContext(sqlStatementContext, sql, 
params, new HintValueContext(), connectionContext, metaData);
-        return new SQLRouteEngine(Collections.singleton(shardingRule), 
props).route(queryContext, globalRuleMetaData, database);
+        return new SQLRouteEngine(database.getRuleMetaData().getRules(), 
props).route(queryContext, globalRuleMetaData, database);
     }
     
     private static ShardingSphereDatabase createDatabase(final DatabaseType 
databaseType, final ShardingRule shardingRule, final ConfigurationProperties 
props) {

Reply via email to