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