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" />-->