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 0abc3a8  fix SingleTableDataNode concurrent exception (#13686)
0abc3a8 is described below

commit 0abc3a8b072e584263af6dda868e720470c13f20
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Nov 18 19:15:07 2021 +0800

    fix SingleTableDataNode concurrent exception (#13686)
---
 .../engine/fixture/AbstractRoutingEngineTest.java   |  2 +-
 .../type/AlterTableStatementSchemaRefresher.java    |  4 ++--
 .../type/CreateTableStatementSchemaRefresher.java   |  2 +-
 .../type/CreateViewStatementSchemaRefresher.java    |  2 +-
 .../type/DropTableStatementSchemaRefresher.java     |  2 +-
 .../type/DropViewStatementSchemaRefresher.java      |  2 +-
 .../rule/identifier/type/MutableDataNodeRule.java   |  6 +++---
 .../optimize/metadata/FederationSchemaMetaData.java | 15 ++++++++-------
 .../type/AlterTableFederationMetaDataRefresher.java |  4 ++--
 .../CreateTableFederationMetaDataRefresher.java     |  2 +-
 .../singletable/rule/SingleTableDataNodeLoader.java |  6 +++---
 .../singletable/rule/SingleTableRule.java           | 21 +++++++++++----------
 .../rule/SingleTableDataNodeLoaderTest.java         |  6 ------
 .../singletable/rule/SingleTableRuleTest.java       | 12 +++++-------
 .../EncryptSQLRewriterParameterizedTest.java        |  4 ++--
 .../ShardingSQLRewriterParameterizedTest.java       |  4 ++--
 16 files changed, 44 insertions(+), 50 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/fixture/AbstractRoutingEngineTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/fixture/AbstractRoutingEngineTest.java
index 157f695..61a1e88 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/fixture/AbstractRoutingEngineTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/fixture/AbstractRoutingEngineTest.java
@@ -244,7 +244,7 @@ public abstract class AbstractRoutingEngineTest {
     protected SingleTableRule createAllSingleTableRule(final 
Collection<ShardingSphereRule> rules) {
         Map<String, DataSource> dataSourceMap = createDataSourceMapWithMain();
         SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class), dataSourceMap, rules, 
new ConfigurationProperties(new Properties()));
-        singleTableRule.addDataNode("t_category", 
dataSourceMap.keySet().iterator().next());
+        singleTableRule.put("t_category", 
dataSourceMap.keySet().iterator().next());
         return singleTableRule;
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/AlterTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/AlterTableStatementSchemaRefresher.java
index 9c44379..9204f44 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/AlterTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/AlterTableStatementSchemaRefresher.java
@@ -51,13 +51,13 @@ public final class AlterTableStatementSchemaRefresher 
implements SchemaRefresher
     
     private void removeTableMetaData(final ShardingSphereMetaData 
schemaMetaData, final String tableName) {
         schemaMetaData.getSchema().remove(tableName);
-        
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each
 -> each.dropDataNode(tableName));
+        
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each
 -> each.remove(tableName));
     }
     
     private void putTableMetaData(final ShardingSphereMetaData schemaMetaData, 
                                   final Collection<String> 
logicDataSourceNames, final String tableName, final ConfigurationProperties 
props) throws SQLException {
         if (!containsInDataNodeContainedRule(tableName, schemaMetaData)) {
-            
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each
 -> each.addDataNode(tableName, logicDataSourceNames.iterator().next()));
+            
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each
 -> each.put(tableName, logicDataSourceNames.iterator().next()));
         }
         SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
                 schemaMetaData.getResource().getDatabaseType(), 
schemaMetaData.getResource().getDataSources(), 
schemaMetaData.getRuleMetaData().getRules(), props);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
index 29682a4..33fabd0 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
@@ -42,7 +42,7 @@ public final class CreateTableStatementSchemaRefresher 
implements SchemaRefreshe
                         final CreateTableStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
         String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue();
         if (!containsInDataNodeContainedRule(tableName, schemaMetaData)) {
-            
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each
 -> each.addDataNode(tableName, logicDataSourceNames.iterator().next()));
