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