This is an automated email from the ASF dual-hosted git repository.

zhaojinchao 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 2aa03356b75 Fix NPE when add resource with uppercase database name 
(#19109)
2aa03356b75 is described below

commit 2aa03356b75cd4cf1dec2f114e5e03ffb95108ec
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Jul 13 20:28:15 2022 +0800

    Fix NPE when add resource with uppercase database name (#19109)
---
 .../optimizer/context/OptimizerContext.java        | 35 +++++++++++-----------
 .../optimizer/context/OptimizerContextTest.java    | 17 ++++++++---
 2 files changed, 31 insertions(+), 21 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
index 398137ba4d5..f99e19d0c35 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
@@ -56,10 +56,10 @@ public final class OptimizerContext {
      * @param protocolType protocol database type
      */
     public void addDatabase(final String databaseName, final DatabaseType 
protocolType) {
-        FederationDatabaseMetaData federationDatabaseMetaData = new 
FederationDatabaseMetaData(databaseName, Collections.emptyMap());
-        federationMetaData.getDatabases().put(databaseName, 
federationDatabaseMetaData);
-        parserContexts.put(databaseName, 
OptimizerParserContextFactory.create(protocolType));
-        plannerContexts.put(databaseName, 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
+        FederationDatabaseMetaData federationDatabaseMetaData = new 
FederationDatabaseMetaData(databaseName.toLowerCase(), Collections.emptyMap());
+        federationMetaData.getDatabases().put(databaseName.toLowerCase(), 
federationDatabaseMetaData);
+        parserContexts.put(databaseName.toLowerCase(), 
OptimizerParserContextFactory.create(protocolType));
+        plannerContexts.put(databaseName.toLowerCase(), 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
     }
     
     /**
@@ -69,9 +69,10 @@ public final class OptimizerContext {
      * @param globalRuleMetaData global rule meta data
      */
     public void alterDatabase(final ShardingSphereDatabase database, final 
ShardingSphereRuleMetaData globalRuleMetaData) {
-        OptimizerContext toBeAlteredOptimizerContext = 
OptimizerContextFactory.create(Collections.singletonMap(database.getName(), 
database), globalRuleMetaData);
-        federationMetaData.getDatabases().put(database.getName(), 
toBeAlteredOptimizerContext.getFederationMetaData().getDatabases().get(database.getName()));
-        plannerContexts.put(database.getName(), 
toBeAlteredOptimizerContext.getPlannerContexts().get(database.getName()));
+        String databaseName = database.getName().toLowerCase();
+        OptimizerContext toBeAlteredOptimizerContext = 
OptimizerContextFactory.create(Collections.singletonMap(databaseName, 
database), globalRuleMetaData);
+        federationMetaData.getDatabases().put(databaseName, 
toBeAlteredOptimizerContext.getFederationMetaData().getDatabases().get(databaseName));
+        plannerContexts.put(databaseName, 
toBeAlteredOptimizerContext.getPlannerContexts().get(databaseName));
     }
     
     /**
@@ -80,9 +81,9 @@ public final class OptimizerContext {
      * @param databaseName database name
      */
     public void dropDatabase(final String databaseName) {
-        federationMetaData.getDatabases().remove(databaseName);
-        parserContexts.remove(databaseName);
-        plannerContexts.remove(databaseName);
+        federationMetaData.getDatabases().remove(databaseName.toLowerCase());
+        parserContexts.remove(databaseName.toLowerCase());
+        plannerContexts.remove(databaseName.toLowerCase());
     }
     
     /**
@@ -92,9 +93,9 @@ public final class OptimizerContext {
      * @param schemaName schema name
      */
     public void addSchema(final String databaseName, final String schemaName) {
-        
federationMetaData.getDatabases().get(databaseName).putTable(schemaName, new 
ShardingSphereTable());
+        
federationMetaData.getDatabases().get(databaseName.toLowerCase()).putTable(schemaName,
 new ShardingSphereTable());
         // TODO add schema only
-        plannerContexts.put(databaseName, 
OptimizerPlannerContextFactory.create(federationMetaData.getDatabases().get(databaseName)));
+        plannerContexts.put(databaseName.toLowerCase(), 
OptimizerPlannerContextFactory.create(federationMetaData.getDatabases().get(databaseName.toLowerCase())));
     }
     
     /**
@@ -105,9 +106,9 @@ public final class OptimizerContext {
      * @param toBeChangedTable to be changed table
      */
     public void alterTable(final String databaseName, final String schemaName, 
final ShardingSphereTable toBeChangedTable) {
-        FederationDatabaseMetaData federationDatabaseMetaData = 
federationMetaData.getDatabases().get(databaseName);
-        federationDatabaseMetaData.putTable(schemaName, toBeChangedTable);
-        plannerContexts.put(databaseName, 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
+        FederationDatabaseMetaData federationDatabaseMetaData = 
federationMetaData.getDatabases().get(databaseName.toLowerCase());
+        federationDatabaseMetaData.putTable(schemaName.toLowerCase(), 
toBeChangedTable);
+        plannerContexts.put(databaseName.toLowerCase(), 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
     }
     
     /**
@@ -118,8 +119,8 @@ public final class OptimizerContext {
      * @param toBeDeletedTableName to be deleted table name
      */
     public void dropTable(final String databaseName, final String schemaName, 
final String toBeDeletedTableName) {
-        FederationDatabaseMetaData federationDatabaseMetaData = 
federationMetaData.getDatabases().get(databaseName);
+        FederationDatabaseMetaData federationDatabaseMetaData = 
federationMetaData.getDatabases().get(databaseName.toLowerCase());
         federationDatabaseMetaData.removeTableMetadata(schemaName, 
toBeDeletedTableName);
-        plannerContexts.put(databaseName, 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
+        plannerContexts.put(databaseName.toLowerCase(), 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContextTest.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContextTest.java
index d3a7ef2b73a..b15a3858ccf 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContextTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContextTest.java
@@ -42,14 +42,14 @@ public final class OptimizerContextTest {
     @Test
     public void assertDropDatabase() {
         OptimizerContext optimizerContext = createOptimizerContext();
-        optimizerContext.dropDatabase("foo_db");
+        optimizerContext.dropDatabase("FOO_DB");
         
assertFalse(optimizerContext.getFederationMetaData().getDatabases().containsKey("foo_db"));
     }
     
     @Test
     public void assertAlterTable() {
         OptimizerContext optimizerContext = createOptimizerContext();
-        optimizerContext.alterTable("foo_db", "foo_schema", 
createTable("bar_col"));
+        optimizerContext.alterTable("FOO_DB", "foo_schema", 
createTable("bar_col"));
         Optional<FederationSchemaMetaData> schemaMetaData = 
optimizerContext.getFederationMetaData().getDatabases().get("foo_db").getSchemaMetadata("foo_schema");
         assertTrue(schemaMetaData.isPresent());
         
assertFalse(schemaMetaData.get().getTables().get("foo_tbl").getColumnNames().contains("foo_col"));
@@ -60,7 +60,7 @@ public final class OptimizerContextTest {
     public void assertDropTable() {
         OptimizerContext optimizerContext = createOptimizerContext();
         OptimizerPlannerContext beforeDroppedPlannerContext = 
optimizerContext.getPlannerContexts().get("foo_db");
-        optimizerContext.dropTable("foo_db", "foo_schema", "foo_tbl");
+        optimizerContext.dropTable("FOO_DB", "foo_schema", "foo_tbl");
         assertThat(beforeDroppedPlannerContext, 
not(optimizerContext.getPlannerContexts().get("foo_db")));
         Optional<FederationSchemaMetaData> schemaMetadata = 
optimizerContext.getFederationMetaData().getDatabases().get("foo_db").getSchemaMetadata("foo_schema");
         assertTrue(schemaMetadata.isPresent());
@@ -70,7 +70,7 @@ public final class OptimizerContextTest {
     @Test
     public void assertAddDatabase() {
         OptimizerContext optimizerContext = createOptimizerContext();
-        optimizerContext.addDatabase("bar_db", new H2DatabaseType());
+        optimizerContext.addDatabase("BAR_DB", new H2DatabaseType());
         
assertTrue(optimizerContext.getFederationMetaData().getDatabases().containsKey("bar_db"));
         assertTrue(optimizerContext.getParserContexts().containsKey("bar_db"));
         
assertTrue(optimizerContext.getPlannerContexts().containsKey("bar_db"));
@@ -87,6 +87,15 @@ public final class OptimizerContextTest {
         assertTrue(schemaMetadata.get().getTables().containsKey("bar_tbl"));
     }
     
+    @Test
+    public void assertAddSchema() {
+        OptimizerContext optimizerContext = createOptimizerContext();
+        optimizerContext.addSchema("FOO_DB", "foo_schema");
+        
assertTrue(optimizerContext.getFederationMetaData().getDatabases().get("foo_db").getSchemas().containsKey("foo_schema"));
+        
assertTrue(optimizerContext.getPlannerContexts().get("foo_db").getConverters().containsKey("foo_schema"));
+        
assertTrue(optimizerContext.getPlannerContexts().get("foo_db").getValidators().containsKey("foo_schema"));
+    }
+    
     private OptimizerContext createOptimizerContext() {
         return 
OptimizerContextFactory.create(Collections.singletonMap("foo_db", 
createDatabase()), mock(ShardingSphereRuleMetaData.class));
     }

Reply via email to