DBZ-3497 Handle MySQL DATE default value parser to accept timestamp

This commit is contained in:
Anisha Mohanty 2021-05-05 15:19:50 +05:30 committed by Jiri Pechanec
parent e6d1beb697
commit 5156ea0d16
2 changed files with 17 additions and 6 deletions

View File

@ -47,6 +47,14 @@ public class MySqlDefaultValueConverter {
private static final String EPOCH_DATE = "1970-01-01"; private static final String EPOCH_DATE = "1970-01-01";
private static final DateTimeFormatter DATE_WITH_OPTIONAL_TIME_FORMATTER_BUILDER = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.optionalStart()
.appendLiteral(" ")
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.optionalEnd()
.toFormatter();
private final MySqlValueConverters converters; private final MySqlValueConverters converters;
public MySqlDefaultValueConverter(MySqlValueConverters converters) { public MySqlDefaultValueConverter(MySqlValueConverters converters) {
@ -99,23 +107,24 @@ public Object convert(Column column, String value) {
} }
/** /**
* Converts a string object for an object type of {@link LocalDate}. * Converts a string object for an object type of {@link LocalDate} or {@link LocalDateTime} in case of MySql Date type.
* If the column definition allows null and default value is 0000-00-00, we need return null; * If the column definition allows null and default value is 0000-00-00, we need return null;
* else 0000-00-00 will be replaced with 1970-01-01; * else 0000-00-00 will be replaced with 1970-01-01;
* *
* @param column the column definition describing the {@code data} value; never null * @param column the column definition describing the {@code data} value; never null
* @param value the string object to be converted into a {@link LocalDate} type; * @param value the string object to be converted into a {@link LocalDate} type or {@link LocalDateTime} in case of MySql Date type;
* @return the converted value; * @return the converted value;
*/ */
private Object convertToLocalDate(Column column, String value) { private Object convertToLocalDate(Column column, String value) {
final boolean zero = EPOCH_EQUIVALENT_DATE.matcher(value).matches() || "0".equals(value); final boolean zero = EPOCH_EQUIVALENT_DATE.matcher(value).matches() || EPOCH_EQUIVALENT_TIMESTAMP.matcher(value).matches() || "0".equals(value);
if (zero && column.isOptional()) { if (zero && column.isOptional()) {
return null; return null;
} }
if (zero) { if (zero) {
value = EPOCH_DATE; value = EPOCH_DATE;
} }
return LocalDate.from(DateTimeFormatter.ISO_LOCAL_DATE.parse(value)); return LocalDate.from(DATE_WITH_OPTIONAL_TIME_FORMATTER_BUILDER.parse(value));
} }
/** /**

View File

@ -394,7 +394,8 @@ public void parseDateDefaultValue() {
" E date NOT NULL DEFAULT '9999-09-09'," + " E date NOT NULL DEFAULT '9999-09-09'," +
" F date NOT NULL DEFAULT '1111-11-11'," + " F date NOT NULL DEFAULT '1111-11-11'," +
" G date NOT NULL DEFAULT '2018-08-31'," + " G date NOT NULL DEFAULT '2018-08-31'," +
" H date NOT NULL DEFAULT 0" + " H date NOT NULL DEFAULT '2050-01-01 00:00:00'," +
" I date NOT NULL DEFAULT 0" +
");"; ");";
parser.parse(sql, tables); parser.parse(sql, tables);
Table table = tables.forTable(new TableId(null, null, "DATE_TABLE")); Table table = tables.forTable(new TableId(null, null, "DATE_TABLE"));
@ -405,7 +406,8 @@ public void parseDateDefaultValue() {
assertThat(table.columnWithName("E").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(9999, 9, 9, 0, 0, 0, 0, ZoneOffset.UTC).toInstant())); assertThat(table.columnWithName("E").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(9999, 9, 9, 0, 0, 0, 0, ZoneOffset.UTC).toInstant()));
assertThat(table.columnWithName("F").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(1111, 11, 11, 0, 0, 0, 0, ZoneOffset.UTC).toInstant())); assertThat(table.columnWithName("F").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(1111, 11, 11, 0, 0, 0, 0, ZoneOffset.UTC).toInstant()));
assertThat(table.columnWithName("G").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(2018, 8, 31, 0, 0, 0, 0, ZoneOffset.UTC).toInstant())); assertThat(table.columnWithName("G").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(2018, 8, 31, 0, 0, 0, 0, ZoneOffset.UTC).toInstant()));
assertThat(table.columnWithName("H").defaultValue()).isEqualTo((Date.from(Instant.ofEpochMilli(0)))); assertThat(table.columnWithName("H").defaultValue()).isEqualTo(Date.from(ZonedDateTime.of(2050, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC).toInstant()));
assertThat(table.columnWithName("I").defaultValue()).isEqualTo((Date.from(Instant.ofEpochMilli(0))));
} }
@Test @Test