Skip to content

Commit 724c217

Browse files
Bump to version 3.4.2 (#1551)
## Summary Bump the driver version to `3.4.2` and roll `NEXT_CHANGELOG.md` into `CHANGELOG.md` / `release-notes.txt` for the release. Version references updated in `pom.xml` (parent + child modules), `DriverUtil.DRIVER_VERSION`, `README.md`, the bug-report issue template, and the version-assertion unit tests. ### Notable changes since 3.4.1 **Added** - `UseBoundedSeaApi` connection property for the bounded SEA API CloudFetch contract (default off). - OAuth M2M: client id/secret may be supplied via JDBC `user`/`password` instead of the connection URL. **Updated** - Databricks SDK for Java `0.106.0` → `0.118.0`. **Fixed (highlights)** - Multiple security fixes: masked credentials in `getURL()`, redacted presigned-URL creds and access tokens in logs, hardened OAuth U2M token cache at rest, fixed SQL injection in binary parameter handling. - `TIMESTAMP_NTZ` type-name preservation (regression from 3.0.7; `EnableTimestampNtzTypeName=0` to opt out). - MAP-with-complex-value rendering via Arrow, nested-complex-type timezone shift, SEA result truncation, `closeOnCompletion()` hang, `supportsBatchUpdates()`, `setReadOnly()` no-op, and more. Full list in `CHANGELOG.md`. ## Validation - Nightly pipeline validated the release commit `ca1889b0` end-to-end: - **JDBC-Nightly-Build** (run 29490251): built from `Current HEAD: ca1889b…`, JAR SHA256 `12e21bd6…`. - **JDBC-Nightly-Correctness** (run 29492211): multi-DBR suites (Basic/BiToolReplay/HMSMetadata/LargeQueries/Regression/SmokeTest, SEA + thrift) passed against JAR `12e21bd6…`. - Benchmark deferred to the universe integration PR (nightly benchmark is currently red due to a known cross-driver workspace-infra issue, not a JDBC regression). - Local `mvn clean package` produced `databricks-jdbc-3.4.2.jar` (manifest `Implementation-Version: 3.4.2`). - Local `mvn test`: all suites pass (the JVM-reflection-gated `ArrowBufferAllocatorTest` case is excluded from standard CI and passes under the CI group config). ## Test plan - [x] Version-assertion unit tests pass (`DriverUtilTest`, `DatabricksDatabaseMetaDataTest`, `DatabricksDriverFeatureFlagsContextTest`) - [x] Nightly multi-DBR correctness green on the release SHA - [ ] CI green - [ ] EM + engineer signoff before merge Do not merge until signoff is obtained. Reference: #1036 This pull request and its description were written by Isaac. Signed-off-by: Vikrant Puppala <vikrant.puppala@databricks.com>
1 parent 43ea6c4 commit 724c217

15 files changed

Lines changed: 96 additions & 39 deletions

File tree

.github/ISSUE_TEMPLATE/bug_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ If available, share redacted client side logs
2626
- OS: [e.g. Windows]
2727
- Java version [e.g. Java 21]
2828
- Java vendor [e.g. OpenJDK]
29-
- Driver Version [e.g. 3.4.1]
29+
- Driver Version [e.g. 3.4.2]
3030
- BI Tool (if used) [e.g. DBeaver]
3131
- BI Tool version (if applicable) [e.g. 24.3.5]
3232

CHANGELOG.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,36 @@
11
# Version Changelog
22

3+
## [v3.4.2] - 2026-07-14
4+
5+
### Added
6+
7+
- Added `UseBoundedSeaApi` connection property (default `0`/off). When enabled, the driver uses the bounded SEA API contract for CloudFetch: sends `row_offset` on GetResultData requests and uses `next_chunk_index` for chunk discovery instead of `total_chunk_count`. Requires server support.
8+
- OAuth M2M (client credentials) connections can now supply the client secret via the JDBC `password`/`PWD` property and the client id via the JDBC `user`/`UID` property, instead of embedding `OAuth2Secret`/`OAuth2ClientId` in the connection URL. This lets BI tools (e.g. DBeaver) mask the OAuth secret in their password field rather than exposing it in the clear-text JDBC URL. Explicit `OAuth2ClientId`/`OAuth2Secret` still take precedence when present, so existing URLs are unaffected.
9+
10+
### Updated
11+
12+
- Bumped the Databricks SDK for Java dependency from `0.106.0` to `0.118.0`.
13+
14+
### Fixed
15+
16+
- Fixed telemetry misattribution when multiple connections (e.g. Thrift and SEA) are used on the same thread. Per-statement telemetry events could be tagged with another connection's context (e.g. transport mode); each connection's telemetry now uses its own context instead of a shared thread-local value.
17+
- Hardened the OAuth U2M token cache at rest (encryption key derivation and file permissions).
18+
- Fixed `DatabaseMetaData.getURL()` exposing credentials embedded in the connection URL; secret parameters are now masked (the URL is otherwise unchanged).
19+
- Fixed presigned URL credentials not being fully redacted in logs.
20+
- Fixed access token exposure in DEBUG logs.
21+
- Fixed `StackOverflowError` / hang when closing a `ResultSet` or `Statement` with `closeOnCompletion()` enabled.
22+
- Fixed SQL injection vulnerability in binary parameter handling.
23+
- Fixed `setCatalog()` and `setSchema()` producing invalid SQL (e.g. `SET CATALOG ``name``) when the catalog or schema name was passed already wrapped in backticks. Backticks are now stripped before wrapping, and `getCatalog()`/`getSchema()` return the bare identifier name.
24+
- Fixed metadata SQL generation for catalog, schema, and table identifiers containing backticks.
25+
- Fixed SEA result truncation when direct results are disabled. Large, highly-compressible results that span multiple chunks were delivered inline via the old hybrid path and truncated to the first chunk. The SQL Execution path now uses an async (`0s`) wait timeout when direct results are disabled, so results are returned via external links and fetched in full.
26+
- Fixed `getColumns()` flooding the `DriverManager` log writer with caught-and-recovered `Invalid column index` stack traces.
27+
- Fixed timezone-shifted TIMESTAMP values when retrieving nested complex types (STRUCT/ARRAY/MAP) with `EnableComplexDatatypeSupport=1`.
28+
- Fixed `MAP` columns whose values are themselves complex types (e.g. `MAP<INT,ARRAY<BIGINT>>`) rendering their values as empty (e.g. `SELECT MAP(0, ARRAY(34277,0))` returned `{0:}` instead of `{0:[34277,0]}`) when fetched via Arrow (`EnableArrow=1`) with `EnableComplexDatatypeSupport` disabled.
29+
- Fixed `DatabricksDatabaseMetaData.supportsBatchUpdates()` always returning `false`, which caused batch-aware JDBC clients (e.g. Apache Hop) to skip `executeBatch()` and fall back to one INSERT per row. It now returns `true` when `EnableBatchedInserts=1`, so those clients use the optimized multi-row INSERT path.
30+
- Fixed `Connection.setReadOnly(true)` throwing `DatabricksSQLFeatureNotSupportedException`, which broke clients (e.g. Trino/Starburst GenericJDBC, HikariCP, DBCP) that call it during connection initialization. Per the JDBC spec, `setReadOnly` is a hint the driver may ignore; it is now a no-op and `isReadOnly()` continues to return `false`.
31+
- Fixed `ResultSetMetaData.getColumnTypeName()` returning `TIMESTAMP` for `TIMESTAMP_NTZ` columns (e.g. `SELECT MIN(ntz_col) ...`), a regression from 3.0.7. By default the driver now preserves the `TIMESTAMP_NTZ` type name across the SEA, Thrift, and describe-query metadata paths; `getColumnType()` continues to report `java.sql.Types.TIMESTAMP`. Set the new connection property `EnableTimestampNtzTypeName=0` to restore the previous behavior (report `TIMESTAMP`), which matches the legacy (v2.x.x) driver. ([#1495](https://github.com/databricks/databricks-jdbc/issues/1495))
32+
- Fixed `SQLException.getErrorCode()` being inconsistent between transports for statement-execution failures: the Thrift path returned `0` while the SEA path returned `1003` for the same server error. Thrift statement errors now report the `EXECUTE_STATEMENT_FAILED` (`1003`) vendor code, matching SEA. The `SQLState` and error message are unchanged.
33+
334
## [v3.4.1] - 2026-05-25
435

536
### BREAKING CHANGES in 3.4.1

NEXT_CHANGELOG.md

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,11 @@
33
## [Unreleased]
44

55
### Added
6-
- Added `UseBoundedSeaApi` connection property (default `0`/off). When enabled, the driver uses the bounded SEA API contract for CloudFetch: sends `row_offset` on GetResultData requests and uses `next_chunk_index` for chunk discovery instead of `total_chunk_count`. Requires server support.
7-
- OAuth M2M (client credentials) connections can now supply the client secret via the JDBC `password`/`PWD` property and the client id via the JDBC `user`/`UID` property, instead of embedding `OAuth2Secret`/`OAuth2ClientId` in the connection URL. This lets BI tools (e.g. DBeaver) mask the OAuth secret in their password field rather than exposing it in the clear-text JDBC URL. Explicit `OAuth2ClientId`/`OAuth2Secret` still take precedence when present, so existing URLs are unaffected.
86

97
### Updated
10-
- Bumped the Databricks SDK for Java dependency from `0.106.0` to `0.118.0`.
118

129
### Fixed
13-
- Fixed telemetry misattribution when multiple connections (e.g. Thrift and SEA) are used on the same thread. Per-statement telemetry events could be tagged with another connection's context (e.g. transport mode); each connection's telemetry now uses its own context instead of a shared thread-local value.
14-
- Hardened the OAuth U2M token cache at rest (encryption key derivation and file permissions).
15-
- Fixed `DatabaseMetaData.getURL()` exposing credentials embedded in the connection URL; secret parameters are now masked (the URL is otherwise unchanged).
16-
- Fixed presigned URL credentials not being fully redacted in logs.
17-
- Fixed access token exposure in DEBUG logs.
18-
- Fixed `StackOverflowError` / hang when closing a `ResultSet` or `Statement` with `closeOnCompletion()` enabled.
19-
- Fixed SQL injection vulnerability in binary parameter handling.
20-
- Fixed `setCatalog()` and `setSchema()` producing invalid SQL (e.g. `SET CATALOG ``name``) when the catalog or schema name was passed already wrapped in backticks. Backticks are now stripped before wrapping, and `getCatalog()`/`getSchema()` return the bare identifier name.
21-
- Fixed metadata SQL generation for catalog, schema, and table identifiers containing backticks.
22-
- Fixed SEA result truncation when direct results are disabled. Large, highly-compressible results that span multiple chunks were delivered inline via the old hybrid path and truncated to the first chunk. The SQL Execution path now uses an async (`0s`) wait timeout when direct results are disabled, so results are returned via external links and fetched in full.
23-
- Fixed `getColumns()` flooding the `DriverManager` log writer with caught-and-recovered `Invalid column index` stack traces.
24-
- Fixed timezone-shifted TIMESTAMP values when retrieving nested complex types (STRUCT/ARRAY/MAP) with `EnableComplexDatatypeSupport=1`.
25-
- Fixed `MAP` columns whose values are themselves complex types (e.g. `MAP<INT,ARRAY<BIGINT>>`) rendering their values as empty (e.g. `SELECT MAP(0, ARRAY(34277,0))` returned `{0:}` instead of `{0:[34277,0]}`) when fetched via Arrow (`EnableArrow=1`) with `EnableComplexDatatypeSupport` disabled.
26-
- Fixed `DatabricksDatabaseMetaData.supportsBatchUpdates()` always returning `false`, which caused batch-aware JDBC clients (e.g. Apache Hop) to skip `executeBatch()` and fall back to one INSERT per row. It now returns `true` when `EnableBatchedInserts=1`, so those clients use the optimized multi-row INSERT path.
27-
- Fixed `Connection.setReadOnly(true)` throwing `DatabricksSQLFeatureNotSupportedException`, which broke clients (e.g. Trino/Starburst GenericJDBC, HikariCP, DBCP) that call it during connection initialization. Per the JDBC spec, `setReadOnly` is a hint the driver may ignore; it is now a no-op and `isReadOnly()` continues to return `false`.
28-
- Fixed `ResultSetMetaData.getColumnTypeName()` returning `TIMESTAMP` for `TIMESTAMP_NTZ` columns (e.g. `SELECT MIN(ntz_col) ...`), a regression from 3.0.7. By default the driver now preserves the `TIMESTAMP_NTZ` type name across the SEA, Thrift, and describe-query metadata paths; `getColumnType()` continues to report `java.sql.Types.TIMESTAMP`. Set the new connection property `EnableTimestampNtzTypeName=0` to restore the previous behavior (report `TIMESTAMP`), which matches the legacy (v2.x.x) driver. ([#1495](https://github.com/databricks/databricks-jdbc/issues/1495))
29-
- Fixed `SQLException.getErrorCode()` being inconsistent between transports for statement-execution failures: the Thrift path returned `0` while the SEA path returned `1003` for the same server error. Thrift statement errors now report the `EXECUTE_STATEMENT_FAILED` (`1003`) vendor code, matching SEA. The `SQLState` and error message are unchanged.
3010

3111
---
3212
*Note: When making changes, please add your change under the appropriate section
33-
with a brief description.*
13+
with a brief description.*

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Add the following dependency to your `pom.xml`:
2020
<dependency>
2121
<groupId>com.databricks</groupId>
2222
<artifactId>databricks-jdbc</artifactId>
23-
<version>3.4.1</version>
23+
<version>3.4.2</version>
2424
</dependency>
2525
```
2626

assembly-thin/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>com.databricks</groupId>
99
<artifactId>databricks-jdbc-parent</artifactId>
10-
<version>3.4.1</version>
10+
<version>3.4.2</version>
1111
</parent>
1212

1313
<artifactId>databricks-jdbc-thin</artifactId>
@@ -51,7 +51,7 @@
5151
<dependency>
5252
<groupId>com.databricks</groupId>
5353
<artifactId>databricks-jdbc-core</artifactId>
54-
<version>3.4.1</version>
54+
<version>3.4.2</version>
5555
</dependency>
5656
</dependencies>
5757

assembly-uber/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>com.databricks</groupId>
99
<artifactId>databricks-jdbc-parent</artifactId>
10-
<version>3.4.1</version>
10+
<version>3.4.2</version>
1111
</parent>
1212

1313
<artifactId>databricks-jdbc</artifactId>
@@ -51,7 +51,7 @@
5151
<dependency>
5252
<groupId>com.databricks</groupId>
5353
<artifactId>databricks-jdbc-core</artifactId>
54-
<version>3.4.1</version>
54+
<version>3.4.2</version>
5555
</dependency>
5656
</dependencies>
5757

jdbc-core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.databricks</groupId>
88
<artifactId>databricks-jdbc-parent</artifactId>
9-
<version>3.4.1</version>
9+
<version>3.4.2</version>
1010
</parent>
1111

1212
<artifactId>databricks-jdbc-core</artifactId>

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<groupId>com.databricks</groupId>
66
<artifactId>databricks-jdbc-parent</artifactId>
77
<!-- This value may be modified by a release script to reflect the current version of the driver. -->
8-
<version>3.4.1</version>
8+
<version>3.4.2</version>
99
<packaging>pom</packaging>
1010
<name>Databricks JDBC Parent</name>
1111
<description>Parent POM for Databricks JDBC Driver.</description>
@@ -64,7 +64,7 @@
6464
<cyclonedx-maven-plugin.version>2.9.1</cyclonedx-maven-plugin.version>
6565

6666
<!-- Dependency Versions -->
67-
<databricks-jdbc-version>3.4.1</databricks-jdbc-version>
67+
<databricks-jdbc-version>3.4.2</databricks-jdbc-version>
6868
<arrow.version>18.3.0</arrow.version>
6969
<commons-lang3.version>3.18.0</commons-lang3.version>
7070
<commons-configuration.version>2.15.0</commons-configuration.version>

release-notes.txt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,52 @@ The release notes summarize enhancements, new features, known issues, workflow c
66

77
Version History ==============================================================
88

9+
3.4.2 ========================================================================
10+
Released 2026-07-14
11+
12+
Added
13+
14+
* UseBoundedSeaApi connection property (default off) for the bounded SEA API
15+
CloudFetch contract (row_offset on GetResultData; next_chunk_index for chunk
16+
discovery). Requires server support.
17+
* OAuth M2M (client credentials): client secret may be supplied via the JDBC
18+
password/PWD property and client id via user/UID, instead of embedding
19+
OAuth2Secret/OAuth2ClientId in the connection URL. Explicit
20+
OAuth2ClientId/OAuth2Secret still take precedence.
21+
22+
Updated
23+
24+
* Bumped Databricks SDK for Java from 0.106.0 to 0.118.0.
25+
26+
Fixed
27+
28+
* Security: masked credentials in DatabaseMetaData.getURL(); redacted presigned
29+
URL credentials and access tokens in logs; hardened the OAuth U2M token cache
30+
at rest; fixed a SQL injection in binary parameter handling.
31+
* Fixed telemetry misattribution across multiple connections on the same thread.
32+
* Fixed StackOverflowError / hang when closing a ResultSet or Statement with
33+
closeOnCompletion() enabled.
34+
* Fixed setCatalog()/setSchema() producing invalid SQL when the identifier was
35+
already backtick-wrapped; fixed metadata SQL generation for identifiers
36+
containing backticks.
37+
* Fixed SEA result truncation when direct results are disabled.
38+
* Fixed getColumns() flooding the DriverManager log writer with recovered
39+
Invalid column index stack traces.
40+
* Fixed timezone-shifted TIMESTAMP values in nested complex types with
41+
EnableComplexDatatypeSupport=1.
42+
* Fixed MAP columns with complex value types rendering values as empty when
43+
fetched via Arrow with EnableComplexDatatypeSupport disabled.
44+
* Fixed supportsBatchUpdates() always returning false (now true when
45+
EnableBatchedInserts=1).
46+
* Fixed Connection.setReadOnly(true) throwing; it is now a no-op per spec.
47+
* Fixed getColumnTypeName() returning TIMESTAMP for TIMESTAMP_NTZ columns
48+
(regression from 3.0.7); set EnableTimestampNtzTypeName=0 to restore the
49+
previous behavior.
50+
* Fixed SQLException.getErrorCode() inconsistency between transports for
51+
statement-execution failures: Thrift now reports EXECUTE_STATEMENT_FAILED
52+
(1003) matching SEA (was 0). SQLState and message unchanged.
53+
54+
955
3.4.1 ========================================================================
1056
Released 2026-05-26
1157

src/main/java/com/databricks/jdbc/common/util/DriverUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
public class DriverUtil {
2121

2222
private static final JdbcLogger LOGGER = JdbcLoggerFactory.getLogger(DriverUtil.class);
23-
private static final String DRIVER_VERSION = "3.4.1";
23+
private static final String DRIVER_VERSION = "3.4.2";
2424
private static final String DRIVER_NAME = "oss-jdbc";
2525
private static final String JDBC_VERSION = "4.3";
2626

0 commit comments

Comments
 (0)