Skip to content

Commit 12348a6

Browse files
committed
add date/time handling in setObject
1 parent defb44a commit 12348a6

3 files changed

Lines changed: 108 additions & 14 deletions

File tree

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcTypeMappings.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@
2828
import java.sql.Time;
2929
import java.sql.Timestamp;
3030
import java.sql.Types;
31+
import java.time.Instant;
32+
import java.time.LocalDate;
33+
import java.time.LocalDateTime;
34+
import java.time.LocalTime;
35+
import java.time.OffsetDateTime;
36+
import java.time.ZonedDateTime;
3137
import java.util.AbstractMap.SimpleEntry;
3238
import java.util.Map;
3339

@@ -117,11 +123,15 @@ static StandardSQLTypeName classToType(Class type)
117123
return StandardSQLTypeName.FLOAT64;
118124
} else if (BigDecimal.class.isAssignableFrom(type)) {
119125
return StandardSQLTypeName.NUMERIC;
120-
} else if (Date.class.isAssignableFrom(type)) {
126+
} else if (Date.class.isAssignableFrom(type) || LocalDate.class.isAssignableFrom(type)) {
121127
return StandardSQLTypeName.DATE;
122-
} else if (Timestamp.class.isAssignableFrom(type)) {
128+
} else if (Timestamp.class.isAssignableFrom(type)
129+
|| LocalDateTime.class.isAssignableFrom(type)
130+
|| OffsetDateTime.class.isAssignableFrom(type)
131+
|| Instant.class.isAssignableFrom(type)
132+
|| ZonedDateTime.class.isAssignableFrom(type)) {
123133
return StandardSQLTypeName.TIMESTAMP;
124-
} else if (Time.class.isAssignableFrom(type)) {
134+
} else if (Time.class.isAssignableFrom(type) || LocalTime.class.isAssignableFrom(type)) {
125135
return StandardSQLTypeName.TIME;
126136
} else if (JsonObject.class.isAssignableFrom(type)) {
127137
return StandardSQLTypeName.JSON;

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
import java.sql.Time;
5858
import java.sql.Timestamp;
5959
import java.sql.Types;
60+
import java.time.Instant;
61+
import java.time.LocalDate;
62+
import java.time.LocalDateTime;
63+
import java.time.LocalTime;
64+
import java.time.OffsetDateTime;
65+
import java.time.ZonedDateTime;
6066
import java.util.ArrayList;
6167
import java.util.Arrays;
6268
import java.util.Calendar;
@@ -230,6 +236,30 @@ public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQ
230236
setNull(parameterIndex, targetSqlType);
231237
return;
232238
}
239+
if (x instanceof LocalDate) {
240+
setDate(parameterIndex, Date.valueOf((LocalDate) x));
241+
return;
242+
}
243+
if (x instanceof LocalTime) {
244+
setTime(parameterIndex, Time.valueOf((LocalTime) x));
245+
return;
246+
}
247+
if (x instanceof LocalDateTime) {
248+
setTimestamp(parameterIndex, Timestamp.valueOf((LocalDateTime) x));
249+
return;
250+
}
251+
if (x instanceof OffsetDateTime) {
252+
setTimestamp(parameterIndex, Timestamp.from(((OffsetDateTime) x).toInstant()));
253+
return;
254+
}
255+
if (x instanceof Instant) {
256+
setTimestamp(parameterIndex, Timestamp.from((Instant) x));
257+
return;
258+
}
259+
if (x instanceof ZonedDateTime) {
260+
setTimestamp(parameterIndex, Timestamp.from(((ZonedDateTime) x).toInstant()));
261+
return;
262+
}
233263
Class<?> javaType = BigQueryJdbcTypeMappings.getJavaType(targetSqlType);
234264
this.parameterHandler.setParameter(parameterIndex, x, javaType);
235265
}
@@ -241,6 +271,30 @@ public void setObject(int parameterIndex, Object x) throws SQLException {
241271
setNull(parameterIndex, Types.NULL);
242272
return;
243273
}
274+
if (x instanceof LocalDate) {
275+
setDate(parameterIndex, Date.valueOf((LocalDate) x));
276+
return;
277+
}
278+
if (x instanceof LocalTime) {
279+
setTime(parameterIndex, Time.valueOf((LocalTime) x));
280+
return;
281+
}
282+
if (x instanceof LocalDateTime) {
283+
setTimestamp(parameterIndex, Timestamp.valueOf((LocalDateTime) x));
284+
return;
285+
}
286+
if (x instanceof OffsetDateTime) {
287+
setTimestamp(parameterIndex, Timestamp.from(((OffsetDateTime) x).toInstant()));
288+
return;
289+
}
290+
if (x instanceof Instant) {
291+
setTimestamp(parameterIndex, Timestamp.from((Instant) x));
292+
return;
293+
}
294+
if (x instanceof ZonedDateTime) {
295+
setTimestamp(parameterIndex, Timestamp.from(((ZonedDateTime) x).toInstant()));
296+
return;
297+
}
244298
this.parameterHandler.setParameter(parameterIndex, x, x.getClass());
245299
}
246300

