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));
}