From e8e8d43544b31a611b991cb1afa9644e0e9c4d70 Mon Sep 17 00:00:00 2001 From: Felix Mueller Date: Tue, 8 Jul 2025 16:42:14 +0200 Subject: [PATCH 1/2] Default port, multiple endpoints verboten --- .../jdbc/internal/JdbcConfiguration.java | 13 +++++++++- .../jdbc/internal/JdbcConfigurationTest.java | 26 ++++++++++++++----- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/JdbcConfiguration.java b/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/JdbcConfiguration.java index 90f50e0cf..c1aada0bb 100644 --- a/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/JdbcConfiguration.java +++ b/jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/JdbcConfiguration.java @@ -2,6 +2,7 @@ import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; +import com.clickhouse.client.api.http.ClickHouseHttpProto; import com.clickhouse.jdbc.Driver; import com.google.common.collect.ImmutableMap; @@ -128,7 +129,14 @@ private static String createConnectionURL(String url, boolean ssl) throws SQLExc : url; try { URI tmp = URI.create(adjustedURL); - return tmp.toASCIIString(); + String asciiString = tmp.toASCIIString(); + if (tmp.getPort() < 0) { + String port = ssl || adjustedURL.startsWith("https") + ? ":" + ClickHouseHttpProto.DEFAULT_HTTPS_PORT + : ":" + ClickHouseHttpProto.DEFAULT_HTTP_PORT; + asciiString += port; + } + return asciiString; } catch (IllegalArgumentException iae) { throw new SQLException("Failed to parse URL '" + url + "'", iae); } @@ -170,6 +178,9 @@ private Map parseUrl(String url) throws SQLException { throw new SQLException( "Invalid authority part JDBC URL '" + url + "'"); } + if (uri.getAuthority().contains(",")) { + throw new SQLException("Multiple endpoints not supported"); + } properties.put(PARSE_URL_CONN_URL_PROP, uri.getScheme() + "://" + uri.getRawAuthority()); // will be parsed again later if (uri.getPath() != null diff --git a/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java b/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java index eb6cfb26c..48accc4a9 100644 --- a/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java +++ b/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java @@ -1,6 +1,8 @@ package com.clickhouse.jdbc.internal; +import com.clickhouse.client.api.Client; import com.clickhouse.client.api.ClientConfigProperties; + import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -23,15 +25,17 @@ public class JdbcConfigurationTest { new JdbcConfigurationTestData("jdbc:clickhouse://localhost"), new JdbcConfigurationTestData("jdbc:clickhouse:http://localhost"), new JdbcConfigurationTestData("jdbc:clickhouse:https://localhost") - .withExpectedConnectionURL("https://localhost"), + .withExpectedConnectionURL("https://localhost:8443"), + new JdbcConfigurationTestData("jdbc:clickhouse:https://localhost:8123") + .withExpectedConnectionURL("https://localhost:8123"), new JdbcConfigurationTestData("jdbc:clickhouse://localhost") .withAdditionalConnectionParameters( Map.of(JdbcConfiguration.USE_SSL_PROP, "true")) - .withExpectedConnectionURL("https://localhost") + .withExpectedConnectionURL("https://localhost:8443") .withAdditionalExpectedClientProperties( Map.of("ssl", "true")), new JdbcConfigurationTestData("jdbc:clickhouse://[::1]") - .withExpectedConnectionURL("http://[::1]"), + .withExpectedConnectionURL("http://[::1]:8123"), new JdbcConfigurationTestData("jdbc:clickhouse://[::1]:8123") .withExpectedConnectionURL("http://[::1]:8123"), new JdbcConfigurationTestData("jdbc:clickhouse://localhost:8443") @@ -111,14 +115,22 @@ public class JdbcConfigurationTest { )) }; + @SuppressWarnings("deprecation") @Test(dataProvider = "validURLTestData") public void testParseURLValid(String jdbcURL, Properties properties, - String connectionUrl, Map expectedClientProps) + String connectionURL, Map expectedClientProps) throws Exception { JdbcConfiguration configuration = new JdbcConfiguration(jdbcURL, properties); - assertEquals(configuration.getConnectionUrl(), connectionUrl); + assertEquals(configuration.getConnectionUrl(), connectionURL); assertEquals(configuration.clientProperties, expectedClientProps); + Client.Builder bob = new Client.Builder(); + configuration.applyClientProperties(bob); + Client client = bob.build(); + assertEquals(client.getEndpoints().size(), 1); + assertEquals( + client.getEndpoints().iterator().next(), + connectionURL); } @Test(dataProvider = "invalidURLs") @@ -198,6 +210,8 @@ public Object[][] createInvalidConnectionURLs() { { "jdbc:clickhouse://foo.bar?x&y=z" }, { "jdbc:clickhouse://foo.bar?x==&y=z" }, { "jdbc:clickhouse://localhost?☺=value1" }, + { "jdbc:clickhouse://foo,bar" }, + { "jdbc:clickhouse://foo,bar.com:8123" }, }; } @@ -210,7 +224,7 @@ private static final class JdbcConfigurationTestData { Map.of( "user", "default", "password", ""); private static final String DEFAULT_EXPECTED_CONNECTION_URL = - "http://localhost"; + "http://localhost:8123"; private final String url; private final Properties connectionParameters; From 16e540fbfb741a13b6bf112b354e7b75096767f5 Mon Sep 17 00:00:00 2001 From: Felix Mueller Date: Tue, 8 Jul 2025 16:51:22 +0200 Subject: [PATCH 2/2] add comment to tests cases --- .../java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java b/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java index 48accc4a9..8e06aa99e 100644 --- a/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java +++ b/jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcConfigurationTest.java @@ -210,6 +210,7 @@ public Object[][] createInvalidConnectionURLs() { { "jdbc:clickhouse://foo.bar?x&y=z" }, { "jdbc:clickhouse://foo.bar?x==&y=z" }, { "jdbc:clickhouse://localhost?☺=value1" }, + // multiple endpoints are invalid { "jdbc:clickhouse://foo,bar" }, { "jdbc:clickhouse://foo,bar.com:8123" }, };