+            
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each
 -> each.put(tableName, logicDataSourceNames.iterator().next()));
         }
         SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
                 schemaMetaData.getResource().getDatabaseType(), 
schemaMetaData.getResource().getDataSources(), 
schemaMetaData.getRuleMetaData().getRules(), props);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
index ebb08a5..32581a0 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateViewStatementSchemaRefresher.java
@@ -38,7 +38,7 @@ public final class CreateViewStatementSchemaRefresher 
implements SchemaRefresher
         TableMetaData tableMetaData = new TableMetaData();
         schemaMetaData.getSchema().put(viewName, tableMetaData);
         if (!containsInDataNodeContainedRule(viewName, schemaMetaData)) {
-            
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each
 -> each.addDataNode(viewName, logicDataSourceNames.iterator().next()));
+            
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each
 -> each.put(viewName, logicDataSourceNames.iterator().next()));
         }
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropTableStatementSchemaRefresher.java
index 1c77c54..d2ae933 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropTableStatementSchemaRefresher.java
@@ -36,7 +36,7 @@ public final class DropTableStatementSchemaRefresher 
implements SchemaRefresher<
         sqlStatement.getTables().forEach(each -> 
schemaMetaData.getSchema().remove(each.getTableName().getIdentifier().getValue()));
         Collection<MutableDataNodeRule> rules = 
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class);
         for (SimpleTableSegment each : sqlStatement.getTables()) {
-            rules.forEach(rule -> 
rule.dropDataNode(each.getTableName().getIdentifier().getValue()));
+            rules.forEach(rule -> 
rule.remove(each.getTableName().getIdentifier().getValue()));
         }
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
index 3169b58..2893418 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/DropViewStatementSchemaRefresher.java
@@ -36,7 +36,7 @@ public final class DropViewStatementSchemaRefresher 
implements SchemaRefresher<D
         sqlStatement.getViews().forEach(each -> 
schemaMetaData.getSchema().remove(each.getTableName().getIdentifier().getValue()));
         Collection<MutableDataNodeRule> rules = 
schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class);
         for (SimpleTableSegment each : sqlStatement.getViews()) {
-            rules.forEach(rule -> 
rule.dropDataNode(each.getTableName().getIdentifier().getValue()));
+            rules.forEach(rule -> 
rule.remove(each.getTableName().getIdentifier().getValue()));
         }
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
index 90b6e10..d4628da 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
@@ -30,12 +30,12 @@ public interface MutableDataNodeRule extends 
ShardingSphereRule {
      * @param tableName table name
      * @param dataSourceName data source name
      */
-    void addDataNode(String tableName, String dataSourceName);
+    void put(String tableName, String dataSourceName);
     
     /**
-     * Drop data node.
+     * Remove data node.
      *
      * @param tableName table name
      */
-    void dropDataNode(String tableName);
+    void remove(String tableName);
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/FederationSchemaMetaData.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/FederationSchemaMetaData.java
index 63aedec..e1e83ad 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/FederationSchemaMetaData.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/FederationSchemaMetaData.java
@@ -20,9 +20,9 @@ package org.apache.shardingsphere.infra.optimize.metadata;
 import lombok.Getter;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Federation schema meta data.
@@ -32,30 +32,31 @@ public final class FederationSchemaMetaData {
     
     private final String name;
     
-    private final Map<String, FederationTableMetaData> tables = new 
LinkedHashMap<>();
+    private final Map<String, FederationTableMetaData> tables;
     
     public FederationSchemaMetaData(final String name, final Map<String, 
TableMetaData> metaData) {
         this.name = name;
+        this.tables = new ConcurrentHashMap<>(metaData.size(), 1);
         for (Entry<String, TableMetaData> entry : metaData.entrySet()) {
-            tables.put(entry.getKey(), new 
FederationTableMetaData(entry.getValue().getName(), entry.getValue()));
+            tables.put(entry.getKey().toLowerCase(), new 
FederationTableMetaData(entry.getValue().getName(), entry.getValue()));
         }
     }
     
     /**
-     * Update table meta data.
+     * Add table meta data.
      * 
      * @param metaData table meta data to be updated
      */
-    public synchronized void update(final TableMetaData metaData) {
+    public void put(final TableMetaData metaData) {
         tables.put(metaData.getName().toLowerCase(), new 
FederationTableMetaData(metaData.getName(), metaData));
     }
     
     /**
-     * Remove table.
+     * Remove table meta data.
      * 
      * @param tableName table name to be removed
      */
-    public synchronized void remove(final String tableName) {
+    public void remove(final String tableName) {
         tables.remove(tableName.toLowerCase());
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/type/AlterTableFederationMetaDataRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/type/AlterTableFederationMetaDataRefresher.java
index fef18a1..5bc8c60 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/type/AlterTableFederationMetaDataRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/type/AlterTableFederationMetaDataRefresher.java
@@ -40,10 +40,10 @@ public final class AlterTableFederationMetaDataRefresher 
implements FederationMe
         String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue();
         if (sqlStatement.getRenameTable().isPresent()) {
             String renameTableName = 
sqlStatement.getRenameTable().get().getTableName().getIdentifier().getValue();
-            buildTableMetaData(materials, 
renameTableName).ifPresent(schema::update);
+            buildTableMetaData(materials, 
renameTableName).ifPresent(schema::put);
             schema.remove(tableName);
         } else {
-            buildTableMetaData(materials, tableName).ifPresent(schema::update);
+            buildTableMetaData(materials, tableName).ifPresent(schema::put);
         }
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/type/CreateTableFederationMetaDataRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/type/CreateTableFederationMetaDataRefresher.java
index 72f6a8f..5335512 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/type/CreateTableFederationMetaDataRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/metadata/refresher/type/CreateTableFederationMetaDataRefresher.java
@@ -38,6 +38,6 @@ public final class CreateTableFederationMetaDataRefresher 
implements FederationM
                         final CreateTableStatement sqlStatement, final 
SchemaBuilderMaterials materials) throws SQLException {
         String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue();
         
Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName),
 materials).get(tableName))
-                .map(each -> 
TableMetaDataBuilder.decorateFederationTableMetaData(each, 
materials.getRules())).ifPresent(schema::update);
+                .map(each -> 
TableMetaDataBuilder.decorateFederationTableMetaData(each, 
materials.getRules())).ifPresent(schema::put);
     }
 }
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoader.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoader.java
index 3bdad25..28ae298 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoader.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoader.java
@@ -32,7 +32,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Single table data node loader.
@@ -51,12 +51,12 @@ public final class SingleTableDataNodeLoader {
      */
     public static Map<String, SingleTableDataNode> load(final DatabaseType 
databaseType, final Map<String, DataSource> dataSourceMap, 
                                                         final 
Collection<String> excludedTables, final ConfigurationProperties props) {
-        Map<String, SingleTableDataNode> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+        Map<String, SingleTableDataNode> result = new ConcurrentHashMap<>();
         boolean checkDuplicateTable = 
props.getValue(ConfigurationPropertyKey.CHECK_DUPLICATE_TABLE_ENABLED);
         for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
             Map<String, SingleTableDataNode> dataNodeMap = load(databaseType, 
entry.getKey(), entry.getValue(), excludedTables);
             for (String each : dataNodeMap.keySet()) {
-                SingleTableDataNode existDataNode = result.putIfAbsent(each, 
dataNodeMap.get(each));
+                SingleTableDataNode existDataNode = 
result.putIfAbsent(each.toLowerCase(), dataNodeMap.get(each));
                 if (checkDuplicateTable) {
                     Preconditions.checkState(null == existDataNode, "Single 
table conflict, there are multiple tables `%s` existed.", each);
                 }
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
index bcdd6ed..3de700f 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
@@ -94,7 +94,8 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
      * @return whether single tables are in same data source or not
      */
     public boolean isSingleTablesInSameDataSource(final Collection<String> 
singleTableNames) {
-        Set<String> dataSourceNames = 
singleTableNames.stream().map(singleTableDataNodes::get).filter(Objects::nonNull).map(SingleTableDataNode::getDataSourceName).collect(Collectors.toSet());
+        Set<String> dataSourceNames = singleTableNames.stream().map(each -> 
singleTableDataNodes.get(each.toLowerCase()))
+                
.filter(Objects::nonNull).map(SingleTableDataNode::getDataSourceName).collect(Collectors.toSet());
         return dataSourceNames.size() <= 1;
     }
     
@@ -109,7 +110,7 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
         if (!isSingleTablesInSameDataSource(singleTableNames)) {
             return false;
         }
-        SingleTableDataNode dataNode = 
singleTableDataNodes.get(singleTableNames.iterator().next());
+        SingleTableDataNode dataNode = 
singleTableDataNodes.get(singleTableNames.iterator().next().toLowerCase());
         for (RouteUnit each : routeContext.getRouteUnits()) {
             if 
(!each.getDataSourceMapper().getLogicName().equals(dataNode.getDataSourceName()))
 {
                 return false;
@@ -134,19 +135,19 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
      * @return sharding logic table names
      */
     public Collection<String> getSingleTableNames(final Collection<String> 
logicTableNames) {
-        return 
logicTableNames.stream().filter(singleTableDataNodes::containsKey).collect(Collectors.toCollection(LinkedList::new));
+        return logicTableNames.stream().filter(each -> 
singleTableDataNodes.containsKey(each.toLowerCase())).collect(Collectors.toCollection(LinkedList::new));
     }
     
     @Override
-    public void addDataNode(final String tableName, final String 
dataSourceName) {
-        if (dataSourceNames.contains(dataSourceName) && 
!singleTableDataNodes.containsKey(tableName)) {
-            singleTableDataNodes.put(tableName, new 
SingleTableDataNode(tableName, dataSourceName));
+    public void put(final String tableName, final String dataSourceName) {
+        if (dataSourceNames.contains(dataSourceName)) {
+            singleTableDataNodes.put(tableName.toLowerCase(), new 
SingleTableDataNode(tableName, dataSourceName));
         }
     }
     
     @Override
-    public void dropDataNode(final String tableName) {
-        singleTableDataNodes.remove(tableName);
+    public void remove(final String tableName) {
+        singleTableDataNodes.remove(tableName.toLowerCase());
     }
     
     private Collection<String> getExcludedTables(final 
Collection<ShardingSphereRule> rules) {
@@ -187,12 +188,12 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
     
     @Override
     public Collection<String> getAllTables() {
-        return singleTableDataNodes.keySet();
+        return 
singleTableDataNodes.values().stream().map(SingleTableDataNode::getTableName).collect(Collectors.toList());
     }
     
     @Override
     public Collection<String> getTables() {
-        return singleTableDataNodes.keySet();
+        return 
singleTableDataNodes.values().stream().map(SingleTableDataNode::getTableName).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoaderTest.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoaderTest.java
index dfaf7a1..3d383f1 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoaderTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoaderTest.java
@@ -109,11 +109,8 @@ public final class SingleTableDataNodeLoaderTest {
         assertFalse(dataNodeMap.containsKey("salary"));
         assertFalse(dataNodeMap.containsKey("student"));
         assertTrue(dataNodeMap.containsKey("dept"));
-        assertTrue(dataNodeMap.containsKey("DEPT"));
         assertTrue(dataNodeMap.containsKey("teacher"));
-        assertTrue(dataNodeMap.containsKey("TEACHER"));
         assertTrue(dataNodeMap.containsKey("class"));
-        assertTrue(dataNodeMap.containsKey("CLASS"));
         assertThat(dataNodeMap.get("dept").getDataSourceName(), is("ds0"));
         assertThat(dataNodeMap.get("teacher").getDataSourceName(), is("ds1"));
         assertThat(dataNodeMap.get("class").getDataSourceName(), is("ds1"));
@@ -138,11 +135,8 @@ public final class SingleTableDataNodeLoaderTest {
         assertFalse(dataNodeMap.containsKey("salary"));
         assertFalse(dataNodeMap.containsKey("student"));
         assertTrue(dataNodeMap.containsKey("dept"));
-        assertTrue(dataNodeMap.containsKey("DEPT"));
         assertTrue(dataNodeMap.containsKey("teacher"));
-        assertTrue(dataNodeMap.containsKey("TEACHER"));
         assertTrue(dataNodeMap.containsKey("class"));
-        assertTrue(dataNodeMap.containsKey("CLASS"));
         assertThat(dataNodeMap.get("dept").getDataSourceName(), is("ds0"));
         assertThat(dataNodeMap.get("teacher").getDataSourceName(), is("ds1"));
         assertThat(dataNodeMap.get("class").getDataSourceName(), is("ds1"));
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableRuleTest.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableRuleTest.java
index 79a2794..9cd1881 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableRuleTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableRuleTest.java
@@ -30,7 +30,6 @@ import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -39,6 +38,7 @@ import java.util.stream.Collectors;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -94,9 +94,8 @@ public final class SingleTableRuleTest {
                 Collections.singletonList(dataNodeContainedRule), new 
ConfigurationProperties(new Properties()));
         Map<String, SingleTableDataNode> actual = 
singleTableRule.getSingleTableDataNodes();
         assertThat(actual.size(), is(2));
-        Iterator<SingleTableDataNode> iterator = actual.values().iterator();
-        assertThat(iterator.next().getTableName(), is("employee"));
-        assertThat(iterator.next().getTableName(), is("student"));
+        assertTrue(actual.containsKey("employee"));
+        assertTrue(actual.containsKey("student"));
     }
     
     @Test
@@ -107,8 +106,7 @@ public final class SingleTableRuleTest {
                 Collections.singletonList(dataNodeContainedRule), new 
ConfigurationProperties(new Properties()));
         Map<String, SingleTableDataNode> actual = 
singleTableRule.getSingleTableDataNodes();
         assertThat(actual.size(), is(2));
-        Iterator<SingleTableDataNode> iterator = actual.values().iterator();
-        assertThat(iterator.next().getTableName(), is("employee"));
-        assertThat(iterator.next().getTableName(), is("student"));
+        assertTrue(actual.containsKey("employee"));
+        assertTrue(actual.containsKey("student"));
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/EncryptSQLRewriterParameterizedTest.java
 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/EncryptSQLRewriterParameterizedTest.java
index 261ea1e..92bd5d9 100644
--- 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/EncryptSQLRewriterParameterizedTest.java
+++ 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/EncryptSQLRewriterParameterizedTest.java
@@ -71,8 +71,8 @@ public final class EncryptSQLRewriterParameterizedTest 
extends AbstractSQLRewrit
     protected void mockRules(final Collection<ShardingSphereRule> rules) {
         Optional<SingleTableRule> singleTableRule = rules.stream().filter(each 
-> each instanceof SingleTableRule).map(each -> (SingleTableRule) 
each).findFirst();
         if (singleTableRule.isPresent()) {
-            singleTableRule.get().addDataNode("t_account", "encrypt_ds");
-            singleTableRule.get().addDataNode("t_account_bak", "encrypt_ds");
+            singleTableRule.get().put("t_account", "encrypt_ds");
+            singleTableRule.get().put("t_account_bak", "encrypt_ds");
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
index 64115d9..49eff62 100644
--- 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
+++ 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
@@ -72,8 +72,8 @@ public final class ShardingSQLRewriterParameterizedTest 
extends AbstractSQLRewri
     protected void mockRules(final Collection<ShardingSphereRule> rules) {
         Optional<SingleTableRule> singleTableRule = rules.stream().filter(each 
-> each instanceof SingleTableRule).map(each -> (SingleTableRule) 
each).findFirst();
         if (singleTableRule.isPresent()) {
-            singleTableRule.get().addDataNode("t_single", "db");
-            singleTableRule.get().addDataNode("t_single_extend", "db");
+            singleTableRule.get().put("t_single", "db");
+            singleTableRule.get().put("t_single_extend", "db");
         }
     }
     

Reply via email to