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 9848b5b59a6 Refactor MCP tests to avoid concrete database type 
fixtures (#39043)
9848b5b59a6 is described below

commit 9848b5b59a6b3ef45484335ac78aa83ce869b0ee
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jul 8 02:29:37 2026 +0800

    Refactor MCP tests to avoid concrete database type fixtures (#39043)
---
 .../MCPCompletionSpecificationFactoryTest.java     |  4 +-
 .../core/completion/MCPCompletionServiceTest.java  |  4 +-
 .../provider/MetadataCompletionProviderTest.java   |  4 +-
 .../metadata/MetadataResourceHandlerTest.java      |  6 +--
 .../MCPJdbcTransactionStatementExecutorTest.java   | 60 ++++++++--------------
 .../execute/MCPJdbcStatementExecutorTest.java      | 49 ++++++++++--------
 .../MCPSQLExecutionFacadeConcurrencyTest.java      | 41 ++++++---------
 .../handler/BroadcastTableRuleHandlerTest.java     |  2 +-
 .../BroadcastWorkflowPlanningServiceTest.java      |  2 +-
 .../BroadcastWorkflowValidationServiceTest.java    |  2 +-
 ...dwriteSplittingWorkflowPlanningServiceTest.java |  4 +-
 ...riteSplittingWorkflowValidationServiceTest.java |  6 +--
 .../ShardingWorkflowValidationServiceTest.java     |  4 +-
 .../jdbc/MCPJdbcDatabaseProfileLoaderTest.java     |  6 +--
 .../jdbc/MCPJdbcMetadataLoaderFailureTest.java     |  2 +-
 .../metadata/model/MCPDatabaseMetadataTest.java    | 10 ++--
 .../metadata/query/DatabaseTestDataFactory.java    |  6 +--
 .../MCPDatabaseCapabilityResponseTest.java         | 15 ++++--
 .../RuntimeDatabaseValidationServiceTest.java      |  4 +-
 19 files changed, 111 insertions(+), 120 deletions(-)

diff --git 
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/transport/capability/completion/MCPCompletionSpecificationFactoryTest.java
 
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/transport/capability/completion/MCPCompletionSpecificationFactoryTest.java
index 636a3b9f6f7..9e4d105dee5 100644
--- 
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/transport/capability/completion/MCPCompletionSpecificationFactoryTest.java
+++ 
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/transport/capability/completion/MCPCompletionSpecificationFactoryTest.java
@@ -198,8 +198,8 @@ class MCPCompletionSpecificationFactoryTest {
     private MCPRuntimeContext createRuntimeContext(final 
WorkflowSessionContext workflowSessionContext) {
         MCPDatabaseCapabilityProvider databaseCapabilityProvider = 
mock(MCPDatabaseCapabilityProvider.class);
         
when(databaseCapabilityProvider.getDatabaseProfiles()).thenReturn(List.of(
-                new RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"),
-                new RuntimeDatabaseProfile("warehouse", "PostgreSQL", "16")));
+                new RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"),
+                new RuntimeDatabaseProfile("warehouse", "FixtureWarehouseDB", 
"2.0")));
         MCPRuntimeContext result = mock(MCPRuntimeContext.class, 
RETURNS_DEEP_STUBS);
         
when(result.getDatabaseCapabilityProvider()).thenReturn(databaseCapabilityProvider);
         
when(result.getWorkflowSessionContext()).thenReturn(workflowSessionContext);
diff --git 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/MCPCompletionServiceTest.java
 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/MCPCompletionServiceTest.java
index 2e46cb71b99..c33c073ded2 100644
--- 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/MCPCompletionServiceTest.java
+++ 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/MCPCompletionServiceTest.java
@@ -144,8 +144,8 @@ class MCPCompletionServiceTest {
     private MCPRuntimeContext createRuntimeContext(final 
WorkflowSessionContext workflowSessionContext) {
         MCPDatabaseCapabilityProvider databaseCapabilityProvider = 
mock(MCPDatabaseCapabilityProvider.class);
         
when(databaseCapabilityProvider.getDatabaseProfiles()).thenReturn(List.of(
-                new RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"),
-                new RuntimeDatabaseProfile("warehouse", "PostgreSQL", "16")));
+                new RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"),
+                new RuntimeDatabaseProfile("warehouse", "FixtureWarehouseDB", 
"2.0")));
         MCPRuntimeContext result = mock(MCPRuntimeContext.class, 
RETURNS_DEEP_STUBS);
         
when(result.getDatabaseCapabilityProvider()).thenReturn(databaseCapabilityProvider);
         
when(result.getWorkflowSessionContext()).thenReturn(workflowSessionContext);
diff --git 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/provider/MetadataCompletionProviderTest.java
 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/provider/MetadataCompletionProviderTest.java
index fe53850783a..f4659a6124b 100644
--- 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/provider/MetadataCompletionProviderTest.java
+++ 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/provider/MetadataCompletionProviderTest.java
@@ -259,11 +259,11 @@ class MetadataCompletionProviderTest {
     }
     
     private RuntimeDatabaseProfile createDatabaseProfile(final String 
database) {
-        return new RuntimeDatabaseProfile(database, "MySQL", "8.0");
+        return new RuntimeDatabaseProfile(database, "FixtureDB", "1.0");
     }
     
     private MCPDatabaseMetadata createDatabaseMetadata() {
-        return new MCPDatabaseMetadata("logic_db", "MySQL", "8.0", 
List.of(createSchemaMetadata()));
+        return new MCPDatabaseMetadata("logic_db", "FixtureDB", "1.0", 
List.of(createSchemaMetadata()));
     }
     
     private MCPSchemaMetadata createSchemaMetadata() {
diff --git 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourceHandlerTest.java
 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourceHandlerTest.java
index 5b6f43c21bf..ec1a9b9b17f 100644
--- 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourceHandlerTest.java
+++ 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourceHandlerTest.java
@@ -113,7 +113,7 @@ class MetadataResourceHandlerTest {
     @Test
     void assertHandleListResourceWithEmptyScope() {
         MetadataResourceHandler handler = new 
MetadataResourceHandler("shardingsphere://databases/{database}/schemas", 
(requestContext, uriVariables) -> List.of());
-        MCPResponse actual = 
handler.handle(createDatabaseContext(Optional.of(new 
RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"))),
+        MCPResponse actual = 
handler.handle(createDatabaseContext(Optional.of(new 
RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"))),
                 new MCPUriVariables(Map.of("database", "logic_db")));
         Map<?, ?> actualEmptyState = (Map<?, ?>) 
actual.toPayload().get("empty_state");
         assertThat(actualEmptyState.get("category"), is("empty_scope"));
@@ -124,7 +124,7 @@ class MetadataResourceHandlerTest {
     @Test
     void assertHandleSchemaDetailResourceNotVisible() {
         MetadataResourceHandler handler = new 
MetadataResourceHandler("shardingsphere://databases/{database}/schemas/{schema}",
 (requestContext, uriVariables) -> List.of());
-        MCPResponse actual = 
handler.handle(createDatabaseContext(Optional.of(new 
RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"))),
+        MCPResponse actual = 
handler.handle(createDatabaseContext(Optional.of(new 
RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"))),
                 new MCPUriVariables(Map.of("database", "logic_db", "schema", 
"missing_schema")));
         Map<?, ?> actualEmptyState = (Map<?, ?>) 
actual.toPayload().get("empty_state");
         assertThat(actualEmptyState.get("category"), is("schema_not_visible"));
@@ -136,7 +136,7 @@ class MetadataResourceHandlerTest {
     @Test
     void assertHandleObjectDetailResourceNotVisible() {
         MetadataResourceHandler handler = new 
MetadataResourceHandler("shardingsphere://databases/{database}/schemas/{schema}/tables/{table}",
 (requestContext, uriVariables) -> List.of());
-        MCPResponse actual = 
handler.handle(createDatabaseContext(Optional.of(new 
RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"))),
+        MCPResponse actual = 
handler.handle(createDatabaseContext(Optional.of(new 
RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"))),
                 new MCPUriVariables(Map.of("database", "logic_db", "schema", 
"public", "table", "missing_table")));
         Map<?, ?> actualEmptyState = (Map<?, ?>) 
actual.toPayload().get("empty_state");
         assertThat(actualEmptyState.get("category"), is("object_not_visible"));
diff --git 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/session/MCPJdbcTransactionStatementExecutorTest.java
 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/session/MCPJdbcTransactionStatementExecutorTest.java
index ed8a58c2842..642a62b126a 100644
--- 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/session/MCPJdbcTransactionStatementExecutorTest.java
+++ 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/session/MCPJdbcTransactionStatementExecutorTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.mcp.core.session;
 
-import 
org.apache.shardingsphere.mcp.core.fixture.CoreDatabaseTypeFactoryMocker;
 import 
org.apache.shardingsphere.mcp.api.protocol.exception.MCPInvalidRequestException;
 import 
org.apache.shardingsphere.mcp.api.protocol.exception.MCPTransactionStateException;
 import 
org.apache.shardingsphere.mcp.api.protocol.exception.MCPUnsupportedException;
@@ -25,8 +24,11 @@ import 
org.apache.shardingsphere.mcp.core.tool.handler.execute.ClassificationRes
 import 
org.apache.shardingsphere.mcp.core.tool.handler.execute.MCPJdbcTransactionStatementExecutor;
 import 
org.apache.shardingsphere.mcp.core.tool.handler.execute.StatementClassifier;
 import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
-import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityProvider;
+import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import 
org.apache.shardingsphere.mcp.support.database.capability.SchemaExecutionSemantics;
+import 
org.apache.shardingsphere.mcp.support.database.capability.SchemaSemantics;
 import 
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPStatement;
+import 
org.apache.shardingsphere.mcp.support.database.capability.TransactionCapability;
 import 
org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
 import 
org.apache.shardingsphere.mcp.support.database.tool.response.SQLExecutionResponse;
 import org.junit.jupiter.api.Test;
@@ -35,11 +37,8 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Savepoint;
-import java.sql.Statement;
 import java.util.Collections;
 import java.util.Map;
 import java.util.stream.Stream;
@@ -49,7 +48,6 @@ import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -67,7 +65,7 @@ class MCPJdbcTransactionStatementExecutorTest {
         sessionManager.createSession("session-1");
         prepareTransactionState(sql, sessionManager, connection, savepoint);
         MCPJdbcTransactionStatementExecutor executor = new 
MCPJdbcTransactionStatementExecutor(sessionManager);
-        SQLExecutionResponse actual = executor.execute("session-1", 
"logic_db", createCapability("logic_db"), new 
StatementClassifier().classify(sql));
+        SQLExecutionResponse actual = executor.execute("session-1", 
"logic_db", createCapability(), new StatementClassifier().classify(sql));
         assertThat(actual.getStatementType(), is(expectedStatementType));
         assertThat(actual.getMessage(), is(expectedMessage));
         assertDatabaseExecution(sql, sessionManager, runtimeDatabaseConfig, 
connection, savepoint);
@@ -90,7 +88,7 @@ class MCPJdbcTransactionStatementExecutorTest {
         sessionManager.createSession("session-1");
         MCPJdbcTransactionStatementExecutor executor = new 
MCPJdbcTransactionStatementExecutor(sessionManager);
         MCPUnsupportedException actual = 
assertThrows(MCPUnsupportedException.class,
-                () -> executor.execute("session-1", "warehouse", 
createCapability("warehouse"), new StatementClassifier().classify("SAVEPOINT 
sp_1")));
+                () -> executor.execute("session-1", "warehouse", 
createCapabilityWithoutSavepoint(), new 
StatementClassifier().classify("SAVEPOINT sp_1")));
         assertThat(actual.getMessage(), is("Savepoint is not supported."));
     }
     
@@ -100,7 +98,7 @@ class MCPJdbcTransactionStatementExecutorTest {
         sessionManager.createSession("session-1");
         MCPJdbcTransactionStatementExecutor executor = new 
MCPJdbcTransactionStatementExecutor(sessionManager);
         MCPInvalidRequestException actual = 
assertThrows(MCPInvalidRequestException.class,
-                () -> executor.execute("session-1", "logic_db", 
createCapability("logic_db"), new StatementClassifier().classify("SELECT 1")));
+                () -> executor.execute("session-1", "logic_db", 
createCapability(), new StatementClassifier().classify("SELECT 1")));
         assertThat(actual.getMessage(), is("Statement is not a transaction 
command."));
     }
     
@@ -109,7 +107,7 @@ class MCPJdbcTransactionStatementExecutorTest {
         MCPSessionManager sessionManager = new 
MCPSessionManager(Collections.emptyMap());
         MCPJdbcTransactionStatementExecutor executor = new 
MCPJdbcTransactionStatementExecutor(sessionManager);
         MCPSessionNotExistedException actual = 
assertThrows(MCPSessionNotExistedException.class,
-                () -> executor.execute("session-1", "logic_db", 
createCapability("logic_db"), new StatementClassifier().classify("BEGIN")));
+                () -> executor.execute("session-1", "logic_db", 
createCapability(), new StatementClassifier().classify("BEGIN")));
         assertThat(actual.getMessage(), is("Session does not exist."));
     }
     
@@ -119,7 +117,7 @@ class MCPJdbcTransactionStatementExecutorTest {
         sessionManager.createSession("session-1");
         MCPJdbcTransactionStatementExecutor executor = new 
MCPJdbcTransactionStatementExecutor(sessionManager);
         MCPTransactionStateException actual = 
assertThrows(MCPTransactionStateException.class,
-                () -> executor.execute("session-1", "logic_db", 
createCapability("logic_db"), new StatementClassifier().classify("COMMIT")));
+                () -> executor.execute("session-1", "logic_db", 
createCapability(), new StatementClassifier().classify("COMMIT")));
         assertThat(actual.getMessage(), is("No active transaction."));
     }
     
@@ -130,42 +128,26 @@ class MCPJdbcTransactionStatementExecutorTest {
         sessionManager.createSession("session-1");
         MCPJdbcTransactionStatementExecutor executor = new 
MCPJdbcTransactionStatementExecutor(sessionManager);
         MCPInvalidRequestException actual = 
assertThrows(MCPInvalidRequestException.class,
-                () -> executor.execute("session-1", "logic_db", 
createCapability("logic_db"),
+                () -> executor.execute("session-1", "logic_db", 
createCapability(),
                         new 
ClassificationResult(SupportedMCPStatement.SAVEPOINT, statementType, sql, "", 
"")));
         assertThat(actual.getMessage(), is("Savepoint name is required."));
     }
     
-    private MCPDatabaseCapabilityProvider createDatabaseCapabilityBuilder() {
-        return 
CoreDatabaseTypeFactoryMocker.createDatabaseCapabilityProvider(Map.of(
-                "logic_db", 
createCapabilityRuntimeDatabaseConfiguration("logic_db", "MySQL"),
-                "warehouse", 
createCapabilityRuntimeDatabaseConfiguration("warehouse", "Hive")));
+    private MCPDatabaseCapability createCapability() {
+        return createCapability("logic_db", 
TransactionCapability.LOCAL_WITH_SAVEPOINT);
     }
     
-    private MCPDatabaseCapability createCapability(final String databaseName) {
-        return 
createDatabaseCapabilityBuilder().provide(databaseName).orElseThrow(IllegalStateException::new);
+    private MCPDatabaseCapability createCapability(final String databaseName, 
final TransactionCapability transactionCapability) {
+        MCPDatabaseCapabilityOption option = 
mock(MCPDatabaseCapabilityOption.class);
+        when(option.getType()).thenReturn("FixtureDB");
+        
when(option.getTransactionCapability()).thenReturn(transactionCapability);
+        
when(option.getDefaultSchemaSemantics()).thenReturn(SchemaSemantics.NATIVE_SCHEMA);
+        
when(option.getSchemaExecutionSemantics()).thenReturn(SchemaExecutionSemantics.FIXED_TO_DATABASE);
+        return new MCPDatabaseCapability(databaseName, "", option);
     }
     
-    private RuntimeDatabaseConfiguration 
createCapabilityRuntimeDatabaseConfiguration(final String databaseName, final 
String databaseType) {
-        RuntimeDatabaseConfiguration result = 
mock(RuntimeDatabaseConfiguration.class);
-        Connection connection = mock(Connection.class);
-        DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class);
-        try {
-            when(result.openConnection(databaseName)).thenReturn(connection);
-            when(connection.getMetaData()).thenReturn(databaseMetaData);
-            when(databaseMetaData.getDatabaseProductVersion()).thenReturn("");
-            
when(databaseMetaData.getURL()).thenReturn(CoreDatabaseTypeFactoryMocker.createJdbcUrl(databaseType));
-            mockEmptyScalarQueries(connection);
-        } catch (final SQLException ex) {
-            throw new IllegalStateException(ex);
-        }
-        return result;
-    }
-    
-    private void mockEmptyScalarQueries(final Connection connection) throws 
SQLException {
-        Statement statement = mock(Statement.class);
-        ResultSet resultSet = mock(ResultSet.class);
-        when(connection.createStatement()).thenReturn(statement);
-        when(statement.executeQuery(anyString())).thenReturn(resultSet);
+    private MCPDatabaseCapability createCapabilityWithoutSavepoint() {
+        return createCapability("warehouse", TransactionCapability.LOCAL);
     }
     
     private void prepareTransactionState(final String sql, final 
MCPSessionManager sessionManager, final Connection connection, final Savepoint 
savepoint) throws SQLException {
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 4aa3a6766db..135f6522c1c 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
@@ -17,10 +17,12 @@
 
 package org.apache.shardingsphere.mcp.core.tool.handler.execute;
 
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPStatement;
 import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
 import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import 
org.apache.shardingsphere.mcp.support.database.capability.SchemaExecutionSemantics;
+import 
org.apache.shardingsphere.mcp.support.database.capability.SchemaSemantics;
+import 
org.apache.shardingsphere.mcp.support.database.capability.TransactionCapability;
 import 
org.apache.shardingsphere.mcp.support.database.exception.QueryDidNotReturnResultSetException;
 import 
org.apache.shardingsphere.mcp.support.database.exception.StatementClassNotSupportedException;
 import 
org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
@@ -80,7 +82,7 @@ class MCPJdbcStatementExecutorTest {
         MCPJdbcTransactionResourceManager transactionResourceManager = 
mock(MCPJdbcTransactionResourceManager.class);
         when(transactionResourceManager.findTransactionConnection(anyString(), 
anyString())).thenReturn(Optional.empty());
         MCPJdbcStatementExecutor statementExecutor = new 
MCPJdbcStatementExecutor(Map.of("logic_db", runtimeDatabaseConfig), 
transactionResourceManager);
-        SQLExecutionResponse actual = 
statementExecutor.execute(executionRequest, classificationResult, 
createDatabaseCapability("MySQL"));
+        SQLExecutionResponse actual = 
statementExecutor.execute(executionRequest, classificationResult, 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getResultKind(), is(expectedResultKind));
         assertThat(actual.getStatementClass(), 
is(classificationResult.getStatementClass()));
         assertThat(actual.getStatementType(), is(expectedStatementType));
@@ -102,7 +104,7 @@ 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("MySQL"));
+                new ClassificationResult(SupportedMCPStatement.DML, "UPDATE", 
"UPDATE orders SET status = 'DONE'", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getAffectedRows(), is(2));
         verify(connection, never()).close();
     }
@@ -123,7 +125,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("MySQL"));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getRows().size(), is(1));
         verify(connection).setReadOnly(true);
         verify(connection).setAutoCommit(false);
@@ -141,7 +143,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("MySQL"));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getRows().size(), is(1));
         verify(connection, never()).setReadOnly(true);
         verify(connection, never()).rollback();
@@ -164,7 +166,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("MySQL"));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getRows().size(), is(2));
         assertFalse(actual.isTruncated());
         verify(connection, never()).setSchema(anyString());
@@ -186,7 +188,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("MySQL"));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getRows().size(), is(0));
         assertFalse(actual.isTruncated());
         verify(statement).setMaxRows(Integer.MAX_VALUE);
@@ -208,7 +210,7 @@ class MCPJdbcStatementExecutorTest {
                 "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", "", ""),
-                createDatabaseCapability("MySQL"));
+                
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getResultKind(), 
is(ExecuteQueryResultKind.RESULT_SET));
         assertThat(actual.getStatementClass(), is(SupportedMCPStatement.DML));
         assertThat(actual.getStatementType(), is("SELECT"));
@@ -225,7 +227,7 @@ 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("MySQL"));
+                new ClassificationResult(SupportedMCPStatement.DML, "UPDATE", 
"UPDATE orders SET status = 'DONE'", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getAffectedRows(), is(1));
         verify(connection, never()).setSchema(anyString());
     }
@@ -241,7 +243,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("PostgreSQL")));
+                new ClassificationResult(SupportedMCPStatement.DML, "UPDATE", 
"UPDATE orders SET status = 'DONE'", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.BEST_EFFORT)));
         assertThat(actual.getMessage(), is("schema"));
         verify(connection).setSchema("public");
         verify(connection, never()).createStatement();
@@ -258,7 +260,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("MySQL")));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
         assertThat(actual.getMessage(), is("Query did not return a result 
set."));
     }
     
@@ -272,7 +274,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("MySQL")));
+                new 
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL, "BEGIN", 
"BEGIN", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
         assertThat(actual.getMessage(), is("Statement class is not 
supported."));
     }
     
@@ -291,7 +293,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("MySQL")));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
         assertThat(actual.getClass(), is(expectedExceptionClass));
         assertThat(actual.getMessage(), is(expectedMessage));
         assertThat(actual.getCause(), is(sqlException));
@@ -305,7 +307,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("MySQL")));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
         assertThat(actual.getMessage(), is("Transaction already active."));
         assertThat(actual.getCause(), is(cause));
     }
@@ -317,7 +319,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("MySQL")));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
         assertThat(actual.getMessage(), is("Database `missing_db` is not 
configured."));
     }
     
@@ -335,7 +337,7 @@ 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("MySQL")));
+                new ClassificationResult(SupportedMCPStatement.DML, "UPDATE", 
"UPDATE orders SET status = 'DONE'", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
         assertThat(actual.getMessage(), is("statement close failed"));
     }
     
@@ -350,7 +352,7 @@ 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("MySQL"));
+                new ClassificationResult(SupportedMCPStatement.DML, "UPDATE", 
"UPDATE orders SET status = 'DONE'", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
         assertThat(actual.getAffectedRows(), is(1));
         verify(connection).close();
     }
@@ -364,7 +366,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("MySQL")));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
     }
     
     @Test
