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 ad92aec5645 Refactor MCP type checks and local dispatch (#40341)
ad92aec5645 is described below

commit ad92aec5645920b16ad2ca04e99e424c21027c4b
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Oct 22 19:42:31 2026 +0800

    Refactor MCP type checks and local dispatch (#40341)
---
 .../HttpTransportConfigurationValidator.java       |   6 +-
 .../transport/MCPTransportErrorFactory.java        |   5 +-
 .../server/http/SessionAttributionResolver.java    |   4 +-
 .../YamlHttpTransportConfigurationSwapperTest.java |  21 ++
 .../metadata/GovernanceMetadataQueryService.java   |   4 +-
 .../error/MCPQueryRecoveryPayloadFactory.java      |  19 +-
 .../protocol/error/MCPRecoveryPayloadSupport.java  |  14 +-
 .../error/MCPSQLRecoveryPayloadFactory.java        |   3 +-
 .../metadata/MetadataResourcePayloadMapper.java    |  23 +-
 .../core/tool/handler/MCPToolArgumentContract.java |   2 +-
 .../handler/execute/MCPJdbcStatementExecutor.java  |   6 +-
 .../MCPJdbcTransactionStatementExecutor.java       |  20 +-
 .../tool/handler/execute/MCPStatementAnalyzer.java |  34 ++-
 .../execute/SQLStatementObjectExtractor.java       | 157 +++++++------
 .../execute/SQLStatementSafetyValidator.java       |  33 ++-
 .../tool/handler/execute/SQLStatementScanner.java  |  11 +-
 .../handler/execute/SQLStatementTreeWalker.java    | 244 ++++++++++-----------
 .../metadata/SearchMetadataToolService.java        |  15 +-
 .../core/workflow/WorkflowExecutionService.java    |  13 +-
 .../tool/model/BroadcastWorkflowRequest.java       |  11 +-
 .../BroadcastRuleDistSQLPlanningService.java       |   6 +-
 .../tool/model/BroadcastWorkflowRequestTest.java   |  25 +++
 .../encrypt/tool/model/EncryptWorkflowRequest.java |   4 +-
 .../EncryptWorkflowApplyArtifactValidator.java     |   4 +-
 .../ReadwriteSplittingRuleWorkflowRequest.java     |  11 +-
 .../ReadwriteSplittingStatusWorkflowRequest.java   |   4 +-
 .../ReadwriteSplittingRuleWorkflowRequestTest.java |  25 +++
 .../ShadowAlgorithmCleanupWorkflowRequest.java     |   4 +-
 .../ShadowDefaultAlgorithmWorkflowRequest.java     |   5 +-
 .../tool/model/ShadowRuleWorkflowRequest.java      |   5 +-
 .../service/ShadowWorkflowValidationService.java   |   6 +-
 .../tool/model/ShardingWorkflowRequest.java        |   2 +-
 .../service/ShardingWorkflowPlanningService.java   |   2 +-
 .../service/ShardingWorkflowValidationService.java |  19 +-
 .../mcp/registry/MCPRegistryMetadataCommand.java   |   6 +-
 .../database/capability/MCPDatabaseCapability.java |  16 +-
 .../exception/MCPJDBCExceptionClassifier.java      |  32 +--
 .../FirebirdMCPDialectSQLExceptionClassifier.java  |   7 +-
 .../MySQLMCPDialectSQLExceptionClassifier.java     |  12 +-
 .../descriptor/MCPToolInputSchemaValidator.java    |   2 +-
 .../UniqueMCPPromptArgumentNamesValidator.java     |   2 +-
 .../support/protocol/payload/MCPItemsPayload.java  |   4 +-
 .../support/resource/MCPUriPathSegmentUtils.java   |  15 +-
 .../workflow/model/SecretReferenceValue.java       |   5 +-
 .../workflow/service/WorkflowAlgorithmUtils.java   |   4 +-
 .../service/WorkflowPlanningArguments.java         |   2 +-
 .../support/workflow/service/WorkflowSQLUtils.java |   7 +-
 .../service/WorkflowSecretReferenceUtils.java      |   4 +-
 .../workflow/spi/WorkflowRuntimeDefinition.java    |   2 +-
 49 files changed, 474 insertions(+), 413 deletions(-)

diff --git 
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/validator/HttpTransportConfigurationValidator.java
 
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/validator/HttpTransportConfigurationValidator.java
index 7708c39ea8a..f9915a6ac9f 100644
--- 
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/validator/HttpTransportConfigurationValidator.java
+++ 
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/validator/HttpTransportConfigurationValidator.java
@@ -121,8 +121,10 @@ public final class HttpTransportConfigurationValidator 
implements ConstraintVali
     }
     
     private boolean isHttpTokenSymbol(final char value) {
-        return '!' == value || '#' == value || '$' == value || '%' == value || 
'&' == value || '\'' == value || '*' == value || '+' == value || '-' == value 
|| '.' == value
-                || '^' == value || '_' == value || '`' == value || '|' == 
value || '~' == value;
+        return switch (value) {
+            case '!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', '^', '_', 
'`', '|', '~' -> true;
+            default -> false;
+        };
     }
     
     private void addViolation(final ConstraintValidatorContext context, final 
String propertyName, final String message) {
diff --git 
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/MCPTransportErrorFactory.java
 
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/MCPTransportErrorFactory.java
index 1742803c851..77552076e34 100644
--- 
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/MCPTransportErrorFactory.java
+++ 
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/MCPTransportErrorFactory.java
@@ -50,9 +50,8 @@ public final class MCPTransportErrorFactory {
      * @return MCP transport error
      */
     public static McpError createError(final Throwable cause) {
-        if (cause instanceof MCPTransportSecurityException) {
-            return createProtocolError(
-                    new MCPErrorPayload(cause.getMessage(), 
createTransportSecurityRecovery((MCPTransportSecurityException) cause)), 
getProtocolErrorCode(cause));
+        if (cause instanceof MCPTransportSecurityException ex) {
+            return createProtocolError(new MCPErrorPayload(cause.getMessage(), 
createTransportSecurityRecovery(ex)), getProtocolErrorCode(cause));
         }
         if (!isApplicationError(cause)) {
             return createInternalError(cause);
diff --git 
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/server/http/SessionAttributionResolver.java
 
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/server/http/SessionAttributionResolver.java
index 3aa1584470d..13b54a90f57 100644
--- 
a/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/server/http/SessionAttributionResolver.java
+++ 
b/mcp/bootstrap/src/main/java/org/apache/shardingsphere/mcp/bootstrap/transport/server/http/SessionAttributionResolver.java
@@ -31,7 +31,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 /**
  * Session attribution resolver.
@@ -99,7 +99,7 @@ public final class SessionAttributionResolver {
         return !isEnabled() ? "disabled" : String.format("trusted-header:%s", 
config.getSubjectHeader());
     }
     
-    private Map<String, String> resolveAttributes(final Iterable<String> 
headerNames, final Function<String, String> headerValueReader) {
+    private Map<String, String> resolveAttributes(final Iterable<String> 
headerNames, final UnaryOperator<String> headerValueReader) {
         Map<String, String> result = new LinkedHashMap<>();
         String attributeHeaderPrefix = config.getAttributeHeaderPrefix();
         if (attributeHeaderPrefix.isEmpty()) {
diff --git 
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/swapper/YamlHttpTransportConfigurationSwapperTest.java
 
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/swapper/YamlHttpTransportConfigurationSwapperTest.java
index 216d74ec08c..2115216b290 100644
--- 
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/swapper/YamlHttpTransportConfigurationSwapperTest.java
+++ 
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/config/yaml/swapper/YamlHttpTransportConfigurationSwapperTest.java
@@ -22,6 +22,8 @@ import 
org.apache.shardingsphere.mcp.bootstrap.config.SessionAttributionSourceCo
 import 
org.apache.shardingsphere.mcp.bootstrap.config.yaml.config.YamlHttpTransportConfiguration;
 import 
org.apache.shardingsphere.mcp.bootstrap.config.yaml.config.YamlSessionAttributionSourceConfiguration;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
@@ -138,6 +140,25 @@ class YamlHttpTransportConfigurationSwapperTest {
         
assertThat(actual.getSessionAttributionSource().getAttributeHeaderPrefix(), 
is("X-Test-Attr-"));
     }
     
+    @ParameterizedTest(name = "HTTP token symbol {0}")
+    @ValueSource(chars = {'!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', 
'^', '_', '`', '|', '~'})
+    void assertSwapToObjectWithSessionAttributionHeaderSymbol(final char 
symbol) {
+        String expectedSubjectHeader = "X-Foo" + symbol;
+        YamlHttpTransportConfiguration yamlConfig = 
createYamlConfig("127.0.0.1", 18088, "/mcp");
+        
yamlConfig.setSessionAttributionSource(createSessionAttributionSource(expectedSubjectHeader,
 "X-Test-Source", "X-Test-Attr-"));
+        HttpTransportConfiguration actual = swapper.swapToObject(yamlConfig);
+        assertThat(actual.getSessionAttributionSource().getSubjectHeader(), 
is(expectedSubjectHeader));
+    }
+    
+    @ParameterizedTest(name = "invalid HTTP header {0}")
+    @ValueSource(strings = {"X-Foo Bar", "X-Foo\tBar", "X-FooéBar", 
"X-Foo١Bar"})
+    void assertSwapToObjectWithInvalidSessionAttributionHeaderCharacter(final 
String subjectHeader) {
+        YamlHttpTransportConfiguration yamlConfig = 
createYamlConfig("127.0.0.1", 18088, "/mcp");
+        
yamlConfig.setSessionAttributionSource(createSessionAttributionSource(subjectHeader,
 "X-Test-Source", "X-Test-Attr-"));
+        IllegalArgumentException actual = 
assertThrows(IllegalArgumentException.class, () -> 
swapper.swapToObject(yamlConfig));
+        assertThat(actual.getMessage(), is("MCP HTTP transport configuration 
property `sessionAttributionSource.subjectHeader` must be a valid HTTP header 
name."));
+    }
+    
     @Test
     void assertSwapToObjectWithInvalidSessionAttributionSubjectHeader() {
         YamlHttpTransportConfiguration yamlConfig = 
createYamlConfig("127.0.0.1", 18088, "/mcp");
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/metadata/GovernanceMetadataQueryService.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/metadata/GovernanceMetadataQueryService.java
index efdfe1c82e5..4707bb86c37 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/metadata/GovernanceMetadataQueryService.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/metadata/GovernanceMetadataQueryService.java
@@ -152,8 +152,8 @@ public final class GovernanceMetadataQueryService {
         if (value instanceof Collection) {
             return redactCollection((Collection<?>) value);
         }
-        if (value instanceof String) {
-            return redactJsonString((String) value);
+        if (value instanceof String text) {
+            return redactJsonString(text);
         }
         return new RedactedValue(value, false);
     }
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPQueryRecoveryPayloadFactory.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPQueryRecoveryPayloadFactory.java
index 4a7c0487f58..15cb88f1abe 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPQueryRecoveryPayloadFactory.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPQueryRecoveryPayloadFactory.java
@@ -48,9 +48,12 @@ final class MCPQueryRecoveryPayloadFactory {
             return true;
         }
         MCPJDBCErrorCategory category = 
MCPJDBCExceptionClassifier.classify(cause);
-        return cause instanceof MCPTimeoutException && 
MCPJDBCErrorCategory.TIMEOUT == category
-                || cause instanceof MCPUnsupportedException && 
MCPJDBCErrorCategory.FEATURE_NOT_SUPPORTED == category
-                || cause instanceof MCPInvalidRequestException && 
MCPJDBCErrorCategory.SYNTAX == category;
+        return switch (cause) {
+            case MCPTimeoutException ignored -> MCPJDBCErrorCategory.TIMEOUT 
== category;
+            case MCPUnsupportedException ignored -> 
MCPJDBCErrorCategory.FEATURE_NOT_SUPPORTED == category;
+            case MCPInvalidRequestException ignored -> 
MCPJDBCErrorCategory.SYNTAX == category;
+            default -> false;
+        };
     }
     
     static Map<String, Object> create(final Throwable cause) {
@@ -111,9 +114,13 @@ final class MCPQueryRecoveryPayloadFactory {
     }
     
     private static boolean usesResourceHint(final String category) {
-        return MCPDiagnosticCategory.OBJECT_NOT_VISIBLE.equals(category) || 
MCPDiagnosticCategory.CONNECTION_INTERRUPTED.equals(category)
-                || MCPDiagnosticCategory.EXECUTION_TIMEOUT.equals(category) || 
MCPDiagnosticCategory.UNSUPPORTED_DATABASE_CAPABILITY.equals(category)
-                || MCPDiagnosticCategory.QUERY_FAILED.equals(category);
+        switch (category) {
+            case MCPDiagnosticCategory.OBJECT_NOT_VISIBLE, 
MCPDiagnosticCategory.CONNECTION_INTERRUPTED, 
MCPDiagnosticCategory.EXECUTION_TIMEOUT,
+                    MCPDiagnosticCategory.UNSUPPORTED_DATABASE_CAPABILITY, 
MCPDiagnosticCategory.QUERY_FAILED:
+                return true;
+            default:
+                return false;
+        }
     }
     
     private static List<Map<String, Object>> createResourcesToRead(final 
String category) {
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPRecoveryPayloadSupport.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPRecoveryPayloadSupport.java
index 2219d32e720..219f8677510 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPRecoveryPayloadSupport.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/protocol/error/MCPRecoveryPayloadSupport.java
@@ -87,10 +87,14 @@ final class MCPRecoveryPayloadSupport {
     }
     
     private static boolean isRuntimeRecoveryCategory(final String category) {
-        return 
RuntimeDatabaseConnectionException.CATEGORY_MISSING_JDBC_DRIVER.equals(category)
 || 
RuntimeDatabaseConnectionException.CATEGORY_AUTHENTICATION_FAILED.equals(category)
-                || 
RuntimeDatabaseConnectionException.CATEGORY_AUTHORIZATION_FAILED.equals(category)
-                || 
RuntimeDatabaseConnectionException.CATEGORY_CONNECTION_TIMEOUT.equals(category) 
|| 
RuntimeDatabaseConnectionException.CATEGORY_INVALID_CONFIGURATION.equals(category)
-                || 
RuntimeDatabaseConnectionException.CATEGORY_DATABASE_UNAVAILABLE.equals(category)
-                || 
RuntimeDatabaseConnectionException.CATEGORY_CONNECTION_FAILED.equals(category);
+        switch (category) {
+            case 
RuntimeDatabaseConnectionException.CATEGORY_MISSING_JDBC_DRIVER, 
RuntimeDatabaseConnectionException.CATEGORY_AUTHENTICATION_FAILED,
+                    
RuntimeDatabaseConnectionException.CATEGORY_AUTHORIZATION_FAILED, 
RuntimeDatabaseConnectionException.CATEGORY_CONNECTION_TIMEOUT,
+                    
RuntimeDatabaseConnectionException.CATEGORY_INVALID_CONFIGURATION, 
RuntimeDatabaseConnectionException.CATEGORY_DATABASE_UNAVAILABLE,
+                    
RuntimeDatabaseConnectionException.CATEGORY_CONNECTION_FAILED:
+                return true;
+            default:
+                return false;
+        }
     }
 }
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 44440f5e7f3..43fcf78f51e 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
@@ -149,8 +149,7 @@ final class MCPSQLRecoveryPayloadFactory {
                                 "Choose the storage unit from the target 
logical database."),
                         
createResourceHint("shardingsphere://databases/{database}/storage-units/{storageUnit}/used-by-rules",
 "storage-unit",
                                 "Read rules that use the chosen storage 
unit."));
-            case "SHOW SINGLE TABLES":
-            case "SHOW SINGLE TABLE":
+            case "SHOW SINGLE TABLES", "SHOW SINGLE TABLE":
                 return 
List.of(createResourceHint("shardingsphere://databases/{database}/single-tables",
 "single-table",
                         "Read single table mappings from the target logical 
database instead of executing SHOW SINGLE TABLE."));
             case "SHOW DEFAULT SINGLE TABLE STORAGE UNIT":
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
index 83572f73b5b..51aa82209a2 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourcePayloadMapper.java
@@ -59,24 +59,23 @@ public final class MetadataResourcePayloadMapper {
     }
     
     private Object mapItem(final ShardingSphereMCPResourceMetadata metadata, 
final Object item) {
-        if (item instanceof RuntimeDatabaseProfile) {
-            return createDatabasePayload((RuntimeDatabaseProfile) item);
+        if (item instanceof RuntimeDatabaseProfile databaseProfile) {
+            return createDatabasePayload(databaseProfile);
         }
-        if (item instanceof ShardingSphereSchema) {
-            return createSchemaPayload(getDatabase(), (ShardingSphereSchema) 
item, detail);
+        if (item instanceof ShardingSphereSchema schema) {
+            return createSchemaPayload(getDatabase(), schema, detail);
         }
-        if (item instanceof ShardingSphereTable) {
-            ShardingSphereTable table = (ShardingSphereTable) item;
+        if (item instanceof ShardingSphereTable table) {
             return "view".equals(metadata.getObjectScope()) ? 
createViewPayload(getDatabase(), getSchema(), table, detail) : 
createTablePayload(getDatabase(), getSchema(), table, detail);
         }
-        if (item instanceof MCPColumnMetadata) {
-            return createColumnPayload((MCPColumnMetadata) item);
+        if (item instanceof MCPColumnMetadata columnMetadata) {
+            return createColumnPayload(columnMetadata);
         }
-        if (item instanceof ShardingSphereIndex) {
-            return createIndexPayload((ShardingSphereIndex) item);
+        if (item instanceof ShardingSphereIndex index) {
+            return createIndexPayload(index);
         }
-        if (item instanceof MCPSequenceMetadata) {
-            return createSequencePayload((MCPSequenceMetadata) item);
+        if (item instanceof MCPSequenceMetadata sequenceMetadata) {
+            return createSequencePayload(sequenceMetadata);
         }
         return item;
     }
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/MCPToolArgumentContract.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/MCPToolArgumentContract.java
index 5734db5d2b4..df45ea683b0 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/MCPToolArgumentContract.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/MCPToolArgumentContract.java
@@ -180,7 +180,7 @@ final class MCPToolArgumentContract {
     }
     
     private BigInteger toBigInteger(final Object value) {
-        return value instanceof BigInteger ? (BigInteger) value : 
BigInteger.valueOf(((Number) value).longValue());
+        return value instanceof BigInteger bigInteger ? bigInteger : 
BigInteger.valueOf(((Number) value).longValue());
     }
     
     private int getIntegerSchemaValue(final Map<?, ?> schema, final String 
key) {
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutor.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutor.java
index 948bcc1ab8d..d15361a5a54 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutor.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutor.java
@@ -236,8 +236,7 @@ public final class MCPJdbcStatementExecutor {
                                                 final ClassificationResult 
classificationResult) throws SQLException {
         boolean hasResultSet = 
statement.execute(classificationResult.getNormalizedSql());
         switch (classificationResult.getStatementClass()) {
-            case QUERY:
-            case EXPLAIN:
+            case QUERY, EXPLAIN:
                 if (!hasResultSet) {
                     throw new QueryDidNotReturnResultSetException();
                 }
@@ -247,8 +246,7 @@ public final class MCPJdbcStatementExecutor {
                         ? createResultSetResult(statement.getResultSet(), 
executionRequest, classificationResult)
                         : 
SQLExecutionResult.updateCount(classificationResult.getStatementClass(), 
classificationResult.getStatementType(), statement.getUpdateCount(),
                                 executionRequest.getMaxRows(), 
executionRequest.getTimeoutMs(), classificationResult.getNormalizedSql());
-            case DDL:
-            case DCL:
+            case DDL, DCL:
                 return 
SQLExecutionResult.statementAck(classificationResult.getStatementClass(), 
classificationResult.getStatementType(),
                         executionRequest.getMaxRows(), 
executionRequest.getTimeoutMs(), classificationResult.getNormalizedSql());
             default:
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutor.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutor.java
index e2b9266cab7..6b02aefcc86 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutor.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcTransactionStatementExecutor.java
@@ -74,14 +74,18 @@ public final class MCPJdbcTransactionStatementExecutor {
     private void executeSavepointStatement(final String sessionId, final 
MCPDatabaseCapability databaseCapability, final ClassificationResult 
classificationResult) {
         String statementType = classificationResult.getStatementType();
         String savepointName = 
classificationResult.getSavepointName().orElse("");
-        if ("SAVEPOINT".equals(statementType)) {
-            executeSavepoint(sessionId, databaseCapability, 
getRequiredSavepointName(savepointName));
-        } else if ("ROLLBACK TO SAVEPOINT".equals(statementType)) {
-            executeRollbackSavepoint(sessionId, databaseCapability, 
getRequiredSavepointName(savepointName));
-        } else if ("RELEASE SAVEPOINT".equals(statementType)) {
-            executeReleaseSavepoint(sessionId, databaseCapability, 
getRequiredSavepointName(savepointName));
-        } else {
-            throw new MCPInvalidRequestException("Statement is not a 
transaction command.");
+        switch (statementType) {
+            case "SAVEPOINT":
+                executeSavepoint(sessionId, databaseCapability, 
getRequiredSavepointName(savepointName));
+                break;
+            case "ROLLBACK TO SAVEPOINT":
+                executeRollbackSavepoint(sessionId, databaseCapability, 
getRequiredSavepointName(savepointName));
+                break;
+            case "RELEASE SAVEPOINT":
+                executeReleaseSavepoint(sessionId, databaseCapability, 
getRequiredSavepointName(savepointName));
+                break;
+            default:
+                throw new MCPInvalidRequestException("Statement is not a 
transaction command.");
         }
     }
     
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPStatementAnalyzer.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPStatementAnalyzer.java
index 65b5b6d72fa..a0f3f0744a0 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPStatementAnalyzer.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPStatementAnalyzer.java
@@ -50,6 +50,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Pattern;
 
 final class MCPStatementAnalyzer {
     
@@ -57,6 +58,8 @@ final class MCPStatementAnalyzer {
     
     private static final Set<String> DDL_STATEMENT_TYPES = Set.of("CREATE", 
"ALTER", "DROP", "TRUNCATE");
     
+    private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+");
+    
     private final Collection<MCPRuleDistSQLStatementClassifier> 
ruleDistSQLStatementClassifiers =
             
ShardingSphereServiceLoader.getServiceInstances(MCPRuleDistSQLStatementClassifier.class);
     
@@ -122,22 +125,17 @@ final class MCPStatementAnalyzer {
         if (ruleDistSQL && DDL_STATEMENT_TYPES.contains(leadingKeyword)) {
             return SupportedMCPStatement.DDL;
         }
-        if (sqlStatement instanceof SelectStatement && 
hasExpectedLeadingKeyword(leadingKeyword, "SELECT")) {
-            return SupportedMCPStatement.QUERY;
-        }
-        if (sqlStatement instanceof InsertStatement && 
hasExpectedLeadingKeyword(leadingKeyword, "INSERT")
-                || sqlStatement instanceof UpdateStatement && 
hasExpectedLeadingKeyword(leadingKeyword, "UPDATE")
-                || sqlStatement instanceof DeleteStatement && 
hasExpectedLeadingKeyword(leadingKeyword, "DELETE")
-                || sqlStatement instanceof MergeStatement && 
hasExpectedLeadingKeyword(leadingKeyword, "MERGE")) {
-            return SupportedMCPStatement.DML;
-        }
-        if (sqlStatement instanceof DDLStatement && 
DDL_STATEMENT_TYPES.contains(leadingKeyword)) {
-            return SupportedMCPStatement.DDL;
-        }
-        if (sqlStatement instanceof GrantStatement && 
"GRANT".equals(leadingKeyword) || sqlStatement instanceof RevokeStatement && 
"REVOKE".equals(leadingKeyword)) {
-            return SupportedMCPStatement.DCL;
-        }
-        throw new MCPUnsupportedSQLStatementException();
+        return switch (sqlStatement) {
+            case SelectStatement ignored when 
hasExpectedLeadingKeyword(leadingKeyword, "SELECT") -> 
SupportedMCPStatement.QUERY;
+            case InsertStatement ignored when 
hasExpectedLeadingKeyword(leadingKeyword, "INSERT") -> 
SupportedMCPStatement.DML;
+            case UpdateStatement ignored when 
hasExpectedLeadingKeyword(leadingKeyword, "UPDATE") -> 
SupportedMCPStatement.DML;
+            case DeleteStatement ignored when 
hasExpectedLeadingKeyword(leadingKeyword, "DELETE") -> 
SupportedMCPStatement.DML;
+            case MergeStatement ignored when 
hasExpectedLeadingKeyword(leadingKeyword, "MERGE") -> SupportedMCPStatement.DML;
+            case DDLStatement ignored when 
DDL_STATEMENT_TYPES.contains(leadingKeyword) -> SupportedMCPStatement.DDL;
+            case GrantStatement ignored when "GRANT".equals(leadingKeyword) -> 
SupportedMCPStatement.DCL;
+            case RevokeStatement ignored when "REVOKE".equals(leadingKeyword) 
-> SupportedMCPStatement.DCL;
+            case null, default -> throw new 
MCPUnsupportedSQLStatementException();
+        };
     }
     
     private boolean hasExpectedLeadingKeyword(final String leadingKeyword, 
final String expectedKeyword) {
@@ -195,11 +193,11 @@ final class MCPStatementAnalyzer {
         if (upperSql.startsWith("RELEASE SAVEPOINT")) {
             return "RELEASE SAVEPOINT";
         }
-        return upperSql.split("\\s+")[0];
+        return WHITESPACE_PATTERN.split(upperSql)[0];
     }
     
     private String extractSavepointName(final String sql) {
-        String[] tokens = sql.split("\\s+");
+        String[] tokens = WHITESPACE_PATTERN.split(sql);
         if ("SAVEPOINT".equalsIgnoreCase(tokens[0]) && 2 == tokens.length) {
             return tokens[1];
         }
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementObjectExtractor.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementObjectExtractor.java
index 5ff7ff0539e..e5e3b9696d5 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementObjectExtractor.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementObjectExtractor.java
@@ -84,10 +84,10 @@ final class SQLStatementObjectExtractor {
     
     private void extractDCLTargets(final SQLStatement sqlStatement, final 
Collection<SQLStatementObjectName> result) {
         Collection<PrivilegeObjectSegment> privilegeObjects;
-        if (sqlStatement instanceof GrantStatement) {
-            privilegeObjects = ((GrantStatement) 
sqlStatement).getPrivilegeObjects();
-        } else if (sqlStatement instanceof RevokeStatement) {
-            privilegeObjects = ((RevokeStatement) 
sqlStatement).getPrivilegeObjects();
+        if (sqlStatement instanceof GrantStatement grant) {
+            privilegeObjects = grant.getPrivilegeObjects();
+        } else if (sqlStatement instanceof RevokeStatement revoke) {
+            privilegeObjects = revoke.getPrivilegeObjects();
         } else {
             return;
         }
@@ -103,8 +103,7 @@ final class SQLStatementObjectExtractor {
     private void extractQualifiedFunctions(final SQLStatement sqlStatement, 
final Collection<SQLStatementObjectName> result) {
         new SQLStatementTreeWalker(each -> {
         }, expression -> {
-            if (expression instanceof FunctionSegment) {
-                FunctionSegment function = (FunctionSegment) expression;
+            if (expression instanceof FunctionSegment function) {
                 if (null != function.getOwner()) {
                     
result.add(SQLStatementObjectName.from(Optional.of(function.getOwner()), new 
IdentifierValue(function.getFunctionName())));
                 }
@@ -113,25 +112,23 @@ final class SQLStatementObjectExtractor {
     }
     
     private void extractDirectTargets(final SQLStatement sqlStatement, final 
Collection<SQLStatementObjectName> result) {
-        if (sqlStatement instanceof InsertStatement) {
-            ((InsertStatement) sqlStatement).getTable().ifPresent(optional -> 
addTable(optional, result));
-        } else if (sqlStatement instanceof UpdateStatement) {
-            addTableSegment(((UpdateStatement) sqlStatement).getTable(), 
result);
-        } else if (sqlStatement instanceof DeleteStatement) {
-            addTableSegment(((DeleteStatement) sqlStatement).getTable(), 
result);
-        } else if (sqlStatement instanceof MergeStatement) {
-            addTableSegment(((MergeStatement) sqlStatement).getTarget(), 
result);
-        } else if (sqlStatement instanceof CreateTableStatement) {
-            CreateTableStatement createTableStatement = (CreateTableStatement) 
sqlStatement;
+        if (sqlStatement instanceof InsertStatement insert) {
+            insert.getTable().ifPresent(optional -> addTable(optional, 
result));
+        } else if (sqlStatement instanceof UpdateStatement update) {
+            addTableSegment(update.getTable(), result);
+        } else if (sqlStatement instanceof DeleteStatement delete) {
+            addTableSegment(delete.getTable(), result);
+        } else if (sqlStatement instanceof MergeStatement merge) {
+            addTableSegment(merge.getTarget(), result);
+        } else if (sqlStatement instanceof CreateTableStatement 
createTableStatement) {
             addTable(createTableStatement.getTable(), result);
             createTableStatement.getLikeTable().ifPresent(table -> 
addTable(table, result));
             createTableStatement.getSelectStatement().ifPresent(select -> 
addSelectTables(select, result));
-        } else if (sqlStatement instanceof AlterTableStatement) {
-            addTable(((AlterTableStatement) sqlStatement).getTable(), result);
-        } else if (sqlStatement instanceof CreateViewStatement) {
-            addTable(((CreateViewStatement) sqlStatement).getView(), result);
-        } else if (sqlStatement instanceof AlterViewStatement) {
-            AlterViewStatement alterViewStatement = (AlterViewStatement) 
sqlStatement;
+        } else if (sqlStatement instanceof AlterTableStatement 
alterTableStatement) {
+            addTable(alterTableStatement.getTable(), result);
+        } else if (sqlStatement instanceof CreateViewStatement 
createViewStatement) {
+            addTable(createViewStatement.getView(), result);
+        } else if (sqlStatement instanceof AlterViewStatement 
alterViewStatement) {
             addTable(alterViewStatement.getView(), result);
             alterViewStatement.getRenameView().ifPresent(view -> 
addTable(view, result));
             alterViewStatement.getSelect().ifPresent(select -> 
addSelectTables(select, result));
@@ -143,53 +140,53 @@ final class SQLStatementObjectExtractor {
     }
     
     private void extractIndexTargets(final SQLStatement sqlStatement, final 
Collection<SQLStatementObjectName> result) {
-        if (sqlStatement instanceof CreateIndexStatement) {
-            addIndex(((CreateIndexStatement) sqlStatement).getIndex(), result);
-        } else if (sqlStatement instanceof AlterIndexStatement) {
-            ((AlterIndexStatement) sqlStatement).getIndex().ifPresent(index -> 
addIndex(index, result));
-            ((AlterIndexStatement) 
sqlStatement).getRenameIndex().ifPresent(index -> addIndex(index, result));
-        } else if (sqlStatement instanceof DropIndexStatement) {
-            for (IndexSegment each : ((DropIndexStatement) 
sqlStatement).getIndexes()) {
+        if (sqlStatement instanceof CreateIndexStatement createIndexStatement) 
{
+            addIndex(createIndexStatement.getIndex(), result);
+        } else if (sqlStatement instanceof AlterIndexStatement 
alterIndexStatement) {
+            alterIndexStatement.getIndex().ifPresent(index -> addIndex(index, 
result));
+            alterIndexStatement.getRenameIndex().ifPresent(index -> 
addIndex(index, result));
+        } else if (sqlStatement instanceof DropIndexStatement 
dropIndexStatement) {
+            for (IndexSegment each : dropIndexStatement.getIndexes()) {
                 addIndex(each, result);
             }
         }
     }
     
     private void extractDatabaseTargets(final SQLStatement sqlStatement, final 
Collection<SQLStatementObjectName> result) {
-        if (sqlStatement instanceof CreateDatabaseStatement) {
-            addNamespaceName(((CreateDatabaseStatement) 
sqlStatement).getDatabaseName(), result);
-        } else if (sqlStatement instanceof AlterDatabaseStatement) {
-            addNamespaceName(((AlterDatabaseStatement) 
sqlStatement).getDatabaseName(), result);
-            ((AlterDatabaseStatement) 
sqlStatement).getRenameDatabaseName().ifPresent(name -> addNamespaceName(name, 
result));
-        } else if (sqlStatement instanceof DropDatabaseStatement) {
-            addNamespaceName(((DropDatabaseStatement) 
sqlStatement).getDatabaseName(), result);
+        if (sqlStatement instanceof CreateDatabaseStatement 
createDatabaseStatement) {
+            addNamespaceName(createDatabaseStatement.getDatabaseName(), 
result);
+        } else if (sqlStatement instanceof AlterDatabaseStatement 
alterDatabaseStatement) {
+            addNamespaceName(alterDatabaseStatement.getDatabaseName(), result);
+            alterDatabaseStatement.getRenameDatabaseName().ifPresent(name -> 
addNamespaceName(name, result));
+        } else if (sqlStatement instanceof DropDatabaseStatement 
dropDatabaseStatement) {
+            addNamespaceName(dropDatabaseStatement.getDatabaseName(), result);
         }
     }
     
     private void extractSchemaTargets(final SQLStatement sqlStatement, final 
Collection<SQLStatementObjectName> result) {
-        if (sqlStatement instanceof CreateSchemaStatement) {
-            ((CreateSchemaStatement) 
sqlStatement).getSchemaName().ifPresent(schema -> 
addNamespaceIdentifier(schema, result));
-        } else if (sqlStatement instanceof AlterSchemaStatement) {
-            addNamespaceIdentifier(((AlterSchemaStatement) 
sqlStatement).getSchemaName(), result);
-            ((AlterSchemaStatement) 
sqlStatement).getRenameSchema().ifPresent(schema -> 
addNamespaceIdentifier(schema, result));
-        } else if (sqlStatement instanceof DropSchemaStatement) {
-            for (IdentifierValue each : ((DropSchemaStatement) 
sqlStatement).getSchemaNames()) {
+        if (sqlStatement instanceof CreateSchemaStatement 
createSchemaStatement) {
+            createSchemaStatement.getSchemaName().ifPresent(schema -> 
addNamespaceIdentifier(schema, result));
+        } else if (sqlStatement instanceof AlterSchemaStatement 
alterSchemaStatement) {
+            addNamespaceIdentifier(alterSchemaStatement.getSchemaName(), 
result);
+            alterSchemaStatement.getRenameSchema().ifPresent(schema -> 
addNamespaceIdentifier(schema, result));
+        } else if (sqlStatement instanceof DropSchemaStatement 
dropSchemaStatement) {
+            for (IdentifierValue each : dropSchemaStatement.getSchemaNames()) {
                 addNamespaceIdentifier(each, result);
             }
         }
     }
     
     private void extractSequenceTargets(final SQLStatement sqlStatement, final 
Collection<SQLStatementObjectName> result) {
-        if (sqlStatement instanceof CreateSequenceStatement) {
-            addName(((CreateSequenceStatement) 
sqlStatement).getSequenceName(), result);
-        } else if (sqlStatement instanceof AlterSequenceStatement) {
-            addName(((AlterSequenceStatement) sqlStatement).getSequenceName(), 
result);
-        } else if (sqlStatement instanceof DropSequenceStatement) {
-            for (Object each : ((DropSequenceStatement) 
sqlStatement).getSequenceNames()) {
-                if (each instanceof String) {
-                    addName((String) each, result);
-                } else if (each instanceof SimpleTableSegment) {
-                    addTable((SimpleTableSegment) each, result);
+        if (sqlStatement instanceof CreateSequenceStatement 
createSequenceStatement) {
+            addName(createSequenceStatement.getSequenceName(), result);
+        } else if (sqlStatement instanceof AlterSequenceStatement 
alterSequenceStatement) {
+            addName(alterSequenceStatement.getSequenceName(), result);
+        } else if (sqlStatement instanceof DropSequenceStatement 
dropSequenceStatement) {
+            for (Object each : dropSequenceStatement.getSequenceNames()) {
+                if (each instanceof String sequenceName) {
+                    addName(sequenceName, result);
+                } else if (each instanceof SimpleTableSegment simpleTable) {
+                    addTable(simpleTable, result);
                 } else {
                     throw new MCPUnsupportedSQLStatementException();
                 }
@@ -198,8 +195,8 @@ final class SQLStatementObjectExtractor {
     }
     
     private void extractMergeTables(final SQLStatement sqlStatement, final 
Collection<SQLStatementObjectName> result) {
-        if (sqlStatement instanceof MergeStatement) {
-            addTableSegment(((MergeStatement) sqlStatement).getSource(), 
result);
+        if (sqlStatement instanceof MergeStatement merge) {
+            addTableSegment(merge.getSource(), result);
         }
     }
     
@@ -232,44 +229,44 @@ final class SQLStatementObjectExtractor {
                 
collectCommonTableExpressionAliases(each.getSubquery().getSelect(), result);
             }
         });
-        if (sqlStatement instanceof CreateTableStatement) {
-            ((CreateTableStatement) 
sqlStatement).getSelectStatement().ifPresent(each -> 
collectCommonTableExpressionAliases(each, result));
-        } else if (sqlStatement instanceof CreateViewStatement) {
-            collectCommonTableExpressionAliases(((CreateViewStatement) 
sqlStatement).getSelect(), result);
-        } else if (sqlStatement instanceof AlterViewStatement) {
-            ((AlterViewStatement) sqlStatement).getSelect().ifPresent(each -> 
collectCommonTableExpressionAliases(each, result));
+        if (sqlStatement instanceof CreateTableStatement createTableStatement) 
{
+            createTableStatement.getSelectStatement().ifPresent(each -> 
collectCommonTableExpressionAliases(each, result));
+        } else if (sqlStatement instanceof CreateViewStatement 
createViewStatement) {
+            
collectCommonTableExpressionAliases(createViewStatement.getSelect(), result);
+        } else if (sqlStatement instanceof AlterViewStatement 
alterViewStatement) {
+            alterViewStatement.getSelect().ifPresent(each -> 
collectCommonTableExpressionAliases(each, result));
         }
     }
     
     private Optional<WithSegment> findWithSegment(final SQLStatement 
sqlStatement) {
-        if (sqlStatement instanceof SelectStatement) {
-            return ((SelectStatement) sqlStatement).getWith();
+        if (sqlStatement instanceof SelectStatement select) {
+            return select.getWith();
         }
-        if (sqlStatement instanceof InsertStatement) {
-            return ((InsertStatement) sqlStatement).getWith();
+        if (sqlStatement instanceof InsertStatement insert) {
+            return insert.getWith();
         }
-        if (sqlStatement instanceof UpdateStatement) {
-            return ((UpdateStatement) sqlStatement).getWith();
+        if (sqlStatement instanceof UpdateStatement update) {
+            return update.getWith();
         }
-        if (sqlStatement instanceof DeleteStatement) {
-            return ((DeleteStatement) sqlStatement).getWith();
+        if (sqlStatement instanceof DeleteStatement delete) {
+            return delete.getWith();
         }
-        return sqlStatement instanceof MergeStatement ? ((MergeStatement) 
sqlStatement).getWith() : Optional.empty();
+        return sqlStatement instanceof MergeStatement merge ? merge.getWith() 
: Optional.empty();
     }
     
     private void addTableSegment(final TableSegment tableSegment, final 
Collection<SQLStatementObjectName> result) {
-        if (tableSegment instanceof SimpleTableSegment) {
-            addTable((SimpleTableSegment) tableSegment, result);
-        } else if (tableSegment instanceof JoinTableSegment) {
-            addTableSegment(((JoinTableSegment) tableSegment).getLeft(), 
result);
-            addTableSegment(((JoinTableSegment) tableSegment).getRight(), 
result);
-        } else if (tableSegment instanceof SubqueryTableSegment) {
+        if (tableSegment instanceof SimpleTableSegment simpleTable) {
+            addTable(simpleTable, result);
+        } else if (tableSegment instanceof JoinTableSegment joinTable) {
+            addTableSegment(joinTable.getLeft(), result);
+            addTableSegment(joinTable.getRight(), result);
+        } else if (tableSegment instanceof SubqueryTableSegment subqueryTable) 
{
             TableExtractor extractor = new TableExtractor();
-            extractor.extractTablesFromSelect(((SubqueryTableSegment) 
tableSegment).getSubquery().getSelect());
+            
extractor.extractTablesFromSelect(subqueryTable.getSubquery().getSelect());
             addTableSegments(extractor.getTableContext(), result);
-        } else if (tableSegment instanceof DeleteMultiTableSegment) {
-            addTables(((DeleteMultiTableSegment) 
tableSegment).getActualDeleteTables(), result);
-            addTableSegment(((DeleteMultiTableSegment) 
tableSegment).getRelationTable(), result);
+        } else if (tableSegment instanceof DeleteMultiTableSegment 
deleteMultiTable) {
+            addTables(deleteMultiTable.getActualDeleteTables(), result);
+            addTableSegment(deleteMultiTable.getRelationTable(), result);
         }
     }
     
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementSafetyValidator.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementSafetyValidator.java
index 91b9aca29e5..8cf41560156 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementSafetyValidator.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementSafetyValidator.java
@@ -37,9 +37,12 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.Se
 
 import java.util.List;
 import java.util.Locale;
+import java.util.regex.Pattern;
 
 final class SQLStatementSafetyValidator {
     
+    private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+");
+    
     private static final List<String> SIDE_EFFECTING_FUNCTION_NAMES = 
List.of("NEXTVAL", "NEXT VALUE FOR", "SETVAL", "GET_LOCK", "RELEASE_LOCK", 
"RELEASE_ALL_LOCKS",
             "PG_ADVISORY_LOCK", "PG_ADVISORY_XACT_LOCK", 
"PG_TRY_ADVISORY_LOCK", "PG_TRY_ADVISORY_XACT_LOCK", "PG_ADVISORY_UNLOCK", 
"PG_ADVISORY_UNLOCK_ALL",
             "SET_CONFIG", "PG_REPLICATION_SLOT_ADVANCE", 
"PG_LOGICAL_SLOT_GET_CHANGES", "PG_LOGICAL_SLOT_GET_BINARY_CHANGES", 
"PG_LOGICAL_EMIT_MESSAGE", "PG_SWITCH_WAL",
@@ -63,9 +66,17 @@ final class SQLStatementSafetyValidator {
     }
     
     private boolean isBannedStatementType(final SQLStatement sqlStatement) {
-        return sqlStatement instanceof SetStatement || sqlStatement instanceof 
CallStatement
-                || sqlStatement instanceof CreateUserStatement || sqlStatement 
instanceof AlterUserStatement || sqlStatement instanceof DropUserStatement
-                || sqlStatement instanceof CreateRoleStatement || sqlStatement 
instanceof AlterRoleStatement || sqlStatement instanceof DropRoleStatement;
+        return switch (sqlStatement) {
+            case SetStatement ignored -> true;
+            case CallStatement ignored -> true;
+            case CreateUserStatement ignored -> true;
+            case AlterUserStatement ignored -> true;
+            case DropUserStatement ignored -> true;
+            case CreateRoleStatement ignored -> true;
+            case AlterRoleStatement ignored -> true;
+            case DropRoleStatement ignored -> true;
+            case null, default -> false;
+        };
     }
     
     private boolean containsExecutableComment(final SQLStatement sqlStatement) 
{
@@ -82,8 +93,7 @@ final class SQLStatementSafetyValidator {
         if (isBannedStatementType(sqlStatement) || 
containsExecutableComment(sqlStatement)) {
             throw new MCPBannedSQLStatementException();
         }
-        if (sqlStatement instanceof SelectStatement) {
-            SelectStatement select = (SelectStatement) sqlStatement;
+        if (sqlStatement instanceof SelectStatement select) {
             if (select.getInto().isPresent() || 
select.getOutfile().isPresent()) {
                 throw new MCPBannedSQLStatementException();
             }
@@ -94,12 +104,11 @@ final class SQLStatementSafetyValidator {
     }
     
     private void checkExpression(final ExpressionSegment expression) {
-        if (expression instanceof FunctionSegment) {
-            checkFunction((FunctionSegment) expression);
-        } else if (expression instanceof BinaryOperationExpression && 
":=".equals(((BinaryOperationExpression) expression).getOperator())) {
+        if (expression instanceof FunctionSegment function) {
+            checkFunction(function);
+        } else if (expression instanceof BinaryOperationExpression binary && 
":=".equals(binary.getOperator())) {
             throw new MCPBannedSQLStatementException();
-        } else if (expression instanceof ColumnSegment) {
-            ColumnSegment column = (ColumnSegment) expression;
+        } else if (expression instanceof ColumnSegment column) {
             if (column.getOwner().isPresent() && 
"NEXTVAL".equalsIgnoreCase(column.getIdentifier().getValue())) {
                 throw new MCPBannedSQLStatementException();
             }
@@ -120,7 +129,7 @@ final class SQLStatementSafetyValidator {
     }
     
     private boolean isAlterSystemStatement(final String upperSql) {
-        String[] words = upperSql.split("\\s+", 3);
+        String[] words = WHITESPACE_PATTERN.split(upperSql, 3);
         return 2 <= words.length && "ALTER".equals(words[0]) && 
"SYSTEM".equals(words[1]);
     }
     
@@ -140,6 +149,6 @@ final class SQLStatementSafetyValidator {
         if (upperSql.startsWith("SHOW SINGLE TABLE")) {
             return "SHOW SINGLE TABLE";
         }
-        return upperSql.split("\\s+")[0];
+        return WHITESPACE_PATTERN.split(upperSql)[0];
     }
 }
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementScanner.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementScanner.java
index 04779b4efaa..d5ae7fc98b3 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementScanner.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementScanner.java
@@ -205,7 +205,11 @@ final class SQLStatementScanner {
         }
         char firstChar = text.charAt(0);
         char lastChar = text.charAt(text.length() - 1);
-        return '"' == firstChar && '"' == lastChar || '`' == firstChar && '`' 
== lastChar || '[' == firstChar && ']' == lastChar;
+        return switch (firstChar) {
+            case '"', '`' -> firstChar == lastChar;
+            case '[' -> ']' == lastChar;
+            default -> false;
+        };
     }
     
     private boolean containsExecutableCommentMarker(final String text) {
@@ -316,8 +320,11 @@ final class SQLStatementScanner {
     }
     
     private int findLineCommentEnd(final String sql, final List<Token> tokens, 
final int startIndex, final boolean lineCommentsHandledByLexer) {
+        if (lineCommentsHandledByLexer) {
+            return -1;
+        }
         Token start = tokens.get(startIndex);
-        if (lineCommentsHandledByLexer || !"-".equals(start.getText()) || 
startIndex + 1 >= tokens.size() || !"-".equals(tokens.get(startIndex + 
1).getText())
+        if (!"-".equals(start.getText()) || startIndex + 1 >= tokens.size() || 
!"-".equals(tokens.get(startIndex + 1).getText())
                 || tokens.get(startIndex + 1).getStartIndex() != 
start.getStopIndex() + 1) {
             return -1;
         }
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementTreeWalker.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementTreeWalker.java
index 9bbd71c03ff..1f63ac9622e 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementTreeWalker.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/SQLStatementTreeWalker.java
@@ -110,36 +110,36 @@ final class SQLStatementTreeWalker {
             return;
         }
         statementConsumer.accept(sqlStatement);
-        if (sqlStatement instanceof SelectStatement) {
-            walkSelect((SelectStatement) sqlStatement);
-        } else if (sqlStatement instanceof InsertStatement) {
-            walkInsert((InsertStatement) sqlStatement);
-        } else if (sqlStatement instanceof UpdateStatement) {
-            walkUpdate((UpdateStatement) sqlStatement);
-        } else if (sqlStatement instanceof DeleteStatement) {
-            walkDelete((DeleteStatement) sqlStatement);
-        } else if (sqlStatement instanceof MergeStatement) {
-            walkMerge((MergeStatement) sqlStatement);
+        if (sqlStatement instanceof SelectStatement select) {
+            walkSelect(select);
+        } else if (sqlStatement instanceof InsertStatement insert) {
+            walkInsert(insert);
+        } else if (sqlStatement instanceof UpdateStatement update) {
+            walkUpdate(update);
+        } else if (sqlStatement instanceof DeleteStatement delete) {
+            walkDelete(delete);
+        } else if (sqlStatement instanceof MergeStatement merge) {
+            walkMerge(merge);
         } else {
             walkDDL(sqlStatement);
         }
     }
     
     private void walkDDL(final SQLStatement sqlStatement) {
-        if (sqlStatement instanceof CreateTableStatement) {
-            ((CreateTableStatement) 
sqlStatement).getSelectStatement().ifPresent(this::walk);
-        } else if (sqlStatement instanceof CreateViewStatement) {
-            walk(((CreateViewStatement) sqlStatement).getSelect());
-        } else if (sqlStatement instanceof AlterViewStatement) {
-            ((AlterViewStatement) 
sqlStatement).getSelect().ifPresent(this::walk);
-        } else if (sqlStatement instanceof CreateMaterializedViewStatement) {
-            walk(((CreateMaterializedViewStatement) sqlStatement).getSelect());
-        } else if (sqlStatement instanceof CreateFunctionStatement) {
-            walkRoutine(((CreateFunctionStatement) 
sqlStatement).getSqlStatements(), ((CreateFunctionStatement) 
sqlStatement).getDynamicSqlStatementExpressions());
-        } else if (sqlStatement instanceof CreateProcedureStatement) {
-            walkRoutine(((CreateProcedureStatement) 
sqlStatement).getSqlStatements(), ((CreateProcedureStatement) 
sqlStatement).getDynamicSqlStatementExpressions());
-        } else if (sqlStatement instanceof CreateTriggerStatement) {
-            walkRoutine(((CreateTriggerStatement) 
sqlStatement).getSqlStatements(), ((CreateTriggerStatement) 
sqlStatement).getDynamicSqlStatementExpressions());
+        if (sqlStatement instanceof CreateTableStatement createTableStatement) 
{
+            createTableStatement.getSelectStatement().ifPresent(this::walk);
+        } else if (sqlStatement instanceof CreateViewStatement 
createViewStatement) {
+            walk(createViewStatement.getSelect());
+        } else if (sqlStatement instanceof AlterViewStatement 
alterViewStatement) {
+            alterViewStatement.getSelect().ifPresent(this::walk);
+        } else if (sqlStatement instanceof CreateMaterializedViewStatement 
createMaterializedViewStatement) {
+            walk(createMaterializedViewStatement.getSelect());
+        } else if (sqlStatement instanceof CreateFunctionStatement 
createFunctionStatement) {
+            walkRoutine(createFunctionStatement.getSqlStatements(), 
createFunctionStatement.getDynamicSqlStatementExpressions());
+        } else if (sqlStatement instanceof CreateProcedureStatement 
createProcedureStatement) {
+            walkRoutine(createProcedureStatement.getSqlStatements(), 
createProcedureStatement.getDynamicSqlStatementExpressions());
+        } else if (sqlStatement instanceof CreateTriggerStatement 
createTriggerStatement) {
+            walkRoutine(createTriggerStatement.getSqlStatements(), 
createTriggerStatement.getDynamicSqlStatementExpressions());
         }
     }
     
@@ -251,25 +251,25 @@ final class SQLStatementTreeWalker {
             return;
         }
         for (ProjectionSegment each : projections.getProjections()) {
-            if (each instanceof ExpressionProjectionSegment) {
-                walkExpression(((ExpressionProjectionSegment) each).getExpr());
-            } else if (each instanceof ExpressionSegment) {
-                walkExpression((ExpressionSegment) each);
-            } else if (each instanceof ColumnProjectionSegment) {
-                walkExpression(((ColumnProjectionSegment) each).getColumn());
-            } else if (each instanceof SubqueryProjectionSegment) {
-                walk(((SubqueryProjectionSegment) 
each).getSubquery().getSelect());
-            } else if (each instanceof DatetimeProjectionSegment) {
-                walkExpression(((DatetimeProjectionSegment) each).getLeft());
-                walkExpression(((DatetimeProjectionSegment) each).getRight());
+            if (each instanceof ExpressionProjectionSegment 
expressionProjection) {
+                walkExpression(expressionProjection.getExpr());
+            } else if (each instanceof ExpressionSegment expression) {
+                walkExpression(expression);
+            } else if (each instanceof ColumnProjectionSegment 
columnProjection) {
+                walkExpression(columnProjection.getColumn());
+            } else if (each instanceof SubqueryProjectionSegment 
subqueryProjection) {
+                walk(subqueryProjection.getSubquery().getSelect());
+            } else if (each instanceof DatetimeProjectionSegment 
datetimeProjection) {
+                walkExpression(datetimeProjection.getLeft());
+                walkExpression(datetimeProjection.getRight());
             }
         }
     }
     
     private void walkOrderByItems(final Iterable<OrderByItemSegment> items) {
         for (OrderByItemSegment each : items) {
-            if (each instanceof ExpressionOrderByItemSegment) {
-                walkExpression(((ExpressionOrderByItemSegment) 
each).getExpr());
+            if (each instanceof ExpressionOrderByItemSegment 
expressionOrderByItem) {
+                walkExpression(expressionOrderByItem.getExpr());
             }
         }
     }
@@ -280,8 +280,8 @@ final class SQLStatementTreeWalker {
     }
     
     private void walkPaginationValue(final PaginationValueSegment value) {
-        if (value instanceof ExpressionPaginationValueSegment) {
-            walkExpression(((ExpressionPaginationValueSegment) 
value).getExpression());
+        if (value instanceof ExpressionPaginationValueSegment 
expressionPaginationValue) {
+            walkExpression(expressionPaginationValue.getExpression());
         }
     }
     
@@ -314,23 +314,22 @@ final class SQLStatementTreeWalker {
     }
     
     private void walkTable(final TableSegment table) {
-        if (table instanceof SimpleTableSegment) {
-            ((SimpleTableSegment) 
table).getTableSampleExpression().ifPresent(this::walkExpression);
-        } else if (table instanceof FunctionTableSegment) {
-            walkExpression(((FunctionTableSegment) table).getTableFunction());
-        } else if (table instanceof JoinTableSegment) {
-            JoinTableSegment join = (JoinTableSegment) table;
+        if (table instanceof SimpleTableSegment simpleTable) {
+            
simpleTable.getTableSampleExpression().ifPresent(this::walkExpression);
+        } else if (table instanceof FunctionTableSegment functionTable) {
+            walkExpression(functionTable.getTableFunction());
+        } else if (table instanceof JoinTableSegment join) {
             walkTable(join.getLeft());
             walkTable(join.getRight());
             walkExpression(join.getCondition());
             
join.getLeftQueryPartitionListSegments().forEach(this::walkExpression);
             
join.getRightQueryPartitionListSegments().forEach(this::walkExpression);
-        } else if (table instanceof SubqueryTableSegment) {
-            walk(((SubqueryTableSegment) table).getSubquery().getSelect());
-        } else if (table instanceof CollectionTableSegment) {
-            walkExpression(((CollectionTableSegment) 
table).getExpressionSegment());
-        } else if (table instanceof DeleteMultiTableSegment) {
-            walkTable(((DeleteMultiTableSegment) table).getRelationTable());
+        } else if (table instanceof SubqueryTableSegment subqueryTable) {
+            walk(subqueryTable.getSubquery().getSelect());
+        } else if (table instanceof CollectionTableSegment collectionTable) {
+            walkExpression(collectionTable.getExpressionSegment());
+        } else if (table instanceof DeleteMultiTableSegment deleteMultiTable) {
+            walkTable(deleteMultiTable.getRelationTable());
         }
     }
     
@@ -339,70 +338,56 @@ final class SQLStatementTreeWalker {
             return;
         }
         expressionConsumer.accept(expression);
-        if (expression instanceof FunctionSegment) {
-            walkFunction((FunctionSegment) expression);
-        } else if (expression instanceof CommonExpressionSegment) {
-            ((CommonExpressionSegment) 
expression).getChildren().forEach(this::walkExpression);
-        } else if (expression instanceof AggregationProjectionSegment) {
-            AggregationProjectionSegment aggregation = 
(AggregationProjectionSegment) expression;
-            aggregation.getParameters().forEach(this::walkExpression);
-            aggregation.getWindow().ifPresent(this::walkWindow);
-        } else if (expression instanceof BinaryOperationExpression) {
-            walkExpression(((BinaryOperationExpression) expression).getLeft());
-            walkExpression(((BinaryOperationExpression) 
expression).getRight());
-        } else if (expression instanceof ColumnAssignmentSegment) {
-            walkExpression(((ColumnAssignmentSegment) expression).getValue());
-        } else if (expression instanceof ListExpression) {
-            ((ListExpression) 
expression).getItems().forEach(this::walkExpression);
-        } else if (expression instanceof BetweenExpression) {
-            BetweenExpression between = (BetweenExpression) expression;
-            walkExpression(between.getLeft());
-            walkExpression(between.getBetweenExpr());
-            walkExpression(between.getAndExpr());
-        } else if (expression instanceof InExpression) {
-            walkExpression(((InExpression) expression).getLeft());
-            walkExpression(((InExpression) expression).getRight());
-        } else if (expression instanceof CaseWhenExpression) {
-            walkCaseWhen((CaseWhenExpression) expression);
-        } else if (expression instanceof NotExpression) {
-            walkExpression(((NotExpression) expression).getExpression());
-        } else if (expression instanceof TypeCastExpression) {
-            walkExpression(((TypeCastExpression) expression).getExpression());
-        } else if (expression instanceof CollateExpression) {
-            ((CollateExpression) 
expression).getExpr().ifPresent(this::walkExpression);
-        } else if (expression instanceof DatetimeExpression) {
-            walkExpression(((DatetimeExpression) expression).getLeft());
-            walkExpression(((DatetimeExpression) expression).getRight());
-        } else if (expression instanceof IntervalExpression) {
-            walkExpression(((IntervalExpression) expression).getValue());
-        } else if (expression instanceof IntervalExpressionProjection) {
-            walkIntervalProjection((IntervalExpressionProjection) expression);
-        } else if (expression instanceof KeyValueSegment) {
-            walkExpression(((KeyValueSegment) expression).getKey());
-            walkExpression(((KeyValueSegment) expression).getValue());
-        } else if (expression instanceof RowExpression) {
-            ((RowExpression) 
expression).getItems().forEach(this::walkExpression);
-        } else if (expression instanceof UnaryOperationExpression) {
-            walkExpression(((UnaryOperationExpression) 
expression).getExpression());
-        } else if (expression instanceof ValuesExpression) {
-            ((ValuesExpression) 
expression).getRowConstructorList().forEach(each -> 
each.getValues().forEach(this::walkExpression));
-        } else if (expression instanceof MatchAgainstExpression) {
-            walkMatchAgainst((MatchAgainstExpression) expression);
-        } else if (expression instanceof MultisetExpression) {
-            walkExpression(((MultisetExpression) expression).getLeft());
-            walkExpression(((MultisetExpression) expression).getRight());
-        } else if (expression instanceof OuterJoinExpression) {
-            walkExpression(((OuterJoinExpression) expression).getColumnName());
-        } else if (expression instanceof SubquerySegment) {
-            walk(((SubquerySegment) expression).getSelect());
-        } else if (expression instanceof SubqueryExpressionSegment) {
-            walk(((SubqueryExpressionSegment) 
expression).getSubquery().getSelect());
-        } else if (expression instanceof ExistsSubqueryExpression) {
-            walk(((ExistsSubqueryExpression) 
expression).getSubquery().getSelect());
-        } else if (expression instanceof QuantifySubqueryExpression) {
-            walk(((QuantifySubqueryExpression) 
expression).getSubquery().getSelect());
-        } else {
-            walkXMLExpression(expression);
+        switch (expression) {
+            case FunctionSegment function -> walkFunction(function);
+            case CommonExpressionSegment common -> 
common.getChildren().forEach(this::walkExpression);
+            case AggregationProjectionSegment aggregation -> {
+                aggregation.getParameters().forEach(this::walkExpression);
+                aggregation.getWindow().ifPresent(this::walkWindow);
+            }
+            case BinaryOperationExpression binary -> {
+                walkExpression(binary.getLeft());
+                walkExpression(binary.getRight());
+            }
+            case ColumnAssignmentSegment assignment -> 
walkExpression(assignment.getValue());
+            case ListExpression list -> 
list.getItems().forEach(this::walkExpression);
+            case BetweenExpression between -> {
+                walkExpression(between.getLeft());
+                walkExpression(between.getBetweenExpr());
+                walkExpression(between.getAndExpr());
+            }
+            case InExpression in -> {
+                walkExpression(in.getLeft());
+                walkExpression(in.getRight());
+            }
+            case CaseWhenExpression caseWhen -> walkCaseWhen(caseWhen);
+            case NotExpression not -> walkExpression(not.getExpression());
+            case TypeCastExpression typeCast -> 
walkExpression(typeCast.getExpression());
+            case CollateExpression collate -> 
collate.getExpr().ifPresent(this::walkExpression);
+            case DatetimeExpression datetime -> {
+                walkExpression(datetime.getLeft());
+                walkExpression(datetime.getRight());
+            }
+            case IntervalExpression interval -> 
walkExpression(interval.getValue());
+            case IntervalExpressionProjection intervalProjection -> 
walkIntervalProjection(intervalProjection);
+            case KeyValueSegment keyValue -> {
+                walkExpression(keyValue.getKey());
+                walkExpression(keyValue.getValue());
+            }
+            case RowExpression row -> 
row.getItems().forEach(this::walkExpression);
+            case UnaryOperationExpression unary -> 
walkExpression(unary.getExpression());
+            case ValuesExpression values -> 
values.getRowConstructorList().forEach(each -> 
each.getValues().forEach(this::walkExpression));
+            case MatchAgainstExpression match -> walkMatchAgainst(match);
+            case MultisetExpression multiset -> {
+                walkExpression(multiset.getLeft());
+                walkExpression(multiset.getRight());
+            }
+            case OuterJoinExpression outerJoin -> 
walkExpression(outerJoin.getColumnName());
+            case SubquerySegment subquery -> walk(subquery.getSelect());
+            case SubqueryExpressionSegment subqueryExpression -> 
walk(subqueryExpression.getSubquery().getSelect());
+            case ExistsSubqueryExpression exists -> 
walk(exists.getSubquery().getSelect());
+            case QuantifySubqueryExpression quantify -> 
walk(quantify.getSubquery().getSelect());
+            default -> walkXMLExpression(expression);
         }
     }
     
@@ -430,23 +415,22 @@ final class SQLStatementTreeWalker {
     }
     
     private void walkXMLExpression(final ExpressionSegment expression) {
-        if (expression instanceof XmlElementFunctionSegment) {
-            XmlElementFunctionSegment xmlElement = (XmlElementFunctionSegment) 
expression;
+        if (expression instanceof XmlElementFunctionSegment xmlElement) {
             xmlElement.getXmlAttributes().forEach(this::walkExpression);
             xmlElement.getParameters().forEach(this::walkExpression);
-        } else if (expression instanceof XmlPiFunctionSegment) {
-            walkExpression(((XmlPiFunctionSegment) 
expression).getEvalNameValueExpr());
-            walkExpression(((XmlPiFunctionSegment) expression).getValueExpr());
-        } else if (expression instanceof XmlQueryAndExistsFunctionSegment) {
-            ((XmlQueryAndExistsFunctionSegment) 
expression).getParameters().forEach(this::walkExpression);
-        } else if (expression instanceof XmlSerializeFunctionSegment) {
-            walkExpression(((XmlSerializeFunctionSegment) 
expression).getParameter());
-        } else if (expression instanceof XmlTableFunctionSegment) {
-            walkXmlTableOptions(((XmlTableFunctionSegment) 
expression).getXmlTableOption());
-        } else if (expression instanceof XmlTableOptionsSegment) {
-            walkXmlTableOptions((XmlTableOptionsSegment) expression);
-        } else if (expression instanceof XmlTableColumnSegment) {
-            walkExpression(((XmlTableColumnSegment) 
expression).getDefaultExpr());
+        } else if (expression instanceof XmlPiFunctionSegment xmlPi) {
+            walkExpression(xmlPi.getEvalNameValueExpr());
+            walkExpression(xmlPi.getValueExpr());
+        } else if (expression instanceof XmlQueryAndExistsFunctionSegment 
xmlQueryAndExists) {
+            xmlQueryAndExists.getParameters().forEach(this::walkExpression);
+        } else if (expression instanceof XmlSerializeFunctionSegment 
xmlSerialize) {
+            walkExpression(xmlSerialize.getParameter());
+        } else if (expression instanceof XmlTableFunctionSegment xmlTable) {
+            walkXmlTableOptions(xmlTable.getXmlTableOption());
+        } else if (expression instanceof XmlTableOptionsSegment 
xmlTableOptions) {
+            walkXmlTableOptions(xmlTableOptions);
+        } else if (expression instanceof XmlTableColumnSegment xmlTableColumn) 
{
+            walkExpression(xmlTableColumn.getDefaultExpr());
         }
     }
     
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/SearchMetadataToolService.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/SearchMetadataToolService.java
index f7ce435605b..41b3e64ff57 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/SearchMetadataToolService.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/tool/handler/metadata/SearchMetadataToolService.java
@@ -27,8 +27,8 @@ import 
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMet
 import 
org.apache.shardingsphere.mcp.support.database.spi.MCPFeatureQueryFacade;
 import 
org.apache.shardingsphere.mcp.support.database.spi.MCPMetadataQueryFacade;
 
+import java.util.EnumSet;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -60,10 +60,10 @@ public final class SearchMetadataToolService {
      */
     public MetadataSearchResult execute(final MetadataSearchRequest request) {
         ShardingSpherePreconditions.checkState(request.getSchema().isEmpty() 
|| !request.getDatabase().isEmpty(), () -> new 
MCPInvalidRequestException("Schema cannot be provided without database."));
-        Set<SupportedMCPMetadataObjectType> searchObjectTypes = 
getSearchObjectTypes(request.getObjectTypes());
         if (isBlankAllDatabaseSearch(request)) {
             return executeBlankAllDatabaseSearch(request);
         }
+        Set<SupportedMCPMetadataObjectType> searchObjectTypes = 
getSearchObjectTypes(request.getObjectTypes());
         return createSearchResult(collector.collect(request, 
searchObjectTypes), request, searchObjectTypes, false);
     }
     
@@ -148,14 +148,7 @@ public final class SearchMetadataToolService {
         if (!objectTypes.isEmpty()) {
             return objectTypes;
         }
-        Set<SupportedMCPMetadataObjectType> result = new LinkedHashSet<>();
-        result.add(SupportedMCPMetadataObjectType.DATABASE);
-        result.add(SupportedMCPMetadataObjectType.SCHEMA);
-        result.add(SupportedMCPMetadataObjectType.TABLE);
-        result.add(SupportedMCPMetadataObjectType.VIEW);
-        result.add(SupportedMCPMetadataObjectType.COLUMN);
-        result.add(SupportedMCPMetadataObjectType.INDEX);
-        result.add(SupportedMCPMetadataObjectType.SEQUENCE);
-        return result;
+        return EnumSet.of(SupportedMCPMetadataObjectType.DATABASE, 
SupportedMCPMetadataObjectType.SCHEMA, SupportedMCPMetadataObjectType.TABLE, 
SupportedMCPMetadataObjectType.VIEW,
+                SupportedMCPMetadataObjectType.COLUMN, 
SupportedMCPMetadataObjectType.INDEX, SupportedMCPMetadataObjectType.SEQUENCE);
     }
 }
diff --git 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/workflow/WorkflowExecutionService.java
 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/workflow/WorkflowExecutionService.java
index 1ec9452d187..2299bc38d74 100644
--- 
a/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/workflow/WorkflowExecutionService.java
+++ 
b/mcp/core/src/main/java/org/apache/shardingsphere/mcp/core/workflow/WorkflowExecutionService.java
@@ -91,15 +91,14 @@ public final class WorkflowExecutionService {
         if (!invalidArtifactResponse.isEmpty()) {
             return invalidArtifactResponse;
         }
-        WorkflowApplyOutcome applyOutcome = new WorkflowApplyOutcome();
         if 
(WorkflowLifecycle.EXECUTION_MODE_PREVIEW.equalsIgnoreCase(actualExecutionMode))
 {
             return previewApply(workflowSessionContext, snapshot);
         }
         if (isManualOnly(actualExecutionMode)) {
+            WorkflowApplyOutcome applyOutcome = new WorkflowApplyOutcome();
             return applyManualOnly(workflowSessionContext, snapshot, 
applyOutcome);
         }
-        return applyAutomatically(workflowSessionContext, queryFacade, 
executionFacade, workflowRuntimeHandler, sessionId, snapshot,
-                actualExecutionMode, applyOutcome);
+        return applyAutomatically(workflowSessionContext, queryFacade, 
executionFacade, workflowRuntimeHandler, sessionId, snapshot, 
actualExecutionMode);
     }
     
     private String requireExecutionMode(final WorkflowContextSnapshot 
snapshot, final String executionMode) {
@@ -225,11 +224,9 @@ public final class WorkflowExecutionService {
                 WorkflowLifecycle.EXECUTION_MODE_MANUAL_ONLY, 
createArtifactPayload(snapshot));
     }
     
-    private Map<String, Object> applyAutomatically(final 
WorkflowSessionContext workflowSessionContext, final MCPFeatureQueryFacade 
queryFacade,
-                                                   final 
MCPFeatureExecutionFacade executionFacade,
-                                                   final 
MCPWorkflowRuntimeHandler workflowRuntimeHandler,
-                                                   final String sessionId, 
final WorkflowContextSnapshot snapshot, final String executionMode,
-                                                   final WorkflowApplyOutcome 
applyOutcome) {
+    private Map<String, Object> applyAutomatically(final 
WorkflowSessionContext workflowSessionContext, final MCPFeatureQueryFacade 
queryFacade, final MCPFeatureExecutionFacade executionFacade,
+                                                   final 
MCPWorkflowRuntimeHandler workflowRuntimeHandler, final String sessionId, final 
WorkflowContextSnapshot snapshot, final String executionMode) {
+        WorkflowApplyOutcome applyOutcome = new WorkflowApplyOutcome();
         if 
(WorkflowSecretReferenceUtils.hasSecretReferences(getRequest(snapshot))) {
             return 
failSecretReferenceManualExecutionRequired(workflowSessionContext, snapshot, 
executionMode, applyOutcome);
         }
diff --git 
a/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequest.java
 
b/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequest.java
index 9e993bc45cd..32fe1440d7a 100644
--- 
a/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequest.java
+++ 
b/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequest.java
@@ -52,7 +52,12 @@ public final class BroadcastWorkflowRequest extends 
WorkflowRequest {
             return;
         }
         this.tables.clear();
-        tables.stream().map(each -> null == each ? "" : 
each.trim()).filter(each -> !each.isEmpty()).forEach(this.tables::add);
+        for (String each : tables) {
+            String normalizedValue = null == each ? "" : each.trim();
+            if (!normalizedValue.isEmpty()) {
+                this.tables.add(normalizedValue);
+            }
+        }
     }
     
     /**
@@ -100,8 +105,8 @@ public final class BroadcastWorkflowRequest extends 
WorkflowRequest {
         if (null == previousRequest) {
             return new BroadcastWorkflowRequest();
         }
-        if (previousRequest instanceof BroadcastWorkflowRequest) {
-            return ((BroadcastWorkflowRequest) previousRequest).copy();
+        if (previousRequest instanceof BroadcastWorkflowRequest request) {
+            return request.copy();
         }
         BroadcastWorkflowRequest result = new BroadcastWorkflowRequest();
         copyFieldsTo(previousRequest, result);
diff --git 
a/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastRuleDistSQLPlanningService.java
 
b/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastRuleDistSQLPlanningService.java
index f0a0ce6661d..8a6a79134e2 100644
--- 
a/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastRuleDistSQLPlanningService.java
+++ 
b/mcp/features/broadcast/src/main/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastRuleDistSQLPlanningService.java
@@ -50,7 +50,9 @@ public final class BroadcastRuleDistSQLPlanningService {
     }
     
     private String formatTableNames(final List<String> tableNames) {
-        return tableNames.stream().peek(each -> 
WorkflowSQLUtils.checkSupportedIdentifier("table", each))
-                
.map(WorkflowSQLUtils::formatGeneratedRuleDistSQLIdentifier).collect(Collectors.joining(",
 "));
+        return tableNames.stream().map(each -> {
+            WorkflowSQLUtils.checkSupportedIdentifier("table", each);
+            return WorkflowSQLUtils.formatGeneratedRuleDistSQLIdentifier(each);
+        }).collect(Collectors.joining(", "));
     }
 }
diff --git 
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequestTest.java
 
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequestTest.java
index 29ea836fc67..0261af4aee5 100644
--- 
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequestTest.java
+++ 
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/model/BroadcastWorkflowRequestTest.java
@@ -19,11 +19,18 @@ package 
org.apache.shardingsphere.mcp.feature.broadcast.tool.model;
 
 import org.apache.shardingsphere.mcp.support.workflow.model.WorkflowRequest;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
+import java.util.stream.Stream;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.sameInstance;
 
 class BroadcastWorkflowRequestTest {
     
@@ -35,6 +42,24 @@ class BroadcastWorkflowRequestTest {
         assertThat(request.getTargetTables(), is(List.of("t_order", 
"t_order_item")));
     }
     
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("setTablesArguments")
+    void assertSetTablesFromCollection(final String scenario, final 
Collection<String> values, final Collection<String> expectedValues) {
+        BroadcastWorkflowRequest request = new BroadcastWorkflowRequest();
+        Collection<String> actualValues = request.getTables();
+        actualValues.add("foo_previous");
+        request.setTables(values);
+        assertThat(request.getTables(), sameInstance(actualValues));
+        assertThat(actualValues, is(expectedValues));
+    }
+    
+    private static Stream<Arguments> setTablesArguments() {
+        return Stream.of(
+                Arguments.of("null collection", null, List.of("foo_previous")),
+                Arguments.of("empty collection", List.of(), 
List.of("foo_previous")),
+                Arguments.of("normalized values and duplicates", 
Arrays.asList(null, "", " ", " foo_table ", "bar_value", "foo_table"), 
List.of("foo_table", "bar_value", "foo_table")));
+    }
+    
     @Test
     void assertGetTargetTablesFallsBackToTable() {
         BroadcastWorkflowRequest request = new BroadcastWorkflowRequest();
diff --git 
a/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/model/EncryptWorkflowRequest.java
 
b/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/model/EncryptWorkflowRequest.java
index 38b99b5363c..5fe104f81d0 100644
--- 
a/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/model/EncryptWorkflowRequest.java
+++ 
b/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/model/EncryptWorkflowRequest.java
@@ -84,8 +84,8 @@ public final class EncryptWorkflowRequest extends 
WorkflowRequest {
         if (null == previousRequest) {
             return new EncryptWorkflowRequest();
         }
-        if (previousRequest instanceof EncryptWorkflowRequest) {
-            return ((EncryptWorkflowRequest) previousRequest).copy();
+        if (previousRequest instanceof EncryptWorkflowRequest request) {
+            return request.copy();
         }
         EncryptWorkflowRequest result = new EncryptWorkflowRequest();
         copyFieldsTo(previousRequest, result);
diff --git 
a/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/service/EncryptWorkflowApplyArtifactValidator.java
 
b/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/service/EncryptWorkflowApplyArtifactValidator.java
index be569988465..f3b9eb931eb 100644
--- 
a/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/service/EncryptWorkflowApplyArtifactValidator.java
+++ 
b/mcp/features/encrypt/src/main/java/org/apache/shardingsphere/mcp/feature/encrypt/tool/service/EncryptWorkflowApplyArtifactValidator.java
@@ -66,8 +66,8 @@ public final class EncryptWorkflowApplyArtifactValidator 
implements MCPWorkflowA
         if (actualSQL.contains("encrypt_algorithm") && 
actualSQL.contains("'aes-key-value'") && 
!actualSQL.contains("'digest-algorithm-name'")) {
             
issues.add(validationSupport.createSQLExecutabilityIssue("Generated AES encrypt 
DistSQL is missing `digest-algorithm-name`.", displaySql));
         }
-        if (snapshot.getRequest() instanceof EncryptWorkflowRequest) {
-            addAlgorithmIssues(issues, (EncryptWorkflowRequest) 
snapshot.getRequest(), displaySql);
+        if (snapshot.getRequest() instanceof EncryptWorkflowRequest request) {
+            addAlgorithmIssues(issues, request, displaySql);
         }
     }
     
diff --git 
a/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequest.java
 
b/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequest.java
index b9305158860..dfd26685f0a 100644
--- 
a/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequest.java
+++ 
b/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequest.java
@@ -82,7 +82,12 @@ public final class ReadwriteSplittingRuleWorkflowRequest 
extends WorkflowRequest
             return;
         }
         this.readStorageUnits.clear();
-        readStorageUnits.stream().map(each -> null == each ? "" : 
each.trim()).filter(each -> 
!each.isEmpty()).forEach(this.readStorageUnits::add);
+        for (String each : readStorageUnits) {
+            String normalizedValue = null == each ? "" : each.trim();
+            if (!normalizedValue.isEmpty()) {
+                this.readStorageUnits.add(normalizedValue);
+            }
+        }
     }
     
     /**
@@ -174,8 +179,8 @@ public final class ReadwriteSplittingRuleWorkflowRequest 
extends WorkflowRequest
         if (null == previousRequest) {
             return new ReadwriteSplittingRuleWorkflowRequest();
         }
-        if (previousRequest instanceof ReadwriteSplittingRuleWorkflowRequest) {
-            return ((ReadwriteSplittingRuleWorkflowRequest) 
previousRequest).copy();
+        if (previousRequest instanceof ReadwriteSplittingRuleWorkflowRequest 
request) {
+            return request.copy();
         }
         ReadwriteSplittingRuleWorkflowRequest result = new 
ReadwriteSplittingRuleWorkflowRequest();
         copyFieldsTo(previousRequest, result);
diff --git 
a/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingStatusWorkflowRequest.java
 
b/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingStatusWorkflowRequest.java
index 850334e4e93..0def7971003 100644
--- 
a/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingStatusWorkflowRequest.java
+++ 
b/mcp/features/readwrite-splitting/src/main/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingStatusWorkflowRequest.java
@@ -103,8 +103,8 @@ public final class ReadwriteSplittingStatusWorkflowRequest 
extends WorkflowReque
         if (null == previousRequest) {
             return new ReadwriteSplittingStatusWorkflowRequest();
         }
-        if (previousRequest instanceof 
ReadwriteSplittingStatusWorkflowRequest) {
-            return ((ReadwriteSplittingStatusWorkflowRequest) 
previousRequest).copy();
+        if (previousRequest instanceof ReadwriteSplittingStatusWorkflowRequest 
request) {
+            return request.copy();
         }
         ReadwriteSplittingStatusWorkflowRequest result = new 
ReadwriteSplittingStatusWorkflowRequest();
         copyFieldsTo(previousRequest, result);
diff --git 
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequestTest.java
 
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequestTest.java
index 5d1c97b0214..a6f2848ef59 100644
--- 
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequestTest.java
+++ 
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/model/ReadwriteSplittingRuleWorkflowRequestTest.java
@@ -19,12 +19,19 @@ package 
org.apache.shardingsphere.mcp.feature.readwritesplitting.tool.model;
 
 import org.apache.shardingsphere.mcp.support.workflow.model.WorkflowRequest;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Stream;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.sameInstance;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
 class ReadwriteSplittingRuleWorkflowRequestTest {
@@ -36,6 +43,24 @@ class ReadwriteSplittingRuleWorkflowRequestTest {
         assertThat(actual.getReadStorageUnits(), is(List.of("read_ds_0", 
"read_ds_1")));
     }
     
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("setReadStorageUnitsArguments")
+    void assertSetReadStorageUnitsFromCollection(final String scenario, final 
Collection<String> values, final Collection<String> expectedValues) {
+        ReadwriteSplittingRuleWorkflowRequest request = new 
ReadwriteSplittingRuleWorkflowRequest();
+        Collection<String> actualValues = request.getReadStorageUnits();
+        actualValues.add("foo_previous");
+        request.setReadStorageUnits(values);
+        assertThat(request.getReadStorageUnits(), sameInstance(actualValues));
+        assertThat(actualValues, is(expectedValues));
+    }
+    
+    private static Stream<Arguments> setReadStorageUnitsArguments() {
+        return Stream.of(
+                Arguments.of("null collection", null, List.of("foo_previous")),
+                Arguments.of("empty collection", List.of(), 
List.of("foo_previous")),
+                Arguments.of("normalized values and duplicates", 
Arrays.asList(null, "", " ", " foo_read ", "bar_value", "foo_read"), 
List.of("foo_read", "bar_value", "foo_read")));
+    }
+    
     @Test
     void assertSetReadStorageUnitsWithNullString() {
         ReadwriteSplittingRuleWorkflowRequest actual = new 
ReadwriteSplittingRuleWorkflowRequest();
diff --git 
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowAlgorithmCleanupWorkflowRequest.java
 
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowAlgorithmCleanupWorkflowRequest.java
index 3d2db5b222c..cf58fd96bc6 100644
--- 
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowAlgorithmCleanupWorkflowRequest.java
+++ 
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowAlgorithmCleanupWorkflowRequest.java
@@ -63,8 +63,8 @@ public final class ShadowAlgorithmCleanupWorkflowRequest 
extends WorkflowRequest
     }
     
     private static ShadowAlgorithmCleanupWorkflowRequest 
copyPreviousRequest(final WorkflowRequest previousRequest) {
-        if (previousRequest instanceof ShadowAlgorithmCleanupWorkflowRequest) {
-            return ((ShadowAlgorithmCleanupWorkflowRequest) 
previousRequest).copy();
+        if (previousRequest instanceof ShadowAlgorithmCleanupWorkflowRequest 
request) {
+            return request.copy();
         }
         ShadowAlgorithmCleanupWorkflowRequest result = new 
ShadowAlgorithmCleanupWorkflowRequest();
         if (null != previousRequest) {
diff --git 
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowDefaultAlgorithmWorkflowRequest.java
 
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowDefaultAlgorithmWorkflowRequest.java
index 127c7ca97ce..2a1010bb71c 100644
--- 
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowDefaultAlgorithmWorkflowRequest.java
+++ 
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowDefaultAlgorithmWorkflowRequest.java
@@ -38,6 +38,7 @@ public final class ShadowDefaultAlgorithmWorkflowRequest 
extends WorkflowRequest
      *
      * @param algorithmType algorithm type
      */
+    @Override
     public void setAlgorithmType(final String algorithmType) {
         this.algorithmType = null == algorithmType ? "" : algorithmType.trim();
     }
@@ -86,8 +87,8 @@ public final class ShadowDefaultAlgorithmWorkflowRequest 
extends WorkflowRequest
     }
     
     private static ShadowDefaultAlgorithmWorkflowRequest 
copyPreviousRequest(final WorkflowRequest previousRequest) {
-        if (previousRequest instanceof ShadowDefaultAlgorithmWorkflowRequest) {
-            return ((ShadowDefaultAlgorithmWorkflowRequest) 
previousRequest).copy();
+        if (previousRequest instanceof ShadowDefaultAlgorithmWorkflowRequest 
request) {
+            return request.copy();
         }
         ShadowDefaultAlgorithmWorkflowRequest result = new 
ShadowDefaultAlgorithmWorkflowRequest();
         if (null != previousRequest) {
diff --git 
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowRuleWorkflowRequest.java
 
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowRuleWorkflowRequest.java
index a93be9c62af..1660e277816 100644
--- 
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowRuleWorkflowRequest.java
+++ 
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/model/ShadowRuleWorkflowRequest.java
@@ -83,6 +83,7 @@ public final class ShadowRuleWorkflowRequest extends 
WorkflowRequest {
      *
      * @param algorithmType algorithm type
      */
+    @Override
     public void setAlgorithmType(final String algorithmType) {
         this.algorithmType = null == algorithmType ? "" : algorithmType.trim();
     }
@@ -151,8 +152,8 @@ public final class ShadowRuleWorkflowRequest extends 
WorkflowRequest {
     }
     
     private static ShadowRuleWorkflowRequest copyPreviousRequest(final 
WorkflowRequest previousRequest) {
-        if (previousRequest instanceof ShadowRuleWorkflowRequest) {
-            return ((ShadowRuleWorkflowRequest) previousRequest).copy();
+        if (previousRequest instanceof ShadowRuleWorkflowRequest request) {
+            return request.copy();
         }
         ShadowRuleWorkflowRequest result = new ShadowRuleWorkflowRequest();
         if (null != previousRequest) {
diff --git 
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/service/ShadowWorkflowValidationService.java
 
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/service/ShadowWorkflowValidationService.java
index 0b8c34792b9..c1378d83165 100644
--- 
a/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/service/ShadowWorkflowValidationService.java
+++ 
b/mcp/features/shadow/src/main/java/org/apache/shardingsphere/mcp/feature/shadow/tool/service/ShadowWorkflowValidationService.java
@@ -73,12 +73,10 @@ public final class ShadowWorkflowValidationService 
implements MCPWorkflowRuntime
         if (!isCreateOrAlterShadowDistSQL(sql)) {
             return;
         }
-        if (snapshot.getRequest() instanceof ShadowRuleWorkflowRequest) {
-            ShadowRuleWorkflowRequest request = (ShadowRuleWorkflowRequest) 
snapshot.getRequest();
+        if (snapshot.getRequest() instanceof ShadowRuleWorkflowRequest 
request) {
             addShadowAlgorithmIssue(issues, request.getAlgorithmType(), 
request.getAlgorithmProperties(), displaySql);
         }
-        if (snapshot.getRequest() instanceof 
ShadowDefaultAlgorithmWorkflowRequest) {
-            ShadowDefaultAlgorithmWorkflowRequest request = 
(ShadowDefaultAlgorithmWorkflowRequest) snapshot.getRequest();
+        if (snapshot.getRequest() instanceof 
ShadowDefaultAlgorithmWorkflowRequest request) {
             addShadowAlgorithmIssue(issues, request.getAlgorithmType(), 
request.getAlgorithmProperties(), displaySql);
         }
     }
diff --git 
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/model/ShardingWorkflowRequest.java
 
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/model/ShardingWorkflowRequest.java
index b4c40c95db7..19505b78cdc 100644
--- 
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/model/ShardingWorkflowRequest.java
+++ 
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/model/ShardingWorkflowRequest.java
@@ -79,7 +79,7 @@ public final class ShardingWorkflowRequest extends 
WorkflowRequest {
     }
     
     private static ShardingWorkflowRequest copyPreviousRequest(final 
WorkflowRequest previous) {
-        return previous instanceof ShardingWorkflowRequest ? 
((ShardingWorkflowRequest) previous).copy() : copyFieldsTo(previous, new 
ShardingWorkflowRequest());
+        return previous instanceof ShardingWorkflowRequest request ? 
request.copy() : copyFieldsTo(previous, new ShardingWorkflowRequest());
     }
     
     @Override
diff --git 
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowPlanningService.java
 
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowPlanningService.java
index 9879ee07b65..8709c2d77f7 100644
--- 
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowPlanningService.java
+++ 
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowPlanningService.java
@@ -207,10 +207,10 @@ public final class ShardingWorkflowPlanningService {
     private WorkflowContextSnapshot planLifecycleWorkflow(final 
WorkflowSessionContext workflowSessionContext, final ShardingWorkflowRequest 
request,
                                                           final 
ShardingWorkflowLifecycleSpec spec) {
         WorkflowContextSnapshot result = 
prepareSnapshot(workflowSessionContext, request, spec.workflowKind(), 
spec.defaultOperationType(), spec.summary());
-        ShardingWorkflowRequest mergedRequest = (ShardingWorkflowRequest) 
result.getRequest();
         if 
(!planningSupport.ensureSupportedOperationType(result.getClarifiedIntent(), 
SUPPORTED_LIFECYCLE_OPERATION_TYPES, result)) {
             return 
planningSupport.persistPlanningInterruption(workflowSessionContext, result);
         }
+        ShardingWorkflowRequest mergedRequest = (ShardingWorkflowRequest) 
result.getRequest();
         if (!inputValidator.ensureDatabase(mergedRequest, result)) {
             return workflowSessionContext.persist(result, 
WorkflowLifecycle.STEP_CLARIFYING, result.getStatus());
         }
diff --git 
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationService.java
 
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationService.java
index 89aeb59f738..b05eeb02051 100644
--- 
a/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationService.java
+++ 
b/mcp/features/sharding/src/main/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationService.java
@@ -64,23 +64,19 @@ public final class ShardingWorkflowValidationService 
implements MCPWorkflowRunti
         queryFacade.checkDatabaseCapability(request.getDatabase());
         if 
(ShardingFeatureDefinition.TABLE_RULE_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
 {
             List<Map<String, Object>> rows = 
inspectionService.queryTableRule(queryFacade, request.getDatabase(), 
request.getTable());
-            return validateNamedState(snapshot, validationReport, rows, 
queryFacade, request.getDatabase(), "table", request.getTable(),
-                    matchesTableRule(rows, queryFacade, request));
+            return validateNamedState(snapshot, validationReport, rows, 
queryFacade, "table", request.getTable(), matchesTableRule(rows, queryFacade, 
request));
         }
         if 
(ShardingFeatureDefinition.TABLE_REFERENCE_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
 {
             List<Map<String, Object>> rows = 
inspectionService.queryTableReferenceRule(queryFacade, request.getDatabase(), 
request.getRuleName());
-            return validateNamedState(snapshot, validationReport, rows, 
queryFacade, request.getDatabase(), "name", request.getRuleName(),
-                    matchesTableReferenceRule(rows, queryFacade, request));
+            return validateNamedState(snapshot, validationReport, rows, 
queryFacade, "name", request.getRuleName(), matchesTableReferenceRule(rows, 
queryFacade, request));
         }
         if 
(ShardingFeatureDefinition.KEY_GENERATOR_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
 {
             List<Map<String, Object>> rows = 
inspectionService.queryKeyGenerator(queryFacade, request.getDatabase(), 
request.getKeyGeneratorName());
-            return validateNamedState(snapshot, validationReport, rows, 
queryFacade, request.getDatabase(), "name", request.getKeyGeneratorName(),
-                    matchesKeyGenerator(rows, queryFacade, request));
+            return validateNamedState(snapshot, validationReport, rows, 
queryFacade, "name", request.getKeyGeneratorName(), matchesKeyGenerator(rows, 
queryFacade, request));
         }
         if 
(ShardingFeatureDefinition.KEY_GENERATE_STRATEGY_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
 {
             List<Map<String, Object>> rows = 
inspectionService.queryKeyGenerateStrategy(queryFacade, request.getDatabase(), 
request.getKeyGenerateStrategyName());
-            return validateNamedState(snapshot, validationReport, rows, 
queryFacade, request.getDatabase(), "name", 
request.getKeyGenerateStrategyName(),
-                    matchesKeyGenerateStrategy(rows, queryFacade, request));
+            return validateNamedState(snapshot, validationReport, rows, 
queryFacade, "name", request.getKeyGenerateStrategyName(), 
matchesKeyGenerateStrategy(rows, queryFacade, request));
         }
         if 
(ShardingFeatureDefinition.DEFAULT_STRATEGY_WORKFLOW_KIND.equals(snapshot.getWorkflowKind()))
 {
             return validateDefaultStrategy(snapshot, validationReport, 
inspectionService.queryDefaultStrategy(queryFacade, request.getDatabase()), 
queryFacade, request);
@@ -88,10 +84,9 @@ public final class ShardingWorkflowValidationService 
implements MCPWorkflowRunti
         return validateCleanup(validationReport, queryFacade, request);
     }
     
-    private ValidationSection validateNamedState(final WorkflowContextSnapshot 
snapshot, final ValidationReport validationReport,
-                                                 final List<Map<String, 
Object>> rows, final MCPFeatureQueryFacade queryFacade, final String 
databaseName,
-                                                 final String fieldName, final 
String expected, final boolean shapeMatches) {
-        boolean ruleExists = containsNamedRow(rows, queryFacade, databaseName, 
fieldName, expected);
+    private ValidationSection validateNamedState(final WorkflowContextSnapshot 
snapshot, final ValidationReport validationReport, final List<Map<String, 
Object>> rows,
+                                                 final MCPFeatureQueryFacade 
queryFacade, final String fieldName, final String expected, final boolean 
shapeMatches) {
+        boolean ruleExists = containsNamedRow(rows, queryFacade, 
snapshot.getRequest().getDatabase(), fieldName, expected);
         boolean dropWorkflow = WorkflowLifecycleUtils.isDropWorkflow(snapshot);
         boolean expectedRuleExists = !dropWorkflow;
         if (expectedRuleExists != ruleExists) {
diff --git 
a/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
 
b/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
index f23dda1317b..c24b6137ee6 100644
--- 
a/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
+++ 
b/mcp/registry/src/main/java/org/apache/shardingsphere/mcp/registry/MCPRegistryMetadataCommand.java
@@ -220,8 +220,7 @@ public final class MCPRegistryMetadataCommand {
     
     private static void validateString(final Map<String, Object> target, final 
String key, final int maxLength) {
         Object value = target.get(key);
-        ShardingSpherePreconditions.checkState(value instanceof String && 
!((String) value).isBlank(),
-                () -> new IllegalArgumentException("server.json field " + key 
+ " must be a non-empty string."));
+        ShardingSpherePreconditions.checkState(value instanceof String string 
&& !string.isBlank(), () -> new IllegalArgumentException("server.json field " + 
key + " must be a non-empty string."));
         ShardingSpherePreconditions.checkState(((String) value).length() <= 
maxLength,
                 () -> new IllegalArgumentException("server.json field " + key 
+ " must be at most " + maxLength + " characters."));
     }
@@ -237,8 +236,7 @@ public final class MCPRegistryMetadataCommand {
     }
     
     private static void validateHttpUrl(final Object value) {
-        ShardingSpherePreconditions.checkState(value instanceof String && 
!((String) value).isBlank(),
-                () -> new IllegalArgumentException("streamable-http transport 
must define a URL."));
+        ShardingSpherePreconditions.checkState(value instanceof String string 
&& !string.isBlank(), () -> new IllegalArgumentException("streamable-http 
transport must define a URL."));
         try {
             URI uri = new URI((String) value);
             
ShardingSpherePreconditions.checkState(("http".equals(uri.getScheme()) || 
"https".equals(uri.getScheme())) && null != uri.getHost(),
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
index b681f30d496..c0cfe077a3d 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/capability/MCPDatabaseCapability.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierCon
 import 
org.apache.shardingsphere.mcp.support.database.metadata.TransactionCapability;
 import 
org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseProfile;
 
-import java.util.LinkedHashSet;
+import java.util.EnumSet;
 import java.util.Set;
 
 /**
@@ -65,12 +65,8 @@ public final class MCPDatabaseCapability {
     }
     
     private Set<SupportedMCPMetadataObjectType> 
createSupportedMetadataObjectTypes(final MCPDatabaseCapabilityOption option) {
-        Set<SupportedMCPMetadataObjectType> result = new LinkedHashSet<>(16, 
1F);
-        result.add(SupportedMCPMetadataObjectType.SCHEMA);
-        result.add(SupportedMCPMetadataObjectType.TABLE);
-        result.add(SupportedMCPMetadataObjectType.VIEW);
-        result.add(SupportedMCPMetadataObjectType.COLUMN);
-        result.add(SupportedMCPMetadataObjectType.INDEX);
+        Set<SupportedMCPMetadataObjectType> result = 
EnumSet.of(SupportedMCPMetadataObjectType.SCHEMA, 
SupportedMCPMetadataObjectType.TABLE, SupportedMCPMetadataObjectType.VIEW,
+                SupportedMCPMetadataObjectType.COLUMN, 
SupportedMCPMetadataObjectType.INDEX);
         if (option.getSequenceQuery().isPresent()) {
             result.add(SupportedMCPMetadataObjectType.SEQUENCE);
         }
@@ -78,11 +74,7 @@ public final class MCPDatabaseCapability {
     }
     
     private Set<SupportedMCPStatement> createSupportedStatementClasses(final 
TransactionCapability transactionCapability, final boolean explainSupported) {
-        Set<SupportedMCPStatement> result = new LinkedHashSet<>(16, 1F);
-        result.add(SupportedMCPStatement.QUERY);
-        result.add(SupportedMCPStatement.DML);
-        result.add(SupportedMCPStatement.DDL);
-        result.add(SupportedMCPStatement.DCL);
+        Set<SupportedMCPStatement> result = 
EnumSet.of(SupportedMCPStatement.QUERY, SupportedMCPStatement.DML, 
SupportedMCPStatement.DDL, SupportedMCPStatement.DCL);
         if (TransactionCapability.NONE != transactionCapability) {
             result.add(SupportedMCPStatement.TRANSACTION_CONTROL);
         }
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/MCPJDBCExceptionClassifier.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/MCPJDBCExceptionClassifier.java
index 2da618aa287..045d878250f 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/MCPJDBCExceptionClassifier.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/MCPJDBCExceptionClassifier.java
@@ -75,21 +75,23 @@ public final class MCPJDBCExceptionClassifier {
             if (!visited.add(current)) {
                 continue;
             }
-            if (current instanceof MCPDatabaseQueryFailedException) {
-                return ((MCPDatabaseQueryFailedException) 
current).getCategory();
-            }
-            if (current instanceof MCPDatabaseSQLSyntaxException) {
-                return MCPJDBCErrorCategory.SYNTAX;
-            }
-            if (current instanceof SQLException) {
-                Optional<MCPJDBCErrorCategory> category = 
classifySQLException(dialectClassifier, (SQLException) current);
-                if (category.isPresent() && MCPJDBCErrorCategory.QUERY_FAILED 
!= category.get()) {
-                    return category.get();
-                }
-                if (category.isEmpty() && current instanceof 
SQLSyntaxErrorException) {
-                    candidate = MCPJDBCErrorCategory.SYNTAX;
-                }
-                addIfPresent(pending, ((SQLException) 
current).getNextException());
+            switch (current) {
+                case MCPDatabaseQueryFailedException ex:
+                    return ex.getCategory();
+                case MCPDatabaseSQLSyntaxException ignored:
+                    return MCPJDBCErrorCategory.SYNTAX;
+                case SQLException ex:
+                    Optional<MCPJDBCErrorCategory> category = 
classifySQLException(dialectClassifier, ex);
+                    if (category.isPresent() && 
MCPJDBCErrorCategory.QUERY_FAILED != category.get()) {
+                        return category.get();
+                    }
+                    if (category.isEmpty() && current instanceof 
SQLSyntaxErrorException) {
+                        candidate = MCPJDBCErrorCategory.SYNTAX;
+                    }
+                    addIfPresent(pending, ex.getNextException());
+                    break;
+                default:
+                    break;
             }
             addIfPresent(pending, current.getCause());
         }
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/FirebirdMCPDialectSQLExceptionClassifier.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/FirebirdMCPDialectSQLExceptionClassifier.java
index b38b12b9404..d0047978a7b 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/FirebirdMCPDialectSQLExceptionClassifier.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/FirebirdMCPDialectSQLExceptionClassifier.java
@@ -47,12 +47,9 @@ public final class FirebirdMCPDialectSQLExceptionClassifier 
implements MCPDialec
         switch (cause.getErrorCode()) {
             case NO_PERMISSION:
                 return Optional.of(MCPJDBCErrorCategory.AUTHORIZATION);
-            case LOGIN:
-            case LOGIN_ERROR:
+            case LOGIN, LOGIN_ERROR:
                 return Optional.of(MCPJDBCErrorCategory.AUTHENTICATION);
-            case COLUMN_UNKNOWN:
-            case TABLE_UNKNOWN:
-            case PROCEDURE_UNKNOWN:
+            case COLUMN_UNKNOWN, TABLE_UNKNOWN, PROCEDURE_UNKNOWN:
                 return Optional.of(MCPJDBCErrorCategory.OBJECT_NOT_VISIBLE);
             case TOKEN_UNKNOWN:
                 return Optional.of(MCPJDBCErrorCategory.SYNTAX);
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/MySQLMCPDialectSQLExceptionClassifier.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/MySQLMCPDialectSQLExceptionClassifier.java
index 3324f229da4..f129c1080e9 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/MySQLMCPDialectSQLExceptionClassifier.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/exception/dialect/MySQLMCPDialectSQLExceptionClassifier.java
@@ -54,17 +54,11 @@ public final class MySQLMCPDialectSQLExceptionClassifier 
implements MCPDialectSQ
             return Optional.empty();
         }
         switch (cause.getErrorCode()) {
-            case ER_DBACCESS_DENIED_ERROR:
-            case ER_TABLEACCESS_DENIED_ERROR:
-            case ER_COLUMNACCESS_DENIED_ERROR:
-            case ER_SPECIFIC_ACCESS_DENIED_ERROR:
-            case ER_PROCACCESS_DENIED_ERROR:
+            case ER_DBACCESS_DENIED_ERROR, ER_TABLEACCESS_DENIED_ERROR, 
ER_COLUMNACCESS_DENIED_ERROR, ER_SPECIFIC_ACCESS_DENIED_ERROR, 
ER_PROCACCESS_DENIED_ERROR:
                 return Optional.of(MCPJDBCErrorCategory.AUTHORIZATION);
-            case ER_BAD_DB_ERROR:
-            case ER_SP_DOES_NOT_EXIST:
+            case ER_BAD_DB_ERROR, ER_SP_DOES_NOT_EXIST:
                 return Optional.of(MCPJDBCErrorCategory.OBJECT_NOT_VISIBLE);
-            case ER_PARSE_ERROR:
-            case ER_SYNTAX_ERROR:
+            case ER_PARSE_ERROR, ER_SYNTAX_ERROR:
                 return Optional.of(MCPJDBCErrorCategory.SYNTAX);
             default:
                 return Optional.of(MCPJDBCErrorCategory.QUERY_FAILED);
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/MCPToolInputSchemaValidator.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/MCPToolInputSchemaValidator.java
index de2b6712d5a..0927c3067cf 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/MCPToolInputSchemaValidator.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/MCPToolInputSchemaValidator.java
@@ -228,6 +228,6 @@ public final class MCPToolInputSchemaValidator {
     }
     
     private static BigInteger toBigInteger(final Object value) {
-        return value instanceof BigInteger ? (BigInteger) value : 
BigInteger.valueOf(((Number) value).longValue());
+        return value instanceof BigInteger bigInteger ? bigInteger : 
BigInteger.valueOf(((Number) value).longValue());
     }
 }
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/yaml/validator/UniqueMCPPromptArgumentNamesValidator.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/yaml/validator/UniqueMCPPromptArgumentNamesValidator.java
index b53bc93a28f..a4c042dbccf 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/yaml/validator/UniqueMCPPromptArgumentNamesValidator.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/descriptor/yaml/validator/UniqueMCPPromptArgumentNamesValidator.java
@@ -36,7 +36,7 @@ public final class UniqueMCPPromptArgumentNamesValidator 
implements ConstraintVa
             return true;
         }
         Set<String> names = new HashSet<>(value.size(), 1F);
-        return value.stream().map(each -> (YamlMCPPromptArgumentDescriptor) 
each)
+        return value.stream().map(YamlMCPPromptArgumentDescriptor.class::cast)
                 .noneMatch(argument -> null != argument && null != 
argument.getName() && !argument.getName().isBlank() && 
!names.add(argument.getName()));
     }
 }
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/protocol/payload/MCPItemsPayload.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/protocol/payload/MCPItemsPayload.java
index 799676f49f5..437eed40162 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/protocol/payload/MCPItemsPayload.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/protocol/payload/MCPItemsPayload.java
@@ -82,8 +82,8 @@ public final class MCPItemsPayload implements 
MCPSuccessPayload {
     
     private String resolveContinuationMode() {
         Object value = navigation.get(CONTINUATION_MODE);
-        if (value instanceof String && !((String) value).isEmpty()) {
-            return value.toString();
+        if (value instanceof String continuationMode && 
!continuationMode.isEmpty()) {
+            return continuationMode;
         }
         return null == nextPageToken || nextPageToken.isEmpty() ? 
CONTINUATION_MODE_NONE : CONTINUATION_MODE_PAGINATION;
     }
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/resource/MCPUriPathSegmentUtils.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/resource/MCPUriPathSegmentUtils.java
index 70ed6356447..5247cab9c4e 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/resource/MCPUriPathSegmentUtils.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/resource/MCPUriPathSegmentUtils.java
@@ -52,20 +52,21 @@ public final class MCPUriPathSegmentUtils {
      */
     public static Optional<String> decodePathSegment(final String pathSegment) 
{
         StringBuilder result = new StringBuilder(pathSegment.length());
-        for (int i = 0; i < pathSegment.length();) {
-            if ('%' != pathSegment.charAt(i)) {
-                result.append(pathSegment.charAt(i));
-                i++;
+        int index = 0;
+        while (index < pathSegment.length()) {
+            if ('%' != pathSegment.charAt(index)) {
+                result.append(pathSegment.charAt(index));
+                index++;
                 continue;
             }
             ByteArrayOutputStream encodedBytes = new ByteArrayOutputStream();
-            while (i < pathSegment.length() && '%' == pathSegment.charAt(i)) {
-                Optional<Integer> decodedByte = 
decodePercentEncodedByte(pathSegment, i);
+            while (index < pathSegment.length() && '%' == 
pathSegment.charAt(index)) {
+                Optional<Integer> decodedByte = 
decodePercentEncodedByte(pathSegment, index);
                 if (decodedByte.isEmpty()) {
                     return Optional.empty();
                 }
                 encodedBytes.write(decodedByte.get());
-                i += 3;
+                index += 3;
             }
             Optional<String> decodedText = 
decodeUtf8(encodedBytes.toByteArray());
             if (decodedText.isEmpty()) {
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/model/SecretReferenceValue.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/model/SecretReferenceValue.java
index 5aea0b2751f..7e2d5054f57 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/model/SecretReferenceValue.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/model/SecretReferenceValue.java
@@ -24,6 +24,7 @@ import lombok.RequiredArgsConstructor;
 import java.util.LinkedHashMap;
 import java.util.Locale;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 /**
  * Secret reference value.
@@ -34,6 +35,8 @@ public final class SecretReferenceValue {
     
     private static final String PLACEHOLDER_PREFIX = "secret_reference:";
     
+    private static final Pattern MANUAL_PLACEHOLDER_SEPARATOR_PATTERN = 
Pattern.compile("[^A-Z0-9]+");
+    
     private final boolean malformed;
     
     /**
@@ -109,7 +112,7 @@ public final class SecretReferenceValue {
     }
     
     private static String normalizeForManualPlaceholder(final String value) {
-        String result = 
normalize(value).toUpperCase(Locale.ENGLISH).replaceAll("[^A-Z0-9]+", "_");
+        String result = 
MANUAL_PLACEHOLDER_SEPARATOR_PATTERN.matcher(normalize(value).toUpperCase(Locale.ENGLISH)).replaceAll("_");
         return result.isEmpty() ? "VALUE" : result;
     }
 }
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowAlgorithmUtils.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowAlgorithmUtils.java
index e9b79bb1b31..c9fe5f59157 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowAlgorithmUtils.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowAlgorithmUtils.java
@@ -110,8 +110,8 @@ public final class WorkflowAlgorithmUtils {
         if (null == value) {
             return Map.of();
         }
-        if (value instanceof Properties) {
-            return createPropertyMap((Properties) value);
+        if (value instanceof Properties props) {
+            return createPropertyMap(props);
         }
         if (value instanceof Map) {
             return createPropertyMap((Map<?, ?>) value);
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowPlanningArguments.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowPlanningArguments.java
index 59bca545b75..63a99e5e794 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowPlanningArguments.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowPlanningArguments.java
@@ -54,7 +54,7 @@ public final class WorkflowPlanningArguments {
      */
     public Boolean getBooleanArgument(final String name) {
         Object result = arguments.get(name);
-        return result instanceof Boolean ? (Boolean) result : null;
+        return result instanceof Boolean booleanValue ? booleanValue : null;
     }
     
     /**
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSQLUtils.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSQLUtils.java
index d2316b3d947..16cfd5a079e 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSQLUtils.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSQLUtils.java
@@ -31,6 +31,7 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -39,7 +40,7 @@ import java.util.stream.Collectors;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class WorkflowSQLUtils {
     
-    private static final String UNQUOTED_IDENTIFIER_PATTERN = 
"[A-Za-z_][A-Za-z0-9_$]*";
+    private static final Pattern UNQUOTED_IDENTIFIER_PATTERN = 
Pattern.compile("[A-Za-z_][A-Za-z0-9_$]*");
     
     private static final Set<String> DIST_SQL_RESERVED_IDENTIFIERS = Set.of(
             "address_random_replace", "aes", "algorithm", "alter", "and", 
"assisted_query", "assisted_query_algorithm", "assisted_query_column", "by", 
"cipher", "column", "columns", "count",
@@ -205,11 +206,11 @@ public final class WorkflowSQLUtils {
     }
     
     private static boolean isSpecialDistSQLIdentifier(final String identifier) 
{
-        return !identifier.matches(UNQUOTED_IDENTIFIER_PATTERN) || 
DIST_SQL_RESERVED_IDENTIFIERS.contains(identifier.toLowerCase(Locale.ENGLISH));
+        return !UNQUOTED_IDENTIFIER_PATTERN.matcher(identifier).matches() || 
DIST_SQL_RESERVED_IDENTIFIERS.contains(identifier.toLowerCase(Locale.ENGLISH));
     }
     
     private static boolean isSpecialSQLIdentifier(final String identifier) {
-        return !identifier.matches(UNQUOTED_IDENTIFIER_PATTERN);
+        return !UNQUOTED_IDENTIFIER_PATTERN.matcher(identifier).matches();
     }
     
     private static QuoteCharacter getQuoteCharacter(final String identifier) {
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSecretReferenceUtils.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSecretReferenceUtils.java
index 9b0b12a0c5e..f57a0f7b696 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSecretReferenceUtils.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/service/WorkflowSecretReferenceUtils.java
@@ -181,8 +181,6 @@ public final class WorkflowSecretReferenceUtils {
     
     private static SecretReferenceValue createSecretReferenceValue(final 
Map<?, ?> value) {
         Object secretRef = value.get(SECRET_REF);
-        return secretRef instanceof String && !((String) 
secretRef).trim().isEmpty()
-                ? SecretReferenceValue.create()
-                : SecretReferenceValue.malformed();
+        return secretRef instanceof String stringValue && 
!stringValue.trim().isEmpty() ? SecretReferenceValue.create() : 
SecretReferenceValue.malformed();
     }
 }
diff --git 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/spi/WorkflowRuntimeDefinition.java
 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/spi/WorkflowRuntimeDefinition.java
index 2e41627c676..5ae8036b891 100644
--- 
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/spi/WorkflowRuntimeDefinition.java
+++ 
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/workflow/spi/WorkflowRuntimeDefinition.java
@@ -58,6 +58,6 @@ public final class WorkflowRuntimeDefinition {
     }
     
     private static MCPWorkflowApplyArtifactValidator 
createApplyArtifactValidator(final MCPWorkflowRuntimeHandler runtimeHandler) {
-        return runtimeHandler instanceof MCPWorkflowApplyArtifactValidator ? 
(MCPWorkflowApplyArtifactValidator) runtimeHandler : 
MCPWorkflowApplyArtifactValidator.NO_OP;
+        return runtimeHandler instanceof MCPWorkflowApplyArtifactValidator 
validator ? validator : MCPWorkflowApplyArtifactValidator.NO_OP;
     }
 }

Reply via email to