Skip to content

Commit 0fa2d5c

Browse files
committed
Fix DATE mapping properly: DATE→DATE in getColumnInfoType, re-record stubs
Previously getColumnInfoType("DATE") incorrectly returned TIMESTAMP, causing setDate() to serialize parameters as TIMESTAMP type. Now returns DATE correctly. This is a behavioral change documented in BREAKING CHANGES. Re-recorded WireMock stubs for testSetDate in both Thrift and SEA modes against dogfood warehouse with the corrected DATE parameter type. Co-authored-by: Isaac Signed-off-by: Gopal Lal <gopal.lal@databricks.com>
1 parent 7687638 commit 0fa2d5c

31 files changed

Lines changed: 295 additions & 295 deletions

File tree

NEXT_CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ upgrading. These changes do not affect metadata on All-Purpose Clusters.
3030
instead of `0` (`CASCADE`) for Thrift, and `3` instead of `null` for SEA.**
3131
This reflects that Unity Catalog foreign keys are informational and non-enforced.
3232

33+
* **`PreparedStatement.setDate()` now sends parameter type as `DATE` instead of
34+
`TIMESTAMP`.** Previously, `setDate()` incorrectly serialized the parameter
35+
type as TIMESTAMP in both Thrift and SEA requests due to a mapping bug.
36+
Server-side behavior is unchanged (Databricks accepts both), but applications
37+
that inspect wire-level parameter types may see the difference.
38+
3339
#### Default Behavior Changes
3440

