in core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimestampExpr.java [256:588]
public static boolean check(String str) {
final int len;
if (str == null || (len = str.length()) < 14 || len > 23) {
return false;
}
final char c0 = str.charAt(0);
final char c1 = str.charAt(1);
final char c2 = str.charAt(2);
final char c3 = str.charAt(3);
final char c4 = str.charAt(4);
final char c5 = str.charAt(5);
final char c6 = str.charAt(6);
final char c7 = str.charAt(7);
final char c8 = str.charAt(8);
final char c9 = str.charAt(9);
final char c10 = str.charAt(10);
// check year
if (c0 < '1' | c0 > '9') {
return false;
}
if (c1 < '0' | c1 > '9') {
return false;
}
if (c2 < '0' | c2 > '9') {
return false;
}
if (c3 < '0' | c3 > '9') {
return false;
}
int year = (c0 - '0') * 1000 + (c1 - '0') * 100 + (c2 - '0') * 10 + (c3 - '0');
if (year < 1000) {
return false;
}
if (c4 != '-') {
return false;
}
final int month, day;
char M0 = 0, M1 = 0, d0 = 0, d1 = 0;
if (c8 == ' ') {
if (c6 != '-') {
return false;
}
M1 = c5;
d1 = c7;
} else if (c9 == ' ') {
if (c6 == '-') {
M1 = c5;
d0 = c7;
d1 = c8;
} else if (c7 == '-') {
M0 = c5;
M1 = c6;
d1 = c8;
} else {
return false;
}
} else if (c10 == ' ') {
if (c7 != '-') {
return false;
}
M0 = c5;
M1 = c6;
d0 = c8;
d1 = c9;
} else {
return false;
}
if (M0 == 0) {
if (M1 < '0' || M1 > '9') {
return false;
}
month = M1 - '0';
} else {
if (M0 != '0' && M0 != '1') {
return false;
}
if (M1 < '0' || M1 > '9') {
return false;
}
month = (M0 - '0') * 10 + M1 - '0';
}
if (d0 == 0) {
if (d1 < '0' || d1 > '9') {
return false;
}
day = d1 - '0';
} else {
if (d0 < '0' || d0 > '9') {
return false;
}
if (d1 < '0' || d1 > '9') {
return false;
}
day = (d0 - '0') * 10 + d1 - '0';
}
if (month < 1) {
return false;
}
if (day < 1) {
return false;
}
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (day > 31) {
return false;
}
break;
case 2:
if (day > 29) {
return false;
}
break;
case 4:
case 6:
case 9:
case 11:
if (day > 30) {
return false;
}
break;
default:
break;
}
int index = len - 1;
if (str.charAt(index) == '0' && str.charAt(index - 1) == '.') {
index -= 2;
}
final char x0 = str.charAt(index--);
final char x1 = str.charAt(index--);
final char x2 = str.charAt(index--);
final char x3 = str.charAt(index--);
final char x4 = str.charAt(index--);
final char x5 = str.charAt(index--);
final char x6 = str.charAt(index--);
final char x7 = str.charAt(index--);
final char x8 = str.charAt(index--);
final char x9 = str.charAt(index--);
final char x10 = str.charAt(index--);
final char x11 = str.charAt(index--);
final char x12 = str.charAt(index--);
final char h0, h1, m0, m1, s0, s1;
if (x5 == ' ') {
if (x1 != ':' || x3 != ':') {
return false;
}
s0 = 0;
s1 = x0;
m0 = 0;
m1 = x2;
h0 = 0;
h1 = x4;
} else if (x6 == ' ') {
if (x1 == ':') {
s0 = 0;
s1 = x0;
if (x3 == ':') {
m0 = 0;
m1 = x2;
h1 = x4;
h0 = x5;
} else if (x4 == ':') {
m0 = x2;
m1 = x3;
h0 = 0;
h1 = x5;
} else {
return false;
}
} else if (x2 == ':') {
s0 = x0;
s1 = x1;
if (x4 != ':') {
return false;
}
m0 = 0;
m1 = x3;
h0 = 0;
h1 = x5;
} else {
return false;
}
} else if (x7 == ' ') {
if (x1 == ':') {
s0 = 0;
s1 = x0;
if (x4 != ':') {
return false;
}
m1 = x2;
m0 = x3;
h1 = x5;
h0 = x6;
} else if (x2 == ':') {
s0 = x0;
s1 = x1;
if (x4 == ':') {
m0 = 0;
m1 = x3;
h1 = x5;
h0 = x6;
} else if (x5 == ':') {
m1 = x3;
m0 = x4;
h0 = 0;
h1 = x6;
} else {
return false;
}
} else {
return false;
}
} else if (x8 == ' ') {
if (x2 != ':' || x5 != ':') {
return false;
}
s1 = x0;
s0 = x1;
m1 = x3;
m0 = x4;
h1 = x6;
h0 = x7;
} else if (x12 == ' ') {
if (x3 != '.' || x6 != ':' || x9 != ':') {
return false;
}
s1 = x4;
s0 = x5;
m1 = x7;
m0 = x8;
h1 = x10;
h0 = x11;
int S2 = x0;
int S1 = x1;
int S0 = x2;
if (S0 < '0' || S0 > '9') {
return false;
}
if (S1 < '0' || S1 > '9') {
return false;
}
if (S2 < '0' || S2 > '9') {
return false;
}
} else {
return false;
}
if (h0 == 0) {
if (h1 < '0' || h1 > '9') {
return false;
}
} else {
if (h0 < '0' || h0 > '2') {
return false;
}
if (h1 < '0' || h1 > '9') {
return false;
}
int hour = (h0 - '0') * 10 + (h1 - '0');
if (hour > 24) {
return false;
}
}
if (m0 == 0) {
if (m1 < '0' || m1 > '9') {
return false;
}
} else {
if (m0 < '0' || m0 > '6') {
return false;
}
if (m1 < '0' || m1 > '9') {
return false;
}
int minute = (m0 - '0') * 10 + (m1 - '0');
if (minute > 60) {
return false;
}
}
if (s0 == 0) {
if (s1 < '0' || s1 > '9') {
return false;
}
} else {
if (s0 < '0' || s0 > '6') {
return false;
}
if (s1 < '0' || s1 > '9') {
return false;
}
int second = (s0 - '0') * 10 + (s1 - '0');
if (second > 60) {
return false;
}
}
return true;
}