Skip to content

Commit a3a8995

Browse files
authored
Merge pull request #1020 from zhicwu/develop
apply timezone to datetime default value
2 parents 0e0a214 + d4a0b61 commit a3a8995

4 files changed

Lines changed: 50 additions & 6 deletions

File tree

clickhouse-client/src/main/java/com/clickhouse/client/data/ClickHouseDateTimeValue.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.time.LocalDateTime;
1010
import java.time.LocalTime;
1111
import java.time.OffsetDateTime;
12+
import java.time.ZoneOffset;
1213
import java.time.ZonedDateTime;
1314
import java.time.format.DateTimeFormatter;
1415
import java.util.TimeZone;
@@ -24,7 +25,8 @@ public class ClickHouseDateTimeValue extends ClickHouseObjectValue<LocalDateTime
2425
/**
2526
* Default value.
2627
*/
27-
public static final LocalDateTime DEFAULT = ClickHouseDateValue.DEFAULT.atStartOfDay();
28+
public static final LocalDateTime DEFAULT = ClickHouseInstantValue.DEFAULT.atOffset(ZoneOffset.UTC)
29+
.toLocalDateTime();
2830

2931
static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
3032

@@ -111,11 +113,15 @@ public static ClickHouseDateTimeValue of(ClickHouseValue ref, String value, int
111113

112114
private final int scale;
113115
private final TimeZone tz;
116+
private final LocalDateTime defaultValue;
114117

115118
protected ClickHouseDateTimeValue(LocalDateTime value, int scale, TimeZone tz) {
116119
super(value);
117120
this.scale = ClickHouseChecker.between(scale, ClickHouseValues.PARAM_SCALE, 0, 9);
118121
this.tz = tz != null ? tz : ClickHouseValues.UTC_TIMEZONE;
122+
this.defaultValue = this.tz.equals(ClickHouseValues.UTC_TIMEZONE) ? DEFAULT
123+
: ClickHouseOffsetDateTimeValue.DEFAULT.toZonedDateTime().withZoneSameInstant(this.tz.toZoneId())
124+
.toLocalDateTime();
119125
}
120126

121127
public int getScale() {
@@ -237,7 +243,7 @@ public String asString(int length, Charset charset) {
237243

238244
@Override
239245
public ClickHouseDateTimeValue resetToDefault() {
240-
set(DEFAULT);
246+
set(defaultValue);
241247
return this;
242248
}
243249

clickhouse-client/src/main/java/com/clickhouse/client/data/ClickHouseDateValue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class ClickHouseDateValue extends ClickHouseObjectValue<LocalDate> {
1919
/**
2020
* Default date.
2121
*/
22-
public static final LocalDate DEFAULT = LocalDate.of(1970, 1, 1);
22+
public static final LocalDate DEFAULT = ClickHouseOffsetDateTimeValue.DEFAULT.toLocalDate();
2323

2424
/**
2525
* Create a new instance representing null value.

clickhouse-client/src/main/java/com/clickhouse/client/data/ClickHouseOffsetDateTimeValue.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,15 @@ public static ClickHouseOffsetDateTimeValue of(ClickHouseValue ref, LocalDateTim
8787

8888
private final int scale;
8989
private final TimeZone tz;
90+
private final OffsetDateTime defaultValue;
9091

9192
protected ClickHouseOffsetDateTimeValue(OffsetDateTime value, int scale, TimeZone tz) {
9293
super(value);
9394
this.scale = ClickHouseChecker.between(scale, ClickHouseValues.PARAM_SCALE, 0, 9);
9495
this.tz = tz == null || tz.equals(ClickHouseValues.UTC_TIMEZONE) ? ClickHouseValues.UTC_TIMEZONE : tz;
96+
this.defaultValue = this.tz.equals(ClickHouseValues.UTC_TIMEZONE) ? DEFAULT
97+
: ClickHouseInstantValue.DEFAULT
98+
.atOffset(tz.toZoneId().getRules().getOffset(ClickHouseInstantValue.DEFAULT));
9599
}
96100

97101
public int getScale() {
@@ -221,9 +225,7 @@ public String asString(int length, Charset charset) {
221225

222226
@Override
223227
public ClickHouseOffsetDateTimeValue resetToDefault() {
224-
set(tz == null ? DEFAULT
225-
: ClickHouseInstantValue.DEFAULT
226-
.atOffset(tz.toZoneId().getRules().getOffset(ClickHouseInstantValue.DEFAULT)));
228+
set(defaultValue);
227229
return this;
228230
}
229231

clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHousePreparedStatementTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.time.LocalDate;
2121
import java.time.LocalDateTime;
2222
import java.time.ZoneOffset;
23+
import java.util.Calendar;
2324
import java.util.Collections;
2425
import java.util.Properties;
2526
import java.util.TimeZone;
@@ -36,7 +37,9 @@
3637
import com.clickhouse.client.ClickHouseProtocol;
3738
import com.clickhouse.client.config.ClickHouseClientOption;
3839
import com.clickhouse.client.data.ClickHouseBitmap;
40+
import com.clickhouse.client.data.ClickHouseDateTimeValue;
3941
import com.clickhouse.client.data.ClickHouseExternalTable;
42+
import com.clickhouse.client.data.ClickHouseOffsetDateTimeValue;
4043
import com.clickhouse.jdbc.internal.InputBasedPreparedStatement;
4144
import com.clickhouse.jdbc.internal.SqlBasedPreparedStatement;
4245

@@ -1480,6 +1483,39 @@ public void testInsertWithMultipleValues() throws Exception {
14801483
}
14811484
}
14821485

1486+
@Test(groups = "integration")
1487+
public void testInsertWithNullDateTime() throws Exception {
1488+
Properties props = new Properties();
1489+
props.setProperty(JdbcConfig.PROP_NULL_AS_DEFAULT, "2");
1490+
try (ClickHouseConnection conn = newConnection(props);
1491+
Statement s = conn.createStatement()) {
1492+
s.execute("drop table if exists test_insert_with_null_datetime; "
1493+
+ "CREATE TABLE test_insert_with_null_datetime(a Int32, "
1494+
+ "b01 DateTime32, b02 DateTime32('America/Los_Angeles'), "
1495+
+ "b11 DateTime32, b12 DateTime32('America/Los_Angeles'), "
1496+
+ "c01 DateTime64(3), c02 DateTime64(6, 'Asia/Shanghai'), "
1497+
+ "c11 DateTime64(3), c12 DateTime64(6, 'Asia/Shanghai')) ENGINE=Memory");
1498+
try (PreparedStatement ps = conn
1499+
.prepareStatement("INSERT INTO test_insert_with_null_datetime values(?, ? ,? ,?,?)")) {
1500+
ps.setInt(1, 1);
1501+
ps.setObject(2, LocalDateTime.now());
1502+
ps.setObject(3, LocalDateTime.now());
1503+
ps.setTimestamp(4, null);
1504+
ps.setNull(5, Types.TIMESTAMP);
1505+
ps.setObject(6, LocalDateTime.now());
1506+
ps.setObject(7, LocalDateTime.now());
1507+
ps.setObject(8, null);
1508+
ps.setTimestamp(9, null, Calendar.getInstance());
1509+
ps.executeUpdate();
1510+
}
1511+
1512+
try (ResultSet rs = s.executeQuery("select * from test_insert_with_null_datetime order by a")) {
1513+
Assert.assertTrue(rs.next());
1514+
Assert.assertFalse(rs.next());
1515+
}
1516+
}
1517+
}
1518+
14831519
@Test(groups = "integration")
14841520
public void testGetParameterMetaData() throws Exception {
14851521
try (Connection conn = newConnection(new Properties());

0 commit comments

Comments
 (0)