in core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java [90:447]
protected String tableAlias(boolean must) {
final Token token = lexer.token;
if (token == Token.CONNECT
|| token == Token.START
|| token == Token.SELECT
|| token == Token.FROM
|| token == Token.WHERE) {
if (token == Token.WHERE && dialectFeatureEnabled(TableAliasConnectWhere)) {
return null;
}
if (must) {
throw new ParserException("illegal alias. " + lexer.info());
}
return null;
}
if (token == Token.IDENTIFIER) {
String ident = lexer.stringVal;
long hash = lexer.hashLCase;
if (isEnabled(SQLParserFeature.IgnoreNameQuotes) && ident.length() > 1) {
ident = StringUtils.removeNameQuotes(ident);
}
if (hash == FnvHash.Constants.START
|| hash == FnvHash.Constants.CONNECT
|| hash == FnvHash.Constants.NATURAL
|| hash == FnvHash.Constants.CROSS
|| hash == FnvHash.Constants.OFFSET
|| hash == FnvHash.Constants.LIMIT) {
if (must) {
throw new ParserException("illegal alias. " + lexer.info());
}
Lexer.SavePoint mark = lexer.mark();
lexer.nextToken();
switch (lexer.token) {
case EOF:
case COMMA:
case WHERE:
case INNER:
case LEFT:
case RIGHT:
case FULL:
case ON:
case GROUP:
case ORDER:
return ident;
case JOIN:
if (hash != FnvHash.Constants.NATURAL
&& hash != FnvHash.Constants.CROSS) {
return ident;
}
lexer.reset(mark);
break;
default:
lexer.reset(mark);
break;
}
return null;
}
if (!must) {
if (hash == FnvHash.Constants.MODEL) {
Lexer.SavePoint mark = lexer.mark();
lexer.nextToken();
if (lexer.token == Token.PARTITION
|| lexer.identifierEquals(FnvHash.Constants.DIMENSION)
|| lexer.identifierEquals(FnvHash.Constants.IGNORE)
|| lexer.identifierEquals(FnvHash.Constants.KEEP)) {
lexer.reset(mark);
return null;
}
return ident;
} else if (hash == FnvHash.Constants.WINDOW) {
Lexer.SavePoint mark = lexer.mark();
lexer.nextToken();
if (lexer.token == Token.IDENTIFIER) {
lexer.reset(mark);
return null;
}
return ident;
} else if (hash == FnvHash.Constants.DISTRIBUTE
|| hash == FnvHash.Constants.SORT
|| hash == FnvHash.Constants.CLUSTER
|| hash == FnvHash.Constants.ZORDER
) {
Lexer.SavePoint mark = lexer.mark();
lexer.nextToken();
if (lexer.token == Token.BY) {
lexer.reset(mark);
return null;
}
return ident;
} else if (hash == FnvHash.Constants.ASOF && dialectFeatureEnabled(TableAliasAsof)) {
Lexer.SavePoint mark = lexer.mark();
lexer.nextToken();
if (lexer.token == Token.LEFT || lexer.token == Token.JOIN) {
lexer.reset(mark);
return null;
}
return ident;
}
}
}
if (!must) {
switch (token) {
case LEFT:
case RIGHT:
case INNER:
case FULL: {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
if (lexer.token == Token.OUTER
|| lexer.token == Token.JOIN
|| lexer.identifierEquals(FnvHash.Constants.ANTI)
|| lexer.identifierEquals(FnvHash.Constants.SEMI)) {
lexer.reset(mark);
return null;
} else {
return strVal;
}
}
case OUTER:
case IN:
case SET:
case BY: {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
switch (lexer.token) {
case WHERE:
case GROUP:
case ORDER:
case LEFT:
case RIGHT:
case FULL:
case RPAREN:
case ON:
case JOIN:
case SEMI: {
return strVal;
}
default:
lexer.reset(mark);
break;
}
break;
}
case FOR:
case GRANT:
case CHECK:
case LEAVE:
case TRIGGER:
case CREATE:
case ASC:
case INOUT:
case DESC:
case SCHEMA:
case IS:
case DECLARE:
case DROP:
case FETCH:
case LOCK:
if (dialectFeatureEnabled(TableAliasLock)) {
String strVal = lexer.stringVal();
lexer.nextToken();
return strVal;
}
break;
case PARTITION:
if (dialectFeatureEnabled(TableAliasPartition)) {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
if (lexer.token == Token.LPAREN) {
lexer.reset(mark);
return null;
}
return strVal;
}
break;
case TABLE:
if (dialectFeatureEnabled(TableAliasTable)) {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
switch (lexer.token) {
case FROM:
case GROUP:
case ORDER:
case ON:
return strVal;
default:
lexer.reset(mark);
break;
}
}
break;
case SHOW:
case REFERENCES:
case REPEAT:
case USE:
case MOD:
case OUT: {
String strVal = lexer.stringVal();
lexer.nextToken();
return strVal;
}
case QUALIFY: {
String strVal = lexer.stringVal();
Lexer.SavePoint mark = lexer.mark();
lexer.nextToken();
if (lexer.token != Token.WHERE
&& lexer.token != Token.GROUP
&& lexer.token != Token.HAVING
&& lexer.token != Token.WINDOW
&& lexer.token != Token.ORDER
&& lexer.token != Token.LIMIT
&& lexer.token != Token.EOF
&& lexer.token != Token.COMMA
) {
lexer.reset(mark);
return null;
} else {
return strVal;
}
}
case DISTRIBUTE: {
String strVal = lexer.stringVal();
Lexer.SavePoint mark = lexer.mark();
lexer.nextToken();
if (lexer.token == Token.BY) {
lexer.reset(mark);
return null;
} else {
return strVal;
}
}
case MINUS:
case EXCEPT:
case LIMIT:
case BETWEEN:
if (dialectFeatureEnabled(TableAliasBetween)) {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
switch (lexer.token) {
case EOF:
case COMMA:
case WHERE:
case GROUP:
case ORDER:
case LEFT:
case RIGHT:
case FULL:
case RPAREN:
case ON:
case JOIN:
case SEMI:
return strVal;
default:
lexer.reset(mark);
break;
}
}
break;
case UNION: {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
switch (lexer.token) {
case GROUP:
case ORDER:
case SEMI:
case LEFT:
case RIGHT:
case INNER:
case JOIN:
case RPAREN:
return strVal;
default:
lexer.reset(mark);
return null;
}
}
default:
break;
}
}
if (must) {
if (dialectFeatureEnabled(TableAliasRest)) {
switch (lexer.token) {
case GROUP:
case ORDER: {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
if (lexer.token == Token.BY) {
lexer.reset(mark);
return null;
} else {
return strVal;
}
}
case UNION: {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
if (lexer.token == Token.ALL) {
lexer.reset(mark);
return null;
} else {
return strVal;
}
}
case LIMIT: {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
if (lexer.token == Token.LITERAL_INT) {
lexer.reset(mark);
return null;
} else {
return strVal;
}
}
case BETWEEN: {
Lexer.SavePoint mark = lexer.mark();
String strVal = lexer.stringVal();
lexer.nextToken();
switch (lexer.token) {
case GROUP:
case ORDER:
case SEMI:
case LEFT:
case RIGHT:
case INNER:
case JOIN:
return strVal;
default:
lexer.reset(mark);
return null;
}
}
default:
break;
}
}
return this.alias();
}
return this.as();
}