This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 657b78f3855 Avoid NPE in DatabaseMetaDataManager.dropSchema by
capturing the schema first (#38930)
657b78f3855 is described below
commit 657b78f3855d550cc0c466fed80a00e3b2741cbf
Author: Vasiliy Mikhailov <[email protected]>
AuthorDate: Sat Jul 4 08:37:51 2026 +0300
Avoid NPE in DatabaseMetaDataManager.dropSchema by capturing the schema
first (#38930)
* Capture schema before dropping it in DatabaseMetaDataManager
dropSchema read database.getSchema(schemaName) after
database.dropSchema(schemaName), so getSchema returned null and getAllTables()
threw a NullPointerException. Capture the schema reference before dropping it.
* Use imported Properties and drop inline comment in
DatabaseMetaDataManagerTest
* Apply spotless formatting to DatabaseMetaDataManagerTest
Signed-off-by: vmihaylov <[email protected]>
---------
Signed-off-by: vmihaylov <[email protected]>
---
.../metadata/manager/database/DatabaseMetaDataManager.java | 3 ++-
.../manager/database/DatabaseMetaDataManagerTest.java | 14 ++++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/database/DatabaseMetaDataManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/database/DatabaseMetaDataManager.java
index 53d1c54c6da..551cf2c06b1 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/database/DatabaseMetaDataManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/database/DatabaseMetaDataManager.java
@@ -99,8 +99,9 @@ public final class DatabaseMetaDataManager {
if (!database.containsSchema(schemaName)) {
return;
}
+ ShardingSphereSchema schema = database.getSchema(schemaName);
database.dropSchema(schemaName);
- if
(database.getSchema(schemaName).getAllTables().stream().anyMatch(each ->
TableRefreshUtils.isSingleTable(each.getName(), database))) {
+ if (schema.getAllTables().stream().anyMatch(each ->
TableRefreshUtils.isSingleTable(each.getName(), database))) {
database.reloadRules();
}
metaData.getGlobalRuleMetaData().getRules().forEach(each ->
((GlobalRule) each).refresh(metaData.getAllDatabases(),
GlobalRuleChangedType.SCHEMA_CHANGED));
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/database/DatabaseMetaDataManagerTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/database/DatabaseMetaDataManagerTest.java
index f3937bfd9c5..b58c30b1ee4 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/database/DatabaseMetaDataManagerTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/database/DatabaseMetaDataManagerTest.java
@@ -19,11 +19,13 @@ package
org.apache.shardingsphere.mode.metadata.manager.database;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -40,9 +42,11 @@ import org.mockito.Mock;
import java.sql.Types;
import java.util.Collections;
+import java.util.Properties;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -138,6 +142,16 @@ class DatabaseMetaDataManagerTest {
verify(metaDataContexts.getMetaData().getDatabase("foo_db")).dropSchema("foo_schema");
}
+ @Test
+ void assertDropExistedSchemaShouldNotNPEAfterSchemaDropped() {
+ DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
+ ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema",
databaseType);
+ ShardingSphereDatabase realDatabase = new
ShardingSphereDatabase("foo_db", databaseType, mock(ResourceMetaData.class),
+ new RuleMetaData(Collections.emptyList()),
Collections.singleton(schema), new ConfigurationProperties(new Properties()));
+
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(realDatabase);
+ assertDoesNotThrow(() -> databaseMetaDataManager.dropSchema("foo_db",
"foo_schema"));
+ }
+
@Test
void assertDropSchemaWithSingleTableRefreshRules() {
ShardingSphereSchema schema = mock(ShardingSphereSchema.class);