protected String tableAlias()

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