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

Reply via email to