You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2025/10/08 14:46:09 UTC
(shardingsphere) branch master updated: Refactor SQLAuditor (#36823)
This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 78181f5abf2 Refactor SQLAuditor (#36823)
78181f5abf2 is described below
commit 78181f5abf273c7e9182e70a4d379a24fc5223c8
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Wed Oct 8 22:46:02 2025 +0800
Refactor SQLAuditor (#36823)
---
.../sharding/auditor/ShardingSQLAuditor.java | 9 ++++-----
.../sharding/auditor/ShardingSQLAuditorTest.java | 23 ++++++++++++++--------
.../infra/executor/audit/SQLAuditEngine.java | 6 +++---
.../infra/executor/audit/SQLAuditor.java | 4 +---
.../DriverExecuteBatchExecutor.java | 6 ++----
.../engine/facade/DriverExecutorFacade.java | 10 +++++-----
.../handler/checker/AuditSQLExecutionChecker.java | 2 +-
.../MySQLMultiStatementsProxyBackendHandler.java | 6 ++----
.../PostgreSQLBatchedStatementsExecutor.java | 6 ++----
9 files changed, 35 insertions(+), 37 deletions(-)
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditor.java
index 2981404c201..75a5de96755 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditor.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditor.java
@@ -21,7 +21,6 @@ import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.executor.audit.SQLAuditor;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
import org.apache.shardingsphere.sharding.constant.ShardingOrder;
@@ -37,22 +36,22 @@ public final class ShardingSQLAuditor implements SQLAuditor<ShardingRule> {
@HighFrequencyInvocation
@Override
- public void audit(final QueryContext queryContext, final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, final ShardingRule rule) {
+ public void audit(final QueryContext queryContext, final ShardingSphereDatabase database, final ShardingRule rule) {
Collection<ShardingAuditStrategyConfiguration> auditStrategies = getShardingAuditStrategies(queryContext.getSqlStatementContext(), rule);
if (auditStrategies.isEmpty()) {
return;
}
Collection<String> disableAuditNames = queryContext.getHintValueContext().getDisableAuditNames();
for (ShardingAuditStrategyConfiguration each : auditStrategies) {
- audit(queryContext, globalRuleMetaData, database, rule, each, disableAuditNames);
+ audit(queryContext, database, rule, each, disableAuditNames);
}
}
- private void audit(final QueryContext queryContext, final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, final ShardingRule rule,
+ private void audit(final QueryContext queryContext, final ShardingSphereDatabase database, final ShardingRule rule,
final ShardingAuditStrategyConfiguration auditStrategy, final Collection<String> disableAuditNames) {
for (String each : auditStrategy.getAuditorNames()) {
if (!auditStrategy.isAllowHintDisable() || !disableAuditNames.contains(each.toLowerCase())) {
- rule.getAuditors().get(each).check(queryContext.getSqlStatementContext(), queryContext.getParameters(), globalRuleMetaData, database);
+ rule.getAuditors().get(each).check(queryContext.getSqlStatementContext(), queryContext.getParameters(), queryContext.getMetaData().getGlobalRuleMetaData(), database);
}
}
}
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditorTest.java
index ee48d319853..1a64398f23b 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditorTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditorTest.java
@@ -94,25 +94,30 @@ class ShardingSQLAuditorTest {
void assertAuditSuccessWithNotTableAvailable() {
SQLStatementContext sqlStatementContext = mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
when(sqlStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
- QueryContext queryContext = mock(QueryContext.class);
+ QueryContext queryContext = mock(QueryContext.class, RETURNS_DEEP_STUBS);
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
- sqlAuditor.audit(queryContext, globalRuleMetaData, database, rule);
+ when(queryContext.getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
+ sqlAuditor.audit(queryContext, database, rule);
verify(queryContext, times(0)).getHintValueContext();
}
@Test
void assertAuditSuccessWithDisableAuditNames() {
when(auditStrategy.isAllowHintDisable()).thenReturn(true);
- QueryContext queryContext = new QueryContext(sqlStatementContext, "", Collections.emptyList(), hintValueContext, mock(ConnectionContext.class), mock(ShardingSphereMetaData.class));
- sqlAuditor.audit(queryContext, globalRuleMetaData, database, rule);
+ ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+ when(metaData.getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
+ QueryContext queryContext = new QueryContext(sqlStatementContext, "", Collections.emptyList(), hintValueContext, mock(ConnectionContext.class), metaData);
+ sqlAuditor.audit(queryContext, database, rule);
verify(rule.getAuditors().get("foo_auditor"), times(0)).check(sqlStatementContext, Collections.emptyList(), globalRuleMetaData, database);
}
@Test
void assertAuditSuccessWithoutDisableAuditNames() {
when(hintValueContext.getDisableAuditNames()).thenReturn(Collections.singleton("bar_auditor"));
- QueryContext queryContext = new QueryContext(sqlStatementContext, "", Collections.emptyList(), hintValueContext, mock(ConnectionContext.class), mock(ShardingSphereMetaData.class));
- sqlAuditor.audit(queryContext, globalRuleMetaData, database, rule);
+ ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+ when(metaData.getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
+ QueryContext queryContext = new QueryContext(sqlStatementContext, "", Collections.emptyList(), hintValueContext, mock(ConnectionContext.class), metaData);
+ sqlAuditor.audit(queryContext, database, rule);
verify(rule.getAuditors().get("foo_auditor")).check(sqlStatementContext, Collections.emptyList(), globalRuleMetaData, database);
}
@@ -120,8 +125,10 @@ class ShardingSQLAuditorTest {
void assertAuditFailed() {
ShardingAuditAlgorithm auditAlgorithm = rule.getAuditors().get("foo_auditor");
doThrow(new DMLWithoutShardingKeyException()).when(auditAlgorithm).check(sqlStatementContext, Collections.emptyList(), globalRuleMetaData, database);
- QueryContext queryContext = new QueryContext(sqlStatementContext, "", Collections.emptyList(), hintValueContext, mock(ConnectionContext.class), mock(ShardingSphereMetaData.class));
- DMLWithoutShardingKeyException ex = assertThrows(DMLWithoutShardingKeyException.class, () -> sqlAuditor.audit(queryContext, globalRuleMetaData, database, rule));
+ ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+ when(metaData.getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
+ QueryContext queryContext = new QueryContext(sqlStatementContext, "", Collections.emptyList(), hintValueContext, mock(ConnectionContext.class), metaData);
+ DMLWithoutShardingKeyException ex = assertThrows(DMLWithoutShardingKeyException.class, () -> sqlAuditor.audit(queryContext, database, rule));
assertThat(ex.getMessage(), is("Not allow DML operation without sharding conditions."));
}
}
diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditEngine.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditEngine.java
index ee3ccb44546..2a186efc9af 100644
--- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditEngine.java
+++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditEngine.java
@@ -40,18 +40,18 @@ public final class SQLAuditEngine {
* Audit SQL.
*
* @param queryContext query context
- * @param globalRuleMetaData global rule meta data
* @param database database
*/
@HighFrequencyInvocation
@SuppressWarnings({"rawtypes", "unchecked"})
- public static void audit(final QueryContext queryContext, final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database) {
+ public static void audit(final QueryContext queryContext, final ShardingSphereDatabase database) {
+ RuleMetaData globalRuleMetaData = queryContext.getMetaData().getGlobalRuleMetaData();
Collection<ShardingSphereRule> rules = new LinkedList<>(globalRuleMetaData.getRules());
if (null != database) {
rules.addAll(database.getRuleMetaData().getRules());
}
for (Entry<ShardingSphereRule, SQLAuditor> entry : OrderedSPILoader.getServices(SQLAuditor.class, rules).entrySet()) {
- entry.getValue().audit(queryContext, globalRuleMetaData, database, entry.getKey());
+ entry.getValue().audit(queryContext, database, entry.getKey());
}
}
}
diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditor.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditor.java
index d33db9c4d68..7c592da4995 100644
--- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditor.java
+++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditor.java
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.infra.executor.audit;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
@@ -36,9 +35,8 @@ public interface SQLAuditor<T extends ShardingSphereRule> extends OrderedSPI<T>
* Audit SQL.
*
* @param queryContext query context
- * @param globalRuleMetaData global rule meta data
* @param database current database
* @param rule rule
*/
- void audit(QueryContext queryContext, RuleMetaData globalRuleMetaData, ShardingSphereDatabase database, T rule);
+ void audit(QueryContext queryContext, ShardingSphereDatabase database, T rule);
}
diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/preparedstatement/DriverExecuteBatchExecutor.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/preparedstatement/DriverExecuteBatchExecutor.java
index e86ca5d2b82..959b6613b38 100644
--- a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/preparedstatement/DriverExecuteBatchExecutor.java
+++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/preparedstatement/DriverExecuteBatchExecutor.java
@@ -36,7 +36,6 @@ import org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriv
import org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import java.sql.Connection;
@@ -91,9 +90,8 @@ public final class DriverExecuteBatchExecutor {
}
private ExecutionContext createExecutionContext(final QueryContext queryContext, final ShardingSphereDatabase database) {
- RuleMetaData globalRuleMetaData = metaData.getGlobalRuleMetaData();
- SQLAuditEngine.audit(queryContext, globalRuleMetaData, database);
- return new KernelProcessor().generateExecutionContext(queryContext, globalRuleMetaData, metaData.getProps());
+ SQLAuditEngine.audit(queryContext, database);
+ return new KernelProcessor().generateExecutionContext(queryContext, metaData.getGlobalRuleMetaData(), metaData.getProps());
}
/**
diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java
index dc1aef87e4b..8fe2fd67450 100644
--- a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java
+++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java
@@ -104,9 +104,9 @@ public final class DriverExecutorFacade implements AutoCloseable {
public ResultSet executeQuery(final ShardingSphereDatabase database, final ShardingSphereMetaData metaData, final QueryContext queryContext, final Statement statement,
final Map<String, Integer> columnLabelAndIndexMap,
final StatementAddCallback addCallback, final StatementReplayCallback replayCallback) throws SQLException {
- SQLAuditEngine.audit(queryContext, connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData(), database);
- return queryExecutor.executeQuery(database, queryContext, createDriverExecutionPrepareEngine(database, metaData, jdbcDriverType), statement, columnLabelAndIndexMap, addCallback,
- replayCallback);
+ SQLAuditEngine.audit(queryContext, database);
+ return queryExecutor.executeQuery(
+ database, queryContext, createDriverExecutionPrepareEngine(database, metaData, jdbcDriverType), statement, columnLabelAndIndexMap, addCallback, replayCallback);
}
/**
@@ -124,7 +124,7 @@ public final class DriverExecutorFacade implements AutoCloseable {
@SuppressWarnings("rawtypes")
public int executeUpdate(final ShardingSphereDatabase database, final ShardingSphereMetaData metaData, final QueryContext queryContext,
final StatementExecuteUpdateCallback executeUpdateCallback, final StatementAddCallback addCallback, final StatementReplayCallback replayCallback) throws SQLException {
- SQLAuditEngine.audit(queryContext, connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData(), database);
+ SQLAuditEngine.audit(queryContext, database);
return updateExecutor.executeUpdate(database, queryContext, createDriverExecutionPrepareEngine(database, metaData, jdbcDriverType), executeUpdateCallback, addCallback, replayCallback);
}
@@ -143,7 +143,7 @@ public final class DriverExecutorFacade implements AutoCloseable {
@SuppressWarnings("rawtypes")
public boolean execute(final ShardingSphereDatabase database, final ShardingSphereMetaData metaData, final QueryContext queryContext,
final StatementExecuteCallback executeCallback, final StatementAddCallback addCallback, final StatementReplayCallback replayCallback) throws SQLException {
- SQLAuditEngine.audit(queryContext, connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData(), database);
+ SQLAuditEngine.audit(queryContext, database);
return executeExecutor.execute(database, queryContext, createDriverExecutionPrepareEngine(database, metaData, jdbcDriverType), executeCallback, addCallback, replayCallback);
}
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/checker/AuditSQLExecutionChecker.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/checker/AuditSQLExecutionChecker.java
index 4ecde5cbb13..197acc4218f 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/checker/AuditSQLExecutionChecker.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/checker/AuditSQLExecutionChecker.java
@@ -30,6 +30,6 @@ public final class AuditSQLExecutionChecker implements SQLExecutionChecker {
@Override
public void check(final Grantee grantee, final QueryContext queryContext, final ShardingSphereDatabase database) {
- SQLAuditEngine.audit(queryContext, queryContext.getMetaData().getGlobalRuleMetaData(), database);
+ SQLAuditEngine.audit(queryContext, database);
}
}
diff --git a/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsProxyBackendHandler.java b/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsProxyBackendHandler.java
index c1a6c20856b..bdd8ff79584 100644
--- a/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsProxyBackendHandler.java
+++ b/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsProxyBackendHandler.java
@@ -39,7 +39,6 @@ import org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.Statemen
import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.infra.hint.SQLHintUtils;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.parser.SQLParserEngine;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.session.query.QueryContext;
@@ -170,10 +169,9 @@ public final class MySQLMultiStatementsProxyBackendHandler implements ProxyBacke
}
private ExecutionContext createExecutionContext(final QueryContext queryContext) {
- RuleMetaData globalRuleMetaData = metaDataContexts.getMetaData().getGlobalRuleMetaData();
ShardingSphereDatabase currentDatabase = metaDataContexts.getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
- SQLAuditEngine.audit(queryContext, globalRuleMetaData, currentDatabase);
- return new KernelProcessor().generateExecutionContext(queryContext, globalRuleMetaData, metaDataContexts.getMetaData().getProps());
+ SQLAuditEngine.audit(queryContext, currentDatabase);
+ return new KernelProcessor().generateExecutionContext(queryContext, metaDataContexts.getMetaData().getGlobalRuleMetaData(), metaDataContexts.getMetaData().getProps());
}
private void executeAddBatch(final ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext) throws SQLException {
diff --git a/proxy/frontend/dialect/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java b/proxy/frontend/dialect/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
index 781c20d67d2..998b594ac2e 100644
--- a/proxy/frontend/dialect/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
+++ b/proxy/frontend/dialect/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
@@ -41,7 +41,6 @@ import org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.Statemen
import org.apache.shardingsphere.infra.hint.HintValueContext;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -133,10 +132,9 @@ public final class PostgreSQLBatchedStatementsExecutor {
}
private ExecutionContext createExecutionContext(final QueryContext queryContext) {
- RuleMetaData globalRuleMetaData = metaDataContexts.getMetaData().getGlobalRuleMetaData();
ShardingSphereDatabase currentDatabase = metaDataContexts.getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
- SQLAuditEngine.audit(queryContext, globalRuleMetaData, currentDatabase);
- return kernelProcessor.generateExecutionContext(queryContext, globalRuleMetaData, metaDataContexts.getMetaData().getProps());
+ SQLAuditEngine.audit(queryContext, currentDatabase);
+ return kernelProcessor.generateExecutionContext(queryContext, metaDataContexts.getMetaData().getGlobalRuleMetaData(), metaDataContexts.getMetaData().getProps());
}
/**