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());
}
/**