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 7b77e34cfc2 Refactor SQLCheckEngine (#23790)
7b77e34cfc2 is described below

commit 7b77e34cfc2292ed7aeb37704e1c0029eac7188e
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jan 28 23:28:35 2023 +0800

    Refactor SQLCheckEngine (#23790)
    
    * For code format
    
    * Refactor SQLCheckEngine
---
 .../checker/audit/ShardingAuditChecker.java        |  5 +--
 .../sharding/checker/ShardingAuditCheckerTest.java |  6 +--
 .../infra/metadata/ShardingSphereMetaData.java     |  2 +-
 .../infra/metadata/ShardingSphereMetaDataTest.java |  4 +-
 .../infra/executor/check/SQLCheckEngine.java       | 50 ++++++++++++++--------
 .../infra/executor/check/checker/SQLChecker.java   |  7 +--
 .../driver/executor/DriverExecutor.java            |  4 +-
 .../jdbc/core/connection/ConnectionManager.java    | 12 +++---
 .../statement/ShardingSpherePreparedStatement.java | 10 ++---
 .../core/statement/ShardingSphereStatement.java    |  9 ++--
 .../authority/checker/AuthorityChecker.java        |  7 ++-
 .../authority/checker/AuthorityCheckerTest.java    |  6 +--
 .../handler/ProxyBackendHandlerFactory.java        | 14 +++---
 .../text/query/MySQLMultiStatementsHandler.java    | 11 ++---
 .../PostgreSQLBatchedStatementsExecutor.java       | 10 ++---
 15 files changed, 81 insertions(+), 76 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/audit/ShardingAuditChecker.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/audit/ShardingAuditChecker.java
index 9895199bbd0..6dc93da7dfd 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/audit/ShardingAuditChecker.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/audit/ShardingAuditChecker.java
@@ -31,7 +31,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.function.BiPredicate;
 
 /**
@@ -46,7 +45,7 @@ public final class ShardingAuditChecker implements 
SQLChecker<ShardingRule> {
     
     @Override
     public void check(final SQLStatementContext<?> sqlStatementContext, final 
List<Object> params, final Grantee grantee, final ShardingSphereRuleMetaData 
globalRuleMetaData,
-                      final String currentDatabase, final Map<String, 
ShardingSphereDatabase> databases, final ShardingRule rule) {
+                      final ShardingSphereDatabase database, final 
ShardingRule rule) {
         Collection<ShardingAuditStrategyConfiguration> auditStrategies = 
getShardingAuditStrategies(sqlStatementContext, rule);
         if (auditStrategies.isEmpty()) {
             return;
@@ -57,7 +56,7 @@ public final class ShardingAuditChecker implements 
SQLChecker<ShardingRule> {
         for (ShardingAuditStrategyConfiguration auditStrategy : 
auditStrategies) {
             for (String auditorName : auditStrategy.getAuditorNames()) {
                 if (!auditStrategy.isAllowHintDisable() || 
!disableAuditNames.contains(auditorName.toLowerCase())) {
-                    
rule.getAuditors().get(auditorName).check(sqlStatementContext, params, grantee, 
globalRuleMetaData, databases.get(currentDatabase.toLowerCase()));
+                    
rule.getAuditors().get(auditorName).check(sqlStatementContext, params, grantee, 
globalRuleMetaData, database);
                 }
             }
         }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingAuditCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingAuditCheckerTest.java
index 6ac2fe20aab..e639272b4f3 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingAuditCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingAuditCheckerTest.java
@@ -77,7 +77,7 @@ public final class ShardingAuditCheckerTest {
     @Test
     public void assertCheckSQLStatementPass() {
         ShardingSphereRuleMetaData globalRuleMetaData = 
mock(ShardingSphereRuleMetaData.class);
-        new ShardingAuditChecker().check(sqlStatementContext, 
Collections.emptyList(), grantee, globalRuleMetaData, "foo_db", databases, 
rule);
+        new ShardingAuditChecker().check(sqlStatementContext, 
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"), 
rule);
         verify(rule.getAuditors().get("auditor_1"), 
times(1)).check(sqlStatementContext, Collections.emptyList(), grantee, 
globalRuleMetaData, databases.get("foo_db"));
     }
     
@@ -85,7 +85,7 @@ public final class ShardingAuditCheckerTest {
     public void assertSQCheckPassByDisableAuditNames() {
         when(auditStrategy.isAllowHintDisable()).thenReturn(true);
         ShardingSphereRuleMetaData globalRuleMetaData = 
mock(ShardingSphereRuleMetaData.class);
-        new ShardingAuditChecker().check(sqlStatementContext, 
Collections.emptyList(), grantee, globalRuleMetaData, "foo_db", databases, 
rule);
+        new ShardingAuditChecker().check(sqlStatementContext, 
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"), 
rule);
         verify(rule.getAuditors().get("auditor_1"), 
times(0)).check(sqlStatementContext, Collections.emptyList(), grantee, 
globalRuleMetaData, databases.get("foo_db"));
     }
     
@@ -96,7 +96,7 @@ public final class ShardingAuditCheckerTest {
         doThrow(new SQLCheckException("Not allow DML operation without 
sharding conditions"))
                 .when(auditAlgorithm).check(sqlStatementContext, 
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"));
         try {
-            new ShardingAuditChecker().check(sqlStatementContext, 
Collections.emptyList(), grantee, globalRuleMetaData, "foo_db", databases, 
rule);
+            new ShardingAuditChecker().check(sqlStatementContext, 
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"), 
rule);
         } catch (final SQLCheckException ex) {
             assertThat(ex.getMessage(), is("SQL check failed, error message: 
Not allow DML operation without sharding conditions."));
         }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
index 19686adda25..368b3399502 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
@@ -78,7 +78,7 @@ public final class ShardingSphereMetaData {
      * @return contains database from meta data or not
      */
     public boolean containsDatabase(final String databaseName) {
-        return databases.containsKey(databaseName.toLowerCase());
+        return null != databaseName && 
databases.containsKey(databaseName.toLowerCase());
     }
     
     /**
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
index 52b8e728ed3..c6a625f78b2 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
@@ -60,8 +60,8 @@ public final class ShardingSphereMetaDataTest {
             DatabaseType databaseType = mock(DatabaseType.class);
             mockedStatic.when(() -> ShardingSphereDatabase.create("foo_db", 
databaseType)).thenReturn(database);
             Map<String, ShardingSphereDatabase> databases = new 
HashMap<>(Collections.singletonMap("foo_db", database));
-            ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(databases,
-                    new 
ShardingSphereRuleMetaData(Collections.singleton(globalResourceHeldRule)), new 
ConfigurationProperties(new Properties()));
+            ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                    databases, new 
ShardingSphereRuleMetaData(Collections.singleton(globalResourceHeldRule)), new 
ConfigurationProperties(new Properties()));
             metaData.addDatabase("foo_db", databaseType);
             assertThat(metaData.getDatabases(), is(databases));
             verify(globalResourceHeldRule).addResource(database);
diff --git 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/check/SQLCheckEngine.java
 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/check/SQLCheckEngine.java
index 88269c928d3..871c4f925a6 100644
--- 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/check/SQLCheckEngine.java
+++ 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/check/SQLCheckEngine.java
@@ -29,7 +29,6 @@ import 
org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPILoader;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.function.BiPredicate;
 
@@ -40,41 +39,54 @@ import java.util.function.BiPredicate;
 public final class SQLCheckEngine {
     
     /**
-     * Check database.
+     * Check SQL with database rules.
      *
-     * @param databaseName database name
+     * @param sqlStatementContext SQL statement context
+     * @param params SQL parameters
+     * @param globalRuleMetaData global rule meta data
+     * @param database database
+     * @param grantee grantee
+     */
+    public static void checkWithDatabaseRules(final SQLStatementContext<?> 
sqlStatementContext, final List<Object> params,
+                                              final ShardingSphereRuleMetaData 
globalRuleMetaData, final ShardingSphereDatabase database, final Grantee 
grantee) {
+        checkWithRules(sqlStatementContext, params, globalRuleMetaData, 
database.getRuleMetaData().getRules(), database, grantee);
+    }
+    
+    /**
+     * Check SQL with rules.
+     *
+     * @param sqlStatementContext SQL statement context
+     * @param params SQL parameters
+     * @param globalRuleMetaData global rule meta data
      * @param rules rules
+     * @param database database
      * @param grantee grantee
-     * @return check result
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public static boolean check(final String databaseName, final 
Collection<ShardingSphereRule> rules, final Grantee grantee) {
+    public static void checkWithRules(final SQLStatementContext<?> 
sqlStatementContext, final List<Object> params, final 
ShardingSphereRuleMetaData globalRuleMetaData,
+                                      final Collection<ShardingSphereRule> 
rules, final ShardingSphereDatabase database, final Grantee grantee) {
         for (Entry<ShardingSphereRule, SQLChecker> entry : 
OrderedSPILoader.getServices(SQLChecker.class, rules).entrySet()) {
-            boolean checkResult = entry.getValue().check(databaseName, 
grantee, entry.getKey());
-            if (!checkResult) {
-                return false;
-            }
+            entry.getValue().check(sqlStatementContext, params, grantee, 
globalRuleMetaData, database, entry.getKey());
         }
-        return true;
     }
     
     /**
-     * Check SQL.
+     * Check database.
      *
-     * @param sqlStatementContext SQL statement context
-     * @param params SQL parameters
-     * @param globalRuleMetaData global rule meta data
+     * @param databaseName database name
      * @param rules rules
-     * @param currentDatabase current database
-     * @param databases databases
      * @param grantee grantee
+     * @return check result
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public static void check(final SQLStatementContext<?> sqlStatementContext, 
final List<Object> params, final ShardingSphereRuleMetaData globalRuleMetaData,
-                             final Collection<ShardingSphereRule> rules, final 
String currentDatabase, final Map<String, ShardingSphereDatabase> databases, 
final Grantee grantee) {
+    public static boolean check(final String databaseName, final 
Collection<ShardingSphereRule> rules, final Grantee grantee) {
         for (Entry<ShardingSphereRule, SQLChecker> entry : 
OrderedSPILoader.getServices(SQLChecker.class, rules).entrySet()) {
-            entry.getValue().check(sqlStatementContext, params, grantee, 
globalRuleMetaData, currentDatabase, databases, entry.getKey());
+            boolean checkResult = entry.getValue().check(databaseName, 
grantee, entry.getKey());
+            if (!checkResult) {
+                return false;
+            }
         }
+        return true;
     }
     
     /**
diff --git 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/check/checker/SQLChecker.java
 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/check/checker/SQLChecker.java
index d58d9b21356..a7efe5b34a8 100644
--- 
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/check/checker/SQLChecker.java
+++ 
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/check/checker/SQLChecker.java
@@ -26,7 +26,6 @@ import 
org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPI;
 
 import java.util.List;
-import java.util.Map;
 import java.util.function.BiPredicate;
 
 /**
@@ -52,12 +51,10 @@ public interface SQLChecker<T extends ShardingSphereRule> 
extends OrderedSPI<T>
      * @param params SQL parameters
      * @param grantee grantee
      * @param globalRuleMetaData global rule meta data
-     * @param currentDatabase current database
-     * @param databases databases
+     * @param database current database
      * @param rule rule
      */
-    void check(SQLStatementContext<?> sqlStatementContext, List<Object> 
params, Grantee grantee,
-               ShardingSphereRuleMetaData globalRuleMetaData, String 
currentDatabase, Map<String, ShardingSphereDatabase> databases, T rule);
+    void check(SQLStatementContext<?> sqlStatementContext, List<Object> 
params, Grantee grantee, ShardingSphereRuleMetaData globalRuleMetaData, 
ShardingSphereDatabase database, T rule);
     
     /**
      * Check User.
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
index 3fc1d1214fa..a406c700c25 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
@@ -56,8 +56,8 @@ public final class DriverExecutor implements AutoCloseable {
         DatabaseType protocolType = 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getProtocolType();
         String schemaName = 
DatabaseTypeEngine.getDefaultSchemaName(protocolType, 
connection.getDatabaseName());
         SQLFederationRule sqlFederationRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLFederationRule.class);
-        federationExecutor = 
sqlFederationRule.getSQLFederationExecutor(connection.getDatabaseName(), 
schemaName, metaDataContexts.getMetaData(),
-                metaDataContexts.getShardingSphereData(), jdbcExecutor, 
eventBusContext);
+        federationExecutor = sqlFederationRule.getSQLFederationExecutor(
+                connection.getDatabaseName(), schemaName, 
metaDataContexts.getMetaData(), metaDataContexts.getShardingSphereData(), 
jdbcExecutor, eventBusContext);
         trafficExecutor = new TrafficExecutor();
     }
     
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
index 51b1815d731..0836135dccf 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
@@ -85,17 +85,17 @@ public final class ConnectionManager implements 
ExecutorJDBCConnectionManager, A
     }
     
     private Map<String, DataSource> getTrafficDataSourceMap(final String 
databaseName, final ContextManager contextManager) {
-        TrafficRule trafficRule = 
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TrafficRule.class);
-        MetaDataPersistService persistService = 
contextManager.getMetaDataContexts().getPersistService();
-        if (trafficRule.getStrategyRules().isEmpty()) {
+        TrafficRule rule = 
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TrafficRule.class);
+        if (rule.getStrategyRules().isEmpty()) {
             return Collections.emptyMap();
         }
+        MetaDataPersistService persistService = 
contextManager.getMetaDataContexts().getPersistService();
         String actualDatabaseName = 
contextManager.getMetaDataContexts().getMetaData().getActualDatabaseName(databaseName);
         Map<String, DataSourceProperties> dataSourcePropsMap = 
persistService.getDataSourceService().load(actualDatabaseName);
         Preconditions.checkState(!dataSourcePropsMap.isEmpty(), "Can not get 
data source properties from meta data.");
         DataSourceProperties dataSourcePropsSample = 
dataSourcePropsMap.values().iterator().next();
         Collection<ShardingSphereUser> users = 
persistService.getGlobalRuleService().loadUsers();
-        Collection<InstanceMetaData> instances = 
contextManager.getInstanceContext().getAllClusterInstances(InstanceType.PROXY, 
trafficRule.getLabels());
+        Collection<InstanceMetaData> instances = 
contextManager.getInstanceContext().getAllClusterInstances(InstanceType.PROXY, 
rule.getLabels());
         return 
DataSourcePoolCreator.create(createDataSourcePropertiesMap(instances, users, 
dataSourcePropsSample, actualDatabaseName));
     }
     
@@ -127,8 +127,8 @@ public final class ConnectionManager implements 
ExecutorJDBCConnectionManager, A
     
     private ConnectionTransaction createConnectionTransaction(final String 
databaseName, final ContextManager contextManager) {
         TransactionType type = TransactionTypeHolder.get();
-        TransactionRule transactionRule = 
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TransactionRule.class);
-        return null == type ? new ConnectionTransaction(databaseName, 
transactionRule) : new ConnectionTransaction(databaseName, type, 
transactionRule);
+        TransactionRule rule = 
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TransactionRule.class);
+        return null == type ? new ConnectionTransaction(databaseName, rule) : 
new ConnectionTransaction(databaseName, type, rule);
     }
     
     /**
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 2cf03fb26af..918bb9e1c0b 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -547,11 +547,11 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
     }
     
     private ExecutionContext createExecutionContext(final QueryContext 
queryContext) {
-        SQLCheckEngine.check(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
-                
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData().getRules(),
-                connection.getDatabaseName(), 
metaDataContexts.getMetaData().getDatabases(), null);
-        ExecutionContext result = 
kernelProcessor.generateExecutionContext(queryContext, 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()),
-                metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps(), connection.getConnectionContext());
+        ShardingSphereRuleMetaData globalRuleMetaData = 
metaDataContexts.getMetaData().getGlobalRuleMetaData();
+        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName());
+        
SQLCheckEngine.checkWithDatabaseRules(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null);
+        ExecutionContext result = kernelProcessor.generateExecutionContext(
+                queryContext, currentDatabase, globalRuleMetaData, 
metaDataContexts.getMetaData().getProps(), connection.getConnectionContext());
         findGeneratedKey(result).ifPresent(optional -> 
generatedValues.addAll(optional.getGeneratedValues()));
         return result;
     }
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 8bd0ec031ab..bbe9b559822 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -522,11 +522,10 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     
     private ExecutionContext createExecutionContext(final QueryContext 
queryContext) throws SQLException {
         clearStatements();
-        SQLCheckEngine.check(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
-                
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData().getRules(),
-                connection.getDatabaseName(), 
metaDataContexts.getMetaData().getDatabases(), null);
-        return kernelProcessor.generateExecutionContext(queryContext, 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
-                metaDataContexts.getMetaData().getProps(), 
connection.getConnectionContext());
+        ShardingSphereRuleMetaData globalRuleMetaData = 
metaDataContexts.getMetaData().getGlobalRuleMetaData();
+        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName());
+        
SQLCheckEngine.checkWithDatabaseRules(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null);
+        return kernelProcessor.generateExecutionContext(queryContext, 
currentDatabase, globalRuleMetaData, metaDataContexts.getMetaData().getProps(), 
connection.getConnectionContext());
     }
     
     private ExecutionGroupContext<JDBCExecutionUnit> 
createExecutionGroupContext() throws SQLException {
diff --git 
a/kernel/authority/core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
 
b/kernel/authority/core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
index 44bef40cb3a..97a01d431e0 100644
--- 
a/kernel/authority/core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
+++ 
b/kernel/authority/core/src/main/java/org/apache/shardingsphere/authority/checker/AuthorityChecker.java
@@ -48,7 +48,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ
 
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.function.BiPredicate;
 
@@ -64,14 +63,14 @@ public final class AuthorityChecker implements 
SQLChecker<AuthorityRule> {
     
     @Override
     public void check(final SQLStatementContext<?> sqlStatementContext, final 
List<Object> params, final Grantee grantee, final ShardingSphereRuleMetaData 
globalRuleMetaData,
-                      final String currentDatabase, final Map<String, 
ShardingSphereDatabase> databases, final AuthorityRule rule) {
+                      final ShardingSphereDatabase database, final 
AuthorityRule rule) {
         if (null == grantee) {
             return;
         }
         Optional<ShardingSpherePrivileges> privileges = 
rule.findPrivileges(grantee);
         ShardingSpherePreconditions.checkState(privileges.isPresent(), () -> 
new SQLCheckException(String.format("Access denied for user '%s'@'%s'", 
grantee.getUsername(), grantee.getHostname())));
-        ShardingSpherePreconditions.checkState(null == currentDatabase || 
privileges.filter(optional -> 
optional.hasPrivileges(currentDatabase)).isPresent(),
-                () -> new SQLCheckException(String.format("Unknown database 
'%s'", currentDatabase)));
+        ShardingSpherePreconditions.checkState(null == database || 
privileges.filter(optional -> 
optional.hasPrivileges(database.getName())).isPresent(),
+                () -> new SQLCheckException(String.format("Unknown database 
'%s'", null == database ? null : database.getName())));
         PrivilegeType privilegeType = 
getPrivilege(sqlStatementContext.getSqlStatement());
         boolean hasPrivileges = 
privileges.get().hasPrivileges(Collections.singletonList(privilegeType));
         ShardingSpherePreconditions.checkState(hasPrivileges, () -> new 
SQLCheckException(String.format("Access denied for operation %s.", null == 
privilegeType ? "" : privilegeType.name())));
diff --git 
a/kernel/authority/core/src/test/java/org/apache/shardingsphere/authority/checker/AuthorityCheckerTest.java
 
b/kernel/authority/core/src/test/java/org/apache/shardingsphere/authority/checker/AuthorityCheckerTest.java
index 18b2955c40f..a8e580179b4 100644
--- 
a/kernel/authority/core/src/test/java/org/apache/shardingsphere/authority/checker/AuthorityCheckerTest.java
+++ 
b/kernel/authority/core/src/test/java/org/apache/shardingsphere/authority/checker/AuthorityCheckerTest.java
@@ -79,8 +79,8 @@ public final class AuthorityCheckerTest {
         SelectStatementContext selectStatementContext = 
mock(SelectStatementContext.class);
         CreateTableStatementContext createTableStatementContext = 
mock(CreateTableStatementContext.class);
         InsertStatementContext insertStatementContext = 
mock(InsertStatementContext.class);
-        sqlChecker.check(selectStatementContext, Collections.emptyList(), new 
Grantee("root", "localhost"), mock(ShardingSphereRuleMetaData.class), "db0", 
Collections.emptyMap(), rule);
-        sqlChecker.check(insertStatementContext, Collections.emptyList(), new 
Grantee("root", "localhost"), mock(ShardingSphereRuleMetaData.class), "db0", 
Collections.emptyMap(), rule);
-        sqlChecker.check(createTableStatementContext, Collections.emptyList(), 
new Grantee("root", "localhost"), mock(ShardingSphereRuleMetaData.class), 
"db0", Collections.emptyMap(), rule);
+        sqlChecker.check(selectStatementContext, Collections.emptyList(), new 
Grantee("root", "localhost"), mock(ShardingSphereRuleMetaData.class), null, 
rule);
+        sqlChecker.check(insertStatementContext, Collections.emptyList(), new 
Grantee("root", "localhost"), mock(ShardingSphereRuleMetaData.class), null, 
rule);
+        sqlChecker.check(createTableStatementContext, Collections.emptyList(), 
new Grantee("root", "localhost"), mock(ShardingSphereRuleMetaData.class), null, 
rule);
     }
 }
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
index a653d120538..7d60f2d823e 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
@@ -157,8 +157,8 @@ public final class ProxyBackendHandlerFactory {
         String databaseName = 
sqlStatementContext.getTablesContext().getDatabaseName().isPresent()
                 ? 
sqlStatementContext.getTablesContext().getDatabaseName().get()
                 : connectionSession.getDatabaseName();
-        SQLCheckEngine.check(sqlStatementContext, 
queryContext.getParameters(), 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData(),
-                getRules(databaseName), databaseName, 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabases(),
 connectionSession.getGrantee());
+        SQLCheckEngine.checkWithRules(sqlStatementContext, 
queryContext.getParameters(), 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData(),
+                getRules(databaseName), 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName),
 connectionSession.getGrantee());
         backendHandler = 
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, 
sqlStatementContext, connectionSession);
         return backendHandler.orElseGet(() -> 
DatabaseBackendHandlerFactory.newInstance(queryContext, connectionSession, 
preferPreparedStatement));
     }
@@ -202,13 +202,11 @@ public final class ProxyBackendHandlerFactory {
     }
     
     private static Collection<ShardingSphereRule> getRules(final String 
databaseName) {
-        MetaDataContexts contexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        if (Strings.isNullOrEmpty(databaseName) || 
!ProxyContext.getInstance().databaseExists(databaseName)) {
-            return contexts.getMetaData().getGlobalRuleMetaData().getRules();
+        MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+        Collection<ShardingSphereRule> result = new 
LinkedList<>(metaDataContexts.getMetaData().getGlobalRuleMetaData().getRules());
+        if (ProxyContext.getInstance().databaseExists(databaseName)) {
+            
result.addAll(metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules());
         }
-        Collection<ShardingSphereRule> result;
-        result = new 
LinkedList<>(contexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules());
-        
result.addAll(contexts.getMetaData().getGlobalRuleMetaData().getRules());
         return result;
     }
     
diff --git 
a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
 
b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
index fcd1738b668..d35b2904da9 100644
--- 
a/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
+++ 
b/proxy/frontend/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
@@ -37,6 +37,8 @@ import 
org.apache.shardingsphere.infra.executor.sql.execute.result.update.Update
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriverType;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
@@ -125,11 +127,10 @@ public final class MySQLMultiStatementsHandler implements 
ProxyBackendHandler {
     }
     
     private ExecutionContext createExecutionContext(final QueryContext 
queryContext) {
-        SQLCheckEngine.check(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
-                
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName()).getRuleMetaData().getRules(),
-                connectionSession.getDatabaseName(), 
metaDataContexts.getMetaData().getDatabases(), null);
-        return kernelProcessor.generateExecutionContext(queryContext, 
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName()),
-                metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps(), 
connectionSession.getConnectionContext());
+        ShardingSphereRuleMetaData globalRuleMetaData = 
metaDataContexts.getMetaData().getGlobalRuleMetaData();
+        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName());
+        
SQLCheckEngine.checkWithDatabaseRules(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null);
+        return kernelProcessor.generateExecutionContext(queryContext, 
currentDatabase, globalRuleMetaData, metaDataContexts.getMetaData().getProps(), 
connectionSession.getConnectionContext());
     }
     
     @Override
diff --git 
a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
 
b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
index 76b11c7c8f2..a6f6841ce06 100644
--- 
a/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
+++ 
b/proxy/frontend/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
@@ -39,6 +39,7 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecuti
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriverType;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.JDBCBackendStatement;
@@ -125,11 +126,10 @@ public final class PostgreSQLBatchedStatementsExecutor {
     }
     
     private ExecutionContext createExecutionContext(final QueryContext 
queryContext) {
-        SQLCheckEngine.check(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), 
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
-                
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName()).getRuleMetaData().getRules(),
-                connectionSession.getDatabaseName(), 
metaDataContexts.getMetaData().getDatabases(), null);
-        return kernelProcessor.generateExecutionContext(queryContext, 
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName()),
-                metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps(), 
connectionSession.getConnectionContext());
+        ShardingSphereRuleMetaData globalRuleMetaData = 
metaDataContexts.getMetaData().getGlobalRuleMetaData();
+        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName());
+        
SQLCheckEngine.checkWithDatabaseRules(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null);
+        return kernelProcessor.generateExecutionContext(queryContext, 
currentDatabase, globalRuleMetaData, metaDataContexts.getMetaData().getProps(), 
connectionSession.getConnectionContext());
     }
     
     /**


Reply via email to