sandynz commented on issue #6729:
URL: https://github.com/apache/shardingsphere/issues/6729#issuecomment-671006899


   Reason analyze of "sql route to 2 physics tables, but not one".
   
   ```
   ShardingStandardRoutingEngine.java
       private Collection<DataNode> routeTables(final ShardingRule 
shardingRule, final TableRule tableRule, final String routedDataSource, final 
List<RouteValue> tableShardingValues) {
           Collection<String> availableTargetTables = 
tableRule.getActualTableNames(routedDataSource);
           Collection<String> routedTables = new 
LinkedHashSet<>(tableShardingValues.isEmpty() ? availableTargetTables
                   : 
shardingRule.getTableShardingStrategy(tableRule).doSharding(availableTargetTables,
 tableShardingValues, properties));
           Collection<DataNode> result = new LinkedList<>();
           for (String each : routedTables) {
               result.add(new DataNode(routedDataSource, each));
           }
           return result;
       }
   tableShardingValues is empty, just return availableTargetTables.
        
       private List<RouteValue> getShardingValuesFromShardingConditions(final 
ShardingRule shardingRule, final Collection<String> shardingColumns, final 
ShardingCondition shardingCondition) {
           List<RouteValue> result = new ArrayList<>(shardingColumns.size());
           for (RouteValue each : shardingCondition.getRouteValues()) {
               Optional<BindingTableRule> bindingTableRule = 
shardingRule.findBindingTableRule(logicTableName);
               if ((logicTableName.equals(each.getTableName()) || 
bindingTableRule.isPresent() && 
bindingTableRule.get().hasLogicTable(logicTableName)) 
                       && shardingColumns.contains(each.getColumnName())) {
                   result.add(each);
               }
           }
           return result;
       }
   shardingCondition.getRouteValues() result is empty, so result is empty.
   ```
   
   Trace shardingCondition.routeValues
   ```
   ShardingRouteDecorator.java
       private ShardingConditions getShardingConditions(final List<Object> 
parameters, final SQLStatementContext sqlStatementContext,
                                                        final SchemaMetaData 
schemaMetaData, final ShardingRule shardingRule) {
           if (sqlStatementContext.getSqlStatement() instanceof DMLStatement) {
               if (sqlStatementContext instanceof InsertStatementContext) {
                   return new ShardingConditions(new 
InsertClauseShardingConditionEngine(shardingRule, 
schemaMetaData).createShardingConditions((InsertStatementContext) 
sqlStatementContext, parameters));
               }
               return new ShardingConditions(new 
WhereClauseShardingConditionEngine(shardingRule, 
schemaMetaData).createShardingConditions(sqlStatementContext, parameters));
           }
           return new ShardingConditions(Collections.emptyList());
       }
   ```
   
   ```
   InsertClauseShardingConditionEngine.java
       private ShardingCondition createShardingCondition(final String 
tableName, final Iterator<String> columnNames, final InsertValueContext 
insertValueContext, final List<Object> parameters) {
           ShardingCondition result = new ShardingCondition();
           SPITimeService timeService = new SPITimeService();
           for (ExpressionSegment each : 
insertValueContext.getValueExpressions()) {
               String columnName = columnNames.next();
               if (shardingRule.isShardingColumn(columnName, tableName)) {
                   if (each instanceof SimpleExpressionSegment) {
                       result.getRouteValues().add(new 
ListRouteValue<>(columnName, tableName, 
Collections.singletonList(getRouteValue((SimpleExpressionSegment) each, 
parameters))));
                   } else if (ExpressionConditionUtils.isNowExpression(each)) {
                       result.getRouteValues().add(new 
ListRouteValue<>(columnName, tableName, 
Collections.singletonList(timeService.getTime())));
                   } else if (ExpressionConditionUtils.isNullExpression(each)) {
                       throw new ShardingSphereException("Insert clause 
sharding column can't be null.");
                   }
               }
           }
           return result;
       }
   insertValueContext.getValueExpressions() elements are 
CommonExpressionSegment,
   not instanceof SimpleExpressionSegment, it should be 
ParameterMarkerExpressionSegment,
   the same reason as problem 1.
   ```
   createShardingCondition example:
   ![createShardingCondition 
example](https://user-images.githubusercontent.com/42492540/89725272-45adc680-da40-11ea-80ef-4e3fc87dab34.png)
   
   
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to