This is an automated email from the ASF dual-hosted git repository.

panjuan 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 1f3671a  fix NPE when execute use statement with not exist schema 
(#10389)
1f3671a is described below

commit 1f3671ae829af9fbc9a82b14fe463655b82dcfdf
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed May 19 17:18:26 2021 +0800

    fix NPE when execute use statement with not exist schema (#10389)
---
 .../backend/text/admin/mysql/executor/UseDatabaseExecutor.java   | 5 +++--
 .../text/admin/mysql/executor/UseDatabaseExecutorTest.java       | 9 +++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
index 0e41eec..8114d0b 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
 
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Optional;
 
 /**
  * Use database executor.
@@ -48,8 +49,8 @@ public final class UseDatabaseExecutor implements 
DatabaseAdminExecutor {
     }
     
     private Collection<ShardingSphereRule> getRules(final String schemaName) {
-        Collection<ShardingSphereRule> result;
-        result = new 
LinkedList<>(ProxyContext.getInstance().getMetaDataContexts().getMetaData(schemaName).getRuleMetaData().getRules());
+        Collection<ShardingSphereRule> result = new LinkedList<>();
+        
Optional.ofNullable(ProxyContext.getInstance().getMetaDataContexts().getMetaData(schemaName)).ifPresent(each
 -> result.addAll(each.getRuleMetaData().getRules()));
         
result.addAll(ProxyContext.getInstance().getMetaDataContexts().getGlobalRuleMetaData().getRules());
         return result;
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
index 22ec981..aa2abd0 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import 
org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
 import org.junit.Before;
 import org.junit.Test;
@@ -78,4 +79,12 @@ public final class UseDatabaseExecutorTest {
         useSchemaBackendHandler.execute(backendConnection);
         verify(backendConnection).setCurrentSchema(anyString());
     }
+    
+    @Test(expected = UnknownDatabaseException.class)
+    public void assertExecuteUseStatementBackendHandlerWhenSchemaNotExist() {
+        MySQLUseStatement useStatement = mock(MySQLUseStatement.class);
+        
when(useStatement.getSchema()).thenReturn(String.format(SCHEMA_PATTERN, 10));
+        UseDatabaseExecutor useSchemaBackendHandler = new 
UseDatabaseExecutor(useStatement);
+        useSchemaBackendHandler.execute(backendConnection);
+    }
 }

Reply via email to