DBZ-768 Default values with variable second fractions

This commit is contained in:
Jiri Pechanec 2018-06-26 08:47:36 +02:00
parent a3f42610ff
commit 741debe18e
2 changed files with 54 additions and 7 deletions

View File

@ -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());
}

View File

@ -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()));
}
}