public final SQLType scanSQLType()

in core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java [696:1020]


    public final SQLType scanSQLType() {
        _loop:
        for (; ; ) {
            while (isWhitespace(ch)) {
                ch = charAt(++pos);
            }

            if (ch == '/') {
                if (pos + 1 < text.length() && text.charAt(pos + 1) == '*') {
                    int index = text.indexOf("*/", pos + 2);
                    if (index == -1) {
                        return SQLType.UNKNOWN;
                    }

                    pos = index + 2;
                    ch = charAt(pos);
                    continue;
                } else if (pos + 2 < text.length()
                        && text.charAt(pos + 1) == ' '
                        && text.charAt(pos + 2) == '*'
                        && dialectFeatureEnabled(ScanSQLTypeBlockComment)
                ) {
                    int index = text.indexOf("* /", pos + 3);
                    if (index == -1) {
                        return SQLType.UNKNOWN;
                    }

                    pos = index + 3;
                    ch = charAt(pos);
                    continue;
                }
            }

            if (dialectFeatureEnabled(ScanSQLTypeWithSemi)) {
                while (ch == ';') {
                    ch = charAt(++pos);

                    if (isEOF()) {
                        return SQLType.EMPTY;
                    }

                    while (isWhitespace(ch)) {
                        ch = charAt(++pos);
                    }
                    continue _loop;
                }
            }

            if (pos + 1 < text.length()
                    && ((ch == '-' && text.charAt(pos + 1) == '-') || (ch == '—' && text.charAt(pos + 1) == '—'))) {
                int index = text.indexOf('\n', pos + 2);
                if (index == -1) {
                    reset(0);
                    nextToken();
                    if (token == EOF) {
                        return SQLType.EMPTY;
                    }

                    return SQLType.UNKNOWN;
                }

                pos = index + 1;
                ch = charAt(pos);
                continue;
            }

            break;
        }

        while (ch == '(') {
            ch = charAt(++pos);

            while (isWhitespace(ch)) {
                ch = charAt(++pos);
            }
        }

        long hashCode = FnvHash.BASIC;
        for (; ; ) {
            char c;
            if (ch >= 'a' && ch <= 'z') {
                c = ch;
            } else if (ch >= 'A' && ch <= 'Z') {
                c = (char) (ch + 32);
            } else {
                break;
            }
            hashCode ^= c;
            hashCode *= FnvHash.PRIME;

            ch = charAt(++pos);
        }

        if (ch == '_' || (ch >= '0' && ch <= '9')) {
            return SQLType.UNKNOWN;
        }

        if (hashCode == FnvHash.Constants.SELECT) {
            return SQLType.SELECT;
        } else if (hashCode == FnvHash.Constants.INSERT) {
            return SQLType.INSERT;
        } else if (hashCode == FnvHash.Constants.DELETE) {
            return SQLType.DELETE;
        } else if (hashCode == FnvHash.Constants.UPDATE) {
            return SQLType.UPDATE;
        } else if (hashCode == FnvHash.Constants.REPLACE) {
            return SQLType.REPLACE;
        } else if (hashCode == FnvHash.Constants.TRUNCATE) {
            return SQLType.TRUNCATE;
        } else if (hashCode == FnvHash.Constants.MERGE) {
            return SQLType.MERGE;
        } else if (hashCode == FnvHash.Constants.CREATE) {
            return SQLType.CREATE;
        } else if (hashCode == FnvHash.Constants.ALTER) {
            return SQLType.ALTER;
        } else if (hashCode == FnvHash.Constants.SHOW) {
            nextToken();
            if (identifierEquals(FnvHash.Constants.STATISTIC)) {
                return SQLType.SHOW_STATISTIC;
            } else if (identifierEquals(FnvHash.Constants.STATISTIC_LIST)) {
                return SQLType.SHOW_STATISTIC_LIST;
            } else if (identifierEquals(FnvHash.Constants.TABLES) || identifierEquals("TABLES;")) {
                return SQLType.SHOW_TABLES;
            } else if (identifierEquals(FnvHash.Constants.PARTITIONS)) {
                return SQLType.SHOW_PARTITIONS;
            } else if (identifierEquals(FnvHash.Constants.CATALOGS)) {
                return SQLType.SHOW_CATALOGS;
            } else if (identifierEquals(FnvHash.Constants.FUNCTIONS)) {
                return SQLType.SHOW_FUNCTIONS;
            } else if (identifierEquals(FnvHash.Constants.ROLES)) {
                return SQLType.SHOW_ROLES;
            } else if (identifierEquals(FnvHash.Constants.ROLE)) {
                return SQLType.SHOW_ROLE;
            } else if (identifierEquals(FnvHash.Constants.LABEL)) {
                return SQLType.SHOW_LABEL;
            } else if (identifierEquals(FnvHash.Constants.GRANTS)) {
                return SQLType.SHOW_GRANTS;
            } else if (identifierEquals(FnvHash.Constants.GRANT)
                    || token == GRANT
            ) {
                return SQLType.SHOW_GRANT;
            } else if (identifierEquals(FnvHash.Constants.RECYCLEBIN)) {
                return SQLType.SHOW_RECYCLEBIN;
            } else if (identifierEquals("VARIABLES")) {
                return SQLType.SHOW_VARIABLES;
            } else if (identifierEquals("HISTORY")) {
                return SQLType.SHOW_HISTORY;
            } else if (identifierEquals("PACKAGES")) {
                return SQLType.SHOW_PACKAGES;
            } else if (identifierEquals("PACKAGE")) {
                return SQLType.SHOW_PACKAGE;
            } else if (identifierEquals("CHANGELOGS")) {
                return SQLType.SHOW_CHANGELOGS;
            } else if (identifierEquals("ACL")) {
                return SQLType.SHOW_ACL;
            } else if (token == CREATE) {
                nextToken();
                if (token == TABLE) {
                    return SQLType.SHOW_CREATE_TABLE;
                }
            }
            return SQLType.SHOW;
        } else if (hashCode == FnvHash.Constants.DESC) {
            return SQLType.DESC;
        } else if (hashCode == FnvHash.Constants.DESCRIBE) {
            return SQLType.DESC;
        } else if (hashCode == FnvHash.Constants.SET) {
            nextToken();
            if (identifierEquals(FnvHash.Constants.LABEL)) {
                return SQLType.SET_LABEL;
            } else if (identifierEquals("PROJECT")) {
                return SQLType.SET_PROJECT;
            }
            return SQLType.SET;
        } else if (hashCode == FnvHash.Constants.SETPROJECT) {
            return SQLType.SET_PROJECT;
        } else if (hashCode == FnvHash.Constants.KILL) {
            return SQLType.KILL;
        } else if (hashCode == FnvHash.Constants.MSCK) {
            return SQLType.MSCK;
        } else if (hashCode == FnvHash.Constants.USE) {
            return SQLType.USE;
        } else if (hashCode == FnvHash.Constants.DROP) {
            return SQLType.DROP;
        } else if (hashCode == FnvHash.Constants.LIST) {
            nextToken();
            if (identifierEquals(FnvHash.Constants.USERS)) {
                return SQLType.LIST_USERS;
            } else if (identifierEquals(FnvHash.Constants.TABLES)) {
                return SQLType.LIST_TABLES;
            } else if (identifierEquals(FnvHash.Constants.ROLES)) {
                return SQLType.LIST_ROLES;
            } else if (identifierEquals(FnvHash.Constants.TEMPORARY)) {
                return SQLType.LIST_TEMPORARY_OUTPUT;
            } else if (identifierEquals("TENANT")) {
                nextToken();
                if (identifierEquals(FnvHash.Constants.ROLES)) {
                    return SQLType.LIST_TENANT_ROLES;
                }
            } else if (identifierEquals("TRUSTEDPROJECTS")) {
                return SQLType.LIST_TRUSTEDPROJECTS;
            } else if (identifierEquals("ACCOUNTPROVIDERS")) {
                return SQLType.LIST_ACCOUNTPROVIDERS;
            }
            return SQLType.LIST;
        } else if (hashCode == FnvHash.Constants.ROLLBACK) {
            return SQLType.ROLLBACK;
        } else if (hashCode == FnvHash.Constants.COMMIT) {
            return SQLType.COMMIT;
        } else if (hashCode == FnvHash.Constants.WHO) {
            return SQLType.WHO;
        } else if (hashCode == FnvHash.Constants.GRANT) {
            return SQLType.GRANT;
        } else if (hashCode == FnvHash.Constants.REVOKE) {
            return SQLType.REVOKE;
        } else if (hashCode == FnvHash.Constants.ANALYZE) {
            return SQLType.ANALYZE;
        } else if (hashCode == FnvHash.Constants.EXPLAIN) {
            return SQLType.EXPLAIN;
        } else if (hashCode == FnvHash.Constants.READ) {
            return SQLType.READ;
        } else if (hashCode == FnvHash.Constants.WITH) {
            return SQLType.WITH;
        } else if (hashCode == FnvHash.Constants.DUMP) {
            nextToken();
            if (identifierEquals(FnvHash.Constants.DATA)) {
                return SQLType.DUMP_DATA;
            }
        } else if (hashCode == FnvHash.Constants.ADD) {
            nextToken();
            if (token == Token.USER || identifierEquals(FnvHash.Constants.USER)) {
                return SQLType.ADD_USER;
            } else if (token == TABLE) {
                return SQLType.ADD_TABLE;
            } else if (token == FUNCTION) {
                return SQLType.ADD_FUNCTION;
            } else if (identifierEquals(FnvHash.Constants.STATISTIC)) {
                return SQLType.ADD_STATISTIC;
            } else if (identifierEquals(FnvHash.Constants.RESOURCE)) {
                return SQLType.ADD_RESOURCE;
            } else if (identifierEquals("VOLUME")) {
                return SQLType.ADD_VOLUME;
            } else if (identifierEquals("ACCOUNTPROVIDER")) {
                return SQLType.ADD_ACCOUNTPROVIDER;
            } else if (identifierEquals("TRUSTEDPROJECT")) {
                return SQLType.ADD_TRUSTEDPROJECT;
            } else {
                return SQLType.ADD;
            }
        } else if (hashCode == FnvHash.Constants.REMOVE) {
            nextToken();
            if (token == Token.USER || identifierEquals(FnvHash.Constants.USER)) {
                return SQLType.REMOVE_USER;
            }

            if (identifierEquals(FnvHash.Constants.RESOURCE)) {
                return SQLType.REMOVE_RESOURCE;
            }
            return SQLType.REMOVE;
        } else if (hashCode == FnvHash.Constants.TUNNEL) {
            nextToken();
            if (identifierEquals(FnvHash.Constants.DOWNLOAD)) {
                return SQLType.TUNNEL_DOWNLOAD;
            }
        } else if (hashCode == FnvHash.Constants.UPLOAD) {
            return SQLType.UPLOAD;
        } else if (hashCode == FnvHash.Constants.WHOAMI) {
            return SQLType.WHOAMI;
        } else if (hashCode == FnvHash.Constants.COUNT) {
            return SQLType.COUNT;
        } else if (hashCode == FnvHash.Constants.CLONE) {
            return SQLType.CLONE;
        } else if (hashCode == FnvHash.Constants.LOAD) {
            return SQLType.LOAD;
        } else if (hashCode == FnvHash.Constants.INSTALL) {
            return SQLType.INSTALL;
        } else if (hashCode == FnvHash.Constants.UNLOAD) {
            return SQLType.UNLOAD;
        } else if (hashCode == FnvHash.Constants.ALLOW) {
            return SQLType.ALLOW;
        } else if (hashCode == FnvHash.Constants.PURGE) {
            return SQLType.PURGE;
        } else if (hashCode == FnvHash.Constants.RESTORE) {
            return SQLType.RESTORE;
        } else if (hashCode == FnvHash.Constants.EXSTORE) {
            return SQLType.EXSTORE;
        } else if (hashCode == FnvHash.Constants.UNDO) {
            return SQLType.UNDO;
        } else if (hashCode == FnvHash.Constants.REMOVE) {
            return SQLType.REMOVE;
        } else if (hashCode == FnvHash.Constants.FROM && dialectFeatureEnabled(ScanSQLTypeWithFrom)) {
            return SQLType.INSERT_MULTI;
        } else if (hashCode == FnvHash.Constants.ADD) {
            return SQLType.ADD;
        } else if (hashCode == FnvHash.Constants.IF) {
            return SQLType.SCRIPT;
        } else if (hashCode == FnvHash.Constants.FUNCTION && dialectFeatureEnabled(ScanSQLTypeWithFunction)) {
            return SQLType.SCRIPT;
        } else if (hashCode == FnvHash.Constants.BEGIN && dialectFeatureEnabled(ScanSQLTypeWithBegin)) {
            return SQLType.SCRIPT;
        } else if (ch == '@') {
            nextToken();
            if (token == VARIANT && dialectFeatureEnabled(ScanSQLTypeWithAt)) {
                nextToken();

                if (token == TABLE) {
                    return SQLType.SCRIPT;
                }

                // datatype
                if (token == IDENTIFIER) {
                    nextToken();
                }

                if (token == COLONEQ || token == SEMI) {
                    return SQLType.SCRIPT;
                }
            }
        }

        if (ch == EOI) {
            return SQLType.EMPTY;
        }
        return SQLType.UNKNOWN;
    }