DBZ-2726 extend data separator and time separator

This commit is contained in:
Kewei Shang 2020-11-09 14:19:24 +02:00 committed by Jiri Pechanec
parent 7e44a3068a
commit 78c061a86d
2 changed files with 64 additions and 28 deletions

View File

@ -273,34 +273,31 @@ private String cleanTimestamp(String s) {
s = s.trim();
// clean first dash
s = replaceFirstNonNumericSubstring(s, 0, '-');
// clean second dash
s = replaceFirstNonNumericSubstring(s, s.indexOf('-') + 1, '-');
// clean dividing space
s = replaceFirstNonNumericSubstring(s, s.indexOf('-', s.indexOf('-') + 1) + 1, ' ');
if (s.indexOf(' ') != -1) {
// clean first colon
s = replaceFirstNonNumericSubstring(s, s.indexOf(' ') + 1, ':');
if (s.indexOf(':') != -1) {
// clean second colon
s = replaceFirstNonNumericSubstring(s, s.indexOf(':') + 1, ':');
}
}
final int MAX_MONTH = 12;
final int MAX_DAY = 31;
// Parse the date
int firstDash = s.indexOf('-');
int secondDash = s.indexOf('-', firstDash + 1);
int dividingStart = -1;
int dividingEnd = -1;
boolean hasDividing = false;
for (int i = secondDash + 1; i < s.length(); i++) {
if (!Character.isDigit(s.charAt(i))) {
dividingStart = i;
hasDividing = true;
break;
}
}
if (hasDividing) {
for (int i = dividingStart; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
break;
}
dividingEnd = i;
}
}
int dividingSpace = s.indexOf(' ');
// Parse the time
int firstColon = s.indexOf(':', dividingEnd + 1);
int firstColon = s.indexOf(':', dividingSpace + 1);
int secondColon = s.indexOf(':', firstColon + 1);
int period = s.indexOf('.', secondColon + 1);
@ -317,8 +314,8 @@ private String cleanTimestamp(String s) {
if (firstDash > 0 && secondDash > firstDash) {
year = Integer.parseInt(s.substring(0, firstDash));
month = Integer.parseInt(s.substring(firstDash + 1, secondDash));
if (hasDividing) {
day = Integer.parseInt(s.substring(secondDash + 1, dividingStart));
if (dividingSpace != -1) {
day = Integer.parseInt(s.substring(secondDash + 1, dividingSpace));
}
else {
day = Integer.parseInt(s.substring(secondDash + 1, len));
@ -333,12 +330,12 @@ private String cleanTimestamp(String s) {
}
// Get the time. Hour, minute, second and colons are all optional
if (hasDividing && dividingEnd < len - 1) {
if (dividingSpace != -1 && dividingSpace < len - 1) {
if (firstColon == -1) {
hour = Integer.parseInt(s.substring(dividingEnd + 1, len));
hour = Integer.parseInt(s.substring(dividingSpace + 1, len));
}
else {
hour = Integer.parseInt(s.substring(dividingEnd + 1, firstColon));
hour = Integer.parseInt(s.substring(dividingSpace + 1, firstColon));
if (firstColon < len - 1) {
if (secondColon == -1) {
minute = Integer.parseInt(s.substring(firstColon + 1, len));
@ -369,6 +366,23 @@ private String cleanTimestamp(String s) {
return cleanedTimestamp.toString();
}
/**
* Replace the first non-numeric substring
*
* @param s the original string
* @param startIndex the beginning index, inclusive
* @param c the new character
* @return
*/
private String replaceFirstNonNumericSubstring(String s, int startIndex, char c) {
StringBuilder sb = new StringBuilder();
sb.append(s.substring(0, startIndex));
String rest = s.substring(startIndex);
sb.append(rest.replaceFirst("[^\\d]+", Character.toString(c)));
return sb.toString();
}
public ColumnEditor setColumnDefaultValue(ColumnEditor columnEditor) {
final Column column = columnEditor.create();

View File

@ -2559,14 +2559,22 @@ public void shouldParseTimestampDefaultValue() {
"ts_col08 TIMESTAMP DEFAULT '2020-01-02 03:04'," +
"ts_col09 TIMESTAMP DEFAULT '2020-01-02 03:004'," +
"ts_col10 TIMESTAMP DEFAULT '2020-01-02 03:04:05'," +
"ts_col11 TIMESTAMP DEFAULT '2020-01-02 03:04:05.6'," +
"ts_col11 TIMESTAMP(6) DEFAULT '2020-01-02 03:04:05.123456'," +
"ts_col12 TIMESTAMP DEFAULT '2020-01-02 03:04:05.'," +
"ts_col13 TIMESTAMP DEFAULT '2020-01-02:03:04:05'," +
"ts_col14 TIMESTAMP DEFAULT '2020-01-02-03:04:05'," +
"ts_col15 TIMESTAMP DEFAULT '2020-01-02--03:04:05'," +
"ts_col16 TIMESTAMP DEFAULT '2020-01-02--03:004:0005'," +
"ts_col17 TIMESTAMP DEFAULT '02020-0001-00002--03:004:0005'," +
"ts_col18 TIMESTAMP DEFAULT '1970-01-01:00:00:001');";
"ts_col18 TIMESTAMP DEFAULT '1970-01-01:00:00:001'," +
"ts_col19 TIMESTAMP DEFAULT '2020-01-02 03!@#.$:{}()[]^04!@#.$:{}()[]^05'," +
"ts_col20 TIMESTAMP DEFAULT '2020-01-02 03::04'," +
"ts_col21 TIMESTAMP DEFAULT '2020-01-02 03::04.'," +
"ts_col22 TIMESTAMP DEFAULT '2020-01-02 03.04'," +
"ts_col23 TIMESTAMP DEFAULT '2020#01#02 03.04'," +
"ts_col24 TIMESTAMP DEFAULT '2020##01--02^03.04'," +
"ts_col25 TIMESTAMP DEFAULT '2020-01-02 03::04'" +
");";
parser.parse(ddl, tables);
Table table = tables.forTable(new TableId(null, null, "my_table"));
@ -2591,7 +2599,7 @@ public void shouldParseTimestampDefaultValue() {
assertThat(table.columnWithName("ts_col10").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col10").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:05"));
assertThat(table.columnWithName("ts_col11").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col11").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:05.6"));
assertThat(table.columnWithName("ts_col11").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:05.123456"));
assertThat(table.columnWithName("ts_col12").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col12").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:05"));
assertThat(table.columnWithName("ts_col13").hasDefaultValue()).isEqualTo(true);
@ -2606,6 +2614,20 @@ public void shouldParseTimestampDefaultValue() {
assertThat(table.columnWithName("ts_col17").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:05"));
assertThat(table.columnWithName("ts_col18").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col18").defaultValue()).isEqualTo(toIsoString("1970-01-01 00:00:01"));
assertThat(table.columnWithName("ts_col19").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col19").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:05"));
assertThat(table.columnWithName("ts_col20").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col20").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:00"));
assertThat(table.columnWithName("ts_col21").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col21").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:00"));
assertThat(table.columnWithName("ts_col22").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col22").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:00"));
assertThat(table.columnWithName("ts_col23").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col23").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:00"));
assertThat(table.columnWithName("ts_col24").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col24").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:00"));
assertThat(table.columnWithName("ts_col25").hasDefaultValue()).isEqualTo(true);
assertThat(table.columnWithName("ts_col25").defaultValue()).isEqualTo(toIsoString("2020-01-02 03:04:00"));
final String alter1 = "ALTER TABLE my_table ADD ts_col TIMESTAMP DEFAULT '2020-01-02';";