This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 497fb3121da Remove ClassificationResult compatibility constructor
(#39087)
497fb3121da is described below
commit 497fb3121dab5fdff9fd4ec1be1d05894f94da84
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Jul 13 18:47:50 2026 +0800
Remove ClassificationResult compatibility constructor (#39087)
---
.../tool/handler/execute/ClassificationResult.java | 5 ---
.../tool/handler/execute/StatementClassifier.java | 5 ++-
.../core/protocol/error/MCPErrorConverterTest.java | 23 ++++++++--
.../execute/MCPJdbcStatementExecutorTest.java | 50 ++++++++++++----------
.../MCPJdbcTransactionStatementExecutorTest.java | 3 +-
.../handler/execute/MCPSQLExecutionFacadeTest.java | 26 +++++++----
.../execute/RuleDistSQLExecutionExceptionTest.java | 3 +-
7 files changed, 70 insertions(+), 45 deletions(-)
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/ClassificationResult.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/ClassificationResult.java
index f1cf58c8498..2fcb3f9af96 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/ClassificationResult.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/ClassificationResult.java
@@ -58,11 +58,6 @@ public final class ClassificationResult {
private final String savepointName;
- public ClassificationResult(final SupportedMCPStatement statementClass,
final String statementType, final String normalizedSql, final String
targetObjectName, final String savepointName) {
- this(statementClass, statementType, normalizedSql, savepointName,
- targetObjectName.isEmpty() ? List.of() :
List.of(SQLStatementObjectName.fromNormalizedName(targetObjectName)));
- }
-
ClassificationResult(final SupportedMCPStatement statementClass, final
String statementType, final String normalizedSql, final String savepointName,
final Collection<SQLStatementObjectName>
referencedObjects) {
this.statementClass = statementClass;
diff --git
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/StatementClassifier.java
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/StatementClassifier.java
index 94dbec4bb2b..3243f0770a1 100644
---
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/StatementClassifier.java
+++
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/StatementClassifier.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.mcp.core.tool.handler.execute;
import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPStatement;
+import java.util.List;
import java.util.Locale;
/**
@@ -52,10 +53,10 @@ public final class StatementClassifier {
String statementType = extractStatementType(upperLeadingSql);
String savepointName = extractSavepointName(leadingSql);
validateSavepointName(statementType, savepointName);
- return new ClassificationResult(SupportedMCPStatement.SAVEPOINT,
statementType, actualSql, "", savepointName);
+ return new ClassificationResult(SupportedMCPStatement.SAVEPOINT,
statementType, actualSql, savepointName, List.of());
}
if (isTransactionControlStatement(upperLeadingSql)) {
- return new
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL,
extractStatementType(upperLeadingSql), actualSql, "", "");
+ return new
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL,
extractStatementType(upperLeadingSql), actualSql, "", List.of());
}
SQLStatementStructure statementStructure =
structureResolver.resolve(actualSql);
SupportedMCPStatement statementClass =
statementClassResolver.resolve(statementStructure);
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPErrorConverterTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPErrorConverterTest.java
index bd5421f79bc..3dae5977253 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPErrorConverterTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPErrorConverterTest.java
@@ -59,12 +59,15 @@ import java.sql.SQLTransientConnectionException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.stream.Stream;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
class MCPErrorConverterTest {
@@ -271,7 +274,12 @@ class MCPErrorConverterTest {
@Test
void assertConvertSQLToolMismatchWithRecovery() {
- ClassificationResult classificationResult = new
ClassificationResult(SupportedMCPStatement.DML, "UPDATE", "UPDATE orders SET
status = 'PAID'", "orders", "");
+ ClassificationResult classificationResult =
mock(ClassificationResult.class);
+
when(classificationResult.getStatementClass()).thenReturn(SupportedMCPStatement.DML);
+ when(classificationResult.getStatementType()).thenReturn("UPDATE");
+ when(classificationResult.getNormalizedSql()).thenReturn("UPDATE
orders SET status = 'PAID'");
+
when(classificationResult.getTargetObjectName()).thenReturn(Optional.of("orders"));
+
when(classificationResult.getSavepointName()).thenReturn(Optional.empty());
Map<String, Object> suggestedArguments = Map.of("database",
"logic_db", "schema", "public", "sql", "UPDATE orders SET status = 'PAID'",
"execution_mode", "preview");
Map<String, Object> actual = MCPErrorConverter.convert(new
SQLToolMismatchException(
"database_gateway_execute_query only supports
classifier-approved QUERY statements. "
@@ -304,7 +312,12 @@ class MCPErrorConverterTest {
@Test
void assertConvertReadOnlySQLToolMismatchWithRecovery() {
- ClassificationResult classificationResult = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT * FROM
orders", "orders", "");
+ ClassificationResult classificationResult =
mock(ClassificationResult.class);
+
when(classificationResult.getStatementClass()).thenReturn(SupportedMCPStatement.QUERY);
+ when(classificationResult.getStatementType()).thenReturn("SELECT");
+ when(classificationResult.getNormalizedSql()).thenReturn("SELECT *
FROM orders");
+
when(classificationResult.getTargetObjectName()).thenReturn(Optional.of("orders"));
+
when(classificationResult.getSavepointName()).thenReturn(Optional.empty());
Map<String, Object> suggestedArguments = Map.of("database",
"logic_db", "sql", "SELECT * FROM orders");
Map<String, Object> actual = MCPErrorConverter.convert(new
SQLToolMismatchException(
"database_gateway_execute_update does not accept read-only
SQL. Use database_gateway_execute_query for read-only SQL.",
@@ -318,8 +331,10 @@ class MCPErrorConverterTest {
@Test
void assertConvertRuleDistSQLExecutionWithRecovery() {
- ClassificationResult classificationResult = new
ClassificationResult(SupportedMCPStatement.DDL, "CREATE",
- "CREATE SHARDING TABLE RULE
t_order(DATANODES('ds_${0..1}.t_order_${0..1}'))", "", "");
+ ClassificationResult classificationResult =
mock(ClassificationResult.class);
+
when(classificationResult.getStatementClass()).thenReturn(SupportedMCPStatement.DDL);
+ when(classificationResult.getStatementType()).thenReturn("CREATE");
+
when(classificationResult.getSideEffectScope()).thenReturn("rule-metadata");
Map<String, Object> actual = MCPErrorConverter.convert(new
RuleDistSQLExecutionException(
"sharding_db", classificationResult, new
SQLSyntaxErrorException("syntax error"))).toPayload();
assertThat(actual.get("message"),
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutorTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutorTest.java
index 032dcf401a1..37a64d299fb 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutorTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutorTest.java
@@ -101,7 +101,8 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Collections.emptyMap(), transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "UPDATE orders SET status = 'DONE'", 10,
1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", List.of()),
+
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getAffectedRows(), is(2));
verify(connection, never()).close();
}
@@ -122,7 +123,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000,
true),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getRows().size(), is(1));
verify(connection).setReadOnly(true);
verify(connection).setAutoCommit(false);
@@ -140,7 +141,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Collections.emptyMap(), transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000,
true),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getRows().size(), is(1));
verify(connection, never()).setReadOnly(true);
verify(connection, never()).rollback();
@@ -163,7 +164,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", " ", "SELECT status FROM orders", 0, 0),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getRows().size(), is(2));
assertFalse(actual.isTruncated());
verify(connection, never()).setSchema(anyString());
@@ -185,7 +186,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders",
Integer.MAX_VALUE, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getRows().size(), is(0));
assertFalse(actual.isTruncated());
verify(statement).setMaxRows(Integer.MAX_VALUE);
@@ -206,7 +207,7 @@ class MCPJdbcStatementExecutorTest {
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "WITH updated_orders AS (UPDATE orders
SET status = 'DONE' RETURNING *) SELECT * FROM updated_orders", 10, 1000),
new ClassificationResult(SupportedMCPStatement.DML, "SELECT",
- "WITH updated_orders AS (UPDATE orders SET status =
'DONE' RETURNING *) SELECT * FROM updated_orders", "", ""),
+ "WITH updated_orders AS (UPDATE orders SET status =
'DONE' RETURNING *) SELECT * FROM updated_orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getResultKind(),
is(ExecuteQueryResultKind.RESULT_SET));
assertThat(actual.getStatementClass(), is(SupportedMCPStatement.DML));
@@ -224,7 +225,8 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "logic_db", "UPDATE orders SET status = 'DONE'",
10, 1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", List.of()),
+
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getAffectedRows(), is(1));
verify(connection, never()).setSchema(anyString());
}
@@ -240,7 +242,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
MCPUnsupportedException actual =
assertThrows(MCPUnsupportedException.class, () -> statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "UPDATE orders SET status = 'DONE'", 10,
1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.BEST_EFFORT)));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.BEST_EFFORT)));
assertThat(actual.getMessage(), is("schema"));
verify(connection).setSchema("public");
verify(connection, never()).createStatement();
@@ -257,7 +259,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
QueryDidNotReturnResultSetException actual =
assertThrows(QueryDidNotReturnResultSetException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("Query did not return a result
set."));
}
@@ -271,7 +273,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
StatementClassNotSupportedException actual =
assertThrows(StatementClassNotSupportedException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "public", "BEGIN", 10, 1000),
- new
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL, "BEGIN",
"BEGIN", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
+ new
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL, "BEGIN",
"BEGIN", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("Statement class is not
supported."));
}
@@ -287,7 +289,7 @@ class MCPJdbcStatementExecutorTest {
when(databaseConfig.openConnection(anyString())).thenReturn(connection);
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("sharding_db", databaseConfig),
transactionResourceManager);
ClassificationResult classificationResult = new
ClassificationResult(SupportedMCPStatement.DDL, "CREATE",
- "CREATE SHARDING TABLE RULE
t_order(DATANODES('ds_${0..1}.t_order_${0..1}'))", "", "");
+ "CREATE SHARDING TABLE RULE
t_order(DATANODES('ds_${0..1}.t_order_${0..1}'))", "", List.of());
RuleDistSQLExecutionException actual =
assertThrows(RuleDistSQLExecutionException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"sharding_db", "public", "CREATE SHARDING TABLE RULE
t_order(DATANODES('ds_${0..1}.t_order_${0..1}'))", 10, 1000),
classificationResult,
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
@@ -313,7 +315,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
ShardingSphereMCPException actual =
assertThrows(expectedExceptionClass, () -> statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getClass(), is(expectedExceptionClass));
assertThat(actual.getMessage(), is(expectedMessage));
assertThat(actual.getCause(), is(sqlException));
@@ -327,7 +329,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Collections.emptyMap(), transactionResourceManager);
MCPTransactionStateException actual =
assertThrows(MCPTransactionStateException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("Transaction already active."));
assertThat(actual.getCause(), is(cause));
}
@@ -339,7 +341,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Collections.emptyMap(), transactionResourceManager);
MCPUnavailableException actual =
assertThrows(MCPUnavailableException.class, () -> statementExecutor.execute(new
SQLExecutionRequest("session-1",
"missing_db", "public", "SELECT status FROM orders", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("Database `missing_db` is not
configured."));
}
@@ -357,7 +359,8 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
MCPQueryFailedException actual =
assertThrows(MCPQueryFailedException.class, () -> statementExecutor.execute(new
SQLExecutionRequest("session-1", "logic_db",
"public", "UPDATE orders SET status = 'DONE'", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", List.of()),
+
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("statement close failed"));
}
@@ -372,7 +375,8 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "UPDATE orders SET status = 'DONE'", 10,
1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", List.of()),
+
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getAffectedRows(), is(1));
verify(connection).close();
}
@@ -386,7 +390,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
assertThrows(NullPointerException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "", "SELECT status FROM orders", 0, 0),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
}
@Test
@@ -400,7 +404,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
assertThrows(NullPointerException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "", "SELECT status FROM orders", 0, 0),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", List.of()),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
}
private static MCPDatabaseCapability createDatabaseCapability(final
SchemaExecutionSemantics schemaExecutionSemantics) {
@@ -447,21 +451,21 @@ class MCPJdbcStatementExecutorTest {
private static Stream<Arguments> assertExecuteCases() throws SQLException {
return Stream.of(
Arguments.of("query result set", new
SQLExecutionRequest("session-1", "logic_db", "public", "SELECT status FROM
orders ORDER BY order_id", 1, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders ORDER BY order_id", "", ""),
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders ORDER BY order_id", "", List.of()),
createStatementConnection(true, 0,
createResultSet(createColumns(), List.of(List.of(1, "NEW"), List.of(2,
"DONE")))),
ExecuteQueryResultKind.RESULT_SET, "SELECT", 1, 0, "",
true),
Arguments.of("explain result set", new
SQLExecutionRequest("session-1", "logic_db", "public", "EXPLAIN SELECT * FROM
orders", 10, 1000),
- new
ClassificationResult(SupportedMCPStatement.EXPLAIN, "EXPLAIN", "EXPLAIN SELECT
* FROM orders", "", ""),
+ new
ClassificationResult(SupportedMCPStatement.EXPLAIN, "EXPLAIN", "EXPLAIN SELECT
* FROM orders", "", List.of()),
createStatementConnection(true, 0,
createResultSet(List.of(new ExecuteQueryColumnDefinition("plan", "VARCHAR",
"VARCHAR", true)), List.of(List.of("plan")))),
ExecuteQueryResultKind.RESULT_SET, "EXPLAIN", 1, 0,
"", false),
Arguments.of("dml update count", new
SQLExecutionRequest("session-1", "logic_db", "public", "UPDATE orders SET
status = 'DONE'", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.DML,
"UPDATE", "UPDATE orders SET status = 'DONE'", "", ""),
createStatementConnection(false, 3, null),
+ new ClassificationResult(SupportedMCPStatement.DML,
"UPDATE", "UPDATE orders SET status = 'DONE'", "", List.of()),
createStatementConnection(false, 3, null),
ExecuteQueryResultKind.UPDATE_COUNT, "UPDATE", 0, 3,
"", false),
Arguments.of("ddl ack", new SQLExecutionRequest("session-1",
"logic_db", "public", "CREATE TABLE orders_archive", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.DDL,
"CREATE", "CREATE TABLE orders_archive", "", ""),
createStatementConnection(false, 0, null),
+ new ClassificationResult(SupportedMCPStatement.DDL,
"CREATE", "CREATE TABLE orders_archive", "", List.of()),
createStatementConnection(false, 0, null),
ExecuteQueryResultKind.STATEMENT_ACK, "CREATE", 0, 0,
"Statement executed.", false),
Arguments.of("dcl ack", new SQLExecutionRequest("session-1",
"logic_db", "public", "GRANT SELECT ON orders TO app_user", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.DCL,
"GRANT", "GRANT SELECT ON orders TO app_user", "", ""),
createStatementConnection(false, 0, null),
+ new ClassificationResult(SupportedMCPStatement.DCL,
"GRANT", "GRANT SELECT ON orders TO app_user", "", List.of()),
createStatementConnection(false, 0, null),
ExecuteQueryResultKind.STATEMENT_ACK, "GRANT", 0, 0,
"Statement executed.", false));
}
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutorTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutorTest.java
index 812dc9e4049..dc8a9137244 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutorTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutorTest.java
@@ -36,6 +36,7 @@ import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
@@ -125,7 +126,7 @@ class MCPJdbcTransactionStatementExecutorTest {
MCPJdbcTransactionStatementExecutor executor = new
MCPJdbcTransactionStatementExecutor(sessionManager);
MCPInvalidRequestException actual =
assertThrows(MCPInvalidRequestException.class,
() -> executor.execute("session-1", "logic_db",
createCapability(),
- new
ClassificationResult(SupportedMCPStatement.SAVEPOINT, statementType, sql, "",
"")));
+ new
ClassificationResult(SupportedMCPStatement.SAVEPOINT, statementType, sql, "",
List.of())));
assertThat(actual.getMessage(), is("Savepoint name is required."));
}
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeTest.java
index 10f9c2ef0e9..c6671b35894 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeTest.java
@@ -42,6 +42,7 @@ import org.mockito.ArgumentCaptor;
import java.sql.SQLException;
import java.sql.SQLSyntaxErrorException;
import java.util.Collections;
+import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
@@ -88,7 +89,7 @@ class MCPSQLExecutionFacadeTest {
SQLExecutionTraceFactory traceFactory =
mock(SQLExecutionTraceFactory.class);
SQLExecutionRequest request = createExecutionRequest("SELECT 1");
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.QUERY));
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT 1", "", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT 1", "",
List.of());
SQLExecutionResponse response = mock(SQLExecutionResponse.class);
ArgumentCaptor<Supplier<SQLExecutionResponse>> lockedExecution =
ArgumentCaptor.forClass(Supplier.class);
when(coordinator.executeWithSessionLock(eq("session-1"),
lockedExecution.capture())).thenReturn(response);
@@ -151,7 +152,8 @@ class MCPSQLExecutionFacadeTest {
MCPJdbcStatementExecutor statementExecutor =
mock(MCPJdbcStatementExecutor.class);
SQLExecutionTraceFactory traceFactory =
mock(SQLExecutionTraceFactory.class);
SQLExecutionRequest request = createExecutionRequest("SELECT 1");
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT 1",
"orders", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT 1", "",
+ List.of(SQLStatementObjectName.fromNormalizedName("orders")));
MCPSQLExecutionFacade facade = createFacade(capabilityProvider,
coordinator, transactionExecutor, statementExecutor, traceFactory,
createStatementClassifier(classification));
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.DML));
mockSessionLock(coordinator);
@@ -168,7 +170,7 @@ class MCPSQLExecutionFacadeTest {
MCPSessionExecutionCoordinator coordinator =
mock(MCPSessionExecutionCoordinator.class);
MCPJdbcTransactionStatementExecutor transactionExecutor =
mock(MCPJdbcTransactionStatementExecutor.class);
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.TRANSACTION_CONTROL));
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL, "BEGIN",
"BEGIN", "", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL, "BEGIN",
"BEGIN", "", List.of());
SQLExecutionResponse response =
SQLExecutionResponse.statementAck(SupportedMCPStatement.TRANSACTION_CONTROL,
"BEGIN", "Transaction started.");
mockSessionLock(coordinator);
when(capabilityProvider.provide("logic_db")).thenReturn(Optional.of(capability));
@@ -190,7 +192,8 @@ class MCPSQLExecutionFacadeTest {
MCPSessionExecutionCoordinator coordinator =
mock(MCPSessionExecutionCoordinator.class);
MCPJdbcStatementExecutor statementExecutor =
mock(MCPJdbcStatementExecutor.class);
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.QUERY));
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT 1",
"orders", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT 1", "",
+ List.of(SQLStatementObjectName.fromNormalizedName("orders")));
SQLExecutionResponse response =
SQLExecutionResponse.resultSet(SupportedMCPStatement.QUERY, "SELECT",
Collections.emptyList(), Collections.emptyList(), false);
mockSessionLock(coordinator);
when(capabilityProvider.provide("logic_db")).thenReturn(Optional.of(capability));
@@ -215,7 +218,8 @@ class MCPSQLExecutionFacadeTest {
SQLExecutionTraceFactory traceFactory =
mock(SQLExecutionTraceFactory.class);
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.QUERY));
SQLExecutionRequest request = createExecutionRequest("SELECT * FROM
other_db.orders");
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT * FROM
other_db.orders", "other_db.orders", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT * FROM
other_db.orders", "",
+
List.of(SQLStatementObjectName.fromNormalizedName("other_db.orders")));
MCPSQLExecutionFacade facade = createFacade(capabilityProvider,
coordinator, transactionExecutor, statementExecutor, traceFactory,
createStatementClassifier(classification));
mockSessionLock(coordinator);
when(capabilityProvider.provide("logic_db")).thenReturn(Optional.of(capability));
@@ -271,7 +275,8 @@ class MCPSQLExecutionFacadeTest {
SQLExecutionTraceFactory traceFactory =
mock(SQLExecutionTraceFactory.class);
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.DML));
SQLExecutionRequest request = createExecutionRequest("UPDATE
other_db.orders SET status = 'DONE'");
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.DML, "UPDATE", "UPDATE
other_db.orders SET status = 'DONE'", "other_db.orders", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.DML, "UPDATE", "UPDATE
other_db.orders SET status = 'DONE'", "",
+
List.of(SQLStatementObjectName.fromNormalizedName("other_db.orders")));
MCPSQLExecutionFacade facade = createFacade(capabilityProvider,
coordinator, transactionExecutor, statementExecutor, traceFactory,
createStatementClassifier(classification));
mockSessionLock(coordinator);
when(capabilityProvider.provide("logic_db")).thenReturn(Optional.of(capability));
@@ -287,7 +292,8 @@ class MCPSQLExecutionFacadeTest {
MCPSessionExecutionCoordinator coordinator =
mock(MCPSessionExecutionCoordinator.class);
MCPJdbcStatementExecutor statementExecutor =
mock(MCPJdbcStatementExecutor.class);
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.QUERY));
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT * FROM
logic_db.orders", "logic_db.orders", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT * FROM
logic_db.orders", "",
+
List.of(SQLStatementObjectName.fromNormalizedName("logic_db.orders")));
SQLExecutionResponse response =
SQLExecutionResponse.resultSet(SupportedMCPStatement.QUERY, "SELECT",
Collections.emptyList(), Collections.emptyList(), false);
mockSessionLock(coordinator);
when(capabilityProvider.provide("logic_db")).thenReturn(Optional.of(capability));
@@ -340,7 +346,8 @@ class MCPSQLExecutionFacadeTest {
MCPSessionExecutionCoordinator coordinator =
mock(MCPSessionExecutionCoordinator.class);
MCPJdbcStatementExecutor statementExecutor =
mock(MCPJdbcStatementExecutor.class);
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.QUERY),
SchemaExecutionSemantics.BEST_EFFORT);
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT * FROM
other_db.orders", "other_db.orders", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT * FROM
other_db.orders", "",
+
List.of(SQLStatementObjectName.fromNormalizedName("other_db.orders")));
SQLExecutionResponse response =
SQLExecutionResponse.resultSet(SupportedMCPStatement.QUERY, "SELECT",
Collections.emptyList(), Collections.emptyList(), false);
mockSessionLock(coordinator);
when(capabilityProvider.provide("logic_db")).thenReturn(Optional.of(capability));
@@ -362,7 +369,8 @@ class MCPSQLExecutionFacadeTest {
MCPSessionExecutionCoordinator coordinator =
mock(MCPSessionExecutionCoordinator.class);
MCPDatabaseCapability capability =
createCapability(Set.of(SupportedMCPStatement.QUERY));
SQLExecutionRequest request = createExecutionRequest("SELECT 1");
- ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT 1",
"orders", "");
+ ClassificationResult classification = new
ClassificationResult(SupportedMCPStatement.QUERY, "SELECT", "SELECT 1", "",
+ List.of(SQLStatementObjectName.fromNormalizedName("orders")));
mockSessionLock(coordinator);
when(capabilityProvider.provide("logic_db")).thenReturn(Optional.of(capability));
MCPJdbcStatementExecutor statementExecutor =
mock(MCPJdbcStatementExecutor.class);
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/RuleDistSQLExecutionExceptionTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/RuleDistSQLExecutionExceptionTest.java
index e3970ac37d4..777c0e1d3ce 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/RuleDistSQLExecutionExceptionTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/RuleDistSQLExecutionExceptionTest.java
@@ -21,6 +21,7 @@ import
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPSta
import org.junit.jupiter.api.Test;
import java.sql.SQLSyntaxErrorException;
+import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
@@ -30,7 +31,7 @@ class RuleDistSQLExecutionExceptionTest {
@Test
void assertRuleDistSQLExecutionException() {
ClassificationResult classificationResult = new
ClassificationResult(SupportedMCPStatement.DDL, "CREATE",
- "CREATE SHARDING TABLE RULE
t_order(DATANODES('ds_${0..1}.t_order_${0..1}'))", "", "");
+ "CREATE SHARDING TABLE RULE
t_order(DATANODES('ds_${0..1}.t_order_${0..1}'))", "", List.of());
SQLSyntaxErrorException cause = new SQLSyntaxErrorException("syntax
error");
RuleDistSQLExecutionException actual = new
RuleDistSQLExecutionException("sharding_db", classificationResult, cause);
assertThat(actual.getMessage(),