public static boolean check()

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;
    }