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

jianglongtao 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 5dbf392  Fix #13912  permission verification exception (#14139)
5dbf392 is described below

commit 5dbf3929951f675a3a8e6eb6fc23a3bfd28b4ec7
Author: lanchengx <[email protected]>
AuthorDate: Sat Dec 18 17:30:31 2021 +0800

    Fix #13912  permission verification exception (#14139)
    
    * Fix `use database` can still succeed without permission, and permission 
check is incomplete when querying.
    
    * Reformat.
    
    * Reformat.
    
    * When verifying SQL type permissions, add schema verification.
    Drop database adds permission verification.
    
    * Adjust the class name.
    
    * improve test.
---
 .../mysql/constant/MySQLServerErrorCode.java       |  2 +-
 .../infra/exception/SchemaNotExistedException.java |  6 ++++
 .../authority/checker/AuthorityChecker.java        |  9 +++++-
 ...xception.java => DBDropNotExistsException.java} |  2 +-
 .../text/TextProtocolBackendHandlerFactory.java    | 19 +++++++++----
 .../admin/mysql/executor/UseDatabaseExecutor.java  |  7 +++--
 .../text/database/DropDatabaseBackendHandler.java  | 32 ++++++++++++++++++----
 .../DatabaseOperateBackendHandlerFactoryTest.java  | 15 +++++-----
 .../mysql/executor/UseDatabaseExecutorTest.java    | 12 +++++++-
 .../database/DropDatabaseBackendHandlerTest.java   |  8 ++++--
 .../frontend/mysql/err/MySQLErrPacketFactory.java  | 11 +++++---
 .../mysql/err/MySQLErrPacketFactoryTest.java       |  4 +--
 12 files changed, 94 insertions(+), 33 deletions(-)

diff --git 
a/shardingsphere-db-protocol/shardingsphere-db-protocol-mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLServerErrorCode.java
 
