in core/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java [449:640]
protected String as() {
String alias = null;
final Token token = lexer.token;
if (token == Token.COMMA) {
return null;
}
if (token == Token.AS) {
lexer.nextTokenAlias();
if (lexer.token == Token.LPAREN) {
return null;
}
// for oracle
if (dialectFeatureEnabled(AsCommaFrom) && (lexer.token == Token.COMMA || lexer.token == Token.FROM)) {
return null;
}
alias = lexer.stringVal();
lexer.nextToken();
if (alias != null) {
while (lexer.token == Token.DOT) {
lexer.nextToken();
alias += ('.' + lexer.token.name());
lexer.nextToken();
}
return alias;
}
if (lexer.token == Token.LPAREN) {
return null;
}
throw new ParserException("Error : " + lexer.info());
}
if (lexer.token == Token.LITERAL_ALIAS) {
alias = lexer.stringVal();
lexer.nextToken();
} else if (lexer.token == Token.IDENTIFIER) {
alias = lexer.stringVal();
boolean skip = false;
if (dialectFeatureEnabled(AsSkip)) {
skip = "TBLPROPERTIES".equalsIgnoreCase(alias);
}
if (skip) {
alias = null;
} else {
lexer.nextToken();
}
} else if (lexer.token == Token.LITERAL_CHARS) {
alias = "'" + lexer.stringVal() + "'";
lexer.nextToken();
} else {
switch (lexer.token) {
case CASE:
case USER:
case LOB:
case END:
case DEFERRED:
case OUTER:
case DO:
case LOOP:
case STORE:
case MOD:
case ANY:
case BEGIN:
case CAST:
case COMPUTE:
case ESCAPE:
case FULL:
case MERGE:
case OPEN:
case SOME:
case TRUNCATE:
case UNTIL:
case VIEW:
case KILL:
case COMMENT:
case TABLESPACE:
case REPEAT:
case PRIMARY:
case FOREIGN:
case UNIQUE:
case LEAVE:
case ENABLE:
case DISABLE:
case REPLACE:
alias = lexer.stringVal();
lexer.nextToken();
break;
case INTERSECT:
case EXCEPT:
case DESC:
case INOUT:
case MINUS:
case UPDATE:
case DELETE:
case TABLE:
case UNION:
case EXPLAIN:
case CREATE:
case LIMIT:
case USE:
case BY:
case ALTER:
case IN:
case INTO:
case ASC: {
alias = lexer.stringVal();
Lexer.SavePoint mark = lexer.mark();
lexer.nextToken();
if (lexer.token() != Token.COMMA
&& lexer.token() != Token.RPAREN
&& lexer.token() != Token.FROM
&& lexer.token() != Token.SEMI
&& lexer.token() != Token.SEMI
) {
alias = null;
lexer.reset(mark);
}
break;
}
case CLOSE:
case SEQUENCE:
if (dialectFeatureEnabled(AsSequence)) {
alias = lexer.stringVal();
lexer.nextToken();
break;
}
break;
case CHECK:
case INDEX:
case ALL:
case INNER:
case VALUES:
case SHOW:
case TO:
case REFERENCES:
case LIKE:
case RLIKE:
case NULL:
case RIGHT:
case LEFT:
case DATABASE:
if (dialectFeatureEnabled(AsDatabase)) {
alias = lexer.stringVal();
lexer.nextToken();
break;
}
break;
case GROUP:
case ORDER:
case DISTRIBUTE:
case DEFAULT:
if (dialectFeatureEnabled(AsDefault)) {
Lexer.SavePoint mark = lexer.mark();
alias = lexer.stringVal();
lexer.nextToken();
if (lexer.token == Token.BY) {
lexer.reset(mark);
alias = null;
}
break;
}
break;
default:
break;
}
}
switch (lexer.token) {
case KEY:
case INTERVAL:
case CONSTRAINT:
alias = lexer.token.name();
lexer.nextToken();
return alias;
default:
break;
}
if (isEnabled(SQLParserFeature.IgnoreNameQuotes) && alias != null && alias.length() > 1) {
alias = StringUtils.removeNameQuotes(alias);
}
return alias;
}