Skip to content

Commit 1912235

Browse files
committed
added reading date-time
1 parent ae60ace commit 1912235

File tree

4 files changed

+371
-142
lines changed

4 files changed

+371
-142
lines changed

jdbc-v2/src/main/java/com/clickhouse/jdbc/ConnectionImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ public void setDefaultQuerySettings(QuerySettings settings) {
130130
this.defaultQuerySettings = settings;
131131
}
132132

133+
public Calendar getDefaultCalendar() {
134+
return defaultCalendar;
135+
}
136+
133137
public String getServerVersion() throws SQLException {
134138
GenericRecord result = client.queryAll("SELECT version() as server_version").stream()
135139
.findFirst().orElseThrow(() -> new SQLException("Failed to retrieve server version.", ExceptionUtils.SQL_STATE_CLIENT_ERROR));

jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/DetachedResultSet.java

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
import java.sql.Statement;
2424
import java.sql.Time;
2525
import java.sql.Timestamp;
26+
import java.time.Instant;
27+
import java.time.LocalDate;
28+
import java.time.LocalDateTime;
29+
import java.time.LocalTime;
30+
import java.time.ZonedDateTime;
2631
import java.util.ArrayList;
2732
import java.util.Calendar;
2833
import java.util.Collection;
@@ -46,6 +51,8 @@ public class DetachedResultSet implements ResultSet, JdbcV2Wrapper {
4651

4752
private ResultSetMetaData metaData;
4853

54+
private final Calendar defaultCalendar;
55+
4956
private Map<String, Object> record;
5057

5158
private boolean wasNull;
@@ -58,10 +65,11 @@ public class DetachedResultSet implements ResultSet, JdbcV2Wrapper {
5865

5966
private Map<String, Integer> columnMap;
6067

61-
private DetachedResultSet(List<Map<String, Object>> records, ResultSetMetaData metaData) throws SQLException {
68+
private DetachedResultSet(List<Map<String, Object>> records, ResultSetMetaData metaData, Calendar defaultCalendar) throws SQLException {
6269
this.records = records;
6370
this.iterator = records.listIterator();
6471
this.metaData = metaData;
72+
this.defaultCalendar = defaultCalendar;
6573
this.wasNull = false;
6674
this.row = ResultSetImpl.BEFORE_FIRST;
6775
this.lastRow = records.size();
@@ -73,7 +81,7 @@ private DetachedResultSet(List<Map<String, Object>> records, ResultSetMetaData m
7381
}
7482
}
7583

76-
public static DetachedResultSet createFromResultSet(ResultSet resultSet, Collection<Consumer<Map<String, Object>>> mutators) throws SQLException {
84+
public static DetachedResultSet createFromResultSet(ResultSet resultSet, Calendar defaultCalendar, Collection<Consumer<Map<String, Object>>> mutators) throws SQLException {
7785
ResultSetMetaData metaData = resultSet.getMetaData();
7886
List<Map<String, Object>> records = new ArrayList<>();
7987
while (resultSet.next()) {
@@ -86,7 +94,7 @@ public static DetachedResultSet createFromResultSet(ResultSet resultSet, Collect
8694
}
8795
records.add(record);
8896
}
89-
return new DetachedResultSet(records, metaData);
97+
return new DetachedResultSet(records, metaData, defaultCalendar);
9098
}
9199

92100
@Override
@@ -263,19 +271,19 @@ public byte[] getBytes(String columnLabel) throws SQLException {
263271
@Override
264272
public Date getDate(String columnLabel) throws SQLException {
265273
ensureOpen();
266-
return getObject(columnLabel, Date.class);
274+
return getDate(columnLabel, defaultCalendar);
267275
}
268276

269277
@Override
270278
public Time getTime(String columnLabel) throws SQLException {
271279
ensureOpen();
272-
return getObject(columnLabel, Time.class);
280+
return getTime(columnLabel, defaultCalendar);
273281
}
274282

275283
@Override
276284
public Timestamp getTimestamp(String columnLabel) throws SQLException {
277285
ensureOpen();
278-
return getObject(columnLabel, Timestamp.class);
286+
return getTimestamp(columnLabel, defaultCalendar);
279287
}
280288

281289
@Override
@@ -783,7 +791,19 @@ public Date getDate(int columnIndex, Calendar cal) throws SQLException {
783791
@Override
784792
public Date getDate(String columnLabel, Calendar cal) throws SQLException {
785793
ensureOpen();
786-
return null;
794+
try {
795+
Date date = getObject(columnLabel, Date.class);
796+
if (date != null) {
797+
Calendar c = (Calendar) (cal != null ? cal : defaultCalendar).clone();
798+
c.clear();
799+
LocalDate ld = date.toLocalDate();
800+
c.set(ld.getYear(), ld.getMonthValue() - 1, ld.getDayOfMonth(), 0, 0, 0);
801+
date = new Date(c.getTimeInMillis());
802+
}
803+
return date;
804+
} catch (Exception e) {
805+
throw new SQLException(String.format("Method: getDate(\"%s\") encountered an exception.", columnLabel), e);
806+
}
787807
}
788808

789809
@Override
@@ -794,7 +814,19 @@ public Time getTime(int columnIndex, Calendar cal) throws SQLException {
794814
@Override
795815
public Time getTime(String columnLabel, Calendar cal) throws SQLException {
796816
ensureOpen();
797-
return null;
817+
try {
818+
Time time = getObject(columnLabel, Time.class);
819+
if (time != null) {
820+
Calendar c = (Calendar) (cal != null ? cal : defaultCalendar).clone();
821+
c.clear();
822+
LocalTime ld = time.toLocalTime();
823+
c.set(1970, Calendar.JANUARY, 1, ld.getHour(), ld.getMinute(), ld.getSecond());
824+
time = new Time(c.getTimeInMillis());
825+
}
826+
return time;
827+
} catch (Exception e) {
828+
throw new SQLException(String.format("Method: getTime(\"%s\") encountered an exception.", columnLabel), e);
829+
}
798830
}
799831

800832
@Override
@@ -805,7 +837,22 @@ public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException
805837
@Override
806838
public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException {
807839
ensureOpen();
808-
return null;
840+
try {
841+
Timestamp timestamp = getObject(columnLabel, Timestamp.class);
842+
if (timestamp != null) {
843+
Calendar c = (Calendar) (cal != null ? cal : defaultCalendar).clone();
844+
c.clear();
845+
LocalDateTime ldt = timestamp.toLocalDateTime();
846+
c.set(ldt.getYear(), ldt.getMonthValue() - 1, ldt.getDayOfMonth(), ldt.getHour(), ldt.getMinute(),
847+
ldt.getSecond());
848+
timestamp = new Timestamp(c.getTimeInMillis());
849+
timestamp.setNanos(ldt.getNano());
850+
return timestamp;
851+
}
852+
return timestamp;
853+
} catch (Exception e) {
854+
throw new SQLException(String.format("Method: getTimestamp(\"%s\") encountered an exception.", columnLabel), e);
855+
}
809856
}
810857

811858
@Override

jdbc-v2/src/main/java/com/clickhouse/jdbc/metadata/DatabaseMetaDataImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,7 @@ public ResultSet getColumns(String catalog, String schemaPattern, String tableNa
872872
" AND name LIKE " + SQLUtils.enquoteLiteral(columnNamePattern == null ? "%" : columnNamePattern) +
873873
" ORDER BY TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION";
874874
try (Statement statement = connection.createStatement(); ResultSet rs = statement.executeQuery(sql)) {
875-
return DetachedResultSet.createFromResultSet(rs, GET_COLUMNS_RS_MUTATORS);
875+
return DetachedResultSet.createFromResultSet(rs, connection.getDefaultCalendar(), GET_COLUMNS_RS_MUTATORS);
876876
} catch (Exception e) {
877877
throw ExceptionUtils.toSqlState(e);
878878
}
@@ -1079,7 +1079,7 @@ public ResultSet getCrossReference(String parentCatalog, String parentSchema, St
10791079
@SuppressWarnings({"squid:S2095"})
10801080
public ResultSet getTypeInfo() throws SQLException {
10811081
try (Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(DATA_TYPE_INFO_SQL)) {
1082-
return DetachedResultSet.createFromResultSet(rs, GET_TYPE_INFO_MUTATORS);
1082+
return DetachedResultSet.createFromResultSet(rs, connection.getDefaultCalendar(), GET_TYPE_INFO_MUTATORS);
10831083
} catch (Exception e) {
10841084
throw ExceptionUtils.toSqlState(e);
10851085
}

0 commit comments

Comments
 (0)