DBZ-768 Default values with variable second fractions
This commit is contained in:
parent
a3f42610ff
commit
741debe18e
@ -14,6 +14,7 @@
|
||||
import java.time.LocalTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import io.debezium.annotation.Immutable;
|
||||
import io.debezium.relational.Column;
|
||||
@ -29,7 +30,7 @@
|
||||
@Immutable
|
||||
public class MySqlDefaultValuePreConverter {
|
||||
|
||||
private static final String ALL_ZERO_TIMESTAMP = "0000-00-00 00:00:00";
|
||||
private static final Pattern ALL_ZERO_TIMESTAMP = Pattern.compile("0000-00-00 00:00:00(\\.\\d{1,6})?");
|
||||
|
||||
private static final String ALL_ZERO_DATE = "0000-00-00";
|
||||
|
||||
@ -108,9 +109,19 @@ private Object convertToLocalDate(Column column, String value) {
|
||||
* @return the converted value;
|
||||
*/
|
||||
private Object convertToLocalDateTime(Column column, String value) {
|
||||
if (ALL_ZERO_TIMESTAMP.equals(value) && column.isOptional()) return null;
|
||||
if (ALL_ZERO_TIMESTAMP.equals(value)) value = EPOCH_TIMESTAMP;
|
||||
String timestampFormat = timestampFormat(column.length());
|
||||
final boolean matches = ALL_ZERO_TIMESTAMP.matcher(value).matches();
|
||||
if (matches && column.isOptional()) return null;
|
||||
if (matches) {
|
||||
value = EPOCH_TIMESTAMP;
|
||||
if (column.length() > 0) {
|
||||
final StringBuilder sb = new StringBuilder(EPOCH_TIMESTAMP).append('.');
|
||||
for (int i = 0; i < column.length(); i++) {
|
||||
sb.append('0');
|
||||
}
|
||||
value = sb.toString();
|
||||
}
|
||||
}
|
||||
final String timestampFormat = timestampFormat(column.length());
|
||||
return LocalDateTime.from(DateTimeFormatter.ofPattern(timestampFormat).parse(value));
|
||||
}
|
||||
|
||||
@ -124,8 +135,9 @@ private Object convertToLocalDateTime(Column column, String value) {
|
||||
* @return the converted value;
|
||||
*/
|
||||
private Object convertToTimestamp(Column column, String value) {
|
||||
if (ALL_ZERO_TIMESTAMP.equals(value) && column.isOptional()) return null;
|
||||
if (ALL_ZERO_TIMESTAMP.equals(value)) value = EPOCH_TIMESTAMP;
|
||||
final boolean matches = ALL_ZERO_TIMESTAMP.matcher(value).matches();
|
||||
if (matches && column.isOptional()) return null;
|
||||
if (matches) value = EPOCH_TIMESTAMP;
|
||||
return Timestamp.valueOf(value).toInstant().atZone(ZoneId.systemDefault());
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,10 @@
|
||||
import static org.fest.assertions.Assertions.assertThat;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneOffset;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.junit.Before;
|
||||
@ -271,7 +275,6 @@ public void parseNumberDefaultValue() {
|
||||
assertThat(table.columnWithName("D").defaultValue()).isEqualTo(20L);
|
||||
assertThat(table.columnWithName("E").defaultValue()).isEqualTo(null);
|
||||
assertThat(table.columnWithName("F").defaultValue()).isEqualTo(0d);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -317,4 +320,36 @@ public void parseNumericAndDecimalToDecimalDefaultValue() {
|
||||
assertThat(table.columnWithName("B").defaultValue()).isEqualTo(BigDecimal.valueOf(2.321));
|
||||
assertThat(table.columnWithName("C").defaultValue()).isEqualTo(BigDecimal.valueOf(12.678));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void parseTimeDefaultValue() {
|
||||
String sql = "CREATE TABLE TIME_TABLE (\n" +
|
||||
" A timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n" +
|
||||
" B timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',\n" +
|
||||
" C timestamp NOT NULL DEFAULT '0000-00-00 00:00:00.000'," +
|
||||
" D timestamp NOT NULL DEFAULT '2018-06-26 12:34:56'," +
|
||||
" E timestamp NOT NULL DEFAULT '2018-06-26 12:34:56.000'," +
|
||||
" F timestamp NOT NULL DEFAULT '2018-06-26 12:34:56.78'," +
|
||||
" G datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n" +
|
||||
" H datetime NOT NULL DEFAULT '0000-00-00 00:00:00',\n" +
|
||||
" I datetime(3) NOT NULL DEFAULT '0000-00-00 00:00:00.000'," +
|
||||
" J datetime NOT NULL DEFAULT '2018-06-26 12:34:56'," +
|
||||
" K datetime(3) NOT NULL DEFAULT '2018-06-26 12:34:56.000'," +
|
||||
" L datetime(2) NOT NULL DEFAULT '2018-06-26 12:34:56.78'" +
|
||||
");";
|
||||
parser.parse(sql, tables);
|
||||
Table table = tables.forTable(new TableId(null, null, "TIME_TABLE"));
|
||||
assertThat(table.columnWithName("A").defaultValue()).isEqualTo("1970-01-01T00:00:00+01:00");
|
||||
assertThat(table.columnWithName("B").defaultValue()).isEqualTo("1970-01-01T00:00:00+01:00");
|
||||
assertThat(table.columnWithName("C").defaultValue()).isEqualTo("1970-01-01T00:00:00+01:00");
|
||||
assertThat(table.columnWithName("D").defaultValue()).isEqualTo("2018-06-26T12:34:56+02:00");
|
||||
assertThat(table.columnWithName("E").defaultValue()).isEqualTo("2018-06-26T12:34:56+02:00");
|
||||
assertThat(table.columnWithName("F").defaultValue()).isEqualTo("2018-06-26T12:34:56.78+02:00");
|
||||
assertThat(table.columnWithName("G").defaultValue()).isEqualTo(Date.from(Instant.ofEpochMilli(0)));
|
||||
assertThat(table.columnWithName("H").defaultValue()).isEqualTo((Date.from(Instant.ofEpochMilli(0))));
|
||||
assertThat(table.columnWithName("I").defaultValue()).isEqualTo((Date.from(Instant.ofEpochMilli(0))));
|
||||
assertThat(table.columnWithName("J").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(2018, 6, 26, 12, 34, 56, 0, ZoneOffset.UTC).toInstant()));
|
||||
assertThat(table.columnWithName("K").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(2018, 6, 26, 12, 34, 56, 0, ZoneOffset.UTC).toInstant()));
|
||||
assertThat(table.columnWithName("L").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(2018, 6, 26, 12, 34, 56, 780_000_000, ZoneOffset.UTC).toInstant()));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user