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