@@ -378,11 +380,16 @@ 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("MySQL")));
+                new ClassificationResult(SupportedMCPStatement.QUERY, 
"SELECT", "SELECT status FROM orders", "", ""), 
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
     }
     
-    private static MCPDatabaseCapability createDatabaseCapability(final String 
databaseType) {
-        return new MCPDatabaseCapability("logic_db", "", 
TypedSPILoader.getService(MCPDatabaseCapabilityOption.class, databaseType));
+    private static MCPDatabaseCapability createDatabaseCapability(final 
SchemaExecutionSemantics schemaExecutionSemantics) {
+        MCPDatabaseCapabilityOption option = 
mock(MCPDatabaseCapabilityOption.class);
+        when(option.getType()).thenReturn("FixtureDB");
+        
when(option.getTransactionCapability()).thenReturn(TransactionCapability.NONE);
+        
when(option.getDefaultSchemaSemantics()).thenReturn(SchemaSemantics.NATIVE_SCHEMA);
+        
when(option.getSchemaExecutionSemantics()).thenReturn(schemaExecutionSemantics);
+        return new MCPDatabaseCapability("logic_db", "", option);
     }
     
     private static Connection createStatementConnection(final boolean 
hasResultSet, final int updateCount, final ResultSet resultSet) throws 
SQLException {
diff --git 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeConcurrencyTest.java
 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeConcurrencyTest.java
index 12a6e4ce2c0..735dc1099dd 100644
--- 
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeConcurrencyTest.java
+++ 
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeConcurrencyTest.java
@@ -17,9 +17,14 @@
 
 package org.apache.shardingsphere.mcp.core.tool.handler.execute;
 
-import 
org.apache.shardingsphere.mcp.core.fixture.CoreDatabaseTypeFactoryMocker;
 import 
org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
 import 
org.apache.shardingsphere.mcp.api.protocol.exception.MCPTransactionStateException;
+import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
+import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityProvider;
+import 
org.apache.shardingsphere.mcp.support.database.capability.SchemaExecutionSemantics;
+import 
org.apache.shardingsphere.mcp.support.database.capability.SchemaSemantics;
+import 
org.apache.shardingsphere.mcp.support.database.capability.TransactionCapability;
 import 
org.apache.shardingsphere.mcp.support.database.tool.response.SQLExecutionResponse;
 import org.apache.shardingsphere.mcp.core.session.MCPSessionManager;
 import 
org.apache.shardingsphere.mcp.support.database.tool.request.SQLExecutionRequest;
@@ -27,7 +32,6 @@ import org.junit.jupiter.api.Test;
 import org.mockito.internal.configuration.plugins.Plugins;
 
 import java.sql.Connection;
-import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
@@ -173,30 +177,19 @@ class MCPSQLExecutionFacadeConcurrencyTest {
     }
     
     private MCPSQLExecutionFacade createFacade(final MCPSessionManager 
sessionManager) {
-        return new 
MCPSQLExecutionFacade(CoreDatabaseTypeFactoryMocker.createDatabaseCapabilityProvider(Map.of("logic_db",
 createCapabilityRuntimeDatabaseConfiguration())), sessionManager);
+        MCPDatabaseCapability databaseCapability = createDatabaseCapability();
+        MCPDatabaseCapabilityProvider databaseCapabilityProvider = 
mock(MCPDatabaseCapabilityProvider.class);
+        
when(databaseCapabilityProvider.provide("logic_db")).thenReturn(Optional.of(databaseCapability));
+        return new MCPSQLExecutionFacade(databaseCapabilityProvider, 
sessionManager);
     }
     
-    private RuntimeDatabaseConfiguration 
createCapabilityRuntimeDatabaseConfiguration() {
-        RuntimeDatabaseConfiguration result = 
mock(RuntimeDatabaseConfiguration.class);
-        Connection connection = mock(Connection.class);
-        DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class);
-        try {
-            when(result.openConnection("logic_db")).thenReturn(connection);
-            when(connection.getMetaData()).thenReturn(databaseMetaData);
-            when(databaseMetaData.getDatabaseProductVersion()).thenReturn("");
-            
when(databaseMetaData.getURL()).thenReturn(CoreDatabaseTypeFactoryMocker.createJdbcUrl("MySQL"));
-            mockEmptyScalarQueries(connection);
-        } catch (final SQLException ex) {
-            throw new IllegalStateException(ex);
-        }
-        return result;
-    }
-    
-    private void mockEmptyScalarQueries(final Connection connection) throws 
SQLException {
-        Statement statement = mock(Statement.class);
-        ResultSet resultSet = mock(ResultSet.class);
-        when(connection.createStatement()).thenReturn(statement);
-        when(statement.executeQuery(anyString())).thenReturn(resultSet);
+    private MCPDatabaseCapability createDatabaseCapability() {
+        MCPDatabaseCapabilityOption option = 
mock(MCPDatabaseCapabilityOption.class);
+        when(option.getType()).thenReturn("FixtureDB");
+        
when(option.getTransactionCapability()).thenReturn(TransactionCapability.LOCAL_WITH_SAVEPOINT);
+        
when(option.getDefaultSchemaSemantics()).thenReturn(SchemaSemantics.NATIVE_SCHEMA);
+        
when(option.getSchemaExecutionSemantics()).thenReturn(SchemaExecutionSemantics.FIXED_TO_DATABASE);
+        return new MCPDatabaseCapability("logic_db", "", option);
     }
     
     private SQLExecutionRequest createExecutionRequest(final String sessionId, 
final String sql) {
diff --git 
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/resource/handler/BroadcastTableRuleHandlerTest.java
 
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/resource/handler/BroadcastTableRuleHandlerTest.java
index 38d53254e60..f9bb7fcca43 100644
--- 
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/resource/handler/BroadcastTableRuleHandlerTest.java
+++ 
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/resource/handler/BroadcastTableRuleHandlerTest.java
@@ -52,7 +52,7 @@ class BroadcastTableRuleHandlerTest {
         MCPFeatureQueryFacade queryFacade = mock(MCPFeatureQueryFacade.class);
         MCPDatabaseHandlerContext databaseContext = 
mock(MCPDatabaseHandlerContext.class);
         when(databaseContext.getQueryFacade()).thenReturn(queryFacade);
-        when(queryFacade.getDatabaseType("logic_db")).thenReturn("MySQL");
+        when(queryFacade.getDatabaseType("logic_db")).thenReturn("FixtureDB");
         when(ruleInspectionService.queryBroadcastRules(queryFacade, 
"logic_db")).thenReturn(List.of(Map.of("broadcast_table", "t_order"), 
Map.of("broadcast_table", "t_order_item")));
         MCPResponse actual = new 
BroadcastTableRuleHandler(ruleInspectionService).handle(databaseContext, new 
MCPUriVariables(Map.of("database", "logic_db", "table", "t_order")));
         verify(ruleInspectionService).queryBroadcastRules(queryFacade, 
"logic_db");
diff --git 
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowPlanningServiceTest.java
 
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowPlanningServiceTest.java
index 8a1fa77de72..1075375f524 100644
--- 
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowPlanningServiceTest.java
+++ 
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowPlanningServiceTest.java
@@ -113,7 +113,7 @@ class BroadcastWorkflowPlanningServiceTest {
     
     private MCPFeatureQueryFacade mockQueryFacade(final List<Map<String, 
Object>> broadcastRules) {
         MCPFeatureQueryFacade result = mock(MCPFeatureQueryFacade.class);
-        when(result.getDatabaseType("logic_db")).thenReturn("MySQL");
+        when(result.getDatabaseType("logic_db")).thenReturn("FixtureDB");
         when(result.query(eq("logic_db"), eq(""), 
any())).thenReturn(broadcastRules);
         return result;
     }
diff --git 
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowValidationServiceTest.java
 
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowValidationServiceTest.java
index 8ca296d960b..faa7b3b00df 100644
--- 
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowValidationServiceTest.java
+++ 
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowValidationServiceTest.java
@@ -64,7 +64,7 @@ class BroadcastWorkflowValidationServiceTest {
         BroadcastRuleInspectionService ruleInspectionService = 
mock(BroadcastRuleInspectionService.class);
         when(ruleInspectionService.queryBroadcastRules(any(), 
any())).thenReturn(List.of(Map.of("broadcast_table", "t_order")));
         MCPFeatureQueryFacade queryFacade = mock(MCPFeatureQueryFacade.class);
-        when(queryFacade.getDatabaseType("logic_db")).thenReturn("MySQL");
+        when(queryFacade.getDatabaseType("logic_db")).thenReturn("FixtureDB");
         MCPMetadataQueryFacade metadataQueryFacade = 
mock(MCPMetadataQueryFacade.class);
         MCPFeatureExecutionFacade executionFacade = 
mock(MCPFeatureExecutionFacade.class);
         Map<String, Object> actual = createService(ruleInspectionService)
diff --git 
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowPlanningServiceTest.java
 
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowPlanningServiceTest.java
index 359a9653083..264dc7e30e6 100644
--- 
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowPlanningServiceTest.java
+++ 
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowPlanningServiceTest.java
@@ -187,14 +187,14 @@ class ReadwriteSplittingWorkflowPlanningServiceTest {
     
     private MCPFeatureQueryFacade mockRuleQueryFacade(final List<Map<String, 
Object>> rules) {
         MCPFeatureQueryFacade result = mock(MCPFeatureQueryFacade.class);
-        when(result.getDatabaseType("logic_db")).thenReturn("MySQL");
+        when(result.getDatabaseType("logic_db")).thenReturn("FixtureDB");
         when(result.query(eq("logic_db"), eq(""), any())).thenReturn(rules);
         return result;
     }
     
     private MCPFeatureQueryFacade mockStatusQueryFacade(final List<Map<String, 
Object>> statuses) {
         MCPFeatureQueryFacade result = mock(MCPFeatureQueryFacade.class);
-        when(result.getDatabaseType("logic_db")).thenReturn("MySQL");
+        when(result.getDatabaseType("logic_db")).thenReturn("FixtureDB");
         when(result.query(eq("logic_db"), eq(""), any())).thenReturn(statuses);
         return result;
     }
diff --git 
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowValidationServiceTest.java
 
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowValidationServiceTest.java
index 92813226e03..28d615e9136 100644
--- 
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowValidationServiceTest.java
+++ 
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowValidationServiceTest.java
@@ -73,7 +73,7 @@ class ReadwriteSplittingWorkflowValidationServiceTest {
         ReadwriteSplittingInspectionService inspectionService = 
mock(ReadwriteSplittingInspectionService.class);
         when(inspectionService.queryRules(any(), 
any())).thenReturn(List.of(createRuleRow()));
         MCPFeatureQueryFacade queryFacade = mock(MCPFeatureQueryFacade.class);
-        when(queryFacade.getDatabaseType("logic_db")).thenReturn("MySQL");
+        when(queryFacade.getDatabaseType("logic_db")).thenReturn("FixtureDB");
         MCPMetadataQueryFacade metadataQueryFacade = 
mock(MCPMetadataQueryFacade.class);
         MCPFeatureExecutionFacade executionFacade = 
mock(MCPFeatureExecutionFacade.class);
         Map<String, Object> actual = 
createRuleService(inspectionService).validate(workflowSessionContext, 
metadataQueryFacade, queryFacade, executionFacade, "session-1", snapshot);
@@ -144,7 +144,7 @@ class ReadwriteSplittingWorkflowValidationServiceTest {
         ReadwriteSplittingInspectionService inspectionService = 
mock(ReadwriteSplittingInspectionService.class);
         when(inspectionService.queryRuleStatus(any(), any(), 
any())).thenReturn(List.of(createStatusRow("ENABLED")));
         MCPFeatureQueryFacade queryFacade = mock(MCPFeatureQueryFacade.class);
-        when(queryFacade.getDatabaseType("logic_db")).thenReturn("MySQL");
+        when(queryFacade.getDatabaseType("logic_db")).thenReturn("FixtureDB");
         Map<String, Object> actual = 
createStatusService(inspectionService).validate(
                 workflowSessionContext, mock(MCPMetadataQueryFacade.class), 
queryFacade, mock(MCPFeatureExecutionFacade.class), "session-1", snapshot);
         assertThat(actual.get("status"), is("validated"));
@@ -152,7 +152,7 @@ class ReadwriteSplittingWorkflowValidationServiceTest {
     }
     
     @Test
-    void assertSynchronizeStatusWhenStateDoesNotConverge() throws 
ReflectiveOperationException {
+    void assertSynchronizeStatusWhenStateDoesNotConverge() {
         WorkflowContextSnapshot snapshot = createStatusSnapshot("plan-1", 
"session-1", "executed", "enable");
         ReadwriteSplittingInspectionService inspectionService = 
mock(ReadwriteSplittingInspectionService.class);
         when(inspectionService.queryRuleStatus(any(), any(), 
any())).thenReturn(List.of(createStatusRow("DISABLED")));
diff --git 
a/mcp/features/sharding/src/test/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationServiceTest.java
 
b/mcp/features/sharding/src/test/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationServiceTest.java
index 2984d44e34e..05dea041817 100644
--- 
a/mcp/features/sharding/src/test/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationServiceTest.java
+++ 
b/mcp/features/sharding/src/test/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationServiceTest.java
@@ -177,7 +177,7 @@ class ShardingWorkflowValidationServiceTest {
     }
     
     @Test
-    void assertSynchronizeWhenStateDoesNotConverge() throws 
ReflectiveOperationException {
+    void assertSynchronizeWhenStateDoesNotConverge() {
         WorkflowContextSnapshot snapshot = createSnapshot("plan-1", 
"session-1", "executed", "create",
                 ShardingFeatureDefinition.TABLE_REFERENCE_WORKFLOW_KIND, 
createReferenceRuleRequest());
         ShardingInspectionService inspectionService = 
mock(ShardingInspectionService.class);
@@ -202,7 +202,7 @@ class ShardingWorkflowValidationServiceTest {
     
     private MCPFeatureQueryFacade createQueryFacade() {
         MCPFeatureQueryFacade result = mock(MCPFeatureQueryFacade.class);
-        when(result.getDatabaseType("logic_db")).thenReturn("MySQL");
+        when(result.getDatabaseType("logic_db")).thenReturn("FixtureDB");
         return result;
     }
     
diff --git 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
index 8e36e906189..df9f6271b56 100644
--- 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
+++ 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
@@ -41,10 +41,10 @@ class MCPJdbcDatabaseProfileLoaderTest {
     @Test
     void assertLoad() throws SQLException {
         try (MockedStatic<DatabaseTypeFactory> ignored = 
SupportDatabaseTypeFactoryMocker.mockByConnectionMetadata()) {
-            RuntimeDatabaseProfile actual = new 
MCPJdbcDatabaseProfileLoader().load("logic_db", 
createRuntimeDatabaseConfiguration(SupportDatabaseTypeFactoryMocker.createJdbcUrl("MySQL"),
 "8.0.32"));
+            RuntimeDatabaseProfile actual = new 
MCPJdbcDatabaseProfileLoader().load("logic_db", 
createRuntimeDatabaseConfiguration(SupportDatabaseTypeFactoryMocker.createJdbcUrl("FixtureDB"),
 "1.0"));
             assertThat(actual.getDatabase(), is("logic_db"));
-            assertThat(actual.getDatabaseType(), is("MySQL"));
-            assertThat(actual.getDatabaseVersion(), is("8.0.32"));
+            assertThat(actual.getDatabaseType(), is("FixtureDB"));
+            assertThat(actual.getDatabaseVersion(), is("1.0"));
         }
     }
     
diff --git 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderFailureTest.java
 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderFailureTest.java
index 1290a2e096a..8c436bd1196 100644
--- 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderFailureTest.java
+++ 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderFailureTest.java
@@ -36,7 +36,7 @@ class MCPJdbcMetadataLoaderFailureTest {
         
when(runtimeDatabaseConfiguration.openConnection("logic_db")).thenThrow(expected);
         MCPJdbcMetadataLoader metadataLoader = new MCPJdbcMetadataLoader();
         RuntimeDatabaseConnectionException actual = 
assertThrows(RuntimeDatabaseConnectionException.class,
-                () -> metadataLoader.load("logic_db", 
runtimeDatabaseConfiguration, new RuntimeDatabaseProfile("logic_db", 
"PostgreSQL", "")));
+                () -> metadataLoader.load("logic_db", 
runtimeDatabaseConfiguration, new RuntimeDatabaseProfile("logic_db", 
"FixtureDB", "")));
         assertThat(actual.getMessage(), is("Runtime database `logic_db` 
connection failed: connection_failed."));
         assertThat(actual.getCause(), is(expected));
     }
diff --git 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPDatabaseMetadataTest.java
 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPDatabaseMetadataTest.java
index 7a81a13563d..981c8a2cece 100644
--- 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPDatabaseMetadataTest.java
+++ 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPDatabaseMetadataTest.java
@@ -31,8 +31,8 @@ class MCPDatabaseMetadataTest {
     void assertCreateSummary() {
         MCPDatabaseMetadata actual = createDatabaseMetadata().createSummary();
         assertThat(actual.getDatabase(), is("foo_db"));
-        assertThat(actual.getDatabaseType(), is("MySQL"));
-        assertThat(actual.getDatabaseVersion(), is("8.0"));
+        assertThat(actual.getDatabaseType(), is("FixtureDB"));
+        assertThat(actual.getDatabaseVersion(), is("1.0"));
         assertTrue(actual.getSchemas().isEmpty());
     }
     
@@ -40,8 +40,8 @@ class MCPDatabaseMetadataTest {
     void assertCreateDetail() {
         MCPDatabaseMetadata actual = createDatabaseMetadata().createDetail();
         assertThat(actual.getDatabase(), is("foo_db"));
-        assertThat(actual.getDatabaseType(), is("MySQL"));
-        assertThat(actual.getDatabaseVersion(), is("8.0"));
+        assertThat(actual.getDatabaseType(), is("FixtureDB"));
+        assertThat(actual.getDatabaseVersion(), is("1.0"));
         assertThat(actual.getSchemas().get(0).getSchema(), is("bar_schema"));
         assertThat(actual.getSchemas().get(1).getSchema(), is("foo_schema"));
         assertThat(actual.getSchemas().get(1).getTables().get(0).getTable(), 
is("bar_table"));
@@ -49,7 +49,7 @@ class MCPDatabaseMetadataTest {
     }
     
     private MCPDatabaseMetadata createDatabaseMetadata() {
-        return new MCPDatabaseMetadata("foo_db", "MySQL", "8.0", List.of(new 
MCPSchemaMetadata("foo_db", "foo_schema",
+        return new MCPDatabaseMetadata("foo_db", "FixtureDB", "1.0", 
List.of(new MCPSchemaMetadata("foo_db", "foo_schema",
                 List.of(new MCPTableMetadata("foo_db", "foo_schema", 
"foo_table", List.of(new MCPColumnMetadata("foo_db", "foo_schema", "foo_table", 
"", "foo_column")), List.of()),
                         new MCPTableMetadata("foo_db", "foo_schema", 
"bar_table", List.of(), List.of())),
                 List.of(new MCPViewMetadata("foo_db", "foo_schema", 
"foo_view", List.of())),
diff --git 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/DatabaseTestDataFactory.java
 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/DatabaseTestDataFactory.java
index 19c73f03d26..52b2e58b01f 100644
--- 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/DatabaseTestDataFactory.java
+++ 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/DatabaseTestDataFactory.java
@@ -52,7 +52,7 @@ final class DatabaseTestDataFactory {
     
     static List<MCPDatabaseMetadata> createDatabaseMetadata() {
         return List.of(
-                new MCPDatabaseMetadata("logic_db", "MySQL", "", List.of(
+                new MCPDatabaseMetadata("logic_db", "FixtureDB", "", List.of(
                         new MCPSchemaMetadata("logic_db", "public", List.of(
                                 new MCPTableMetadata("logic_db", "public", 
"orders",
                                         List.of(new 
MCPColumnMetadata("logic_db", "public", "orders", "", "order_id")),
@@ -62,9 +62,9 @@ final class DatabaseTestDataFactory {
                                 List.of(new MCPViewMetadata("logic_db", 
"public", "orders_view",
                                         List.of(new 
MCPColumnMetadata("logic_db", "public", "", "orders_view", "order_id")))),
                                 List.of()))),
-                new MCPDatabaseMetadata("runtime_db", "PostgreSQL", "", 
List.of(
+                new MCPDatabaseMetadata("runtime_db", "FixtureRuntimeDB", "", 
List.of(
                         new MCPSchemaMetadata("runtime_db", "public", 
List.of(), List.of(), List.of(new MCPSequenceMetadata("runtime_db", "public", 
"order_seq"))))),
-                new MCPDatabaseMetadata("warehouse", "Hive", "", List.of(
+                new MCPDatabaseMetadata("warehouse", "FixtureWarehouseDB", "", 
List.of(
                         new MCPSchemaMetadata("warehouse", "warehouse", 
List.of(new MCPTableMetadata("warehouse", "warehouse", "facts", List.of(), 
List.of())), List.of(), List.of()))));
     }
     
diff --git 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponseTest.java
 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponseTest.java
index e539d74415c..8b5f6087998 100644
--- 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponseTest.java
+++ 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponseTest.java
@@ -17,13 +17,13 @@
 
 package org.apache.shardingsphere.mcp.support.database.response;
 
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
 import 
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPStatement;
 import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
 import 
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
 import 
org.apache.shardingsphere.mcp.support.database.capability.SchemaExecutionSemantics;
 import 
org.apache.shardingsphere.mcp.support.database.capability.SchemaSemantics;
+import 
org.apache.shardingsphere.mcp.support.database.capability.TransactionCapability;
 import org.junit.jupiter.api.Test;
 
 import java.util.EnumSet;
@@ -31,17 +31,26 @@ import java.util.Map;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class MCPDatabaseCapabilityResponseTest {
     
     @Test
     void assertToPayload() {
-        MCPDatabaseCapability actualCapability = new 
MCPDatabaseCapability("logic_db", "8.0.32", 
TypedSPILoader.getService(MCPDatabaseCapabilityOption.class, "MySQL"));
+        MCPDatabaseCapabilityOption option = 
mock(MCPDatabaseCapabilityOption.class);
+        when(option.getType()).thenReturn("FixtureDB");
+        when(option.isIndexSupported()).thenReturn(true);
+        
when(option.getTransactionCapability()).thenReturn(TransactionCapability.LOCAL_WITH_SAVEPOINT);
+        
when(option.getDefaultSchemaSemantics()).thenReturn(SchemaSemantics.DATABASE_AS_SCHEMA);
+        
when(option.getSchemaExecutionSemantics()).thenReturn(SchemaExecutionSemantics.FIXED_TO_DATABASE);
+        when(option.isExplainAnalyzeSupported("1.0")).thenReturn(true);
+        MCPDatabaseCapability actualCapability = new 
MCPDatabaseCapability("logic_db", "1.0", option);
         Map<String, Object> actual = new 
MCPDatabaseCapabilityResponse(actualCapability).toPayload();
         assertThat(actual, is(Map.ofEntries(
                 Map.entry("response_mode", "detail"),
                 Map.entry("database", "logic_db"),
-                Map.entry("databaseType", "MySQL"),
+                Map.entry("databaseType", "FixtureDB"),
                 Map.entry("supportedObjectTypes", 
EnumSet.of(SupportedMCPMetadataObjectType.SCHEMA, 
SupportedMCPMetadataObjectType.TABLE,
                         SupportedMCPMetadataObjectType.VIEW, 
SupportedMCPMetadataObjectType.COLUMN, SupportedMCPMetadataObjectType.INDEX)),
                 Map.entry("supportedStatementClasses", 
EnumSet.of(SupportedMCPStatement.QUERY, SupportedMCPStatement.DML, 
SupportedMCPStatement.DDL,
diff --git 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
index 20bb5f984ca..c6745284101 100644
--- 
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
+++ 
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
@@ -199,7 +199,7 @@ class RuntimeDatabaseValidationServiceTest {
     }
     
     private static RuntimeDatabaseProfile createProfile() {
-        return new RuntimeDatabaseProfile("logic_db", "MySQL", "8.0.36");
+        return new RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0");
     }
     
     private static RuntimeDatabaseConfiguration 
createRuntimeDatabaseConfiguration() {
@@ -207,7 +207,7 @@ class RuntimeDatabaseValidationServiceTest {
     }
     
     private static MCPDatabaseMetadata createMetadata(final String schemaName) 
{
-        return new MCPDatabaseMetadata("logic_db", "MySQL", "8.0.36", 
List.of(new MCPSchemaMetadata("logic_db", schemaName, List.of(), List.of(), 
List.of())));
+        return new MCPDatabaseMetadata("logic_db", "FixtureDB", "1.0", 
List.of(new MCPSchemaMetadata("logic_db", schemaName, List.of(), List.of(), 
List.of())));
     }
     
     private static Map<String, Object> createRecoveryPayload(final 
RuntimeDatabaseConnectionException cause) {

Reply via email to