b/shardingsphere-db-protocol/shardingsphere-db-protocol-mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLServerErrorCode.java
index f45ef00..548c130 100644
--- 
a/shardingsphere-db-protocol/shardingsphere-db-protocol-mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLServerErrorCode.java
+++ 
b/shardingsphere-db-protocol/shardingsphere-db-protocol-mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLServerErrorCode.java
@@ -44,7 +44,7 @@ public enum MySQLServerErrorCode implements SQLErrorCode {
     
     ER_DB_CREATE_EXISTS_ERROR(1007, "HY000", "Can't create database '%s'; 
database exists"),
     
-    ER_DB_DROP_EXISTS_ERROR(1008, "HY000", "Can't drop database '%s'; database 
doesn't exist"),
+    ER_DB_DROP_NOT_EXISTS_ERROR(1008, "HY000", "Can't drop database '%s'; 
database doesn't exist"),
     
     ER_TABLE_EXISTS_ERROR(1050, "42S01", "Table '%s' already exists"),
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/exception/SchemaNotExistedException.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/exception/SchemaNotExistedException.java
index 4165ce8..2c66016 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/exception/SchemaNotExistedException.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/exception/SchemaNotExistedException.java
@@ -17,14 +17,20 @@
 
 package org.apache.shardingsphere.infra.exception;
 
+import lombok.Getter;
+
 /**
  * Schema does not exist exception.
  */
+@Getter
 public final class SchemaNotExistedException extends ShardingSphereException {
     
     private static final long serialVersionUID = -1818822065202117480L;
     
+    private final String schemaName;
+    
     public SchemaNotExistedException(final String schemaName) {
         super(String.format("Schema '%s' doesn't exist.", schemaName));
+        this.schemaName = schemaName;
     }
 }
diff --git 
a/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
 
b/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
index cfa3875..c02f899 100644
--- 
a/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
+++ 
b/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
@@ -69,8 +69,15 @@ public final class AuthorityChecker implements 
SQLChecker<AuthorityRule> {
             return new SQLCheckResult(true, "");
         }
         Optional<ShardingSpherePrivileges> privileges = 
authorityRule.findPrivileges(grantee);
+        if (!privileges.isPresent()) {
+            return new SQLCheckResult(false, String.format("Access denied for 
user '%s'@'%s'", grantee.getUsername(), grantee.getHostname()));
+        }
+        if (!privileges.filter(optional -> 
optional.hasPrivileges(currentSchema)).isPresent()) {
+            return new SQLCheckResult(false, String.format("Unknown database 
'%s'", currentSchema));
+        }
         // TODO add error msg
-        return privileges.map(optional -> new 
SQLCheckResult(optional.hasPrivileges(Collections.singletonList(getPrivilege(sqlStatement))),
 "")).orElseGet(() -> new SQLCheckResult(false, ""));
+        return privileges.map(optional -> new 
SQLCheckResult(optional.hasPrivileges(Collections.singletonList(getPrivilege(sqlStatement))),
 
+                        String.format("Access denied for operation %s", 
getPrivilege(sqlStatement).name()))).orElseGet(() -> new SQLCheckResult(false, 
""));
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/DBDropExistsException.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/DBDropNotExistsException.java
similarity index 94%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/DBDropExistsException.java
rename to 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/DBDropNotExistsException.java
index 0f80bf6..f4a8593 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/DBDropExistsException.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/DBDropNotExistsException.java
@@ -25,7 +25,7 @@ import lombok.RequiredArgsConstructor;
  */
 @RequiredArgsConstructor
 @Getter
-public final class DBDropExistsException extends BackendException {
+public final class DBDropNotExistsException extends BackendException {
     
     private static final long serialVersionUID = 6088272565526510361L;
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
index b2e3b80..6334294 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
@@ -107,15 +107,17 @@ public final class TextProtocolBackendHandlerFactory {
         if (extraHandler.isPresent()) {
             return extraHandler.get();
         }
-        String schemaName = connectionSession.getSchemaName();
-        SQLCheckEngine.check(sqlStatement, Collections.emptyList(), 
+        Optional<TextProtocolBackendHandler> databaseOperateHandler = 
findDatabaseOperateBackendHandler(sqlStatement, connectionSession);
+        if (databaseOperateHandler.isPresent()) {
+            return databaseOperateHandler.get();
+        }
+        String schemaName = 
sqlStatementContext.getTablesContext().getSchemaName().isPresent()
+                ? sqlStatementContext.getTablesContext().getSchemaName().get() 
: connectionSession.getSchemaName();
+        SQLCheckEngine.check(sqlStatement, Collections.emptyList(),
                 getRules(schemaName), schemaName, 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap(),
 connectionSession.getGrantee());
         if (sqlStatement instanceof TCLStatement) {
             return 
TransactionBackendHandlerFactory.newInstance((SQLStatementContext<TCLStatement>)
 sqlStatementContext, sql, connectionSession);
         }
-        if (sqlStatement instanceof CreateDatabaseStatement || sqlStatement 
instanceof DropDatabaseStatement) {
-            return 
DatabaseOperateBackendHandlerFactory.newInstance(sqlStatement, 
connectionSession);
-        }
         backendHandler = 
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatement, 
connectionSession);
         return backendHandler.orElseGet(() -> 
DatabaseBackendHandlerFactory.newInstance(sqlStatementContext, sql, 
connectionSession));
     }
@@ -130,6 +132,13 @@ public final class TextProtocolBackendHandlerFactory {
         return 
ShardingSphereServiceLoader.getSingletonServiceInstances(ExtraTextProtocolBackendHandler.class).stream().filter(each
 -> each.accept(sqlStatement)).findFirst();
     }
     
+    private static Optional<TextProtocolBackendHandler> 
findDatabaseOperateBackendHandler(final SQLStatement sqlStatement, final 
ConnectionSession connectionSession) throws SQLException {
+        if (sqlStatement instanceof CreateDatabaseStatement || sqlStatement 
instanceof DropDatabaseStatement) {
+            return 
Optional.of(DatabaseOperateBackendHandlerFactory.newInstance(sqlStatement, 
connectionSession));
+        }
+        return Optional.empty();
+    }
+    
     private static Collection<ShardingSphereRule> getRules(final String 
schemaName) {
         MetaDataContexts contexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         if (Strings.isNullOrEmpty(schemaName) || 
!ProxyContext.getInstance().schemaExists(schemaName)) {
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 d9af61b..795cbda 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
@@ -42,10 +42,11 @@ public final class UseDatabaseExecutor implements 
DatabaseAdminExecutor {
     @Override
     public void execute(final ConnectionSession connectionSession) {
         String schemaName = SQLUtil.getExactlyValue(useStatement.getSchema());
-        if (!ProxyContext.getInstance().schemaExists(schemaName) && 
SQLCheckEngine.check(schemaName, getRules(schemaName), 
connectionSession.getGrantee())) {
-            throw new UnknownDatabaseException(schemaName);
+        if (ProxyContext.getInstance().schemaExists(schemaName) && 
SQLCheckEngine.check(schemaName, getRules(schemaName), 
connectionSession.getGrantee())) {
+            connectionSession.setCurrentSchema(schemaName);
+            return;
         }
-        connectionSession.setCurrentSchema(schemaName);
+        throw new UnknownDatabaseException(schemaName);
     }
     
     private Collection<ShardingSphereRule> getRules(final String schemaName) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandler.java
index adb4133..9079b00 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandler.java
@@ -19,14 +19,22 @@ package 
org.apache.shardingsphere.proxy.backend.text.database;
 
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.executor.check.SQLCheckEngine;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.exception.DBDropExistsException;
+import 
org.apache.shardingsphere.proxy.backend.exception.DBDropNotExistsException;
+import 
org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropDatabaseStatement;
 
+import java.util.Collection;
+import java.util.LinkedList;
+
 /**
  * Drop database backend handler.
  */
@@ -39,7 +47,7 @@ public final class DropDatabaseBackendHandler implements 
TextProtocolBackendHand
     
     @Override
     public ResponseHeader execute() {
-        check(sqlStatement);
+        check(sqlStatement, connectionSession.getGrantee());
         if (isDropCurrentDatabase(sqlStatement.getDatabaseName())) {
             connectionSession.setCurrentSchema(null);
         }
@@ -47,13 +55,27 @@ public final class DropDatabaseBackendHandler implements 
TextProtocolBackendHand
         return new UpdateResponseHeader(sqlStatement);
     }
     
-    private void check(final DropDatabaseStatement sqlStatement) {
-        if 
(!ProxyContext.getInstance().getAllSchemaNames().contains(sqlStatement.getDatabaseName()))
 {
-            throw new DBDropExistsException(sqlStatement.getDatabaseName());
+    private void check(final DropDatabaseStatement sqlStatement, final Grantee 
grantee) {
+        String schemaName = sqlStatement.getDatabaseName();
+        if (!SQLCheckEngine.check(schemaName, getRules(schemaName), grantee)) {
+            throw new UnknownDatabaseException(schemaName);
+        }
+        if 
(!ProxyContext.getInstance().getAllSchemaNames().contains(schemaName)) {
+            throw new DBDropNotExistsException(schemaName);
         }
     }
     
     private boolean isDropCurrentDatabase(final String databaseName) {
         return !Strings.isNullOrEmpty(connectionSession.getSchemaName()) && 
connectionSession.getSchemaName().equals(databaseName);
     }
+    
+    private static Collection<ShardingSphereRule> getRules(final String 
schemaName) {
+        Collection<ShardingSphereRule> result = new LinkedList<>();
+        ShardingSphereMetaData metaData = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(schemaName);
+        if (null != metaData && null != metaData.getRuleMetaData()) {
+            result.addAll(metaData.getRuleMetaData().getRules());
+        }
+        
result.addAll(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getGlobalRuleMetaData().getRules());
+        return result;
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseOperateBackendHandlerFactoryTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseOperateBackendHandlerFactoryTest.java
index f204749..679430e 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseOperateBackendHandlerFactoryTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseOperateBackendHandlerFactoryTest.java
@@ -75,6 +75,7 @@ public final class DatabaseOperateBackendHandlerFactoryTest {
         
when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
         ProxyContext.getInstance().init(contextManager);
         when(connectionSession.getSchemaName()).thenReturn("schema");
+        
when(metaDataContexts.getGlobalRuleMetaData().getRules()).thenReturn(Collections.emptyList());
     }
     
     @Test
@@ -134,23 +135,21 @@ public final class 
DatabaseOperateBackendHandlerFactoryTest {
     private Map<String, ShardingSphereMetaData> getMetaDataMap() {
         ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
         when(metaData.getResource().getDatabaseType()).thenReturn(new 
MySQLDatabaseType());
+        
when(metaData.getRuleMetaData().getRules()).thenReturn(Collections.emptyList());
         return Collections.singletonMap("schema", metaData);
     }
     
     private void setGovernanceMetaDataContexts(final boolean isGovernance) {
-        ContextManager contextManager = mock(ContextManager.class, 
RETURNS_DEEP_STUBS);
+        ContextManager contextManager = 
ProxyContext.getInstance().getContextManager();
         MetaDataContexts metaDataContexts = isGovernance ? 
mockMetaDataContexts() : new 
MetaDataContexts(mock(MetaDataPersistService.class));
         
when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
-        ProxyContext.getInstance().init(contextManager);
     }
     
     private MetaDataContexts mockMetaDataContexts() {
-        MetaDataContexts result = mock(MetaDataContexts.class, 
RETURNS_DEEP_STUBS);
-        
when(result.getAllSchemaNames()).thenReturn(Collections.singletonList("schema"));
-        
when(result.getMetaData("schema").getResource().getDatabaseType()).thenReturn(new
 MySQLDatabaseType());
-        
when(result.getMetaData("schema").getResource().getDataSources()).thenReturn(Collections.emptyMap());
-        
when(result.getMetaData("schema").getResource().getNotExistedResources(any())).thenReturn(Collections.emptyList());
-        return result;
+        MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+        
when(metaDataContexts.getMetaData("schema").getResource().getDataSources()).thenReturn(Collections.emptyMap());
+        
when(metaDataContexts.getMetaData("schema").getResource().getNotExistedResources(any())).thenReturn(Collections.emptyList());
+        return metaDataContexts;
     }
     
     @After
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 58817dd..9a2306c 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
@@ -20,9 +20,9 @@ package 
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
+import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
-import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
@@ -37,10 +37,13 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 
 import java.lang.reflect.Field;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Properties;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
@@ -80,6 +83,13 @@ public final class UseDatabaseExecutorTest {
     public void assertExecuteUseStatementBackendHandler() {
         MySQLUseStatement useStatement = mock(MySQLUseStatement.class);
         
when(useStatement.getSchema()).thenReturn(String.format(SCHEMA_PATTERN, 0));
+        ContextManager contextManager = mock(ContextManager.class, 
RETURNS_DEEP_STUBS);
+        
when(contextManager.getMetaDataContexts().getAllSchemaNames().contains(any())).thenReturn(true);
+        
when(contextManager.getMetaDataContexts().getGlobalRuleMetaData().getRules()).thenReturn(Collections.emptyList());
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        when(metaData.getRuleMetaData().getRules()).thenReturn(new 
LinkedList<>());
+        
when(contextManager.getMetaDataContexts().getMetaData(any())).thenReturn(metaData);
+        ProxyContext.getInstance().init(contextManager);
         UseDatabaseExecutor useSchemaBackendHandler = new 
UseDatabaseExecutor(useStatement);
         useSchemaBackendHandler.execute(connectionSession);
         verify(connectionSession).setCurrentSchema(anyString());
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandlerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandlerTest.java
index 1ba20a9..391bb3f 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandlerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandlerTest.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.proxy.backend.text.database;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.exception.DBDropExistsException;
+import 
org.apache.shardingsphere.proxy.backend.exception.DBDropNotExistsException;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -33,9 +33,11 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 
 import java.util.Arrays;
+import java.util.Collections;
 
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -63,9 +65,11 @@ public final class DropDatabaseBackendHandlerTest {
         ProxyContext.getInstance().init(contextManager);
         handler = new DropDatabaseBackendHandler(sqlStatement, 
connectionSession);
         
when(metaDataContexts.getAllSchemaNames()).thenReturn(Arrays.asList("test_db", 
"other_db"));
+        
when(metaDataContexts.getGlobalRuleMetaData().getRules()).thenReturn(Collections.emptyList());
+        
when(metaDataContexts.getMetaData(any()).getRuleMetaData().getRules()).thenReturn(Collections.emptyList());
     }
     
-    @Test(expected = DBDropExistsException.class)
+    @Test(expected = DBDropNotExistsException.class)
     public void assertExecuteDropNotExistDatabase() {
         when(sqlStatement.getDatabaseName()).thenReturn("test_not_exist_db");
         handler.execute();
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/err/MySQLErrPacketFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/err/MySQLErrPacketFactory.java
index db0736d..3292893 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/err/MySQLErrPacketFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/err/MySQLErrPacketFactory.java
@@ -27,7 +27,7 @@ import 
org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurat
 import org.apache.shardingsphere.infra.exception.SchemaNotExistedException;
 import org.apache.shardingsphere.proxy.backend.exception.CircuitBreakException;
 import 
org.apache.shardingsphere.proxy.backend.exception.DBCreateExistsException;
-import org.apache.shardingsphere.proxy.backend.exception.DBDropExistsException;
+import 
org.apache.shardingsphere.proxy.backend.exception.DBDropNotExistsException;
 import 
org.apache.shardingsphere.proxy.backend.exception.DatabaseNotExistedException;
 import 
org.apache.shardingsphere.proxy.backend.exception.NoDatabaseSelectedException;
 import 
org.apache.shardingsphere.proxy.backend.exception.RuleNotExistedException;
@@ -75,14 +75,17 @@ public final class MySQLErrPacketFactory {
         if (cause instanceof UnknownDatabaseException) {
             return new MySQLErrPacket(1, MySQLServerErrorCode.ER_BAD_DB_ERROR, 
((UnknownDatabaseException) cause).getDatabaseName());
         }
-        if (cause instanceof NoDatabaseSelectedException || cause instanceof 
SchemaNotExistedException) {
+        if (cause instanceof SchemaNotExistedException) {
+            return new MySQLErrPacket(1, MySQLServerErrorCode.ER_BAD_DB_ERROR, 
((SchemaNotExistedException) cause).getSchemaName());
+        }
+        if (cause instanceof NoDatabaseSelectedException) {
             return new MySQLErrPacket(1, MySQLServerErrorCode.ER_NO_DB_ERROR);
         }
         if (cause instanceof DBCreateExistsException) {
             return new MySQLErrPacket(1, 
MySQLServerErrorCode.ER_DB_CREATE_EXISTS_ERROR, ((DBCreateExistsException) 
cause).getDatabaseName());
         }
-        if (cause instanceof DBDropExistsException) {
-            return new MySQLErrPacket(1, 
MySQLServerErrorCode.ER_DB_DROP_EXISTS_ERROR, ((DBDropExistsException) 
cause).getDatabaseName());
+        if (cause instanceof DBDropNotExistsException) {
+            return new MySQLErrPacket(1, 
MySQLServerErrorCode.ER_DB_DROP_NOT_EXISTS_ERROR, ((DBDropNotExistsException) 
cause).getDatabaseName());
         }
         if (cause instanceof TableExistsException) {
             return new MySQLErrPacket(1, 
MySQLServerErrorCode.ER_TABLE_EXISTS_ERROR, ((TableExistsException) 
cause).getTableName());
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/err/MySQLErrPacketFactoryTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/err/MySQLErrPacketFactoryTest.java
index 012d5fe..7f5ab53 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/err/MySQLErrPacketFactoryTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/err/MySQLErrPacketFactoryTest.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurat
 import 
org.apache.shardingsphere.infra.distsql.exception.rule.RuleDefinitionViolationException;
 import org.apache.shardingsphere.proxy.backend.exception.CircuitBreakException;
 import 
org.apache.shardingsphere.proxy.backend.exception.DBCreateExistsException;
-import org.apache.shardingsphere.proxy.backend.exception.DBDropExistsException;
+import 
org.apache.shardingsphere.proxy.backend.exception.DBDropNotExistsException;
 import 
org.apache.shardingsphere.proxy.backend.exception.NoDatabaseSelectedException;
 import 
org.apache.shardingsphere.proxy.backend.exception.TableModifyInTransactionException;
 import 
org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
@@ -122,7 +122,7 @@ public final class MySQLErrPacketFactoryTest {
     
     @Test
     public void assertNewInstanceWithDBDropExistsException() {
-        MySQLErrPacket actual = MySQLErrPacketFactory.newInstance(new 
DBDropExistsException("No reason"));
+        MySQLErrPacket actual = MySQLErrPacketFactory.newInstance(new 
DBDropNotExistsException("No reason"));
         assertThat(actual.getSequenceId(), is(1));
         assertThat(actual.getErrorCode(), is(1008));
         assertThat(actual.getSqlState(), is("HY000"));

Reply via email to