Skip to content

Commit bbec4f7

Browse files
authored
Merge pull request #312 from databendlabs/feat/support-session-settings-pros
feat: support session settings in properties
2 parents c0339aa + b22ad32 commit bbec4f7

File tree

5 files changed

+68
-1
lines changed

5 files changed

+68
-1
lines changed

databend-client/src/main/java/com/databend/client/ClientSettings.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class ClientSettings {
4444
private final int retryAttempts;
4545
// TODO(zhihanz) timezone and locale info
4646

47+
//ClientSettings for test case use
4748
public ClientSettings(String host) {
4849
this(host, DatabendSession.createDefault(), DEFAULT_QUERY_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT, DEFAULT_SOCKET_TIMEOUT, PaginationOptions.defaultPaginationOptions(), new HashMap<String, String>(), null, DEFAULT_RETRY_ATTEMPTS);
4950
}

databend-jdbc/src/main/java/com/databend/jdbc/ConnectionProperties.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public final class ConnectionProperties {
4343
public static final ConnectionProperty<Integer> MAX_ROWS_IN_BUFFER = new MaxRowsInBuffer();
4444
public static final ConnectionProperty<Integer> MAX_ROWS_PER_PAGE = new MaxRowsPerPage();
4545

46+
public static final ConnectionProperty<String> SESSION_SETTINGS = new SessionSettings();
47+
4648
private static final Set<ConnectionProperty<?>> ALL_PROPERTIES = ImmutableSet.<ConnectionProperty<?>>builder()
4749
.add(USER)
4850
.add(PASSWORD)
@@ -63,6 +65,7 @@ public final class ConnectionProperties {
6365
.add(WAIT_TIME_SECS)
6466
.add(MAX_ROWS_IN_BUFFER)
6567
.add(MAX_ROWS_PER_PAGE)
68+
.add(SESSION_SETTINGS)
6669
.build();
6770
private static final Map<String, String> DEFAULTS;
6871

@@ -250,6 +253,13 @@ public MaxRowsPerPage() {
250253
}
251254
}
252255

256+
private static class SessionSettings
257+
extends AbstractConnectionProperty<String> {
258+
public SessionSettings() {
259+
super("session_settings", Optional.of(""), NOT_REQUIRED, ALLOWED, STRING_CONVERTER);
260+
}
261+
}
262+
253263

254264
static {
255265
ImmutableMap.Builder<String, String> defaults = ImmutableMap.builder();

databend-jdbc/src/main/java/com/databend/jdbc/DatabendConnection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ private void initializeFileHandler() {
124124
this.routeHint = randRouteHint();
125125
// it maybe closed due to unsupported server versioning.
126126
this.autoDiscovery = uri.autoDiscovery();
127-
DatabendSession session = new DatabendSession.Builder().setDatabase(this.getSchema()).build();
127+
DatabendSession session = new DatabendSession.Builder().setDatabase(this.getSchema()).setSettings(uri.getSessionSettings()).build();
128128
this.setSession(session);
129129

130130
initializeFileHandler();

databend-jdbc/src/main/java/com/databend/jdbc/DatabendDriverUri.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ public final class DatabendDriverUri {
6767
private final Integer maxRowsPerPage;
6868
private final int nodeDiscoveryInterval;
6969

70+
private final Map<String, String> sessionSettings;
71+
7072
// private final boolean useSecureConnection;
7173

7274
private DatabendDriverUri(String url, Properties driverProperties)
@@ -104,8 +106,28 @@ private DatabendDriverUri(String url, Properties driverProperties)
104106
this.socketTimeout = SOCKET_TIMEOUT.getRequiredValue(properties);
105107
this.maxRowsInBuffer = ConnectionProperties.MAX_ROWS_IN_BUFFER.getRequiredValue(properties);
106108
this.maxRowsPerPage = ConnectionProperties.MAX_ROWS_PER_PAGE.getRequiredValue(properties);
109+
String settingsStr = SESSION_SETTINGS.getValue(properties).orElse("");
110+
this.sessionSettings = parseSessionSettings(settingsStr);
111+
}
112+
113+
private Map<String, String> parseSessionSettings(String settingsStr) {
114+
if (isNullOrEmpty(settingsStr)) {
115+
return new HashMap<>();
116+
}
117+
118+
// key1=value1,key2=value2
119+
Map<String, String> settings = new HashMap<>();
120+
String[] pairs = settingsStr.split(",");
121+
for (String pair : pairs) {
122+
String[] keyValue = pair.split("=", 2);
123+
if (keyValue.length == 2) {
124+
settings.put(keyValue[0].trim(), keyValue[1].trim());
125+
}
126+
}
127+
return settings;
107128
}
108129

130+
109131
public static DatabendDriverUri create(String url, Properties properties)
110132
throws SQLException {
111133
return new DatabendDriverUri(url, firstNonNull(properties, new Properties()));
@@ -406,6 +428,10 @@ public Integer getMaxFailoverRetry() {
406428
return maxFailoverRetry;
407429
}
408430

431+
public Map<String, String> getSessionSettings() {
432+
return sessionSettings;
433+
}
434+
409435
public Properties getProperties() {
410436
return properties;
411437
}

databend-jdbc/src/test/java/com/databend/jdbc/TestDatabendDriverUri.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import org.testng.Assert;
55
import org.testng.annotations.Test;
66

7+
import java.sql.ResultSet;
78
import java.sql.SQLException;
9+
import java.sql.Statement;
810
import java.util.Properties;
911

1012
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -246,4 +248,32 @@ public void TestSetSchema() throws SQLException {
246248
Assert.assertEquals(connection.getSchema(), "test2");
247249
connection.createStatement().execute("insert into test2 values (1)");
248250
}
251+
252+
@Test
253+
public void TestSetSessionSettings() throws SQLException{
254+
Properties props = new Properties();
255+
// set session settings
256+
props.setProperty("session_settings", "key1=value1,key2=value2");
257+
props.setProperty("user","databend");
258+
props.setProperty("password","databend");
259+
DatabendConnection connection = (DatabendConnection) Utils.createConnection("default",props);
260+
try {
261+
Statement statement = connection.createStatement();
262+
statement.execute("show settings");
263+
ResultSet r = statement.getResultSet();
264+
while (r.next()) {
265+
String name = r.getString("name");
266+
String value = r.getString("value");
267+
if (name.equals("key1")) {
268+
Assert.assertEquals(value, "value1");
269+
} else if (name.equals("key2")) {
270+
Assert.assertEquals(value, "value2");
271+
}
272+
}
273+
} catch (SQLException e) {
274+
throw new RuntimeException(e);
275+
} finally {
276+
connection.close();
277+
}
278+
}
249279
}

0 commit comments

Comments
 (0)