Skip to content

Commit e978e05

Browse files
committed
Handle NULL in ResultSet's getDate() method (#50184)
(cherry picked from commit 08214eb)
1 parent 32a068c commit e978e05

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

x-pack/plugin/sql/jdbc/src/main/java/org/elasticsearch/xpack/sql/jdbc/JdbcResultSet.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,11 @@ public Date getDate(String columnLabel) throws SQLException {
259259
private Long dateTimeAsMillis(int columnIndex) throws SQLException {
260260
Object val = column(columnIndex);
261261
EsType type = columnType(columnIndex);
262+
263+
if (val == null) {
264+
return null;
265+
}
266+
262267
try {
263268
// TODO: the B6 appendix of the jdbc spec does mention CHAR, VARCHAR, LONGVARCHAR, DATE, TIMESTAMP as supported
264269
// jdbc types that should be handled by getDate and getTime methods. From all of those we support VARCHAR and
@@ -267,9 +272,6 @@ private Long dateTimeAsMillis(int columnIndex) throws SQLException {
267272
// the cursor can return an Integer if the date-since-epoch is small enough, XContentParser (Jackson) will
268273
// return the "smallest" data type for numbers when parsing
269274
// TODO: this should probably be handled server side
270-
if (val == null) {
271-
return null;
272-
}
273275
return asDateTimeField(val, JdbcDateUtils::dateTimeAsMillisSinceEpoch, Function.identity());
274276
}
275277
if (DATE == type) {
@@ -278,7 +280,7 @@ private Long dateTimeAsMillis(int columnIndex) throws SQLException {
278280
if (TIME == type) {
279281
return timeAsMillisSinceEpoch(val.toString());
280282
}
281-
return val == null ? null : (Long) val;
283+
return (Long) val;
282284
} catch (ClassCastException cce) {
283285
throw new SQLException(
284286
format(Locale.ROOT, "Unable to convert value [%.128s] of type [%s] to a Long", val, type.getName()), cce);

x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/jdbc/ResultSetTestCase.java

+52
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,54 @@ public void testValidGetObjectCalls() throws Exception {
12751275
assertTrue(results.getObject("test_boolean") instanceof Boolean);
12761276
});
12771277
}
1278+
1279+
public void testGettingNullValues() throws Exception {
1280+
String query = "SELECT CAST(NULL AS BOOLEAN) b, CAST(NULL AS TINYINT) t, CAST(NULL AS SMALLINT) s, CAST(NULL AS INTEGER) i,"
1281+
+ "CAST(NULL AS BIGINT) bi, CAST(NULL AS DOUBLE) d, CAST(NULL AS REAL) r, CAST(NULL AS FLOAT) f, CAST(NULL AS VARCHAR) v,"
1282+
+ "CAST(NULL AS DATE) dt, CAST(NULL AS TIME) tm, CAST(NULL AS TIMESTAMP) ts";
1283+
doWithQuery(query, (results) -> {
1284+
results.next();
1285+
1286+
assertNull(results.getObject("b"));
1287+
assertFalse(results.getBoolean("b"));
1288+
1289+
assertNull(results.getObject("t"));
1290+
assertEquals(0, results.getByte("t"));
1291+
1292+
assertNull(results.getObject("s"));
1293+
assertEquals(0, results.getShort("s"));
1294+
1295+
assertNull(results.getObject("i"));
1296+
assertEquals(0, results.getInt("i"));
1297+
1298+
assertNull(results.getObject("bi"));
1299+
assertEquals(0, results.getLong("bi"));
1300+
1301+
assertNull(results.getObject("d"));
1302+
assertEquals(0.0d, results.getDouble("d"), 0d);
1303+
1304+
assertNull(results.getObject("r"));
1305+
assertEquals(0.0f, results.getFloat("r"), 0f);
1306+
1307+
assertNull(results.getObject("f"));
1308+
assertEquals(0.0f, results.getFloat("f"), 0f);
1309+
1310+
assertNull(results.getObject("v"));
1311+
assertNull(results.getString("v"));
1312+
1313+
assertNull(results.getObject("dt"));
1314+
assertNull(results.getDate("dt"));
1315+
assertNull(results.getDate("dt", randomCalendar()));
1316+
1317+
assertNull(results.getObject("tm"));
1318+
assertNull(results.getTime("tm"));
1319+
assertNull(results.getTime("tm", randomCalendar()));
1320+
1321+
assertNull(results.getObject("ts"));
1322+
assertNull(results.getTimestamp("ts"));
1323+
assertNull(results.getTimestamp("ts", randomCalendar()));
1324+
});
1325+
}
12781326

12791327
/*
12801328
* Checks StackOverflowError fix for https://github.com/elastic/elasticsearch/pull/31735
@@ -1841,4 +1889,8 @@ private String asDateString(long millis) {
18411889
private ZoneId getZoneFromOffset(Long randomLongDate) {
18421890
return ZoneId.of(ZoneId.of(timeZoneId).getRules().getOffset(Instant.ofEpochMilli(randomLongDate)).toString());
18431891
}
1892+
1893+
private Calendar randomCalendar() {
1894+
return Calendar.getInstance(randomTimeZone(), Locale.ROOT);
1895+
}
18441896
}

0 commit comments

Comments
 (0)