3541
* **Native geospatial type support (`GEOMETRY` and `GEOGRAPHY`) is now enabled

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -452,14 +452,7 @@ public DatabricksResultSetMetaData(
452452
String columnTypeText = columnDataTypes.get(i);
453453

454454
String baseTypeName = metadataResultSetBuilder.stripBaseTypeName(columnTypeText);
455-
ColumnInfoTypeName columnTypeName;
456-
// DATE must map to DATE in metadata (not TIMESTAMP). getColumnInfoType maps DATE → TIMESTAMP
457-
// for backward compatibility in parameter serialization (setDate), so we handle it here.
458-
if (baseTypeName.equals(DatabricksTypeUtil.DATE)) {
459-
columnTypeName = ColumnInfoTypeName.DATE;
460-
} else {
461-
columnTypeName = DatabricksTypeUtil.getColumnInfoType(baseTypeName);
462-
}
455+
ColumnInfoTypeName columnTypeName = DatabricksTypeUtil.getColumnInfoType(baseTypeName);
463456

464457
// Normalize columnTypeText for types that have a canonical display name
465458
if (baseTypeName.equals(TIMESTAMP_NTZ)) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public static ColumnInfoTypeName getColumnInfoType(String typeName) {
9595
case DatabricksTypeUtil.NVARCHAR:
9696
return ColumnInfoTypeName.STRING;
9797
case DatabricksTypeUtil.DATE:
98+
return ColumnInfoTypeName.DATE;
9899
case DatabricksTypeUtil.TIMESTAMP:
99100
case DatabricksTypeUtil.TIMESTAMP_NTZ:
100101
return ColumnInfoTypeName.TIMESTAMP;

src/test/java/com/databricks/jdbc/common/util/DatabricksTypeUtilTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ void testInferDatabricksType() {
266266
@ParameterizedTest
267267
@CsvSource({
268268
"STRING, STRING",
269-
"DATE, TIMESTAMP",
269+
"DATE, DATE",
270270
"TIMESTAMP, TIMESTAMP",
271271
"TIMESTAMP_NTZ, TIMESTAMP",
272272
"SHORT, SHORT",

src/test/resources/cloudfetchapi/preparedstatementintegrationtests/testsetdate/mappings/oregon-staging_6051921418418893.jobs_sql_extended_results_2026-04-02t105321z_98c3d13c-6b53-40c0-842b-d43110c18ab8-143cad66-48da-4956-9f34-894ec50af41b.json renamed to src/test/resources/cloudfetchapi/preparedstatementintegrationtests/testsetdate/mappings/oregon-staging_6051921418418893.jobs_sql_extended_results_2026-05-22t080142z_7c795f05-538d-4aee-8bda-3daec89f99a0-4af91223-914a-4d56-a64e-79d202dfb6ed.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
2-
"id" : "143cad66-48da-4956-9f34-894ec50af41b",
3-
"name" : "oregon-staging_6051921418418893.jobs_sql_extended_results_2026-04-02t105321z_98c3d13c-6b53-40c0-842b-d43110c18ab8",
2+
"id" : "4af91223-914a-4d56-a64e-79d202dfb6ed",
3+
"name" : "oregon-staging_6051921418418893.jobs_sql_extended_results_2026-05-22t080142z_7c795f05-538d-4aee-8bda-3daec89f99a0",
44
"request" : {
5-
"url" : "/oregon-staging/6051921418418893.jobs/sql/extended/results_2026-04-02T10%3A53%3A21Z_98c3d13c-6b53-40c0-842b-d43110c18ab8?[REDACTED]X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260401T095321Z&X-Amz-SignedHeaders=host&X-Amz-Expires=899&[REDACTED]X-Amz-Signature=cf0d08af0116aaa68edded23d67424dffc1af3399f125ace4eaaa0b5914c22a2",
5+
"url" : "/oregon-staging/6051921418418893.jobs/sql/extended/results_2026-05-22T08%3A01%3A42Z_7c795f05-538d-4aee-8bda-3daec89f99a0?[REDACTED]X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260521T070142Z&X-Amz-SignedHeaders=host&X-Amz-Expires=899&[REDACTED]X-Amz-Signature=b33b54abb3cd75aac6cc439ec6bc9f93766a9ebf801acbbc1fac6500ce941aa0",
66
"method" : "GET"
77
},
88
"response" : {
@@ -12,14 +12,14 @@
1212
"Accept-Ranges" : "bytes",
1313
"Server" : "AmazonS3",
1414
"ETag" : "\"9295f1328e942f941e19047fb0b03b2f\"",
15-
"Last-Modified" : "Wed, 01 Apr 2026 09:53:22 GMT",
16-
"x-amz-request-id" : "20YQ98F5CDJBDA4A",
15+
"Last-Modified" : "Thu, 21 May 2026 07:01:43 GMT",
16+
"x-amz-request-id" : "XMFMBCRC7WS1J8WG",
1717
"x-amz-server-side-encryption" : "AES256",
18-
"x-amz-id-2" : "SAh2k9S2YWEMNK74vaDjSSXGPTzZPKjBsRsDvFMSteQYc20sYIZAulFVZcoTcswRigCy13Xri54jJ3f+6Qfy2w==",
19-
"Date" : "Wed, 01 Apr 2026 09:53:23 GMT",
18+
"x-amz-id-2" : "lqWxvit6qKRJ1lR3mhRVhKHPgR4UdaL7NVkUnQ3u2ny1q36IfX2MYvU5QojyZ3azFNZH55xcxKzxZBrXyVjuX66pomb0HLf4uGh58uQhnx4=",
19+
"Date" : "Thu, 21 May 2026 07:01:44 GMT",
2020
"Content-Type" : "binary/octet-stream"
2121
}
2222
},
23-
"uuid" : "143cad66-48da-4956-9f34-894ec50af41b",
24-
"insertionIndex" : 56
23+
"uuid" : "4af91223-914a-4d56-a64e-79d202dfb6ed",
24+
"insertionIndex" : 2
2525
}

src/test/resources/cloudfetchapi/preparedstatementintegrationtests/testsetdate/mappings/oregon-staging_6051921418418893.jobs_sql_extended_results_2026-04-02t105325z_46eee378-ac5e-4a5a-b478-1ecb381051c0-cb0b5fa3-dfa8-46b8-9be0-01e1ae0648dc.json renamed to src/test/resources/cloudfetchapi/preparedstatementintegrationtests/testsetdate/mappings/oregon-staging_6051921418418893.jobs_sql_extended_results_2026-05-22t080146z_6806e0db-c251-4d16-a4f6-5a9838e635f4-8ee1f363-3bee-406e-a394-72f585a9df87.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
2-
"id" : "cb0b5fa3-dfa8-46b8-9be0-01e1ae0648dc",
3-
"name" : "oregon-staging_6051921418418893.jobs_sql_extended_results_2026-04-02t105325z_46eee378-ac5e-4a5a-b478-1ecb381051c0",
2+
"id" : "8ee1f363-3bee-406e-a394-72f585a9df87",
3+
"name" : "oregon-staging_6051921418418893.jobs_sql_extended_results_2026-05-22t080146z_6806e0db-c251-4d16-a4f6-5a9838e635f4",
44
"request" : {
5-
"url" : "/oregon-staging/6051921418418893.jobs/sql/extended/results_2026-04-02T10%3A53%3A25Z_46eee378-ac5e-4a5a-b478-1ecb381051c0?[REDACTED]X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260401T095325Z&X-Amz-SignedHeaders=host&X-Amz-Expires=899&[REDACTED]X-Amz-Signature=1af4ab5012c707cf8e736a0b42deb7d7a85a8c6c5872edb81d34de8c47987b2c",
5+
"url" : "/oregon-staging/6051921418418893.jobs/sql/extended/results_2026-05-22T08%3A01%3A46Z_6806e0db-c251-4d16-a4f6-5a9838e635f4?[REDACTED]X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260521T070146Z&X-Amz-SignedHeaders=host&X-Amz-Expires=899&[REDACTED]X-Amz-Signature=be8133042693d2480c82e478902f423b3faf751a9e20a7c90adbcb0e455fa7f4",
66
"method" : "GET"
77
},
88
"response" : {
@@ -12,14 +12,14 @@
1212
"Accept-Ranges" : "bytes",
1313
"Server" : "AmazonS3",
1414
"ETag" : "\"1a6d0b3122d415a1fb23e1c4ead56095\"",
15-
"Last-Modified" : "Wed, 01 Apr 2026 09:53:26 GMT",
16-
"x-amz-request-id" : "38F48Z9JR3BR6GAK",
15+
"Last-Modified" : "Thu, 21 May 2026 07:01:47 GMT",
16+
"x-amz-request-id" : "XNZWBPKWAG584G1R",
1717
"x-amz-server-side-encryption" : "AES256",
18-
"x-amz-id-2" : "Xy+CqtOo2rMGa5DWL+CP+OX5fl5U3iXA4wH7dfw08y+ceIbztdvT+RLkD5+DNOC4GJE3AyIVpej31lXbvxqTzA==",
19-
"Date" : "Wed, 01 Apr 2026 09:53:27 GMT",
18+
"x-amz-id-2" : "g+F0EKZvcx943cyouYCX2aXuCUhsPnSjPRSLpOjx2FMfgnyfE+qUuOJ+cpgXDgR5Uj90pzo4cd+oxtRuSPGn+Co38yDyGdsJHjV6mPaa08w=",
19+
"Date" : "Thu, 21 May 2026 07:01:48 GMT",
2020
"Content-Type" : "binary/octet-stream"
2121
}
2222
},
23-
"uuid" : "cb0b5fa3-dfa8-46b8-9be0-01e1ae0648dc",
24-
"insertionIndex" : 55
23+
"uuid" : "8ee1f363-3bee-406e-a394-72f585a9df87",
24+
"insertionIndex" : 1
2525
}

src/test/resources/sqlexecapi/preparedstatementintegrationtests/testsetdate/mappings/api_2.0_sql_sessions-5b2c6dbf-7d64-4bca-8345-e18704b53897.json renamed to src/test/resources/sqlexecapi/preparedstatementintegrationtests/testsetdate/mappings/api_2.0_sql_sessions-aa50f15a-4d8e-4743-a77f-16a93192c130.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"id" : "5b2c6dbf-7d64-4bca-8345-e18704b53897",
2+
"id" : "aa50f15a-4d8e-4743-a77f-16a93192c130",
33
"name" : "api_2.0_sql_sessions",
44
"request" : {
55
"url" : "/api/2.0/sql/sessions/",
@@ -12,10 +12,10 @@
1212
},
1313
"response" : {
1414
"status" : 200,
15-
"body" : "{\"session_id\":\"01f12db0-9a0c-1c70-8018-15f759e4fa26\"}",
15+
"body" : "{\"session_id\":\"01f154e2-e74b-131e-bdf5-198f31c91ac6\"}",
1616
"headers" : {
17-
"x-request-id" : "ddec4137-21e7-43d1-918f-44e6fddd4a03",
18-
"date" : "Wed, 1 Apr 2026 09:53:14 GMT",
17+
"x-request-id" : "234c72fa-3b8c-4315-b634-63852d86970e",
18+
"date" : "Thu, 21 May 2026 07:01:34 GMT",
1919
"server" : "databricks",
2020
"x-databricks-popp-response-code-details" : "via_upstream",
2121
"x-databricks-shard-debug" : "oregon-staging",
@@ -28,11 +28,11 @@
2828
"x-content-type-options" : "nosniff",
2929
"x-databricks-popp-routing-reason" : "deployment-name",
3030
"content-type" : "application/json",
31-
"server-timing" : "request_id;dur=0;desc=\"ddec4137-21e7-43d1-918f-44e6fddd4a03\", client_protocol;dur=0;desc=\"HTTP/1.1\"",
31+
"server-timing" : "request_id;dur=0;desc=\"234c72fa-3b8c-4315-b634-63852d86970e\", client_protocol;dur=0;desc=\"HTTP/1.1\"",
3232
"alt-svc" : "h3=\":443\"; ma=86400, h3-29=\":443\"; ma=86400",
3333
"x-databricks-apiproxy-response-code-details" : "via_upstream"
3434
}
3535
},
36-
"uuid" : "5b2c6dbf-7d64-4bca-8345-e18704b53897",
37-
"insertionIndex" : 270
36+
"uuid" : "aa50f15a-4d8e-4743-a77f-16a93192c130",
37+
"insertionIndex" : 12
3838
}

