Skip to content

Commit 3535d11

Browse files
committed
Fix custom properties lost issue and add more tests
1 parent aebad16 commit 3535d11

File tree

4 files changed

+130
-7
lines changed

4 files changed

+130
-7
lines changed

Diff for: clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/ClickHouseDataSource.java

+15-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
public class ClickHouseDataSource extends JdbcWrapper implements DataSource {
1717
private final String url;
18+
private final Properties props;
1819

1920
protected final ClickHouseDriver driver;
2021
protected final ConnectionInfo connInfo;
@@ -31,6 +32,10 @@ public ClickHouseDataSource(String url, Properties properties) throws SQLExcepti
3132
throw new IllegalArgumentException("Incorrect ClickHouse jdbc url. It must be not null");
3233
}
3334
this.url = url;
35+
this.props = new Properties();
36+
if (properties != null && !properties.isEmpty()) {
37+
this.props.putAll(properties);
38+
}
3439

3540
this.driver = new ClickHouseDriver();
3641
this.connInfo = ClickHouseJdbcUrlParser.parse(url, properties);
@@ -51,10 +56,16 @@ public ClickHouseConnection getConnection(String username, String password) thro
5156
password = "";
5257
}
5358

54-
Properties props = new Properties(connInfo.getProperties());
55-
props.setProperty(ClickHouseDefaults.USER.getKey(), username);
56-
props.setProperty(ClickHouseDefaults.PASSWORD.getKey(), password);
57-
return driver.connect(url, props);
59+
if (username.equals(props.getProperty(ClickHouseDefaults.USER.getKey()))
60+
&& password.equals(props.getProperty(ClickHouseDefaults.PASSWORD.getKey()))) {
61+
return new ClickHouseConnectionImpl(connInfo);
62+
}
63+
64+
Properties properties = new Properties();
65+
properties.putAll(this.props);
66+
properties.setProperty(ClickHouseDefaults.USER.getKey(), username);
67+
properties.setProperty(ClickHouseDefaults.PASSWORD.getKey(), password);
68+
return new ClickHouseConnectionImpl(url, properties);
5869
}
5970

6071
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.clickhouse.jdbc;
2+
3+
import java.sql.DriverManager;
4+
import java.sql.SQLException;
5+
import java.sql.Statement;
6+
import java.util.Properties;
7+
8+
import org.testng.Assert;
9+
import org.testng.annotations.Test;
10+
11+
import com.clickhouse.client.ClickHouseProtocol;
12+
import com.clickhouse.client.config.ClickHouseClientOption;
13+
import com.clickhouse.client.config.ClickHouseDefaults;
14+
15+
public class ClickHouseDataSourceTest extends JdbcIntegrationTest {
16+
@Test(groups = "integration")
17+
public void testGetConnection() throws SQLException {
18+
String url = "jdbc:ch://" + getServerAddress(DEFAULT_PROTOCOL);
19+
String urlWithCredentials = "jdbc:ch://default@" + getServerAddress(ClickHouseProtocol.HTTP);
20+
String clientName = "client1";
21+
int maxExecuteTime = 1234;
22+
boolean continueBatchOnError = true;
23+
24+
Properties properties = new Properties();
25+
properties.setProperty(ClickHouseDefaults.USER.getKey(), "default");
26+
properties.setProperty(ClickHouseDefaults.PASSWORD.getKey(), "");
27+
properties.setProperty(ClickHouseClientOption.CLIENT_NAME.getKey(), clientName);
28+
properties.setProperty(ClickHouseClientOption.MAX_EXECUTION_TIME.getKey(), Integer.toString(maxExecuteTime));
29+
properties.setProperty(JdbcConfig.PROP_CONTINUE_BATCH, Boolean.toString(continueBatchOnError));
30+
String params = String.format("?%s=%s&%s=%d&%s", ClickHouseClientOption.CLIENT_NAME.getKey(), clientName,
31+
ClickHouseClientOption.MAX_EXECUTION_TIME.getKey(), maxExecuteTime, JdbcConfig.PROP_CONTINUE_BATCH);
32+
33+
for (ClickHouseDataSource ds : new ClickHouseDataSource[] {
34+
new ClickHouseDataSource(url, properties),
35+
new ClickHouseDataSource(urlWithCredentials, properties),
36+
new ClickHouseDataSource(url + params),
37+
new ClickHouseDataSource(urlWithCredentials + params),
38+
}) {
39+
for (ClickHouseConnection connection : new ClickHouseConnection[] {
40+
ds.getConnection(),
41+
ds.getConnection("default", ""),
42+
new ClickHouseDriver().connect(url, properties),
43+
new ClickHouseDriver().connect(urlWithCredentials, properties),
44+
new ClickHouseDriver().connect(url + params, new Properties()),
45+
new ClickHouseDriver().connect(urlWithCredentials + params, new Properties()),
46+
(ClickHouseConnection) DriverManager.getConnection(url, properties),
47+
(ClickHouseConnection) DriverManager.getConnection(urlWithCredentials, properties),
48+
(ClickHouseConnection) DriverManager.getConnection(url + params),
49+
(ClickHouseConnection) DriverManager.getConnection(urlWithCredentials + params),
50+
(ClickHouseConnection) DriverManager.getConnection(url + params, "default", ""),
51+
(ClickHouseConnection) DriverManager.getConnection(urlWithCredentials + params, "default", ""),
52+
}) {
53+
try (ClickHouseConnection conn = connection; Statement stmt = conn.createStatement()) {
54+
Assert.assertEquals(conn.getClientInfo(ClickHouseConnection.PROP_APPLICATION_NAME), clientName);
55+
Assert.assertEquals(stmt.getQueryTimeout(), maxExecuteTime);
56+
Assert.assertEquals(conn.getJdbcConfig().isContinueBatchOnError(), continueBatchOnError);
57+
}
58+
}
59+
}
60+
}
61+
}

