You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2026/07/13 03:38:02 UTC

(shardingsphere) branch master updated: Remove redundant MCP EXPLAIN execution semantics (#39080)

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 ebe3d6d32da Remove redundant MCP EXPLAIN execution semantics (#39080)
ebe3d6d32da is described below

commit ebe3d6d32da426a2f72b2e265480aa1d5f4628aa
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Mon Jul 13 11:37:55 2026 +0800

    Remove redundant MCP EXPLAIN execution semantics (#39080)
    
    Keep supportsExplain as the machine-readable capability and update
    EXPLAIN recovery guidance to use the target database type.
---
 .../mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java  |  3 ++-
 .../mcp/core/protocol/error/MCPErrorConverterTest.java         |  6 ++++--
 .../database/response/MCPDatabaseCapabilityResponse.java       |  6 +-----
 .../database/response/MCPDatabaseCapabilityResponseTest.java   | 10 ++++------
 4 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java
index bcd5783e9bd..97eab9f414f 100644
--- a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java
+++ b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPSQLRecoveryPayloadFactory.java
@@ -66,7 +66,8 @@ final class MCPSQLRecoveryPayloadFactory {
         result.put("rejected_explain_sql", cause.getExplainSql());
         result.put("suggested_arguments", createExplainRetryArguments(cause));
         result.put(MCPPayloadFieldNames.NEXT_ACTIONS, MCPNextActionUtils.ordered(
-                MCPNextActionUtils.readResource(createDatabaseCapabilityUri(cause.getDatabase()), "Read explain tool semantics before regenerating explain_sql."),
+                MCPNextActionUtils.readResource(createDatabaseCapabilityUri(cause.getDatabase()),
+                        "Read the target database type before regenerating database-native explain_sql."),
                 MCPNextActionUtils.dependsOn(MCPNextActionUtils.callTool("database_gateway_execute_explain_query",
                         "Regenerate explain_sql from sql without changing sql, then retry the explain tool with the generated explain_sql.",
                         createExplainRetryArguments(cause)), 1)));
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 6d45c326622..bd5421f79bc 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
@@ -295,8 +295,10 @@ class MCPErrorConverterTest {
         assertThat(actualRecovery.get("category"), is("invalid_explain_sql"));
         assertThat(actualRecovery.get("rejected_explain_sql"), is("EXPLAIN BROKEN SELECT * FROM orders"));
         assertThat(actualRecovery.get("suggested_arguments"), is(Map.of("database", "logic_db", "schema", "public", "sql", "SELECT * FROM orders")));
-        Map<?, ?> actualRetryAction = (Map<?, ?>) ((List<?>) actualRecovery.get("next_actions")).get(1);
-        assertThat(actualRetryAction.get("tool_name"), is("database_gateway_execute_explain_query"));
+        List<?> actualNextActions = (List<?>) actualRecovery.get("next_actions");
+        assertThat(((Map<?, ?>) actualNextActions.getFirst()).get("reason"),
+                is("Read the target database type before regenerating database-native explain_sql."));
+        assertThat(((Map<?, ?>) actualNextActions.get(1)).get("tool_name"), is("database_gateway_execute_explain_query"));
         assertFalse((Boolean) actualRecovery.get("ask_user_when_uncertain"));
     }
     
diff --git a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponse.java b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponse.java
index 45a8e580b2c..94f63899e00 100644
--- a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponse.java
+++ b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponse.java
@@ -46,11 +46,7 @@ public final class MCPDatabaseCapabilityResponse implements MCPResponse {
         result.put("defaultSchemaSemantics", databaseCapability.getDefaultSchemaSemantics());
         result.put("schemaExecutionSemantics", databaseCapability.getSchemaExecutionSemantics());
         result.put("supportsCrossSchemaSql", databaseCapability.isSupportsCrossSchemaSql());
-        boolean supportsExplain = databaseCapability.isSupportsExplain();
-        result.put("supportsExplain", supportsExplain);
-        result.put("explainExecutionSemantics", supportsExplain
-                ? "database_gateway_execute_explain_query executes model-generated database-native EXPLAIN SQL for one classifier-approved SELECT. EXPLAIN ANALYZE is not supported."
-                : "database_gateway_execute_explain_query is not supported for this database type.");
+        result.put("supportsExplain", databaseCapability.isSupportsExplain());
         return result;
     }
 }
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 e281aa5a2e5..b6244402367 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
@@ -40,7 +40,7 @@ class MCPDatabaseCapabilityResponseTest {
     
     @ParameterizedTest(name = "{0}")
     @MethodSource("assertToPayloadArguments")
-    void assertToPayload(final String name, final boolean supportsExplain, final String explainExecutionSemantics) {
+    void assertToPayload(final String name, final boolean supportsExplain) {
         MCPDatabaseCapability actualCapability = mock(MCPDatabaseCapability.class);
         when(actualCapability.getDatabaseName()).thenReturn("logic_db");
         when(actualCapability.getDatabaseType()).thenReturn("FixtureDB");
@@ -70,14 +70,12 @@ class MCPDatabaseCapabilityResponseTest {
                 Map.entry("defaultSchemaSemantics", DialectSchemaSemantics.DATABASE_AS_SCHEMA),
                 Map.entry("schemaExecutionSemantics", SchemaExecutionSemantics.FIXED_TO_DATABASE),
                 Map.entry("supportsCrossSchemaSql", false),
-                Map.entry("supportsExplain", supportsExplain),
-                Map.entry("explainExecutionSemantics", explainExecutionSemantics))));
+                Map.entry("supportsExplain", supportsExplain))));
     }
     
     private static Stream<Arguments> assertToPayloadArguments() {
         return Stream.of(
-                Arguments.of("supported", true,
-                        "database_gateway_execute_explain_query executes model-generated database-native EXPLAIN SQL for one classifier-approved SELECT. EXPLAIN ANALYZE is not supported."),
-                Arguments.of("unsupported", false, "database_gateway_execute_explain_query is not supported for this database type."));
+                Arguments.of("supported", true),
+                Arguments.of("unsupported", false));
     }
 }