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:

----------------------------------------------------------------
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]