Diff for: clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseDatabaseMetaDataTest.java

+40
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.Properties;
88

99
import com.clickhouse.client.ClickHouseColumn;
10+
import com.clickhouse.client.config.ClickHouseClientOption;
1011

1112
import org.testng.Assert;
1213
import org.testng.annotations.DataProvider;
@@ -42,6 +43,45 @@ public void testGetTypeInfo() throws SQLException {
4243
}
4344
}
4445

46+
@Test(groups = "integration")
47+
public void testGetClientInfo() throws SQLException {
48+
String clientName = "";
49+
Properties props = new Properties();
50+
try (ClickHouseConnection conn = newConnection(props);
51+
ResultSet rs = conn.getMetaData().getClientInfoProperties()) {
52+
while (rs.next()) {
53+
if (ClickHouseConnection.PROP_APPLICATION_NAME.equals(rs.getString(1))) {
54+
clientName = rs.getString(3);
55+
}
56+
}
57+
Assert.assertEquals(clientName, ClickHouseClientOption.CLIENT_NAME.getDefaultValue());
58+
}
59+
60+
props.setProperty(ClickHouseClientOption.CLIENT_NAME.getKey(), "client1");
61+
try (ClickHouseConnection conn = newConnection(props)) {
62+
clientName = "";
63+
try (ResultSet rs = conn.getMetaData().getClientInfoProperties()) {
64+
while (rs.next()) {
65+
if (ClickHouseConnection.PROP_APPLICATION_NAME.equals(rs.getString(1))) {
66+
clientName = rs.getString(3);
67+
}
68+
}
69+
Assert.assertEquals(clientName, "client1");
70+
}
71+
72+
conn.setClientInfo(ClickHouseConnection.PROP_APPLICATION_NAME, "client2");
73+
clientName = "";
74+
try (ResultSet rs = conn.getMetaData().getClientInfoProperties()) {
75+
while (rs.next()) {
76+
if (ClickHouseConnection.PROP_APPLICATION_NAME.equals(rs.getString(1))) {
77+
clientName = rs.getString(3);
78+
}
79+
}
80+
Assert.assertEquals(clientName, "client2");
81+
}
82+
}
83+
}
84+
4585
@Test(dataProvider = "selectedColumns", groups = "integration")
4686
public void testGetColumns(String columnType, Integer columnSize, Integer decimalDigits, Integer octectLength)
4787
throws SQLException {

Diff for: clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseResultSetTest.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,8 @@ public void testMap() throws SQLException {
245245
public void testTuple() throws SQLException {
246246
try (ClickHouseConnection conn = newConnection(new Properties());
247247
Statement stmt = conn.createStatement()) {
248-
ResultSet rs = stmt
249-
.executeQuery(
250-
"select (toInt16(1), 'a', toFloat32(1.2), cast([1,2] as Array(Nullable(UInt8))), map(toUInt32(1),'a')) v");
248+
ResultSet rs = stmt.executeQuery(
249+
"select (toInt16(1), 'a', toFloat32(1.2), cast([1,2] as Array(Nullable(UInt8))), map(toUInt32(1),'a')) v");
251250
Assert.assertTrue(rs.next());
252251
List<?> v = rs.getObject(1, List.class);
253252
Assert.assertEquals(v.size(), 5);
@@ -257,6 +256,18 @@ public void testTuple() throws SQLException {
257256
Assert.assertEquals(v.get(3), new Short[] { 1, 2 });
258257
Assert.assertEquals(v.get(4), Collections.singletonMap(1L, "a"));
259258
Assert.assertFalse(rs.next());
259+
260+
rs = stmt.executeQuery(
261+
"select cast(tuple(1, [2,3], ('4', [5,6]), map('seven', 8)) as Tuple(Int16, Array(Nullable(Int16)), Tuple(String, Array(Int32)), Map(String, Int32))) v");
262+
Assert.assertTrue(rs.next());
263+
v = rs.getObject(1, List.class);
264+
Assert.assertEquals(v.size(), 4);
265+
Assert.assertEquals(v.get(0), Short.valueOf((short) 1));
266+
Assert.assertEquals(v.get(1), new Short[] { 2, 3 });
267+
Assert.assertEquals(((List<?>) v.get(2)).get(0), "4");
268+
Assert.assertEquals(((List<?>) v.get(2)).get(1), new int[] { 5, 6 });
269+
Assert.assertEquals(v.get(3), Collections.singletonMap("seven", 8));
270+
Assert.assertFalse(rs.next());
260271
}
261272
}
262273

0 commit comments

Comments
 (0)