src/test/resources/sqlexecapi/preparedstatementintegrationtests/testsetdate/mappings/api_2.0_sql_sessions_01f12db0-9a0c-1c70-8018-15f759e4fa26-c61ce7a4-a509-435d-bf50-008299f038d1.json

Lines changed: 0 additions & 32 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"id" : "556a4680-b415-45e9-95b1-dc28f4eee66d",
3+
"name" : "api_2.0_sql_sessions_01f154e2-e74b-131e-bdf5-198f31c91ac6",
4+
"request" : {
5+
"url" : "/api/2.0/sql/sessions/01f154e2-e74b-131e-bdf5-198f31c91ac6?warehouse_id=dd43ee29fedd958d",
6+
"method" : "DELETE"
7+
},
8+
"response" : {
9+
"status" : 200,
10+
"body" : "{}",
11+
"headers" : {
12+
"x-request-id" : "7049869f-419e-468a-a9a0-091637df605c",
13+
"date" : "Thu, 21 May 2026 07:01:53 GMT",
14+
"server" : "databricks",
15+
"x-databricks-popp-response-code-details" : "via_upstream",
16+
"x-databricks-shard-debug" : "oregon-staging",
17+
"x-databricks-popp-fast-path-routing-reason" : "not_eligible",
18+
"x-databricks-popp-shadow-routing-reason" : "spog-domain-checker-false",
19+
"x-databricks-upstream-cluster" : "oregon-staging-h2",
20+
"x-databricks-org-id" : "6051921418418893",
21+
"strict-transport-security" : "max-age=31536000; includeSubDomains; preload",
22+
"x-content-type-options" : "nosniff",
23+
"x-databricks-popp-routing-reason" : "deployment-name",
24+
"content-type" : "application/json",
25+
"server-timing" : "request_id;dur=0;desc=\"7049869f-419e-468a-a9a0-091637df605c\", client_protocol;dur=0;desc=\"HTTP/1.1\"",
26+
"alt-svc" : "h3=\":443\"; ma=86400, h3-29=\":443\"; ma=86400",
27+
"x-databricks-apiproxy-response-code-details" : "via_upstream"
28+
}
29+
},
30+
"uuid" : "556a4680-b415-45e9-95b1-dc28f4eee66d",
31+
"insertionIndex" : 1
32+
}

