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

zhangliang 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 b1db08e7a64 infra: skip aggregate rewrite for DISTINCT queries (#37857)
b1db08e7a64 is described below

commit b1db08e7a641efe63234bd0a93d06fa861f40244
Author: jonasHanhan <[email protected]>
AuthorDate: Tue Jan 27 12:26:20 2026 +0800

    infra: skip aggregate rewrite for DISTINCT queries (#37857)
---
 .../merge/dql/ShardingDQLResultMergerTest.java     | 15 +++++++++++++
 .../rewrite/engine/RouteSQLRewriteEngine.java      |  4 ++++
 .../rewrite/engine/RouteSQLRewriteEngineTest.java  | 26 ++++++++++++++++++++++
 3 files changed, 45 insertions(+)

diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
index d2b3b7c462c..d23b6eb7c21 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
@@ -45,6 +45,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simp
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.GroupBySegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.OrderBySegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.IndexOrderByItemSegment;
@@ -378,6 +379,20 @@ class ShardingDQLResultMergerTest {
         assertThat(((TopAndRowNumberDecoratorMergedResult) 
actual).getMergedResult(), isA(GroupByMemoryMergedResult.class));
     }
     
+    @Test
+    void assertBuildGroupByMemoryMergedResultWithDistinctRow() throws 
SQLException {
+        SelectStatement selectStatement = buildSelectStatement(new 
SelectStatement(mysqlDatabaseType));
+        ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
+        projectionsSegment.setDistinctRow(true);
+        projectionsSegment.getProjections().add(new 
ShorthandProjectionSegment(0, 0));
+        selectStatement.setProjections(projectionsSegment);
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        SelectStatementContext selectStatementContext = new 
SelectStatementContext(
+                selectStatement, createShardingSphereMetaData(database), 
"foo_db", Collections.emptyList());
+        ShardingDQLResultMerger resultMerger = new 
ShardingDQLResultMerger(mysqlDatabaseType);
+        assertThat(resultMerger.merge(createQueryResults(), 
selectStatementContext, createDatabase(), mock(ConnectionContext.class)), 
isA(GroupByMemoryMergedResult.class));
+    }
+    
     @Test
     void assertBuildGroupByMemoryMergedResultWithAggregationOnly() throws 
SQLException {
         final ShardingDQLResultMerger resultMerger = new 
ShardingDQLResultMerger(mysqlDatabaseType);
diff --git 
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
 
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
index dec0363f219..e55270db323 100644
--- 
a/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
+++ 
b/infra/rewrite/core/src/main/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngine.java
@@ -106,6 +106,10 @@ public final class RouteSQLRewriteEngine {
             return false;
         }
         SelectStatementContext statementContext = (SelectStatementContext) 
sqlStatementContext;
+        if (statementContext.getProjectionsContext().isDistinctRow()) {
+            statementContext.setNeedAggregateRewrite(false);
+            return false;
+        }
         boolean containsSubqueryJoinQuery = 
statementContext.isContainsSubquery() || statementContext.isContainsJoinQuery();
         boolean containsOrderByLimitClause = 
!statementContext.getOrderByContext().getItems().isEmpty() || 
statementContext.getPaginationContext().isHasPagination();
         boolean containsLockClause = 
statementContext.getSqlStatement().getLock().isPresent();
diff --git 
a/infra/rewrite/core/src/test/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngineTest.java
 
b/infra/rewrite/core/src/test/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngineTest.java
index 9ffb349bb89..3b25a43c0c5 100644
--- 
a/infra/rewrite/core/src/test/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngineTest.java
+++ 
b/infra/rewrite/core/src/test/java/org/apache/shardingsphere/infra/rewrite/engine/RouteSQLRewriteEngineTest.java
@@ -128,6 +128,32 @@ class RouteSQLRewriteEngineTest {
         
assertThat(actual.getSqlRewriteUnits().values().iterator().next().getParameters(),
 is(Arrays.asList(1, 1)));
     }
     
+    @Test
+    void assertRewriteWithStandardParameterBuilderWhenDistinctRow() {
+        SelectStatementContext statementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+        
when(statementContext.getOrderByContext().getItems()).thenReturn(Collections.emptyList());
+        
when(statementContext.getPaginationContext().isHasPagination()).thenReturn(false);
+        
when(statementContext.getProjectionsContext().isDistinctRow()).thenReturn(true);
+        DatabaseType databaseType = mock(DatabaseType.class);
+        
when(statementContext.getSqlStatement().getDatabaseType()).thenReturn(databaseType);
+        
when(statementContext.getSqlStatement().getLock().isPresent()).thenReturn(false);
+        ShardingSphereDatabase database = mockDatabase(databaseType);
+        QueryContext queryContext = mockQueryContext(statementContext, "SELECT 
?");
+        SQLRewriteContext sqlRewriteContext = new SQLRewriteContext(database, 
queryContext);
+        RouteContext routeContext = new RouteContext();
+        RouteUnit firstRouteUnit = new RouteUnit(new RouteMapper("ds", 
"ds_0"), Collections.singletonList(new RouteMapper("tbl", "tbl_0")));
+        RouteUnit secondRouteUnit = new RouteUnit(new RouteMapper("ds", 
"ds_0"), Collections.singletonList(new RouteMapper("tbl", "tbl_1")));
+        routeContext.getRouteUnits().add(firstRouteUnit);
+        routeContext.getRouteUnits().add(secondRouteUnit);
+        RouteSQLRewriteResult actual = new RouteSQLRewriteEngine(
+                new SQLTranslatorRule(new 
DefaultSQLTranslatorRuleConfigurationBuilder().build()), database, 
mock(RuleMetaData.class)).rewrite(sqlRewriteContext, routeContext, 
queryContext);
+        assertThat(actual.getSqlRewriteUnits().size(), is(2));
+        assertThat(actual.getSqlRewriteUnits().get(firstRouteUnit).getSql(), 
is("SELECT ?"));
+        
assertThat(actual.getSqlRewriteUnits().get(firstRouteUnit).getParameters(), 
is(Collections.singletonList(1)));
+        assertThat(actual.getSqlRewriteUnits().get(secondRouteUnit).getSql(), 
is("SELECT ?"));
+        
assertThat(actual.getSqlRewriteUnits().get(secondRouteUnit).getParameters(), 
is(Collections.singletonList(1)));
+    }
+    
     @Test
     void assertRewriteWithGroupedParameterBuilderForBroadcast() {
         InsertStatementContext statementContext = 
mock(InsertStatementContext.class, RETURNS_DEEP_STUBS);

Reply via email to