This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new fbb1c3b1bb5 Support parse the port in IPv6 jdbcUrl (#35289) (#35524)
fbb1c3b1bb5 is described below

commit fbb1c3b1bb57d28560d138185b90719ad5fb847d
Author: null <466144...@qq.com>
AuthorDate: Tue Aug 5 07:50:22 2025 +0800

    Support parse the port in IPv6 jdbcUrl (#35289) (#35524)
---
 .../core/connector/url/StandardJdbcUrlParser.java  | 32 ++++++++++++++--------
 .../connector/url/StandardJdbcUrlParserTest.java   |  9 ++++++
 2 files changed, 29 insertions(+), 12 deletions(-)

diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParser.java
 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParser.java
index bc919048aee..7a7bc23cd3d 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParser.java
+++ 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParser.java
@@ -22,6 +22,7 @@ import com.google.common.base.Strings;
 import 
org.apache.shardingsphere.infra.database.core.exception.UnrecognizedDatabaseURLException;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 
+import java.util.Optional;
 import java.util.Properties;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -47,6 +48,16 @@ public final class StandardJdbcUrlParser {
     
     private static final String QUERY_GROUP_KEY = "query";
     
+    private static final String HOST_PORT_PATTERN = 
"((?<hostname>[\\w-.+%]+)|(\\[(?<ipv6hostname>[^]]+)]))\\s*(:\\s*(?<port>\\d+))?";
+    
+    private static final Pattern HOST_PORT_PATTERN_PATTERN = 
Pattern.compile(HOST_PORT_PATTERN);
+    
+    private static final String HOSTNAME_GROUP_KEY = "hostname";
+    
+    private static final String IPV6_HOSTNAME_GROUP_KEY = "ipv6hostname";
+    
+    private static final String PORT_GROUP_KEY = "port";
+    
     /**
      * Parse JDBC URL.
      *
@@ -56,24 +67,21 @@ public final class StandardJdbcUrlParser {
     public JdbcUrl parse(final String jdbcUrl) {
         Matcher matcher = CONNECTION_URL_PATTERN.matcher(jdbcUrl);
         ShardingSpherePreconditions.checkState(matcher.matches(), () -> new 
UnrecognizedDatabaseURLException(jdbcUrl, 
CONNECTION_URL_PATTERN.pattern().replaceAll("%", "%%")));
+        
         String authority = matcher.group(AUTHORITY_GROUP_KEY);
         ShardingSpherePreconditions.checkNotNull(authority, () -> new 
UnrecognizedDatabaseURLException(jdbcUrl, 
CONNECTION_URL_PATTERN.pattern().replaceAll("%", "%%")));
-        return new JdbcUrl(parseHostname(authority), parsePort(authority), 
matcher.group(PATH_GROUP_KEY), 
parseQueryProperties(matcher.group(QUERY_GROUP_KEY)));
+        
+        Matcher hostMatcher = HOST_PORT_PATTERN_PATTERN.matcher(authority);
+        ShardingSpherePreconditions.checkState(hostMatcher.find(), () -> new 
UnrecognizedDatabaseURLException(jdbcUrl, 
CONNECTION_URL_PATTERN.pattern().replaceAll("%", "%%")));
+        return new JdbcUrl(parseHostname(hostMatcher), parsePort(hostMatcher), 
matcher.group(PATH_GROUP_KEY), 
parseQueryProperties(matcher.group(QUERY_GROUP_KEY)));
     }
     
-    private String parseHostname(final String authority) {
-        return authority.contains(":") ? authority.split(":")[0] : authority;
+    private String parseHostname(final Matcher hostMatcher) {
+        return 
Optional.ofNullable(hostMatcher.group(IPV6_HOSTNAME_GROUP_KEY)).orElse(hostMatcher.group(HOSTNAME_GROUP_KEY));
     }
     
-    private int parsePort(final String authority) {
-        if (!authority.contains(":")) {
-            return -1;
-        }
-        String port = authority.split(":")[1];
-        if (port.contains(",")) {
-            port = port.split(",")[0];
-        }
-        return Integer.parseInt(port);
+    private int parsePort(final Matcher hostMatcher) {
+        return 
Optional.ofNullable(hostMatcher.group(PORT_GROUP_KEY)).map(Integer::parseInt).orElse(-1);
     }
     
     /**
diff --git 
a/infra/database/core/src/test/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParserTest.java
 
b/infra/database/core/src/test/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParserTest.java
index 9abd9d02747..b4cedfe61e2 100644
--- 
a/infra/database/core/src/test/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParserTest.java
+++ 
b/infra/database/core/src/test/java/org/apache/shardingsphere/infra/database/core/connector/url/StandardJdbcUrlParserTest.java
@@ -81,4 +81,13 @@ class StandardJdbcUrlParserTest {
     void assertParseIncorrectURL() {
         assertThrows(UnrecognizedDatabaseURLException.class, () -> new 
StandardJdbcUrlParser().parse("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL"));
     }
+    
+    @Test
+    void assertParseMySQLJdbcUrlWithIPV6() {
+        JdbcUrl actual = new 
StandardJdbcUrlParser().parse("jdbc:mysql://[fe80::d114:22b3:a0d9:2b3]:3306/db_test");
+        assertThat(actual.getHostname(), is("fe80::d114:22b3:a0d9:2b3"));
+        assertThat(actual.getPort(), is(3306));
+        assertThat(actual.getDatabase(), is("db_test"));
+        assertTrue(actual.getQueryProperties().isEmpty());
+    }
 }

Reply via email to