Skip to content

Commit 0b5dddb

Browse files
committed
added more tests for string conversion
1 parent 4e6a6bd commit 0b5dddb

File tree

6 files changed

+134
-49
lines changed

6 files changed

+134
-49
lines changed

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.clickhouse.client.api;
22

3-
import java.text.SimpleDateFormat;
4-
import java.time.Instant;
5-
import java.time.ZoneId;
63
import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader;
4+
import com.clickhouse.data.ClickHouseDataType;
75

86
import java.time.Instant;
97
import java.time.ZoneId;
@@ -12,8 +10,6 @@
1210
import java.time.temporal.ChronoField;
1311
import java.util.Objects;
1412

15-
import com.clickhouse.data.ClickHouseDataType;
16-
1713
import static com.clickhouse.client.api.data_formats.internal.BinaryStreamReader.BASES;
1814

1915
public class DataTypeUtils {
@@ -44,14 +40,6 @@ public class DataTypeUtils {
4440

4541
public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
4642

47-
public static final SimpleDateFormat OLD_DATE_TIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
48-
49-
public static final SimpleDateFormat OLD_DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd");
50-
51-
public static final SimpleDateFormat OLD_TIME_FORMATTER = new SimpleDateFormat("HH:mm:ss");
52-
53-
public static final SimpleDateFormat OLD_TIME_WITH_NANOS_FORMATTER = new SimpleDateFormat("HH:mm:ss.SSSSSSSSS");
54-
5543
/**
5644
* Formats an {@link Instant} object for use in SQL statements or as query
5745
* parameter.

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import java.time.ZoneOffset;
2626
import java.time.ZonedDateTime;
2727
import java.time.temporal.TemporalAmount;
28-
import java.util.Date;
2928
import java.util.HashMap;
3029
import java.util.List;
3130
import java.util.Map;

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
import java.io.IOException;
66
import java.lang.reflect.Array;
7+
import java.util.ArrayDeque;
8+
import java.util.Deque;
79
import java.util.List;
8-
import java.util.Stack;
910

1011
public abstract class BaseCollectionConverter<TAcc, TList> {
1112
public static final String ARRAY_START = "[";
@@ -45,7 +46,7 @@ public final String convert(TList value, TAcc acc) {
4546
}
4647
setAccumulator(acc);
4748

48-
Stack<ListConversionState<TList>> stack = new Stack<>();
49+
Deque<ListConversionState<TList>> stack = new ArrayDeque<>();
4950
ListConversionState<TList> state = new ListConversionState<>(value, listSize(value));
5051
while (state != null) {
5152
if (state.isFirst()) {

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

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
import com.clickhouse.data.ClickHouseDataType;
88

99
import java.net.InetAddress;
10+
import java.time.Instant;
1011
import java.time.LocalDate;
1112
import java.time.LocalDateTime;
1213
import java.time.LocalTime;
14+
import java.time.ZoneId;
1315
import java.time.ZonedDateTime;
1416
import java.time.format.DateTimeFormatter;
1517
import java.time.temporal.TemporalAccessor;
@@ -76,7 +78,7 @@ public String stringToString(Object bytesOrString, ClickHouseColumn column) {
7678
if (bytesOrString instanceof CharSequence) {
7779
sb.append(((CharSequence) bytesOrString));
7880
} else if (bytesOrString instanceof byte[]) {
79-
sb.append(bytesOrString);
81+
sb.append(new String((byte[]) bytesOrString));
8082
} else {
8183
sb.append(bytesOrString);
8284
}
@@ -86,6 +88,11 @@ public String stringToString(Object bytesOrString, ClickHouseColumn column) {
8688
return sb.toString();
8789
}
8890

91+
public static ZoneId UTC_ZONE_ID = ZoneId.of("UTC");
92+
93+
public static final ZonedDateTime EPOCH_START_OF_THE_DAY =
94+
ZonedDateTime.ofInstant(Instant.EPOCH, UTC_ZONE_ID);
95+
8996
public String dateToString(Object value, ClickHouseColumn column) {
9097
DateTimeFormatter formatter = DataTypeUtils.DATE_FORMATTER;
9198

@@ -94,12 +101,19 @@ public String dateToString(Object value, ClickHouseColumn column) {
94101
return formatter.format(dateTime);
95102
} else if (value instanceof LocalDate) {
96103
return formatter.format(((LocalDate)value));
104+
} else if (value instanceof java.sql.Date) {
105+
java.sql.Date date = (java.sql.Date) value;
106+
return formatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), UTC_ZONE_ID));
107+
} else if (value instanceof java.sql.Time) {
108+
return formatter.format(EPOCH_START_OF_THE_DAY);
97109
} else if (value instanceof Date) {
98-
return DataTypeUtils.OLD_DATE_FORMATTER.format(((Date)value));
110+
return formatter.format(((Date)value).toInstant().atZone(UTC_ZONE_ID));
99111
}
100112
return value.toString();
101113
}
102114

115+
116+
103117
public String timeToString(Object value, ClickHouseColumn column) {
104118
DateTimeFormatter formatter;
105119
switch (column.getDataType()) {
@@ -115,8 +129,13 @@ public String timeToString(Object value, ClickHouseColumn column) {
115129
return formatter.format(dateTime);
116130
} else if (value instanceof LocalTime) {
117131
return formatter.format(((LocalTime)value));
132+
} else if (value instanceof java.sql.Date) {
133+
return formatter.format(EPOCH_START_OF_THE_DAY);
134+
} else if (value instanceof java.sql.Time) {
135+
java.sql.Time date = (java.sql.Time) value;
136+
return formatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), UTC_ZONE_ID));
118137
} else if (value instanceof Date) {
119-
return DataTypeUtils.OLD_TIME_FORMATTER.format(((Date)value));
138+
return formatter.format(((Date)value).toInstant().atZone(UTC_ZONE_ID));
120139
}
121140
return value.toString();
122141
}
@@ -137,9 +156,15 @@ public String dateTimeToString(Object value, ClickHouseColumn column) {
137156
} else if (value instanceof LocalDate) {
138157
return formatter.format(((LocalDate)value).atStartOfDay());
139158
} else if (value instanceof LocalTime) {
140-
return formatter.format(((LocalTime)value).atDate(LocalDate.now()));
159+
return formatter.format(((LocalTime) value).atDate(LocalDate.now()));
160+
} else if (value instanceof java.sql.Date) {
161+
return formatter.format(EPOCH_START_OF_THE_DAY);
162+
163+
} else if (value instanceof java.sql.Time) {
164+
java.sql.Time date = (java.sql.Time) value;
165+
return formatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), UTC_ZONE_ID));
141166
} else if (value instanceof Date) {
142-
return DataTypeUtils.OLD_DATE_TIME_FORMATTER.format(((Date)value));
167+
return formatter.format(((Date)value).toInstant().atZone(UTC_ZONE_ID));
143168
}
144169
return value.toString();
145170
}
@@ -150,14 +175,6 @@ public String enumToString(Object value, ClickHouseColumn column) {
150175
} else if (value instanceof Number ) {
151176
int num = ((Number) value).intValue();
152177
switch (column.getDataType()) {
153-
case Variant:
154-
for (ClickHouseColumn c : column.getNestedColumns()) {
155-
// TODO: will work only if single enum listed as variant
156-
if (c.getDataType() == ClickHouseDataType.Enum8 || c.getDataType() == ClickHouseDataType.Enum16) {
157-
return c.getEnumConstants().name(num);
158-
}
159-
}
160-
return String.valueOf(num); // fail-safe
161178
case Enum8:
162179
case Enum16:
163180
case Enum:
Lines changed: 100 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package com.clickhouse.client.api.internal;
22

33
import com.clickhouse.data.ClickHouseColumn;
4-
import com.clickhouse.data.ClickHouseDataType;
54
import org.testng.annotations.Test;
65

6+
import java.time.LocalDate;
7+
import java.time.LocalDateTime;
8+
import java.time.LocalTime;
9+
import java.time.ZoneId;
10+
import java.time.ZonedDateTime;
711
import java.util.Arrays;
812
import java.util.Collections;
13+
import java.util.Date;
914

1015
import static org.testng.Assert.assertEquals;
16+
import static org.testng.Assert.assertNull;
1117

1218
@Test(groups = {"unit"})
1319
public class DataTypeConverterTest {
@@ -17,31 +23,107 @@ public void testArrayToString() {
1723
DataTypeConverter converter = new DataTypeConverter();
1824

1925
ClickHouseColumn intColumn = ClickHouseColumn.of("v", "Array(Int32)");
20-
assertEquals(converter.arrayToString(new byte[]{1, 2, 3}, intColumn), "[1, 2, 3]");
21-
assertEquals(converter.arrayToString(new short[]{1, 2, 3}, intColumn), "[1, 2, 3]");
22-
assertEquals(converter.arrayToString(new int[]{1, 2, 3}, intColumn), "[1, 2, 3]");
23-
assertEquals(converter.arrayToString(new long[]{1L, 2L, 3L}, intColumn), "[1, 2, 3]");
24-
assertEquals(converter.arrayToString(new float[]{1.0f, 2.0f, 3.0f}, intColumn), "[1.0, 2.0, 3.0]");
25-
assertEquals(converter.arrayToString(new double[]{1.0d, 2.0d, 3.0d}, intColumn), "[1.0, 2.0, 3.0]");
26-
assertEquals(converter.arrayToString(new boolean[]{true, false, true}, intColumn), "[true, false, true]");
26+
assertEquals(converter.convertToString(new byte[]{1, 2, 3}, intColumn), "[1, 2, 3]");
27+
assertEquals(converter.convertToString(new short[]{1, 2, 3}, intColumn), "[1, 2, 3]");
28+
assertEquals(converter.convertToString(new int[]{1, 2, 3}, intColumn), "[1, 2, 3]");
29+
assertEquals(converter.convertToString(new long[]{1L, 2L, 3L}, intColumn), "[1, 2, 3]");
30+
assertEquals(converter.convertToString(new float[]{1.0f, 2.0f, 3.0f}, intColumn), "[1.0, 2.0, 3.0]");
31+
assertEquals(converter.convertToString(new double[]{1.0d, 2.0d, 3.0d}, intColumn), "[1.0, 2.0, 3.0]");
32+
assertEquals(converter.convertToString(new boolean[]{true, false, true}, intColumn), "[true, false, true]");
2733

2834

2935
ClickHouseColumn strColumn = ClickHouseColumn.of("v", "Array(String)");
30-
assertEquals(converter.arrayToString(new String[][]{{"a", null}, {"b", "c"}}, strColumn), "[['a', NULL], ['b', 'c']]");
31-
assertEquals(converter.arrayToString(new int[][]{{1, 2}, {3, 4}}, intColumn), "[[1, 2], [3, 4]]");
32-
assertEquals(converter.arrayToString(new int[][][]{{{1, 2}, {3, 4}}, {{5, 6}}}, intColumn), "[[[1, 2], [3, 4]], [[5, 6]]]");
33-
assertEquals(converter.arrayToString(new char[]{'a', 'b', 'c'}, strColumn), "['a', 'b', 'c']");
36+
assertEquals(converter.convertToString(new String[][]{{"a", null}, {"b", "c"}}, strColumn), "[['a', NULL], ['b', 'c']]");
37+
assertEquals(converter.convertToString(new int[][]{{1, 2}, {3, 4}}, intColumn), "[[1, 2], [3, 4]]");
38+
assertEquals(converter.convertToString(new int[][][]{{{1, 2}, {3, 4}}, {{5, 6}}}, intColumn), "[[[1, 2], [3, 4]], [[5, 6]]]");
39+
assertEquals(converter.convertToString(new char[]{'a', 'b', 'c'}, strColumn), "['a', 'b', 'c']");
3440
}
3541

3642
@Test
3743
public void testListToString() {
3844
DataTypeConverter converter = new DataTypeConverter();
3945
ClickHouseColumn column = ClickHouseColumn.of("field", "Array(Int32)");
40-
assertEquals(converter.arrayToString(Collections.emptyList(), column), "[]");
41-
assertEquals(converter.arrayToString(Arrays.asList(1, 2, 3), column), "[1, 2, 3]");
42-
assertEquals(converter.arrayToString(Arrays.asList(1, null, 3), column), "[1, NULL, 3]");
43-
assertEquals(converter.arrayToString(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4)), column), "[[1, 2], [3, 4]]");
44-
assertEquals(converter.arrayToString(Arrays.asList(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4)), Arrays.asList(Arrays.asList(5, 6))), column), "[[[1, 2], [3, 4]], [[5, 6]]]");
45-
assertEquals(converter.arrayToString(Arrays.asList(null, null, null), column), "[NULL, NULL, NULL]");
46+
assertEquals(converter.convertToString(Collections.emptyList(), column), "[]");
47+
assertEquals(converter.convertToString(Arrays.asList(1, 2, 3), column), "[1, 2, 3]");
48+
assertEquals(converter.convertToString(Arrays.asList(1, null, 3), column), "[1, NULL, 3]");
49+
assertEquals(converter.convertToString(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4)), column), "[[1, 2], [3, 4]]");
50+
assertEquals(converter.convertToString(Arrays.asList(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4)), Arrays.asList(Arrays.asList(5, 6))), column), "[[[1, 2], [3, 4]], [[5, 6]]]");
51+
assertEquals(converter.convertToString(Arrays.asList(null, null, null), column), "[NULL, NULL, NULL]");
52+
}
53+
54+
@Test
55+
public void testDateToString() {
56+
DataTypeConverter converter = new DataTypeConverter();
57+
ClickHouseColumn column = ClickHouseColumn.of("field", "Date");
58+
assertEquals(converter.convertToString(LocalDate.of(2022, 1, 1), column), "2022-01-01");
59+
assertEquals(converter.convertToString(LocalDate.of(2022, 1, 2), column), "2022-01-02");
60+
assertEquals(converter.convertToString(LocalDate.of(2022, 1, 3), column), "2022-01-03");
61+
62+
Date date = Date.from(ZonedDateTime.of(2022, 1, 4, 12, 34, 56, 0, ZoneId.of("Asia/Shanghai")).toInstant());
63+
assertEquals(converter.convertToString(date, column), "2022-01-04");
64+
Date sqlDate = java.sql.Date.valueOf("2022-01-04");
65+
assertEquals(converter.convertToString(sqlDate, column), "2022-01-04");
66+
java.sql.Time sqlTime = java.sql.Time.valueOf("12:34:56");
67+
assertEquals(converter.convertToString(sqlTime, column), "1970-01-01");
68+
}
69+
70+
71+
@Test
72+
public void testTimeToString() {
73+
DataTypeConverter converter = new DataTypeConverter();
74+
ClickHouseColumn column = ClickHouseColumn.of("field", "Time");
75+
assertEquals(converter.timeToString(LocalTime.of(12, 34, 56), column), "12:34:56");
76+
assertEquals(converter.timeToString(LocalTime.of(23, 59, 59), column), "23:59:59");
77+
Date sqlDate = java.sql.Date.valueOf("2022-01-04");
78+
assertEquals(converter.convertToString(sqlDate, column), "00:00:00");
79+
Date date = Date.from(ZonedDateTime.of(2022, 1, 4, 12, 34, 56, 0, ZoneId.of("Asia/Shanghai")).toInstant());
80+
assertEquals(converter.convertToString(date, column), "04:34:56");
81+
java.sql.Time sqlTime = java.sql.Time.valueOf("12:34:56");
82+
assertEquals(converter.convertToString(sqlTime, column), "20:34:56");
83+
}
84+
85+
86+
@Test
87+
public void testDateTimeToString() {
88+
DataTypeConverter converter = new DataTypeConverter();
89+
ClickHouseColumn column = ClickHouseColumn.of("field", "DateTime");
90+
assertEquals(converter.dateTimeToString(LocalDateTime.of(2022, 1, 1, 12, 34, 56), column), "2022-01-01 12:34:56");
91+
assertEquals(converter.dateTimeToString(LocalDateTime.of(2022, 1, 2, 23, 59, 59), column), "2022-01-02 23:59:59");
92+
93+
Date date = Date.from(ZonedDateTime.of(2022, 1, 4, 12, 34, 56, 0, ZoneId.of("Asia/Shanghai")).toInstant());
94+
assertEquals(converter.convertToString(date, column), "2022-01-04 04:34:56");
95+
Date sqlDate = java.sql.Date.valueOf("2022-01-04");
96+
assertEquals(converter.convertToString(sqlDate, column), "1970-01-01 00:00:00");
97+
java.sql.Time sqlTime = java.sql.Time.valueOf("12:34:56");
98+
assertEquals(converter.convertToString(sqlTime, column), "1970-01-01 20:34:56");
99+
}
100+
101+
@Test
102+
public void testEnumToString() {
103+
DataTypeConverter converter = new DataTypeConverter();
104+
ClickHouseColumn column = ClickHouseColumn.of("field", "Enum8('a' = 1, 'b' = 2)");
105+
assertEquals(converter.convertToString("a", column), "a");
106+
assertNull(converter.convertToString(null, column));
107+
assertEquals(converter.convertToString(1, column), "a");
108+
assertEquals(converter.convertToString("1234567", column), "1234567");
109+
110+
column = ClickHouseColumn.of("field", "Enum8('a' = 1, 'b' = 2)");
111+
assertEquals(converter.convertToString("a", column), "a");
112+
assertNull(converter.convertToString(null, column));
113+
assertEquals(converter.convertToString(1, column), "a");
114+
assertEquals(converter.convertToString("1234567", column), "1234567");
115+
116+
column = ClickHouseColumn.of("field", "Enum8('a' = 1, 'b' = 2)");
117+
assertEquals(converter.convertToString("a", column), "a");
118+
assertNull(converter.convertToString(null, column));
119+
assertEquals(converter.convertToString(2, column), "b");
120+
assertEquals(converter.convertToString("1234567", column), "1234567");
121+
122+
column = ClickHouseColumn.of("field", "Variant(Enum8('a' = 1, 'b' = 2))");
123+
assertEquals(converter.convertToString("a", column), "a");
124+
assertEquals(converter.convertToString(null, column), null);
125+
assertEquals(converter.convertToString(1, column), "1");
126+
assertEquals(converter.convertToString("1234567", column), "1234567");
127+
assertEquals(converter.convertToString(2, column), "2");
46128
}
47129
}

jdbc-v2/src/test/java/com/clickhouse/jdbc/StatementTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
import org.testng.annotations.DataProvider;
1212
import org.testng.annotations.Test;
1313

14-
import java.net.Inet4Address;
15-
import java.net.Inet6Address;
1614
import java.sql.Array;
1715
import java.sql.Connection;
1816
import java.sql.Date;

0 commit comments

Comments
 (0)