Skip to content

Commit 1704cab

Browse files
authored
Merge pull request #1863 from ClickHouse/v2_reading_datetime_with_column_scale
[client-v2] Fixes BinaryStreamReader parsing DateTime64 values. Using a column defined scale now.
2 parents 3ace9f4 + 8717355 commit 1704cab

File tree

3 files changed

+66
-6
lines changed

3 files changed

+66
-6
lines changed

client-v2/src/main/java/com/clickhouse/client/api/DataTypeUtils.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,19 @@
44

55
public class DataTypeUtils {
66

7-
public static DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
7+
/**
8+
* Formatter for the DateTime type.
9+
*/
10+
public static DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
811

12+
/**
13+
* Formatter for the Date type.
14+
*/
915
public static DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
16+
17+
/**
18+
* Formatter for the DateTime type with nanoseconds.
19+
*/
20+
public static DateTimeFormatter DATETIME_WITH_NANOS_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn");
21+
1022
}

client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/BinaryStreamReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public <T> T readValue(ClickHouseColumn column, Class<?> typeHint) throws IOExce
171171
return convertDateTime(readDateTime32(column.getTimeZone() == null ? timeZone :
172172
column.getTimeZone()), typeHint);
173173
case DateTime64:
174-
return convertDateTime(readDateTime64(3, column.getTimeZone() == null ? timeZone :
174+
return convertDateTime(readDateTime64(column.getScale(), column.getTimeZone() == null ? timeZone :
175175
column.getTimeZone()), typeHint);
176176

177177
case IntervalYear:

client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -706,18 +706,36 @@ public void testDateTimeDataTypes() {
706706
"min_date Date",
707707
"max_date Date",
708708
"min_dateTime DateTime",
709-
"max_dateTime DateTime"
709+
"max_dateTime DateTime",
710+
"min_dateTime64 DateTime64",
711+
"max_dateTime64 DateTime64",
712+
"min_dateTime64_6 DateTime64(6)",
713+
"max_dateTime64_6 DateTime64(6)",
714+
"min_dateTime64_9 DateTime64(9)",
715+
"max_dateTime64_9 DateTime64(9)"
710716
);
711717

712718
final LocalDate minDate = LocalDate.parse("1970-01-01");
713719
final LocalDate maxDate = LocalDate.parse("2149-06-06");
714-
final LocalDateTime minDateTime = LocalDateTime.parse("1970-01-01T00:00:00");
720+
final LocalDateTime minDateTime = LocalDateTime.parse("1970-01-01T01:02:03");
715721
final LocalDateTime maxDateTime = LocalDateTime.parse("2106-02-07T06:28:15");
722+
final LocalDateTime minDateTime64 = LocalDateTime.parse("1970-01-01T01:02:03.123");
723+
final LocalDateTime maxDateTime64 = LocalDateTime.parse("2106-02-07T06:28:15.123");
724+
final LocalDateTime minDateTime64_6 = LocalDateTime.parse("1970-01-01T01:02:03.123456");
725+
final LocalDateTime maxDateTime64_6 = LocalDateTime.parse("2106-02-07T06:28:15.123456");
726+
final LocalDateTime minDateTime64_9 = LocalDateTime.parse("1970-01-01T01:02:03.123456789");
727+
final LocalDateTime maxDateTime64_9 = LocalDateTime.parse("2106-02-07T06:28:15.123456789");
716728
final List<Supplier<String>> valueGenerators = Arrays.asList(
717729
() -> sq(minDate.toString()),
718730
() -> sq(maxDate.toString()),
719-
() -> sq(minDateTime.format(DataTypeUtils.DATE_TIME_FORMATTER)),
720-
() -> sq(maxDateTime.format(DataTypeUtils.DATE_TIME_FORMATTER))
731+
() -> sq(minDateTime.format(DataTypeUtils.DATETIME_FORMATTER)),
732+
() -> sq(maxDateTime.format(DataTypeUtils.DATETIME_FORMATTER)),
733+
() -> sq(minDateTime64.format(DataTypeUtils.DATETIME_WITH_NANOS_FORMATTER)),
734+
() -> sq(maxDateTime64.format(DataTypeUtils.DATETIME_WITH_NANOS_FORMATTER)),
735+
() -> sq(minDateTime64_6.format(DataTypeUtils.DATETIME_WITH_NANOS_FORMATTER)),
736+
() -> sq(maxDateTime64_6.format(DataTypeUtils.DATETIME_WITH_NANOS_FORMATTER)),
737+
() -> sq(minDateTime64_9.format(DataTypeUtils.DATETIME_WITH_NANOS_FORMATTER)),
738+
() -> sq(maxDateTime64_9.format(DataTypeUtils.DATETIME_WITH_NANOS_FORMATTER))
721739
);
722740

723741
final List<Consumer<ClickHouseBinaryFormatReader>> verifiers = new ArrayList<>();
@@ -741,6 +759,36 @@ public void testDateTimeDataTypes() {
741759
Assert.assertEquals(r.getLocalDateTime("max_dateTime"), maxDateTime);
742760
Assert.assertEquals(r.getLocalDateTime(4), maxDateTime);
743761
});
762+
verifiers.add(r -> {
763+
Assert.assertTrue(r.hasValue("min_dateTime64"), "No value for column min_dateTime64 found");
764+
Assert.assertEquals(r.getLocalDateTime("min_dateTime64"), minDateTime64);
765+
Assert.assertEquals(r.getLocalDateTime(5), minDateTime64);
766+
});
767+
verifiers.add(r -> {
768+
Assert.assertTrue(r.hasValue("max_dateTime64"), "No value for column max_dateTime64 found");
769+
Assert.assertEquals(r.getLocalDateTime("max_dateTime64"), maxDateTime64);
770+
Assert.assertEquals(r.getLocalDateTime(6), maxDateTime64);
771+
});
772+
verifiers.add(r -> {
773+
Assert.assertTrue(r.hasValue("min_dateTime64_6"), "No value for column min_dateTime64_6 found");
774+
Assert.assertEquals(r.getLocalDateTime("min_dateTime64_6"), minDateTime64_6);
775+
Assert.assertEquals(r.getLocalDateTime(7), minDateTime64_6);
776+
});
777+
verifiers.add(r -> {
778+
Assert.assertTrue(r.hasValue("max_dateTime64_6"), "No value for column max_dateTime64_6 found");
779+
Assert.assertEquals(r.getLocalDateTime("max_dateTime64_6"), maxDateTime64_6);
780+
Assert.assertEquals(r.getLocalDateTime(8), maxDateTime64_6);
781+
});
782+
verifiers.add(r -> {
783+
Assert.assertTrue(r.hasValue("min_dateTime64_9"), "No value for column min_dateTime64_9 found");
784+
Assert.assertEquals(r.getLocalDateTime("min_dateTime64_9"), minDateTime64_9);
785+
Assert.assertEquals(r.getLocalDateTime(9), minDateTime64_9);
786+
});
787+
verifiers.add(r -> {
788+
Assert.assertTrue(r.hasValue("max_dateTime64_9"), "No value for column max_dateTime64_9 found");
789+
Assert.assertEquals(r.getLocalDateTime("max_dateTime64_9"), maxDateTime64_9);
790+
Assert.assertEquals(r.getLocalDateTime(10), maxDateTime64_9);
791+
});
744792

745793
testDataTypes(columns, valueGenerators, verifiers);
746794
}

0 commit comments

Comments
 (0)