src/test/resources/sqlexecapi/preparedstatementintegrationtests/testsetdate/mappings/api_2.0_sql_statements-4252be7f-1989-48e8-8cc3-dbabe6fa240f.json renamed to src/test/resources/sqlexecapi/preparedstatementintegrationtests/testsetdate/mappings/api_2.0_sql_statements-315e2e55-3317-47de-b774-11cbe61ebd7f.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
{
2-
"id" : "4252be7f-1989-48e8-8cc3-dbabe6fa240f",
2+
"id" : "315e2e55-3317-47de-b774-11cbe61ebd7f",
33
"name" : "api_2.0_sql_statements",
44
"request" : {
55
"url" : "/api/2.0/sql/statements/",
66
"method" : "POST",
77
"bodyPatterns" : [ {
8-
"equalToJson" : "{\"statement\":\"DROP TABLE IF EXISTS main.jdbc_test_schema.pstmt_set_date_table\",\"warehouse_id\":\"dd43ee29fedd958d\",\"session_id\":\"01f12db0-9a0c-1c70-8018-15f759e4fa26\",\"disposition\":\"EXTERNAL_LINKS\",\"format\":\"ARROW_STREAM\",\"on_wait_timeout\":\"CONTINUE\",\"parameters\":[],\"result_compression\":\"LZ4_FRAME\"}",
8+
"equalToJson" : "{\"statement\":\"DROP TABLE IF EXISTS main.jdbc_test_schema.pstmt_set_date_table\",\"warehouse_id\":\"dd43ee29fedd958d\",\"session_id\":\"01f154e2-e74b-131e-bdf5-198f31c91ac6\",\"disposition\":\"EXTERNAL_LINKS\",\"format\":\"ARROW_STREAM\",\"on_wait_timeout\":\"CONTINUE\",\"parameters\":[],\"result_compression\":\"LZ4_FRAME\"}",
99
"ignoreArrayOrder" : true,
1010
"ignoreExtraElements" : true
1111
} ]
1212
},
1313
"response" : {
1414
"status" : 200,
15-
"body" : "{\"statement_id\":\"01f12db0-a1a7-1150-9093-999d8fb5bb51\",\"status\":{\"state\":\"SUCCEEDED\"},\"manifest\":{\"format\":\"ARROW_STREAM\",\"schema\":{\"column_count\":0},\"total_chunk_count\":0,\"total_row_count\":0,\"total_byte_count\":0,\"truncated\":false,\"result_compression\":\"LZ4_FRAME\"},\"result\":{}}",
15+
"body" : "{\"statement_id\":\"01f154e2-effd-1ee4-b7ed-c3dbff3813dd\",\"status\":{\"state\":\"SUCCEEDED\"},\"manifest\":{\"format\":\"ARROW_STREAM\",\"schema\":{\"column_count\":0},\"total_chunk_count\":0,\"total_row_count\":0,\"total_byte_count\":0,\"truncated\":false,\"result_compression\":\"LZ4_FRAME\"},\"result\":{}}",
1616
"headers" : {
17-
"x-request-id" : "57186fbf-edd2-405e-9b7b-eed18b900d52",
18-
"date" : "Wed, 1 Apr 2026 09:53:28 GMT",
17+
"x-request-id" : "fa22d8c4-6862-4a87-8d44-f991cb658e05",
18+
"date" : "Thu, 21 May 2026 07:01:49 GMT",
1919
"server" : "databricks",
2020
"x-databricks-popp-response-code-details" : "via_upstream",
2121
"x-databricks-shard-debug" : "oregon-staging",
@@ -28,13 +28,13 @@
2828
"x-content-type-options" : "nosniff",
2929
"x-databricks-popp-routing-reason" : "deployment-name",
3030
"content-type" : "application/json",
31-
"server-timing" : "request_id;dur=0;desc=\"57186fbf-edd2-405e-9b7b-eed18b900d52\", client_protocol;dur=0;desc=\"HTTP/1.1\"",
31+
"server-timing" : "request_id;dur=0;desc=\"fa22d8c4-6862-4a87-8d44-f991cb658e05\", client_protocol;dur=0;desc=\"HTTP/1.1\"",
3232
"alt-svc" : "h3=\":443\"; ma=86400, h3-29=\":443\"; ma=86400",
3333
"x-databricks-apiproxy-response-code-details" : "via_upstream"
3434
}
3535
},
36-
"uuid" : "4252be7f-1989-48e8-8cc3-dbabe6fa240f",
36+
"uuid" : "315e2e55-3317-47de-b774-11cbe61ebd7f",
3737
"scenarioName" : "scenario-1-api-2.0-sql-statements",
3838
"requiredScenarioState" : "scenario-1-api-2.0-sql-statements-2",
39-
"insertionIndex" : 264
39+
"insertionIndex" : 5
4040
}

0 commit comments

Comments
 (0)