Skip to content

Commit c4fe4d0

Browse files
authored
Merge pull request #580 from zhicwu/fix-build-break
Fix build break
2 parents 1e6896a + bf6d0d1 commit c4fe4d0

File tree

15 files changed

+132
-79
lines changed

15 files changed

+132
-79
lines changed

.github/workflows/benchmark.yml

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,10 @@ jobs:
6969
with:
7070
github-token: ${{ secrets.GITHUB_TOKEN }}
7171
script: |
72-
if (process.env.BENCHMARK_REPORT) {
73-
github.issues.createComment({
74-
issue_number: context.issue.number,
75-
owner: context.repo.owner,
76-
repo: context.repo.repo,
77-
body: '```\n' + process.env.BENCHMARK_REPORT + '\n```'
78-
});
72+
const report = process.env.BENCHMARK_REPORT;
73+
const { issue: { number: issue_number }, repo: { owner, repo } } = context;
74+
if (report) {
75+
github.issues.createComment({issue_number, owner, repo, body: '```\n' + report + '\n```'});
7976
}
8077
8178
benchmark-on-demand:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ It has support of a minimal subset of features to be usable.
1010
<dependency>
1111
<groupId>ru.yandex.clickhouse</groupId>
1212
<artifactId>clickhouse-jdbc</artifactId>
13-
<version>0.2.6</version>
13+
<version>0.3.0</version>
1414
</dependency>
1515
```
1616

pom.xml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>ru.yandex.clickhouse</groupId>
66
<artifactId>clickhouse-jdbc</artifactId>
7-
<version>0.2.6</version>
7+
<version>${revision}</version>
88
<packaging>jar</packaging>
99

1010
<name>clickhouse-jdbc</name>
@@ -52,6 +52,7 @@
5252
</developers>
5353

5454
<properties>
55+
<revision>0.3.0-SNAPSHOT</revision>
5556
<slf4j.version>1.7.30</slf4j.version>
5657
<project.current.year>2021</project.current.year>
5758
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -62,7 +63,7 @@
6263
<guava.version>29.0-jre</guava.version>
6364
<jaxb.version>2.3.1</jaxb.version>
6465
<jdk.version>1.8</jdk.version>
65-
<testcontainers.version>1.15.1</testcontainers.version>
66+
<testcontainers.version>1.15.2</testcontainers.version>
6667
<testng.version>6.14.3</testng.version>
6768
<mockito.version>1.10.19</mockito.version>
6869
<wiremock.version>2.27.2</wiremock.version>
@@ -84,7 +85,7 @@
8485
<skipITs>${skipTests}</skipITs>
8586
<skipUTs>${skipTests}</skipUTs>
8687
<spec.title>JDBC</spec.title>
87-
<spec.version>4.1</spec.version>
88+
<spec.version>4.2</spec.version>
8889
</properties>
8990

9091
<dependencies>
@@ -262,7 +263,6 @@
262263
<artifactId>maven-failsafe-plugin</artifactId>
263264
<version>${failsafe-plugin.version}</version>
264265
<configuration>
265-
<argLine>-Duser.timezone=Europe/Moscow</argLine>
266266
<includes>**/*.java</includes>
267267
<skipTests>${skipTests}</skipTests>
268268
<skipITs>${skipITs}</skipITs>
@@ -284,7 +284,6 @@
284284
<artifactId>maven-surefire-plugin</artifactId>
285285
<version>${surefire-plugin.version}</version>
286286
<configuration>
287-
<argLine>-Duser.timezone=Europe/Moscow</argLine>
288287
<skipTests>${skipUTs}</skipTests>
289288
<useSystemClassLoader>false</useSystemClassLoader>
290289
</configuration>

src/main/java/ru/yandex/clickhouse/Writer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import static ru.yandex.clickhouse.domain.ClickHouseFormat.RowBinary;
1818
import static ru.yandex.clickhouse.domain.ClickHouseFormat.TabSeparated;
1919

20-
public final class Writer extends ConfigurableApi<Writer> {
20+
public class Writer extends ConfigurableApi<Writer> {
2121

2222
private ClickHouseFormat format = TabSeparated;
2323
private ClickHouseCompression compression = null;

src/main/java/ru/yandex/clickhouse/response/parser/ClickHouseSQLTimeParser.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import ru.yandex.clickhouse.response.ClickHouseColumnInfo;
1212

1313
final class ClickHouseSQLTimeParser extends ClickHouseDateValueParser<Time> {
14+
private static final long MILLISECONDS_A_DAY = 24 * 3600 * 1000;
1415

1516
private static ClickHouseSQLTimeParser instance;
1617

@@ -21,6 +22,10 @@ static ClickHouseSQLTimeParser getInstance() {
2122
return instance;
2223
}
2324

25+
static long normalize(long time) {
26+
return (time + MILLISECONDS_A_DAY) % MILLISECONDS_A_DAY;
27+
}
28+
2429
private ClickHouseSQLTimeParser() {
2530
super(Time.class);
2631
}
@@ -29,65 +34,65 @@ private ClickHouseSQLTimeParser() {
2934
Time parseDate(String value, ClickHouseColumnInfo columnInfo,
3035
TimeZone timeZone)
3136
{
32-
return new Time(
37+
return new Time(normalize(
3338
LocalDateTime.of(
3439
LocalDate.ofEpochDay(0),
3540
LocalTime.MIDNIGHT)
3641
.atZone(effectiveTimeZone(columnInfo, timeZone))
3742
.toInstant()
38-
.toEpochMilli());
43+
.toEpochMilli()));
3944
}
4045

4146
@Override
4247
Time parseDateTime(String value, ClickHouseColumnInfo columnInfo,
4348
TimeZone timeZone)
4449
{
45-
return new Time(parseAsLocalDateTime(value)
50+
return new Time(normalize(parseAsLocalDateTime(value)
4651
.atZone(effectiveTimeZone(columnInfo, timeZone))
4752
.withFixedOffsetZone()
4853
.withYear(1970)
4954
.withMonth(1)
5055
.withDayOfMonth(1)
5156
.toInstant()
52-
.toEpochMilli());
57+
.toEpochMilli()));
5358
}
5459

5560
@Override
5661
Time parseNumber(long value, ClickHouseColumnInfo columnInfo,
5762
TimeZone timeZone)
5863
{
59-
return new Time(
64+
return new Time(normalize(
6065
LocalDateTime.of(
6166
LocalDate.ofEpochDay(0),
6267
parseAsLocalTime(value))
6368
.atZone(effectiveTimeZone(columnInfo, timeZone))
6469
.toInstant()
65-
.toEpochMilli());
70+
.toEpochMilli()));
6671
}
6772

6873
@Override
6974
Time parseOther(String value, ClickHouseColumnInfo columnInfo,
7075
TimeZone timeZone)
7176
{
7277
try {
73-
return new Time(
78+
return new Time(normalize(
7479
LocalDateTime.of(
7580
LocalDate.ofEpochDay(0),
7681
LocalTime.parse(value, DateTimeFormatter.ISO_LOCAL_TIME))
7782
.atZone(effectiveTimeZone(columnInfo, timeZone))
7883
.toInstant()
79-
.toEpochMilli());
84+
.toEpochMilli()));
8085
} catch (DateTimeParseException dtpe) {
8186
// try next pattern candidate
8287
}
8388

84-
return new Time(
89+
return new Time(normalize(
8590
LocalDateTime.of(
8691
LocalDate.ofEpochDay(0),
8792
parseAsLocalTime(value))
8893
.atZone(effectiveTimeZone(columnInfo, timeZone))
8994
.toInstant()
90-
.toEpochMilli());
95+
.toEpochMilli()));
9196
}
9297

9398
}

src/main/java/ru/yandex/clickhouse/util/ClickHouseValueFormatter.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,9 @@ public static String formatBoolean(boolean myBoolean) {
110110
}
111111

112112
public static String formatDate(Date date, TimeZone timeZone) {
113-
getDateFormat().setTimeZone(timeZone);
114-
return getDateFormat().format(date);
113+
SimpleDateFormat formatter = getDateFormat();
114+
formatter.setTimeZone(timeZone);
115+
return formatter.format(date);
115116
}
116117

117118
public static String formatTime(Time time, TimeZone timeZone) {
@@ -124,8 +125,9 @@ public static String formatTime(Time time, TimeZone timeZone) {
124125
}
125126

126127
public static String formatTimestamp(Timestamp time, TimeZone timeZone) {
127-
getDateTimeFormat().setTimeZone(timeZone);
128-
return getDateTimeFormat().format(time);
128+
SimpleDateFormat formatter = getDateTimeFormat();
129+
formatter.setTimeZone(timeZone);
130+
return formatter.format(time);
129131
}
130132

131133
public static String formatUUID(UUID x) {

src/test/java/ru/yandex/clickhouse/ClickHouseContainerForTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ public class ClickHouseContainerForTest {
2222
private static final GenericContainer<?> clickhouseContainer;
2323

2424
static {
25+
String timezone = System.getProperty("clickhouseTimezone");
26+
if (timezone == null || timezone.isEmpty()) {
27+
timezone = "UTC";
28+
}
2529
String imageTag = System.getProperty("clickhouseVersion");
2630

2731
if (imageTag == null || (imageTag = imageTag.trim()).isEmpty()) {
@@ -43,6 +47,7 @@ public class ClickHouseContainerForTest {
4347
.from( imageNameWithTag )
4448
.run("apt-get update && apt-get install tzdata")
4549
))
50+
.withEnv("TZ", timezone)
4651
.withExposedPorts(HTTP_PORT, NATIVE_PORT, MYSQL_PORT)
4752
.withClasspathResourceMapping(
4853
"ru/yandex/clickhouse/users.d",

src/test/java/ru/yandex/clickhouse/ClickHousePreparedStatementTest.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,28 @@ public void testSetDateNull() throws Exception {
154154
@Test
155155
public void testSetDateNormal() throws Exception {
156156
ClickHousePreparedStatement s = createStatement();
157-
s.setDate(1, new Date(1557168043000L));
158-
assertParamMatches(s, "'2019-05-06'");
157+
Date d = new Date(1557168043000L);
158+
s.setDate(1, d);
159+
assertParamMatches(s, "'" + d.toLocalDate().toString() + "'");
159160
}
160161

161162
@Test
162163
public void testSetDateOtherTimeZone() throws Exception {
164+
ClickHouseProperties p = new ClickHouseProperties();
163165
ClickHousePreparedStatement s = createStatement(
164-
TimeZone.getTimeZone("Asia/Tokyo"),
165-
new ClickHouseProperties());
166-
s.setDate(1, new Date(1557168043000L));
167-
assertParamMatches(s, "'2019-05-06'");
166+
TimeZone.getTimeZone("Asia/Tokyo"), p);
167+
Date d = new Date(1557168043000L);
168+
s.setDate(1, d);
169+
assertParamMatches(s, "'" + d.toLocalDate().toString() + "'");
170+
171+
/*
172+
TimeZone t = TimeZone.getTimeZone("American/Los_Angels");
173+
p.setUseServerTimeZoneForDates(true);
174+
s = createStatement(t, p);
175+
s.setDate(1, d);
176+
assertParamMatches(s, "'" + LocalDate.ofInstant(
177+
Instant.ofEpochMilli(d.getTime()), t.toZoneId()).toString() + "'");
178+
*/
168179
}
169180

170181
@Test

src/test/java/ru/yandex/clickhouse/integration/RowBinaryStreamTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ public void writeTo(ClickHouseRowBinaryStream stream) throws IOException {
219219
ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM test.raw_binary ORDER BY date");
220220

221221
Assert.assertTrue(rs.next());
222-
assertEquals(rs.getString("date"), "2017-01-01");
222+
assertEquals(rs.getString("date"),
223+
Instant.ofEpochMilli(timestamp).atZone(connection.getTimeZone().toZoneId())
224+
.withZoneSameInstant(ZoneId.systemDefault()).toLocalDate().toString());
223225
assertEquals(rs.getTimestamp("dateTime").getTime(), date1.getTime());
224226
assertEquals(rs.getString("string"), "string\n1");
225227
assertEquals(rs.getInt("int8"), Byte.MIN_VALUE);

src/test/java/ru/yandex/clickhouse/integration/StreamSQLTest.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,30 @@
88
import ru.yandex.clickhouse.ClickHouseDataSource;
99
import ru.yandex.clickhouse.domain.ClickHouseCompression;
1010
import ru.yandex.clickhouse.domain.ClickHouseFormat;
11-
import ru.yandex.clickhouse.util.ClickHouseVersionNumberUtil;
1211

1312
import java.io.*;
1413
import java.math.BigDecimal;
1514
import java.nio.charset.Charset;
1615
import java.sql.ResultSet;
1716
import java.sql.SQLException;
17+
import java.sql.Timestamp;
18+
import java.time.LocalDateTime;
19+
import java.time.ZoneId;
20+
import java.time.format.DateTimeFormatter;
1821
import java.util.zip.GZIPOutputStream;
1922

2023
public class StreamSQLTest {
24+
private static final DateTimeFormatter DATE_TIME_FORMATTER_TZ =
25+
DateTimeFormatter.ofPattern("yyyy-MM-dd['T'][ ]HH:mm:ss[.SSS][XXX]");
26+
2127
private ClickHouseDataSource dataSource;
2228
private ClickHouseConnection connection;
2329

30+
private Timestamp utcToServerTimezone(String datetime) {
31+
return Timestamp.from(LocalDateTime.parse(datetime, DATE_TIME_FORMATTER_TZ)
32+
.atZone(ZoneId.of("UTC")).withZoneSameInstant(connection.getTimeZone().toZoneId()).toInstant());
33+
}
34+
2435
@BeforeTest
2536
public void setUp() throws Exception {
2637
dataSource = ClickHouseContainerForTest.newDataSource();
@@ -259,8 +270,8 @@ public void ORCInsertCompressedIntoTable() throws SQLException {
259270
Assert.assertEquals(rs.getFloat("sum_flt"), Float.POSITIVE_INFINITY);
260271
Assert.assertEquals(rs.getLong("uniq_str"), 100);
261272
Assert.assertEquals(rs.getBigDecimal("max_dcml"), new BigDecimal("1.000000000"));
262-
Assert.assertEquals(rs.getString("min_time"), "2020-01-01 00:00:00");
263-
Assert.assertEquals(rs.getString("max_time"), "2020-01-01 00:01:39");
273+
Assert.assertEquals(rs.getTimestamp("min_time"), utcToServerTimezone("2020-01-01 00:00:00"));
274+
Assert.assertEquals(rs.getTimestamp("max_time"), utcToServerTimezone("2020-01-01 00:01:39"));
264275
}
265276

266277
@Test
@@ -295,7 +306,7 @@ public void ORCInsertCompressedIntoTable1() throws SQLException {
295306
Assert.assertEquals(rs.getString("str"), "42");
296307
Assert.assertTrue( Math.abs(rs.getFloat("flt") - 0.023809524) < 0.0001);
297308
Assert.assertTrue( Math.abs(rs.getFloat("dcml") - 0.023255813) < 0.0001);
298-
Assert.assertEquals(rs.getString("time"), "2020-01-01 00:00:42");
309+
Assert.assertEquals(rs.getTimestamp("time"), utcToServerTimezone("2020-01-01 00:00:42"));
299310
}
300311

301312
@Test
@@ -339,8 +350,8 @@ public void ParquetInsertCompressedIntoTable() throws SQLException {
339350
Assert.assertEquals(rs.getFloat("sum_flt"), Float.POSITIVE_INFINITY);
340351
Assert.assertEquals(rs.getLong("uniq_str"), 100);
341352
Assert.assertEquals(rs.getBigDecimal("max_dcml"), new BigDecimal("1.000000000"));
342-
Assert.assertEquals(rs.getString("min_time"), "2020-01-01 00:00:00");
343-
Assert.assertEquals(rs.getString("max_time"), "2020-01-01 00:01:39");
353+
Assert.assertEquals(rs.getTimestamp("min_time"), utcToServerTimezone("2020-01-01 00:00:00"));
354+
Assert.assertEquals(rs.getTimestamp("max_time"), utcToServerTimezone("2020-01-01 00:01:39"));
344355
}
345356

346357
@Test
@@ -375,7 +386,7 @@ public void ParquetInsertCompressedIntoTable1() throws SQLException {
375386
Assert.assertEquals(rs.getString("str"), "42");
376387
Assert.assertTrue( Math.abs(rs.getFloat("flt") - 0.023809524) < 0.0001);
377388
Assert.assertTrue( Math.abs(rs.getFloat("dcml") - 0.023255813) < 0.0001);
378-
Assert.assertEquals(rs.getString("time"), "2020-01-01 00:00:42");
389+
Assert.assertEquals(rs.getTimestamp("time"), utcToServerTimezone("2020-01-01 00:00:42"));
379390
}
380391

381392
}

0 commit comments

Comments
 (0)