java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatementSettersTest.java

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,19 @@
2727
import com.google.cloud.bigquery.Schema;
2828
import com.google.cloud.bigquery.StandardSQLTypeName;
2929
import java.sql.Array;
30+
import java.sql.Date;
31+
import java.sql.ParameterMetaData;
3032
import java.sql.ResultSetMetaData;
33+
import java.sql.SQLException;
34+
import java.sql.Time;
35+
import java.sql.Timestamp;
3136
import java.sql.Types;
37+
import java.time.Instant;
38+
import java.time.LocalDate;
39+
import java.time.LocalDateTime;
40+
import java.time.LocalTime;
41+
import java.util.Calendar;
42+
import java.util.TimeZone;
3243
import org.junit.jupiter.api.BeforeEach;
3344
import org.junit.jupiter.api.Test;
3445

@@ -148,7 +159,7 @@ public void testGetParameterMetaData() throws Exception {
148159
preparedStatement.setString(1, "test");
149160
preparedStatement.setInt(2, 42);
150161

151-
java.sql.ParameterMetaData metaData = preparedStatement.getParameterMetaData();
162+
ParameterMetaData metaData = preparedStatement.getParameterMetaData();
152163
assertEquals(5, metaData.getParameterCount());
153164
assertEquals(Types.NVARCHAR, metaData.getParameterType(1));
154165
assertEquals("STRING", metaData.getParameterTypeName(1));
@@ -158,35 +169,35 @@ public void testGetParameterMetaData() throws Exception {
158169
assertEquals("INT64", metaData.getParameterTypeName(2));
159170
assertEquals(Long.class.getName(), metaData.getParameterClassName(2));
160171

161-
assertEquals(java.sql.ParameterMetaData.parameterNullable, metaData.isNullable(1));
162-
assertEquals(java.sql.ParameterMetaData.parameterModeIn, metaData.getParameterMode(1));
172+
assertEquals(ParameterMetaData.parameterNullable, metaData.isNullable(1));
173+
assertEquals(ParameterMetaData.parameterModeIn, metaData.getParameterMode(1));
163174

164-
assertThrows(java.sql.SQLException.class, () -> metaData.getParameterType(0));
165-
assertThrows(java.sql.SQLException.class, () -> metaData.getParameterType(6));
175+
assertThrows(SQLException.class, () -> metaData.getParameterType(0));
176+
assertThrows(SQLException.class, () -> metaData.getParameterType(6));
166177
}
167178

168179
@Test
169180
public void testSetDateWithCalendar() throws Exception {
170-
java.util.Calendar cal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC"));
171-
java.sql.Date date = new java.sql.Date(1700000000000L); // 2023-11-14
181+
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
182+
Date date = new Date(1700000000000L); // 2023-11-14
172183

173184
preparedStatement.setDate(1, date, cal);
174185
assertEquals(String.class, preparedStatement.parameterHandler.getType(1));
175186
}
176187

177188
@Test
178189
public void testSetTimeWithCalendar() throws Exception {
179-
java.util.Calendar cal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC"));
180-
java.sql.Time time = new java.sql.Time(43200000L); // 12:00:00
190+
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
191+
Time time = new Time(43200000L); // 12:00:00
181192

182193
preparedStatement.setTime(1, time, cal);
183194
assertEquals(String.class, preparedStatement.parameterHandler.getType(1));
184195
}
185196

186197
@Test
187198
public void testSetTimestampWithCalendar() throws Exception {
188-
java.util.Calendar cal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC"));
189-
java.sql.Timestamp ts = new java.sql.Timestamp(1700000000000L);
199+
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
200+
Timestamp ts = new Timestamp(1700000000000L);
190201

191202
preparedStatement.setTimestamp(1, ts, cal);
192203
assertEquals(String.class, preparedStatement.parameterHandler.getType(1));
@@ -211,4 +222,23 @@ public void testGetMetaData() throws Exception {
211222
assertEquals("col2", metaData.getColumnName(2));
212223
assertEquals(Types.BIGINT, metaData.getColumnType(2));
213224
}
225+
226+
@Test
227+
public void testSetObjectWithJavaTime() throws Exception {
228+
LocalDate localDate = LocalDate.of(2025, 12, 3);
229+
preparedStatement.setObject(1, localDate);
230+
assertEquals(String.class, preparedStatement.parameterHandler.getType(1));
231+
232+
LocalTime localTime = LocalTime.of(12, 30, 0);
233+
preparedStatement.setObject(2, localTime);
234+
assertEquals(String.class, preparedStatement.parameterHandler.getType(2));
235+
236+
LocalDateTime localDateTime = LocalDateTime.of(2025, 12, 3, 12, 30, 0);
237+
preparedStatement.setObject(3, localDateTime);
238+
assertEquals(String.class, preparedStatement.parameterHandler.getType(3));
239+
240+
Instant instant = Instant.now();
241+
preparedStatement.setObject(4, instant);
242+
assertEquals(String.class, preparedStatement.parameterHandler.getType(4));
243+
}
214244
}

0 commit comments

Comments
 (0)