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 6a29dba  optimize binding table route logic without sharding column in 
join condition (#13882)
6a29dba is described below

commit 6a29dba09a3bebeb145260b7c4312e769ced2d45
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Dec 1 21:01:01 2021 +0800

    optimize binding table route logic without sharding column in join 
condition (#13882)
---
 .../engine/type/ShardingRouteEngineFactory.java    | 115 ++++++++++++++++++---
 .../type/complex/ShardingComplexRoutingEngine.java |   4 +-
 .../shardingsphere/sharding/rule/ShardingRule.java |   9 +-
 .../complex/ShardingComplexRoutingEngineTest.java  |  12 +--
 .../dql/dataset/encrypt/select_join_encrypt.xml    |   3 -
 .../cases/dql/dql-integration-test-cases.xml       |  10 +-
 .../resources/scenario/sharding/case/select.xml    |   1 +
 7 files changed, 124 insertions(+), 30 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
index 917df12..cc9e2a9 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
@@ -19,12 +19,16 @@ package 
org.apache.shardingsphere.sharding.route.engine.type;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.binder.type.TableAvailable;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingConditions;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.value.ShardingConditionValue;
@@ -38,6 +42,12 @@ import 
org.apache.shardingsphere.sharding.route.engine.type.ignore.ShardingIgnor
 import 
org.apache.shardingsphere.sharding.route.engine.type.standard.ShardingStandardRoutingEngine;
 import 
org.apache.shardingsphere.sharding.route.engine.type.unicast.ShardingUnicastRoutingEngine;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import org.apache.shardingsphere.sharding.rule.TableRule;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.AnalyzeTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.DALStatement;
@@ -58,13 +68,20 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropTablesp
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.tcl.TCLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtil;
+import org.apache.shardingsphere.sql.parser.sql.common.util.WhereExtractUtil;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLCreateResourceGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLOptimizeTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLSetResourceGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
 
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -73,6 +90,8 @@ import java.util.stream.Collectors;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ShardingRouteEngineFactory {
     
+    private static final String EQUAL = "=";
+    
     /**
      * Create new instance of routing engine.
      *
@@ -98,7 +117,7 @@ public final class ShardingRouteEngineFactory {
         if (sqlStatement instanceof DCLStatement) {
             return getDCLRoutingEngine(shardingRule, metaData, 
sqlStatementContext);
         }
-        return getDQLRoutingEngine(shardingRule, sqlStatementContext, 
shardingConditions, props);
+        return getDQLRoutingEngine(shardingRule, metaData.getSchema(), 
sqlStatementContext, shardingConditions, props);
     }
     
     private static ShardingRouteEngine getDDLRoutingEngine(final ShardingRule 
shardingRule, final ShardingSphereMetaData metaData, final 
SQLStatementContext<?> sqlStatementContext) {
@@ -175,7 +194,7 @@ public final class ShardingRouteEngineFactory {
         return false;
     }
     
-    private static ShardingRouteEngine getDQLRoutingEngine(final ShardingRule 
shardingRule, final SQLStatementContext<?> sqlStatementContext, 
+    private static ShardingRouteEngine getDQLRoutingEngine(final ShardingRule 
shardingRule, final ShardingSphereSchema schema, final SQLStatementContext<?> 
sqlStatementContext, 
                                                            final 
ShardingConditions shardingConditions, final ConfigurationProperties props) {
         Collection<String> tableNames = 
sqlStatementContext.getTablesContext().getTableNames();
         if (shardingRule.isAllBroadcastTables(tableNames)) {
@@ -188,19 +207,20 @@ public final class ShardingRouteEngineFactory {
         if (shardingLogicTableNames.isEmpty()) {
             return new ShardingIgnoreRoutingEngine();
         }
-        return getDQLRouteEngineForShardingTable(shardingRule, 
sqlStatementContext, shardingConditions, shardingLogicTableNames, props);
+        return getDQLRouteEngineForShardingTable(shardingRule, schema, 
sqlStatementContext, shardingConditions, props, shardingLogicTableNames);
     }
     
-    private static ShardingRouteEngine getDQLRouteEngineForShardingTable(final 
ShardingRule shardingRule, final SQLStatementContext<?> sqlStatementContext, 
-                                                                         final 
ShardingConditions shardingConditions, final Collection<String> tableNames, 
final ConfigurationProperties props) {
-        if (isShardingFederatedQuery(sqlStatementContext, tableNames, 
shardingRule, shardingConditions, props)) {
+    private static ShardingRouteEngine getDQLRouteEngineForShardingTable(final 
ShardingRule shardingRule, final ShardingSphereSchema schema, final 
SQLStatementContext<?> sqlStatementContext, 
+                                                                         final 
ShardingConditions shardingConditions, final ConfigurationProperties props, 
final Collection<String> tableNames) {
+        boolean allBindingTables = tableNames.size() > 1 && 
isAllBindingTables(shardingRule, schema, sqlStatementContext, tableNames);
+        if (isShardingFederatedQuery(shardingRule, sqlStatementContext, 
shardingConditions, props, tableNames, allBindingTables)) {
             return new ShardingFederatedRoutingEngine(tableNames);
         }
-        if (isShardingStandardQuery(tableNames, shardingRule)) {
+        if (isShardingStandardQuery(shardingRule, tableNames, 
allBindingTables)) {
             return new 
ShardingStandardRoutingEngine(getLogicTableName(shardingConditions, 
tableNames), shardingConditions, props);
         }
         // TODO config for cartesian set
-        return new ShardingComplexRoutingEngine(tableNames, 
shardingConditions, props);
+        return new ShardingComplexRoutingEngine(shardingConditions, props, 
tableNames);
     }
     
     private static String getLogicTableName(final ShardingConditions 
shardingConditions, final Collection<String> tableNames) {
@@ -212,12 +232,12 @@ public final class ShardingRouteEngineFactory {
         return tableNames.iterator().next();
     }
     
-    private static boolean isShardingStandardQuery(final Collection<String> 
tableNames, final ShardingRule shardingRule) {
-        return 1 == tableNames.size() && 
shardingRule.isAllShardingTables(tableNames) || 
shardingRule.isAllBindingTables(tableNames);
+    private static boolean isShardingStandardQuery(final ShardingRule 
shardingRule, final Collection<String> tableNames, final boolean 
allBindingTables) {
+        return 1 == tableNames.size() && 
shardingRule.isAllShardingTables(tableNames) || allBindingTables;
     }
     
-    private static boolean isShardingFederatedQuery(final 
SQLStatementContext<?> sqlStatementContext, final Collection<String> 
tableNames, 
-                                                    final ShardingRule 
shardingRule, final ShardingConditions shardingConditions, final 
ConfigurationProperties props) {
+    private static boolean isShardingFederatedQuery(final ShardingRule 
shardingRule, final SQLStatementContext<?> sqlStatementContext, final 
ShardingConditions shardingConditions, 
+                                                    final 
ConfigurationProperties props, final Collection<String> tableNames, final 
boolean allBindingTables) {
         boolean sqlFederationEnabled = 
props.getValue(ConfigurationPropertyKey.SQL_FEDERATION_ENABLED);
         if (!sqlFederationEnabled || !(sqlStatementContext instanceof 
SelectStatementContext)) {
             return false;
@@ -232,6 +252,75 @@ public final class ShardingRouteEngineFactory {
         if (!select.isContainsJoinQuery() || 
shardingRule.isAllTablesInSameDataSource(tableNames)) {
             return false;
         }
-        return tableNames.size() > 1 && 
!shardingRule.isAllBindingTables(tableNames);
+        return tableNames.size() > 1 && !allBindingTables;
+    }
+    
+    private static boolean isAllBindingTables(final ShardingRule shardingRule, 
final ShardingSphereSchema schema, 
+                                              final SQLStatementContext<?> 
sqlStatementContext, final Collection<String> tableNames) {
+        if (!(sqlStatementContext instanceof SelectStatementContext)) {
+            return shardingRule.isAllBindingTables(tableNames); 
+        }
+        return shardingRule.isAllBindingTables(tableNames) && 
isJoinConditionContainsShardingColumns(shardingRule, schema, 
(SelectStatementContext) sqlStatementContext, tableNames);
+    }
+    
+    private static boolean isJoinConditionContainsShardingColumns(final 
ShardingRule shardingRule, final ShardingSphereSchema schema,
+                                                                  final 
SelectStatementContext select, final Collection<String> tableNames) {
+        Collection<String> databaseJoinConditionTables = new 
HashSet<>(tableNames.size());
+        Collection<String> tableJoinConditionTables = new 
HashSet<>(tableNames.size());
+        for (WhereSegment each : 
WhereExtractUtil.getJoinWhereSegments(select.getSqlStatement())) {
+            Collection<AndPredicate> andPredicates = 
ExpressionExtractUtil.getAndPredicates(each.getExpr());
+            if (andPredicates.size() > 1) {
+                return false;
+            }
+            for (AndPredicate andPredicate : andPredicates) {
+                
databaseJoinConditionTables.addAll(getJoinConditionTables(shardingRule, schema, 
select, andPredicate.getPredicates(), true));
+                
tableJoinConditionTables.addAll(getJoinConditionTables(shardingRule, schema, 
select, andPredicate.getPredicates(), false));
+            }
+        }
+        TableRule tableRule = 
shardingRule.getTableRule(tableNames.iterator().next());
+        boolean containsDatabaseShardingColumns = 
!(tableRule.getDatabaseShardingStrategyConfig() instanceof 
StandardShardingStrategyConfiguration) 
+                || databaseJoinConditionTables.containsAll(tableNames);
+        boolean containsTableShardingColumns = 
!(tableRule.getTableShardingStrategyConfig() instanceof 
StandardShardingStrategyConfiguration) || 
tableJoinConditionTables.containsAll(tableNames);
+        return containsDatabaseShardingColumns && containsTableShardingColumns;
+    }
+    
+    private static Collection<String> getJoinConditionTables(final 
ShardingRule shardingRule, final ShardingSphereSchema schema, final 
SelectStatementContext select, 
+                                                             final 
Collection<ExpressionSegment> predicates, final boolean 
isDatabaseJoinCondition) {
+        Collection<String> result = new LinkedList<>();
+        for (ExpressionSegment expression : predicates) {
+            if (!isJoinTableConditionExpression(expression)) {
+                continue;
+            }
+            ColumnProjection leftColumn = 
buildColumnProjection((ColumnSegment) ((BinaryOperationExpression) 
expression).getLeft());
+            ColumnProjection rightColumn = 
buildColumnProjection((ColumnSegment) ((BinaryOperationExpression) 
expression).getRight());
+            Map<String, String> columnTableNames = 
select.getTablesContext().findTableName(Arrays.asList(leftColumn, rightColumn), 
schema);
+            Optional<TableRule> leftTableRule = 
shardingRule.findTableRule(columnTableNames.get(leftColumn.getExpression()));
+            Optional<TableRule> rightTableRule = 
shardingRule.findTableRule(columnTableNames.get(rightColumn.getExpression()));
+            if (!leftTableRule.isPresent() || !rightTableRule.isPresent()) {
+                continue;
+            }
+            ShardingStrategyConfiguration leftConfiguration = 
isDatabaseJoinCondition
+                    ? 
shardingRule.getDatabaseShardingStrategyConfiguration(leftTableRule.get()) : 
shardingRule.getTableShardingStrategyConfiguration(leftTableRule.get());
+            ShardingStrategyConfiguration rightConfiguration = 
isDatabaseJoinCondition
+                    ? 
shardingRule.getDatabaseShardingStrategyConfiguration(rightTableRule.get()) : 
shardingRule.getTableShardingStrategyConfiguration(rightTableRule.get());
+            if (shardingRule.isShardingColumn(leftConfiguration, 
leftColumn.getName()) && shardingRule.isShardingColumn(rightConfiguration, 
rightColumn.getName())) {
+                result.add(columnTableNames.get(leftColumn.getExpression()));
+                result.add(columnTableNames.get(rightColumn.getExpression()));
+            }
+        }
+        return result;
+    }
+    
+    private static ColumnProjection buildColumnProjection(final ColumnSegment 
segment) {
+        String owner = segment.getOwner().map(optional -> 
optional.getIdentifier().getValue()).orElse(null);
+        return new ColumnProjection(owner, segment.getIdentifier().getValue(), 
null);
+    }
+    
+    private static boolean isJoinTableConditionExpression(final 
ExpressionSegment expression) {
+        if (!(expression instanceof BinaryOperationExpression)) {
+            return false;
+        }
+        BinaryOperationExpression binaryExpression = 
(BinaryOperationExpression) expression;
+        return binaryExpression.getLeft() instanceof ColumnSegment && 
binaryExpression.getRight() instanceof ColumnSegment && 
EQUAL.equals(binaryExpression.getOperator());
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/complex/ShardingComplexRoutingEngine.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/complex/ShardingComplexRoutingEngine.java
index f04c15c..f096952 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/complex/ShardingComplexRoutingEngine.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/complex/ShardingComplexRoutingEngine.java
@@ -38,11 +38,11 @@ import java.util.TreeSet;
 @RequiredArgsConstructor
 public final class ShardingComplexRoutingEngine implements ShardingRouteEngine 
{
     
-    private final Collection<String> logicTables;
-    
     private final ShardingConditions shardingConditions;
     
     private final ConfigurationProperties props;
+
+    private final Collection<String> logicTables;
     
     @Override
     public RouteContext route(final ShardingRule shardingRule) {
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index 7f8ec33..ff4b9b9 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -366,7 +366,14 @@ public final class ShardingRule implements SchemaRule, 
DataNodeContainedRule, Ta
         return 
isShardingColumn(getDatabaseShardingStrategyConfiguration(tableRule), 
columnName) || 
isShardingColumn(getTableShardingStrategyConfiguration(tableRule), columnName);
     }
     
-    private boolean isShardingColumn(final ShardingStrategyConfiguration 
shardingStrategyConfig, final String columnName) {
+    /**
+     * Judge whether given logic table column is sharding column or not.
+     * 
+     * @param shardingStrategyConfig sharding strategy config
+     * @param columnName column name
+     * @return whether given logic table column is sharding column or not
+     */
+    public boolean isShardingColumn(final ShardingStrategyConfiguration 
shardingStrategyConfig, final String columnName) {
         if (shardingStrategyConfig instanceof 
StandardShardingStrategyConfiguration) {
             String shardingColumn = null == 
((StandardShardingStrategyConfiguration) 
shardingStrategyConfig).getShardingColumn()
                     ? defaultShardingColumn : 
((StandardShardingStrategyConfiguration) 
shardingStrategyConfig).getShardingColumn();
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/complex/ShardingComplexRoutingEngineTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/complex/ShardingComplexRoutingEngineTest.java
index ee88a9b..2e325ee 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/complex/ShardingComplexRoutingEngineTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/complex/ShardingComplexRoutingEngineTest.java
@@ -39,8 +39,8 @@ public final class ShardingComplexRoutingEngineTest extends 
AbstractRoutingEngin
     
     @Test
     public void assertRoutingForBindingTables() {
-        ShardingComplexRoutingEngine complexRoutingEngine = new 
ShardingComplexRoutingEngine(Arrays.asList("t_order", "t_order_item"), 
-                createShardingConditions("t_order"), new 
ConfigurationProperties(new Properties()));
+        ShardingComplexRoutingEngine complexRoutingEngine = new 
ShardingComplexRoutingEngine(createShardingConditions("t_order"), 
+                new ConfigurationProperties(new Properties()), 
Arrays.asList("t_order", "t_order_item"));
         RouteContext routeContext = 
complexRoutingEngine.route(createBindingShardingRule());
         List<RouteUnit> routeUnits = new 
ArrayList<>(routeContext.getRouteUnits());
         assertThat(routeContext.getRouteUnits().size(), is(1));
@@ -52,8 +52,8 @@ public final class ShardingComplexRoutingEngineTest extends 
AbstractRoutingEngin
     
     @Test
     public void assertRoutingForShardingTableJoinBroadcastTable() {
-        ShardingComplexRoutingEngine complexRoutingEngine = new 
ShardingComplexRoutingEngine(Arrays.asList("t_order", "t_config"),
-                createShardingConditions("t_order"), new 
ConfigurationProperties(new Properties()));
+        ShardingComplexRoutingEngine complexRoutingEngine = new 
ShardingComplexRoutingEngine(createShardingConditions("t_order"), 
+                new ConfigurationProperties(new Properties()), 
Arrays.asList("t_order", "t_config"));
         RouteContext routeContext = 
complexRoutingEngine.route(createBroadcastShardingRule());
         List<RouteUnit> routeUnits = new 
ArrayList<>(routeContext.getRouteUnits());
         assertThat(routeContext.getRouteUnits().size(), is(1));
@@ -65,8 +65,8 @@ public final class ShardingComplexRoutingEngineTest extends 
AbstractRoutingEngin
     
     @Test(expected = ShardingSphereException.class)
     public void assertRoutingForNonLogicTable() {
-        ShardingComplexRoutingEngine complexRoutingEngine = new 
ShardingComplexRoutingEngine(Collections.emptyList(), 
-                createShardingConditions("t_order"), new 
ConfigurationProperties(new Properties()));
+        ShardingComplexRoutingEngine complexRoutingEngine = new 
ShardingComplexRoutingEngine(createShardingConditions("t_order"), 
+                new ConfigurationProperties(new Properties()), 
Collections.emptyList());
         RouteContext routeContext = 
complexRoutingEngine.route(mock(ShardingRule.class));
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/encrypt/select_join_encrypt.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/encrypt/select_join_encrypt.xml
index a105cb0..3556aa4 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/encrypt/select_join_encrypt.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/encrypt/select_join_encrypt.xml
@@ -26,8 +26,5 @@
         <column name="status" />
         <column name="creation_date" />
     </metadata>
-    <row values="10, 10000, a10, init, 100000, 10, init, 2017-08-08" />
     <row values="11, 11000, b11, init, 110000, 11, init, 2017-08-08" />
-    <row values="12, 12000, c12, init, 120000, 12, init, 2017-08-08" />
-    <row values="13, 13000, d13, init, 130000, 13, init, 2017-08-08" />
 </dataset>
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
index caf3b16..0eff84c 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
@@ -99,15 +99,15 @@
         <assertion parameters="100001:int" 
expected-data-file="select_alias_as_keyword.xml" />
     </test-case>
     
-    <test-case sql="SELECT i.* FROM t_order o FORCE INDEX(order_index) JOIN 
t_order_item i ON o.order_id=i.order_id WHERE o.order_id = ?" db-types="MySQL" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
+    <test-case sql="SELECT i.* FROM t_order o FORCE INDEX(order_index) JOIN 
t_order_item i ON o.order_id=i.order_id AND o.user_id = i.user_id WHERE 
o.order_id = ?" db-types="MySQL" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
         <assertion parameters="1000:int" 
expected-data-file="select_with_force_index_join.xml" />
     </test-case>
 
-    <test-case sql="SELECT i.* FROM t_order o FORCE INDEX(order_index) JOIN 
t_order_item i ON o.order_id=i.order_id AND o.order_id = ?" db-types="MySQL" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
+    <test-case sql="SELECT i.* FROM t_order o FORCE INDEX(order_index) JOIN 
t_order_item i ON o.order_id=i.order_id AND o.user_id = i.user_id AND 
o.order_id = ?" db-types="MySQL" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
         <assertion parameters="1000:int" 
expected-data-file="select_with_force_index_join.xml" />
     </test-case>
 
-    <test-case sql="SELECT i.* FROM t_order o FORCE INDEX(order_index) JOIN 
t_order_item i ON o.order_id=i.order_id AND o.order_id in (?,?)" 
db-types="MySQL" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
+    <test-case sql="SELECT i.* FROM t_order o FORCE INDEX(order_index) JOIN 
t_order_item i ON o.order_id=i.order_id AND o.user_id = i.user_id AND 
o.order_id in (?,?)" db-types="MySQL" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
         <assertion parameters="1000:int,1001:int" 
expected-data-file="select_in_with_force_index_join.xml" />
     </test-case>
 
@@ -487,7 +487,7 @@
         <assertion expected-data-file="select_with_case_expression.xml" />
     </test-case>
     
-    <test-case sql="SELECT * FROM t_order o LEFT JOIN t_order_item m ON 
o.order_id = m.order_id" db-types="MySQL,H2" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
+    <test-case sql="SELECT * FROM t_order o LEFT JOIN t_order_item m ON 
o.order_id = m.order_id AND o.user_id = m.user_id" db-types="MySQL,H2" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
         <assertion expected-data-file="select_for_left_join.xml"/>
     </test-case>
     
@@ -513,7 +513,7 @@
         <assertion expected-data-file="select_in_or_encrypt.xml"/>
     </test-case>
     
-    <test-case sql="SELECT * FROM t_user u INNER JOIN t_user_item m ON 
u.user_id=m.user_id" 
scenario-types="encrypt,dbtbl_with_readwrite_splitting_and_encrypt">
+    <test-case sql="SELECT * FROM t_user u INNER JOIN t_user_item m ON 
u.user_id=m.user_id WHERE u.user_id IN (0, 11, 22, 33, 44, 55, 66, 77, 88, 99)" 
scenario-types="encrypt,dbtbl_with_readwrite_splitting_and_encrypt">
         <assertion expected-data-file="select_join_encrypt.xml"/>
     </test-case>
 
diff --git 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/sharding/case/select.xml
 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/sharding/case/select.xml
index 7995f25..f0b0d22 100644
--- 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/sharding/case/select.xml
+++ 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/sharding/case/select.xml
@@ -504,6 +504,7 @@
 
     <rewrite-assertion id="select_multi_nested_subquery_with_binding_tables" 
db-types="MySQL,PostgreSQL,openGauss,SQLServer,SQL92">
         <input sql="SELECT * FROM (SELECT id, content FROM t_user WHERE id = ? 
AND content IN (SELECT content FROM t_user_extend WHERE user_id = ?)) AS temp" 
parameters="1, 1"/>
+        <output sql="SELECT * FROM (SELECT id, content FROM t_user_0 WHERE id 
= ? AND content IN (SELECT content FROM t_user_extend_0 WHERE user_id = ?)) AS 
temp" parameters="1, 1"/>
         <output sql="SELECT * FROM (SELECT id, content FROM t_user_1 WHERE id 
= ? AND content IN (SELECT content FROM t_user_extend_1 WHERE user_id = ?)) AS 
temp" parameters="1, 1"/>
     </rewrite-assertion>
     

Reply via email to