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);