Skip to content

Commit f19f5c6

Browse files
[ES-1343645] Fix schema in connection string (#661)
Allow specifying schema in connection string. For example: - `jdbc:databricks://...:443/<schema>;ConnSchema=<connSchema>;ConnCatalog=<connCatalog>` `<schema>` will be prioritised over `ConnSchema=<connSchema>`. By default, the schema is `default`.
1 parent 2b50476 commit f19f5c6

File tree

5 files changed

+22
-15
lines changed

5 files changed

+22
-15
lines changed

src/main/java/com/databricks/jdbc/api/impl/DatabricksConnectionContext.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ public static IDatabricksConnectionContext parse(String url, Properties properti
6565
Matcher urlMatcher = JDBC_URL_PATTERN.matcher(url);
6666
if (urlMatcher.find()) {
6767
String hostUrlVal = urlMatcher.group(1);
68-
String urlMinusHost = urlMatcher.group(2);
68+
String schema = urlMatcher.group(2);
69+
String urlMinusHost = urlMatcher.group(3);
6970
String[] hostAndPort = hostUrlVal.split(DatabricksJdbcConstants.PORT_DELIMITER);
7071
String hostValue = hostAndPort[0];
7172
int portValue =
@@ -75,12 +76,8 @@ public static IDatabricksConnectionContext parse(String url, Properties properti
7576

7677
ImmutableMap.Builder<String, String> parametersBuilder = ImmutableMap.builder();
7778
String[] urlParts = urlMinusHost.split(DatabricksJdbcConstants.URL_DELIMITER);
78-
String schema = urlParts[0];
79-
if (nullOrEmptyString(schema)) {
80-
schema = DEFAULT_SCHEMA;
81-
}
82-
for (int urlPartIndex = 1; urlPartIndex < urlParts.length; urlPartIndex++) {
83-
String[] pair = urlParts[urlPartIndex].split(DatabricksJdbcConstants.PAIR_DELIMITER);
79+
for (String urlPart : urlParts) {
80+
String[] pair = urlPart.split(DatabricksJdbcConstants.PAIR_DELIMITER);
8481
if (pair.length == 1) {
8582
pair = new String[] {pair[0], ""};
8683
}
@@ -359,6 +356,10 @@ public String getCatalog() {
359356

360357
@Override
361358
public String getSchema() {
359+
if (!nullOrEmptyString(schema)) {
360+
return schema;
361+
}
362+
362363
return getParameter(
363364
DatabricksJdbcUrlParams.CONN_SCHEMA, getParameter(DatabricksJdbcUrlParams.SCHEMA));
364365
}

src/main/java/com/databricks/jdbc/common/DatabricksJdbcConstants.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,14 @@
77

88
public final class DatabricksJdbcConstants {
99
public static final Pattern JDBC_URL_PATTERN =
10-
Pattern.compile("jdbc:databricks://([^/;]*)(?::\\d+)?/*(.*)");
10+
Pattern.compile(
11+
"jdbc:databricks://"
12+
+ // Protocol prefix
13+
"([^/;]+)"
14+
+ // Host[:Port] (captured)
15+
"(?:/([^;]*))?"
16+
+ // Optional Schema (captured without /)
17+
"(?:;(.*))?"); // Optional Property=Value pairs (captured without leading ;)
1118
public static final Pattern HTTP_WAREHOUSE_PATH_PATTERN = Pattern.compile(".*/warehouses/(.+)");
1219
public static final Pattern HTTP_ENDPOINT_PATH_PATTERN = Pattern.compile(".*/endpoints/(.+)");
1320
public static final Pattern HTTP_CLI_PATTERN = Pattern.compile(".*cliservice(.+)");

src/test/java/com/databricks/jdbc/TestConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public class TestConstants {
129129
public static final String GCP_TEST_URL =
130130
"jdbc:databricks://4371047901336987.7.gcp.databricks.com:443/default;transportMode=http;AuthMech=11;Auth_Flow=1;httpPath=/sql/1.0/warehouses/dd5955aacf3f09e5;[email protected];";
131131
public static final String VALID_URL_1 =
132-
"jdbc:databricks://adb-565757575.18.azuredatabricks.net:4423/default;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/erg6767gg;LogLevel=debug;LogPath=./test1;auth_flow=2";
132+
"jdbc:databricks://adb-565757575.18.azuredatabricks.net:4423;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/erg6767gg;LogLevel=debug;LogPath=./test1;auth_flow=2";
133133
public static final String VALID_URL_2 =
134134
"jdbc:databricks://adb-565656.azuredatabricks.net/default;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/fgff575757;LogLevel=invalid;EnableQueryResultLZ4Compression=1;UseThriftClient=0";
135135
public static final String VALID_URL_3 =

src/test/java/com/databricks/jdbc/api/impl/DatabricksConnectionTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public class DatabricksConnectionTest {
4343
"jdbc:databricks://adb-565757575.18.azuredatabricks.net:4423/default;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/erg6767gg;UserAgentEntry=MyApp";
4444
private static final String CATALOG_SCHEMA_JDBC_URL =
4545
String.format(
46-
"jdbc:databricks://adb-565757575.18.azuredatabricks.net:4423/default;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/erg6767gg;ConnCatalog=%s;ConnSchema=%s;logLevel=FATAL",
47-
CATALOG, SCHEMA);
46+
"jdbc:databricks://adb-565757575.18.azuredatabricks.net:4423/%s;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/erg6767gg;ConnCatalog=%s;ConnSchema=%s;logLevel=FATAL",
47+
SCHEMA, CATALOG, SCHEMA);
4848
private static final String SESSION_CONF_JDBC_URL =
4949
String.format(
5050
"jdbc:databricks://adb-565757575.18.azuredatabricks.net:4423/default;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehouses/erg6767gg;%s",
@@ -145,7 +145,7 @@ public void testConfInConnection() throws SQLException {
145145
SESSION_CONFIGS.entrySet().stream()
146146
.collect(Collectors.toMap(e -> e.getKey().toLowerCase(), Map.Entry::getValue));
147147
when(databricksClient.createSession(
148-
new Warehouse(WAREHOUSE_ID), null, null, lowercaseSessionConfigs))
148+
new Warehouse(WAREHOUSE_ID), null, "default", lowercaseSessionConfigs))
149149
.thenReturn(IMMUTABLE_SESSION_INFO);
150150
IDatabricksConnectionContext connectionContext =
151151
DatabricksConnectionContext.parse(SESSION_CONF_JDBC_URL, new Properties());
@@ -215,7 +215,7 @@ public void testSetClientInfo() throws SQLException {
215215
DatabricksConnectionContext.parse(JDBC_URL, new Properties());
216216
ImmutableSessionInfo session =
217217
ImmutableSessionInfo.builder().computeResource(warehouse).sessionId(SESSION_ID).build();
218-
when(databricksClient.createSession(warehouse, null, null, new HashMap<>()))
218+
when(databricksClient.createSession(warehouse, null, "default", new HashMap<>()))
219219
.thenReturn(session);
220220
DatabricksConnection connection =
221221
Mockito.spy(new DatabricksConnection(connectionContext, databricksClient));

src/test/java/com/databricks/jdbc/api/impl/DatabricksSessionTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public class DatabricksSessionTest {
2929
@Mock TSessionHandle tSessionHandle;
3030
private static final String JDBC_URL_INVALID =
3131
"jdbc:databricks://adb-565757575.18.azuredatabricks.net:4423/default;transportMode=http;ssl=1;AuthMech=3;httpPath=/sql/1.0/warehou/erg6767gg;";
32-
private static final String WAREHOUSE_ID = "erg6767gg";
3332
private static final String NEW_CATALOG = "new_catalog";
3433
private static final String NEW_SCHEMA = "new_schema";
3534
private static final String SESSION_ID = "session_id";
@@ -148,7 +147,7 @@ public void testSessionToString() throws DatabricksSQLException {
148147
setupWarehouse(false);
149148
DatabricksSession session = new DatabricksSession(connectionContext);
150149
assertEquals(
151-
"DatabricksSession[compute='SQL Warehouse with warehouse ID {warehouse_id}']",
150+
"DatabricksSession[compute='SQL Warehouse with warehouse ID {warehouse_id}', schema='default']",
152151
session.toString());
153152
}
154153

0 commit comments

Comments
 (0)