You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/07/13 12:28:21 UTC

[shardingsphere] branch master updated: Fix NPE when add resource with uppercase database name (#19109)

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 <du...@apache.org>
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));
     }