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

panjuan 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 40b5076d63d Adjust sharding sql federation decider logic when execute 
cross join with pagination (#21386)
40b5076d63d is described below

commit 40b5076d63d21c0bb19cca16d4db211648b3c7f5
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sun Oct 9 15:01:54 2022 +0800

    Adjust sharding sql federation decider logic when execute cross join with 
pagination (#21386)
    
    * Adjust sharding sql federation decider logic when execute cross join with 
pagination
    
    * fix integration test
    
    * fix unit test
    
    * fix integration test
    
    * fix integration test
    
    * fix integration test
---
 .../decider/ShardingSQLFederationDecider.java      |  8 +++++++-
 .../decider/ShardingSQLFederationDeciderTest.java  | 22 +++++++++++++++++++---
 .../cases/dql/dql-integration-test-cases.xml       |  5 +++++
 3 files changed, 31 insertions(+), 4 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
index f6b00b118ae..4cb6662e000 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
@@ -22,6 +22,8 @@ import 
org.apache.shardingsphere.infra.binder.decider.SQLFederationDecider;
 import 
org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDeciderContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import 
org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType;
+import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.sharding.constant.ShardingOrder;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
@@ -48,7 +50,11 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
         }
         addTableDataNodes(deciderContext, rule, tableNames);
         ShardingConditions shardingConditions = 
createShardingConditions(queryContext, database, rule);
-        if (select.getPaginationContext().isHasPagination() || 
(shardingConditions.isNeedMerge() && 
shardingConditions.isSameShardingCondition())) {
+        // TODO remove this judge logic when we support issue#21392 
+        if (select.getPaginationContext().isHasPagination() && 
!(select.getDatabaseType() instanceof PostgreSQLDatabaseType) && 
!(select.getDatabaseType() instanceof OpenGaussDatabaseType)) {
+            return;
+        }
+        if (shardingConditions.isNeedMerge() && 
shardingConditions.isSameShardingCondition()) {
             return;
         }
         if (select.isContainsSubquery() || select.isContainsHaving() || 
select.isContainsCombine() || select.isContainsPartialDistinctAggregation()) {
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
index 43d229a3c75..5931abf6613 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
@@ -22,7 +22,7 @@ import 
org.apache.shardingsphere.infra.binder.decider.context.SQLFederationDecid
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.DefaultDatabase;
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
+import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
@@ -34,9 +34,9 @@ import java.util.Collections;
 import java.util.Optional;
 import java.util.Properties;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertFalse;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
@@ -161,10 +161,26 @@ public final class ShardingSQLFederationDeciderTest {
         assertTrue(actual.isUseSQLFederation());
     }
     
+    @Test
+    public void 
assertDecideWhenAllTablesIsNotBindingTablesAndContainsPagination() {
+        SelectStatementContext select = createStatementContext();
+        when(select.isContainsJoinQuery()).thenReturn(true);
+        when(select.getPaginationContext().isHasPagination()).thenReturn(true);
+        QueryContext queryContext = new QueryContext(select, "", 
Collections.emptyList());
+        SQLFederationDeciderContext actual = new SQLFederationDeciderContext();
+        ShardingSQLFederationDecider federationDecider = new 
ShardingSQLFederationDecider();
+        ShardingRule shardingRule = createShardingRule();
+        ShardingSphereDatabase database = createDatabase();
+        when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
+        federationDecider.decide(actual, queryContext, database, shardingRule, 
new ConfigurationProperties(new Properties()));
+        assertThat(actual.getDataNodes().size(), is(4));
+        assertTrue(actual.isUseSQLFederation());
+    }
+    
     private static SelectStatementContext createStatementContext() {
         SelectStatementContext result = mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS);
         
when(result.getTablesContext().getTableNames()).thenReturn(Arrays.asList("t_order",
 "t_order_item"));
-        when(result.getDatabaseType()).thenReturn(new MySQLDatabaseType());
+        when(result.getDatabaseType()).thenReturn(new 
PostgreSQLDatabaseType());
         return result;
     }
     
diff --git 
a/test/integration-test/test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
 
b/test/integration-test/test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
index 217855c4f74..0392a63c536 100644
--- 
a/test/integration-test/test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
+++ 
b/test/integration-test/test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
@@ -651,6 +651,11 @@
     <test-case sql="SELECT MAX(p.price) AS max_price, MIN(p.price) AS 
min_price, SUM(p.price) AS sum_price, AVG(p.price) AS avg_price, COUNT(1) AS 
count FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id INNER 
JOIN t_product p ON i.product_id = p.product_id GROUP BY o.order_id HAVING 
SUM(p.price) > ? ORDER BY max_price" db-types="PostgreSQL,openGauss" 
scenario-types="db">
         <assertion parameters="10000:int" 
expected-data-source-name="read_dataset" />
     </test-case>
+    
+    <test-case sql="SELECT * FROM t_order o CROSS JOIN t_order_item i WHERE 
o.user_id = ? ORDER BY o.order_id, 7 LIMIT 10, 10" db-types="openGauss" 
scenario-types="db">
+        <assertion parameters="10:int" 
expected-data-source-name="read_dataset" />
+    </test-case>
+    
 <!--    TODO FIX ME Expected: is "true" but was "1"-->
 <!--    <test-case sql="SELECT order_id, user_id, order_name, type_char, 
type_boolean, type_smallint, type_enum, type_decimal, type_date, type_time, 
type_timestamp FROM t_shadow WHERE user_id = ?" db-types="MySQL" 
scenario-types="sharding_and_shadow">-->
 <!--        <assertion parameters="1:int" 
expected-data-source-name="prod_dataset" />-->

Reply via email to