From 0ffaa7fecf77d8401191a8394159a3c9d4dfa5d0 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Mon, 12 Oct 2026 16:45:43 +0000 Subject: [PATCH 1/3] fix(bigquery-jdbc): preserve `Timestamp` instant in `PreparedStatement` and `CallableStatement` Calendar overloads --- .../jdbc/BigQueryCallableStatement.java | 13 +--- .../jdbc/BigQueryPreparedStatement.java | 3 +- .../jdbc/BigQueryTemporalUtility.java | 20 ------- .../jdbc/BigQueryCallableStatementTest.java | 59 ++++++++++++------- .../BigQueryPreparedStatementSettersTest.java | 23 +++++--- .../jdbc/BigQueryTemporalUtilityTest.java | 25 -------- .../jdbc/it/ITCallableStatementTest.java | 22 ++++--- 7 files changed, 73 insertions(+), 92 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatement.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatement.java index 51599c154cf6..f4a7e41f4d24 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatement.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatement.java @@ -480,14 +480,12 @@ public Timestamp getTimestamp(String parameterName) throws SQLException { @Override public Timestamp getTimestamp(int parameterIndex, Calendar calendar) throws SQLException { - Timestamp ts = getTimestamp(parameterIndex); - return BigQueryTemporalUtility.convertTimestampWithCalendar(ts, calendar); + return getTimestamp(parameterIndex); } @Override public Timestamp getTimestamp(String parameterName, Calendar calendar) throws SQLException { - Timestamp ts = getTimestamp(parameterName); - return BigQueryTemporalUtility.convertTimestampWithCalendar(ts, calendar); + return getTimestamp(parameterName); } @Override @@ -877,12 +875,7 @@ public void setTimestamp(String parameterName, Timestamp value) throws SQLExcept public void setTimestamp(String parameterName, Timestamp value, Calendar calendar) throws SQLException { checkClosed(); - this.parameterHandler.setParameter( - parameterName, - BigQueryTemporalUtility.convertTimestampWithCalendar(value, calendar), - Timestamp.class, - BigQueryStatementParameterType.IN, - 0); + setTimestamp(parameterName, value); } @Override diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java index 118161f55f44..5227796a7bf0 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java @@ -644,8 +644,7 @@ public void setTime(int parameterIndex, Time value, Calendar calendar) throws SQ public void setTimestamp(int parameterIndex, Timestamp value, Calendar calendar) throws SQLException { checkClosed(); - setTimestamp( - parameterIndex, BigQueryTemporalUtility.convertTimestampWithCalendar(value, calendar)); + setTimestamp(parameterIndex, value); } @Override diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtility.java index 4d4771621936..2d3dddd3d38e 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtility.java @@ -478,24 +478,4 @@ static Time convertTimeWithCalendar(Time time, Calendar cal) { targetCal.set(Calendar.MILLISECOND, defaultCal.get(Calendar.MILLISECOND)); return new Time(targetCal.getTimeInMillis()); } - - /** - * Converts a java.sql.Timestamp by shifting its wall-clock fields into the target Calendar's - * timezone per JDBC specification while preserving nanosecond precision. - */ - static Timestamp convertTimestampWithCalendar(Timestamp timestamp, Calendar cal) { - if (timestamp == null || cal == null) { - return timestamp; - } - ZoneId systemZone = ZoneId.systemDefault(); - ZoneId targetZone = cal.getTimeZone().toZoneId(); - if (systemZone.equals(targetZone)) { - return timestamp; - } - LocalDateTime ldt = timestamp.toLocalDateTime(); - ZonedDateTime zdt = ldt.atZone(targetZone); - Timestamp adjustedTimestamp = Timestamp.from(zdt.toInstant()); - adjustedTimestamp.setNanos(timestamp.getNanos()); - return adjustedTimestamp; - } } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java index bfe907b934f4..41a847bde473 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java @@ -33,6 +33,7 @@ import java.util.Calendar; import java.util.HashMap; import java.util.Map; +import java.util.TimeZone; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -825,12 +826,18 @@ public void testGetTimestampParamWithCalByIndex() throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); - Calendar cal = Calendar.getInstance(); - Timestamp expected = new Timestamp(cal.getTimeInMillis()); + TimeZone originalJvmZone = TimeZone.getDefault(); + TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); + try { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); + Timestamp expected = new Timestamp(1700000000000L); - statement.getParameterHandler().setParameter(1, expected, Timestamp.class); - Timestamp actual = statement.getTimestamp(1, cal); - assertEquals(expected, actual); + statement.getParameterHandler().setParameter(1, expected, Timestamp.class); + Timestamp actual = statement.getTimestamp(1, cal); + assertEquals(expected, actual); + } finally { + TimeZone.setDefault(originalJvmZone); + } } @Test @@ -838,15 +845,21 @@ public void testGetTimestampParamWithCalByName() throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); - Calendar cal = Calendar.getInstance(); - Timestamp expected = new Timestamp(cal.getTimeInMillis()); + TimeZone originalJvmZone = TimeZone.getDefault(); + TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); + try { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); + Timestamp expected = new Timestamp(1700000000000L); - statement - .getParameterHandler() - .setParameter( - GET_PARAM_KEY, expected, Timestamp.class, BigQueryStatementParameterType.IN, 0); - Timestamp actual = statement.getTimestamp(GET_PARAM_KEY, cal); - assertEquals(expected, actual); + statement + .getParameterHandler() + .setParameter( + GET_PARAM_KEY, expected, Timestamp.class, BigQueryStatementParameterType.IN, 0); + Timestamp actual = statement.getTimestamp(GET_PARAM_KEY, cal); + assertEquals(expected, actual); + } finally { + TimeZone.setDefault(originalJvmZone); + } } @Test @@ -1055,14 +1068,20 @@ public void testSetTimestampCalParamByName() throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); - Timestamp expectedTimestamp = Timestamp.valueOf("2026-07-17 12:34:56.789"); - Calendar expectedCal = Calendar.getInstance(); + TimeZone originalJvmZone = TimeZone.getDefault(); + TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); + try { + Timestamp expectedTimestamp = new Timestamp(1700000000000L); + Calendar expectedCal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); - statement.setTimestamp(PARAM_KEY, expectedTimestamp, expectedCal); - Timestamp actual = statement.getTimestamp(PARAM_KEY); - assertNotNull(actual); - actual = statement.getTimestamp(PARAM_KEY, expectedCal); - assertNotNull(actual); + statement.setTimestamp(PARAM_KEY, expectedTimestamp, expectedCal); + Timestamp actual = statement.getTimestamp(PARAM_KEY); + assertEquals(expectedTimestamp, actual); + actual = statement.getTimestamp(PARAM_KEY, expectedCal); + assertEquals(expectedTimestamp, actual); + } finally { + TimeZone.setDefault(originalJvmZone); + } } ////////// Private helper methods //////////////////////// diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java index 204b92041f7b..79371ecbc4e4 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java @@ -236,14 +236,21 @@ public void testSetTimeWithCalendar() throws Exception { @Test public void testSetTimestampWithCalendar() throws Exception { - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - cal.setTimeInMillis(1000000L); - long originalMillis = cal.getTimeInMillis(); - Timestamp ts = new Timestamp(1700000000000L); - - preparedStatement.setTimestamp(1, ts, cal); - assertEquals(Timestamp.class, preparedStatement.parameterHandler.getType(1)); - assertEquals(originalMillis, cal.getTimeInMillis()); + TimeZone originalJvmZone = TimeZone.getDefault(); + TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); + try { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); + cal.setTimeInMillis(1000000L); + long originalMillis = cal.getTimeInMillis(); + Timestamp ts = new Timestamp(1700000000000L); + + preparedStatement.setTimestamp(1, ts, cal); + assertEquals(Timestamp.class, preparedStatement.parameterHandler.getType(1)); + assertEquals(ts, preparedStatement.parameterHandler.getParameter(1)); + assertEquals(originalMillis, cal.getTimeInMillis()); + } finally { + TimeZone.setDefault(originalJvmZone); + } } @Test diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtilityTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtilityTest.java index 4adf052b39e0..598ad57bfab9 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtilityTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryTemporalUtilityTest.java @@ -148,31 +148,6 @@ public void testConvertTimeWithCalendar() { assertThat(resultCal.get(Calendar.SECOND)).isEqualTo(45); } - @Test - public void testConvertTimestampWithCalendar() { - Timestamp ts = Timestamp.valueOf("2026-08-24 15:30:45.123456789"); - Calendar cal = Calendar.getInstance(); - - // Null checks - assertThat(BigQueryTemporalUtility.convertTimestampWithCalendar(null, cal)).isNull(); - assertThat(BigQueryTemporalUtility.convertTimestampWithCalendar(ts, null)).isSameInstanceAs(ts); - - // Same timezone fast-path - Calendar sameZoneCal = Calendar.getInstance(TimeZone.getDefault()); - assertThat(BigQueryTemporalUtility.convertTimestampWithCalendar(ts, sameZoneCal)) - .isSameInstanceAs(ts); - - // Different timezone preserves wall-clock shift and nanoseconds - Calendar tokyoCal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); - Timestamp result = BigQueryTemporalUtility.convertTimestampWithCalendar(ts, tokyoCal); - Instant expectedInstant = - LocalDateTime.of(2026, 8, 24, 15, 30, 45, 123456789) - .atZone(ZoneId.of("Asia/Tokyo")) - .toInstant(); - assertThat(result.getTime()).isEqualTo(expectedInstant.toEpochMilli()); - assertThat(result.getNanos()).isEqualTo(123456789); - } - @Test public void testBoxDateTimeAndDate() { Timestamp ts = diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java index 82f1b142838e..7aad6ee2572d 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java @@ -42,6 +42,7 @@ import java.util.Calendar; import java.util.Properties; import java.util.Random; +import java.util.TimeZone; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -446,13 +447,20 @@ public void testSetterGetterTimestamp() throws SQLException { @Test public void testSetterGetterTimestampCal() throws SQLException { - CallableStatement callableStatement = this.bigQueryConnection.prepareCall("call testProc('?')"); - assertNotNull(callableStatement); - Timestamp expected = new Timestamp(1L); - Calendar cal = Calendar.getInstance(); - callableStatement.setTimestamp(CALLABLE_STMT_PARAM_KEY, expected, cal); - Timestamp actual = callableStatement.getTimestamp(CALLABLE_STMT_PARAM_KEY, cal); - assertEquals(expected, actual); + TimeZone originalTz = TimeZone.getDefault(); + try { + TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); + CallableStatement callableStatement = + this.bigQueryConnection.prepareCall("call testProc('?')"); + assertNotNull(callableStatement); + Timestamp expected = new Timestamp(1700000000000L); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); + callableStatement.setTimestamp(CALLABLE_STMT_PARAM_KEY, expected, cal); + Timestamp actual = callableStatement.getTimestamp(CALLABLE_STMT_PARAM_KEY, cal); + assertEquals(expected, actual); + } finally { + TimeZone.setDefault(originalTz); + } } // Block B Tests From 64e24584dccda7e1072565a39baf36e707ed93dc Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Mon, 12 Oct 2026 17:08:37 +0000 Subject: [PATCH 2/3] update unit tests --- .../jdbc/BigQueryCallableStatementTest.java | 68 ++++++++----------- .../BigQueryPreparedStatementSettersTest.java | 28 ++++---- .../jdbc/it/ITCallableStatementTest.java | 25 +++---- 3 files changed, 53 insertions(+), 68 deletions(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java index 41a847bde473..9fdbafd40503 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java @@ -826,18 +826,12 @@ public void testGetTimestampParamWithCalByIndex() throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); - TimeZone originalJvmZone = TimeZone.getDefault(); - TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); - try { - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); - Timestamp expected = new Timestamp(1700000000000L); - - statement.getParameterHandler().setParameter(1, expected, Timestamp.class); - Timestamp actual = statement.getTimestamp(1, cal); - assertEquals(expected, actual); - } finally { - TimeZone.setDefault(originalJvmZone); - } + Calendar cal = getNonDefaultCalendar(); + Timestamp expected = new Timestamp(1700000000000L); + + statement.getParameterHandler().setParameter(1, expected, Timestamp.class); + Timestamp actual = statement.getTimestamp(1, cal); + assertEquals(expected, actual); } @Test @@ -845,21 +839,15 @@ public void testGetTimestampParamWithCalByName() throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); - TimeZone originalJvmZone = TimeZone.getDefault(); - TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); - try { - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); - Timestamp expected = new Timestamp(1700000000000L); + Calendar cal = getNonDefaultCalendar(); + Timestamp expected = new Timestamp(1700000000000L); - statement - .getParameterHandler() - .setParameter( - GET_PARAM_KEY, expected, Timestamp.class, BigQueryStatementParameterType.IN, 0); - Timestamp actual = statement.getTimestamp(GET_PARAM_KEY, cal); - assertEquals(expected, actual); - } finally { - TimeZone.setDefault(originalJvmZone); - } + statement + .getParameterHandler() + .setParameter( + GET_PARAM_KEY, expected, Timestamp.class, BigQueryStatementParameterType.IN, 0); + Timestamp actual = statement.getTimestamp(GET_PARAM_KEY, cal); + assertEquals(expected, actual); } @Test @@ -1068,23 +1056,25 @@ public void testSetTimestampCalParamByName() throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); - TimeZone originalJvmZone = TimeZone.getDefault(); - TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); - try { - Timestamp expectedTimestamp = new Timestamp(1700000000000L); - Calendar expectedCal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); + Timestamp expectedTimestamp = new Timestamp(1700000000000L); + Calendar expectedCal = getNonDefaultCalendar(); - statement.setTimestamp(PARAM_KEY, expectedTimestamp, expectedCal); - Timestamp actual = statement.getTimestamp(PARAM_KEY); - assertEquals(expectedTimestamp, actual); - actual = statement.getTimestamp(PARAM_KEY, expectedCal); - assertEquals(expectedTimestamp, actual); - } finally { - TimeZone.setDefault(originalJvmZone); - } + statement.setTimestamp(PARAM_KEY, expectedTimestamp, expectedCal); + Timestamp actual = statement.getTimestamp(PARAM_KEY); + assertEquals(expectedTimestamp, actual); + actual = statement.getTimestamp(PARAM_KEY, expectedCal); + assertEquals(expectedTimestamp, actual); } ////////// Private helper methods //////////////////////// + private static Calendar getNonDefaultCalendar() { + TimeZone testZone = + TimeZone.getDefault().hasSameRules(TimeZone.getTimeZone("Asia/Tokyo")) + ? TimeZone.getTimeZone("America/New_York") + : TimeZone.getTimeZone("Asia/Tokyo"); + return Calendar.getInstance(testZone); + } + private void registerOutParamIndexHelper( int paramIndex, int javaSqlType, Class javaType, StandardSQLTypeName sqlType, int scale) throws SQLException { diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java index 79371ecbc4e4..aa6a4fe2df89 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java @@ -236,21 +236,19 @@ public void testSetTimeWithCalendar() throws Exception { @Test public void testSetTimestampWithCalendar() throws Exception { - TimeZone originalJvmZone = TimeZone.getDefault(); - TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); - try { - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); - cal.setTimeInMillis(1000000L); - long originalMillis = cal.getTimeInMillis(); - Timestamp ts = new Timestamp(1700000000000L); - - preparedStatement.setTimestamp(1, ts, cal); - assertEquals(Timestamp.class, preparedStatement.parameterHandler.getType(1)); - assertEquals(ts, preparedStatement.parameterHandler.getParameter(1)); - assertEquals(originalMillis, cal.getTimeInMillis()); - } finally { - TimeZone.setDefault(originalJvmZone); - } + TimeZone testZone = + TimeZone.getDefault().hasSameRules(TimeZone.getTimeZone("Asia/Tokyo")) + ? TimeZone.getTimeZone("America/New_York") + : TimeZone.getTimeZone("Asia/Tokyo"); + Calendar cal = Calendar.getInstance(testZone); + cal.setTimeInMillis(1000000L); + long originalMillis = cal.getTimeInMillis(); + Timestamp ts = new Timestamp(1700000000000L); + + preparedStatement.setTimestamp(1, ts, cal); + assertEquals(Timestamp.class, preparedStatement.parameterHandler.getType(1)); + assertEquals(ts, preparedStatement.parameterHandler.getParameter(1)); + assertEquals(originalMillis, cal.getTimeInMillis()); } @Test diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java index 7aad6ee2572d..a2a9ade169f7 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java @@ -447,20 +447,17 @@ public void testSetterGetterTimestamp() throws SQLException { @Test public void testSetterGetterTimestampCal() throws SQLException { - TimeZone originalTz = TimeZone.getDefault(); - try { - TimeZone.setDefault(TimeZone.getTimeZone("America/New_York")); - CallableStatement callableStatement = - this.bigQueryConnection.prepareCall("call testProc('?')"); - assertNotNull(callableStatement); - Timestamp expected = new Timestamp(1700000000000L); - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo")); - callableStatement.setTimestamp(CALLABLE_STMT_PARAM_KEY, expected, cal); - Timestamp actual = callableStatement.getTimestamp(CALLABLE_STMT_PARAM_KEY, cal); - assertEquals(expected, actual); - } finally { - TimeZone.setDefault(originalTz); - } + TimeZone testZone = + TimeZone.getDefault().hasSameRules(TimeZone.getTimeZone("Asia/Tokyo")) + ? TimeZone.getTimeZone("America/New_York") + : TimeZone.getTimeZone("Asia/Tokyo"); + CallableStatement callableStatement = this.bigQueryConnection.prepareCall("call testProc('?')"); + assertNotNull(callableStatement); + Timestamp expected = new Timestamp(1700000000000L); + Calendar cal = Calendar.getInstance(testZone); + callableStatement.setTimestamp(CALLABLE_STMT_PARAM_KEY, expected, cal); + Timestamp actual = callableStatement.getTimestamp(CALLABLE_STMT_PARAM_KEY, cal); + assertEquals(expected, actual); } // Block B Tests From 42299f018322b67718c9a1b69a351e2fc9042386 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Tue, 13 Oct 2026 13:15:50 +0000 Subject: [PATCH 3/3] address pr feedback --- .../jdbc/BigQueryCallableStatementTest.java | 30 +++++++++---------- .../BigQueryPreparedStatementSettersTest.java | 13 ++++---- .../jdbc/it/ITCallableStatementTest.java | 16 ---------- 3 files changed, 20 insertions(+), 39 deletions(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java index 9fdbafd40503..363d5973d8f4 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatementTest.java @@ -36,6 +36,8 @@ import java.util.TimeZone; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; public class BigQueryCallableStatementTest { @@ -821,12 +823,13 @@ public void testGetTimestampParamByName() throws SQLException { assertEquals(expected, actual); } - @Test - public void testGetTimestampParamWithCalByIndex() throws SQLException { + @ParameterizedTest + @ValueSource(strings = {"America/New_York", "Asia/Tokyo"}) + public void testGetTimestampParamWithCalByIndex(String zoneId) throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); - Calendar cal = getNonDefaultCalendar(); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(zoneId)); Timestamp expected = new Timestamp(1700000000000L); statement.getParameterHandler().setParameter(1, expected, Timestamp.class); @@ -834,12 +837,13 @@ public void testGetTimestampParamWithCalByIndex() throws SQLException { assertEquals(expected, actual); } - @Test - public void testGetTimestampParamWithCalByName() throws SQLException { + @ParameterizedTest + @ValueSource(strings = {"America/New_York", "Asia/Tokyo"}) + public void testGetTimestampParamWithCalByName(String zoneId) throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); - Calendar cal = getNonDefaultCalendar(); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(zoneId)); Timestamp expected = new Timestamp(1700000000000L); statement @@ -1051,13 +1055,14 @@ public void testSetTimestampParamByName() throws SQLException { assertEquals(expected, actual); } - @Test - public void testSetTimestampCalParamByName() throws SQLException { + @ParameterizedTest + @ValueSource(strings = {"America/New_York", "Asia/Tokyo"}) + public void testSetTimestampCalParamByName(String zoneId) throws SQLException { BigQueryCallableStatement statement = new BigQueryCallableStatement(bigQueryConnection, "call testProc('?')"); assertNotNull(statement); Timestamp expectedTimestamp = new Timestamp(1700000000000L); - Calendar expectedCal = getNonDefaultCalendar(); + Calendar expectedCal = Calendar.getInstance(TimeZone.getTimeZone(zoneId)); statement.setTimestamp(PARAM_KEY, expectedTimestamp, expectedCal); Timestamp actual = statement.getTimestamp(PARAM_KEY); @@ -1067,13 +1072,6 @@ public void testSetTimestampCalParamByName() throws SQLException { } ////////// Private helper methods //////////////////////// - private static Calendar getNonDefaultCalendar() { - TimeZone testZone = - TimeZone.getDefault().hasSameRules(TimeZone.getTimeZone("Asia/Tokyo")) - ? TimeZone.getTimeZone("America/New_York") - : TimeZone.getTimeZone("Asia/Tokyo"); - return Calendar.getInstance(testZone); - } private void registerOutParamIndexHelper( int paramIndex, int javaSqlType, Class javaType, StandardSQLTypeName sqlType, int scale) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java index aa6a4fe2df89..970a364c885b 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java @@ -53,6 +53,8 @@ import java.util.TimeZone; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; public class BigQueryPreparedStatementSettersTest { @@ -234,13 +236,10 @@ public void testSetTimeWithCalendar() throws Exception { assertEquals(originalMillis, cal.getTimeInMillis()); } - @Test - public void testSetTimestampWithCalendar() throws Exception { - TimeZone testZone = - TimeZone.getDefault().hasSameRules(TimeZone.getTimeZone("Asia/Tokyo")) - ? TimeZone.getTimeZone("America/New_York") - : TimeZone.getTimeZone("Asia/Tokyo"); - Calendar cal = Calendar.getInstance(testZone); + @ParameterizedTest + @ValueSource(strings = {"America/New_York", "Asia/Tokyo"}) + public void testSetTimestampWithCalendar(String zoneId) throws Exception { + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(zoneId)); cal.setTimeInMillis(1000000L); long originalMillis = cal.getTimeInMillis(); Timestamp ts = new Timestamp(1700000000000L); diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java index a2a9ade169f7..725167cc5660 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITCallableStatementTest.java @@ -42,7 +42,6 @@ import java.util.Calendar; import java.util.Properties; import java.util.Random; -import java.util.TimeZone; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -445,21 +444,6 @@ public void testSetterGetterTimestamp() throws SQLException { assertEquals(expected, actual); } - @Test - public void testSetterGetterTimestampCal() throws SQLException { - TimeZone testZone = - TimeZone.getDefault().hasSameRules(TimeZone.getTimeZone("Asia/Tokyo")) - ? TimeZone.getTimeZone("America/New_York") - : TimeZone.getTimeZone("Asia/Tokyo"); - CallableStatement callableStatement = this.bigQueryConnection.prepareCall("call testProc('?')"); - assertNotNull(callableStatement); - Timestamp expected = new Timestamp(1700000000000L); - Calendar cal = Calendar.getInstance(testZone); - callableStatement.setTimestamp(CALLABLE_STMT_PARAM_KEY, expected, cal); - Timestamp actual = callableStatement.getTimestamp(CALLABLE_STMT_PARAM_KEY, cal); - assertEquals(expected, actual); - } - // Block B Tests @Test public void testCallableStatementScriptExecuteUpdate() throws SQLException {