protected SQLExpr parseSelectItemRest()

in core/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java [564:840]


    protected SQLExpr parseSelectItemRest(String ident, long hash_lower) {
        SQLExpr expr = null;
        if (lexer.identifierEquals(FnvHash.Constants.COLLATE)
                && lexer.stringVal().charAt(0) != '`'
        ) {
            lexer.nextToken();
            String collate = lexer.stringVal();
            lexer.nextToken();

            SQLBinaryOpExpr binaryExpr = new SQLBinaryOpExpr(
                    new SQLIdentifierExpr(ident),
                    SQLBinaryOperator.COLLATE,
                    new SQLIdentifierExpr(collate), dbType
            );

            expr = binaryExpr;
        } else if (lexer.identifierEquals(FnvHash.Constants.REGEXP)
                && lexer.stringVal().charAt(0) != '`') {
            lexer.nextToken();
            SQLExpr rightExp = bitOr();

            SQLBinaryOpExpr binaryExpr = new SQLBinaryOpExpr(
                    new SQLIdentifierExpr(ident),
                    SQLBinaryOperator.RegExp,
                    rightExp, dbType
            );

            expr = binaryExpr;
            expr = relationalRest(expr);
        } else if (FnvHash.Constants.TIMESTAMP == hash_lower
                && lexer.stringVal().charAt(0) != '`'
                && lexer.token() == Token.LITERAL_CHARS) {
            String literal = lexer.stringVal();
            lexer.nextToken();

            SQLTimestampExpr ts = new SQLTimestampExpr(literal);
            expr = ts;

            if (lexer.identifierEquals(FnvHash.Constants.AT)) {
                Lexer.SavePoint mark = lexer.mark();
                lexer.nextToken();

                String timeZone = null;
                if (lexer.identifierEquals(FnvHash.Constants.TIME)) {
                    lexer.nextToken();
                    if (lexer.identifierEquals(FnvHash.Constants.ZONE)) {
                        lexer.nextToken();
                        timeZone = lexer.stringVal();
                        lexer.nextToken();
                    }
                }
                if (timeZone == null) {
                    lexer.reset(mark);
                } else {
                    ts.setTimeZone(timeZone);
                }
            }
        } else if (FnvHash.Constants.DATETIME == hash_lower
                && lexer.stringVal().charAt(0) != '`'
                && lexer.token() == Token.LITERAL_CHARS) {
            String literal = lexer.stringVal();
            lexer.nextToken();

            SQLDateTimeExpr ts = new SQLDateTimeExpr(literal);
            expr = ts;
        } else if (FnvHash.Constants.BOOLEAN == hash_lower
                && lexer.stringVal().charAt(0) != '`'
                && lexer.token() == Token.LITERAL_CHARS) {
            String literal = lexer.stringVal();
            lexer.nextToken();

            SQLBooleanExpr ts = new SQLBooleanExpr(Boolean.valueOf(literal));
            expr = ts;
        } else if ((FnvHash.Constants.CHAR == hash_lower || FnvHash.Constants.VARCHAR == hash_lower)
                && lexer.token() == Token.LITERAL_CHARS) {
            String literal = lexer.stringVal();
            lexer.nextToken();

            SQLCharExpr charExpr = new SQLCharExpr(literal);
            expr = charExpr;
        } else if (FnvHash.Constants.CURRENT_DATE == hash_lower
                && ident.charAt(0) != '`'
                && lexer.token() != Token.LPAREN) {
            expr = new SQLCurrentTimeExpr(SQLCurrentTimeExpr.Type.CURRENT_DATE);

        } else if (FnvHash.Constants.CURRENT_TIMESTAMP == hash_lower
                && ident.charAt(0) != '`'
                && lexer.token() != Token.LPAREN) {
            expr = new SQLCurrentTimeExpr(SQLCurrentTimeExpr.Type.CURRENT_TIMESTAMP);

        } else if (FnvHash.Constants.CURRENT_TIME == hash_lower
                && ident.charAt(0) != '`'
                && lexer.token() != Token.LPAREN) {
            expr = new SQLCurrentTimeExpr(SQLCurrentTimeExpr.Type.CURRENT_TIME);

        } else if (FnvHash.Constants.CURDATE == hash_lower
                && ident.charAt(0) != '`'
                && lexer.token() != Token.LPAREN) {
            expr = new SQLCurrentTimeExpr(SQLCurrentTimeExpr.Type.CURDATE);

        } else if (FnvHash.Constants.LOCALTIME == hash_lower
                && ident.charAt(0) != '`'
                && lexer.token() != Token.LPAREN) {
            expr = new SQLCurrentTimeExpr(SQLCurrentTimeExpr.Type.LOCALTIME);

        } else if (FnvHash.Constants.LOCALTIMESTAMP == hash_lower
                && ident.charAt(0) != '`'
                && lexer.token() != Token.LPAREN) {
            expr = new SQLCurrentTimeExpr(SQLCurrentTimeExpr.Type.LOCALTIMESTAMP);

        } else if ((FnvHash.Constants._LATIN1 == hash_lower)
                && ident.charAt(0) != '`'
        ) {
            String hexString;
            if (lexer.token() == Token.LITERAL_HEX) {
                hexString = lexer.hexString();
                lexer.nextToken();
            } else if (lexer.token() == Token.LITERAL_CHARS) {
                hexString = null;
            } else {
                acceptIdentifier("X");
                hexString = lexer.stringVal();
                accept(Token.LITERAL_CHARS);
            }

            if (hexString == null) {
                String str = lexer.stringVal();
                lexer.nextToken();

                String collate = null;
                if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) {
                    lexer.nextToken();
                    collate = lexer.stringVal();
                    if (lexer.token() == Token.LITERAL_CHARS) {
                        lexer.nextToken();
                    } else {
                        accept(Token.IDENTIFIER);
                    }
                }

                expr = new MySqlCharExpr(str, "_latin1", collate);
            } else {
                expr = new MySqlCharExpr(hexString, "_latin1");
            }
        } else if ((FnvHash.Constants._UTF8 == hash_lower || FnvHash.Constants._UTF8MB4 == hash_lower)
                && ident.charAt(0) != '`'
        ) {
            String hexString;
            if (lexer.token() == Token.LITERAL_HEX) {
                hexString = lexer.hexString();
                lexer.nextToken();
            } else if (lexer.token() == Token.LITERAL_CHARS) {
                hexString = null;
            } else {
                acceptIdentifier("X");
                hexString = lexer.stringVal();
                accept(Token.LITERAL_CHARS);
            }

            if (hexString == null) {
                String str = lexer.stringVal();
                lexer.nextToken();

                String collate = null;
                if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) {
                    lexer.nextToken();
                    collate = lexer.stringVal();
                    if (lexer.token() == Token.LITERAL_CHARS) {
                        lexer.nextToken();
                    } else {
                        accept(Token.IDENTIFIER);
                    }
                }

                expr = new MySqlCharExpr(str, "_utf8", collate);
            } else {
                expr = new SQLCharExpr(
                        MySqlUtils.utf8(hexString)
                );
            }
        } else if ((FnvHash.Constants._UTF16 == hash_lower || FnvHash.Constants._UCS2 == hash_lower)
                && ident.charAt(0) != '`'
        ) {
            String hexString;
            if (lexer.token() == Token.LITERAL_HEX) {
                hexString = lexer.hexString();
                lexer.nextToken();
            } else if (lexer.token() == Token.LITERAL_CHARS) {
                hexString = null;
            } else {
                acceptIdentifier("X");
                hexString = lexer.stringVal();
                accept(Token.LITERAL_CHARS);
            }

            if (hexString == null) {
                String str = lexer.stringVal();
                hexString = HexBin.encode(str.getBytes(MySqlUtils.ASCII));
                lexer.nextToken();
            }

            expr = new MySqlCharExpr(hexString, "_utf16");
        } else if (FnvHash.Constants._UTF32 == hash_lower
                && ident.charAt(0) != '`'
        ) {
            String hexString;
            if (lexer.token() == Token.LITERAL_HEX) {
                hexString = lexer.hexString();
                lexer.nextToken();
            } else if (lexer.token() == Token.LITERAL_CHARS) {
                hexString = null;
            } else {
                acceptIdentifier("X");
                hexString = lexer.stringVal();
                accept(Token.LITERAL_CHARS);
            }

            if (hexString == null) {
                String str = lexer.stringVal();
                lexer.nextToken();
                expr = new MySqlCharExpr(str, "_utf32");
            } else {
                expr = new SQLCharExpr(
                        MySqlUtils.utf32(hexString)
                );
            }
        } else if (FnvHash.Constants._GBK == hash_lower
                && ident.charAt(0) != '`'
        ) {
            String hexString;
            if (lexer.token() == Token.LITERAL_HEX) {
                hexString = lexer.hexString();
                lexer.nextToken();
            } else if (lexer.token() == Token.LITERAL_CHARS) {
                hexString = null;
            } else {
                acceptIdentifier("X");
                hexString = lexer.stringVal();
                accept(Token.LITERAL_CHARS);
            }

            if (hexString == null) {
                String str = lexer.stringVal();
                lexer.nextToken();
                expr = new MySqlCharExpr(str, "_gbk");
            } else {
                expr = new SQLCharExpr(
                        MySqlUtils.gbk(hexString)
                );
            }
        } else if (FnvHash.Constants._BIG5 == hash_lower
                && ident.charAt(0) != '`'
        ) {
            String hexString;
            if (lexer.token() == Token.LITERAL_HEX) {
                hexString = lexer.hexString();
                lexer.nextToken();
            } else if (lexer.token() == Token.LITERAL_CHARS) {
                hexString = null;
            } else {
                acceptIdentifier("X");
                hexString = lexer.stringVal();
                accept(Token.LITERAL_CHARS);
            }

            if (hexString == null) {
                String str = lexer.stringVal();
                lexer.nextToken();
                expr = new MySqlCharExpr(str, "_big5");
            } else {
                expr = new SQLCharExpr(
                        MySqlUtils.big5(hexString)
                );
            }
        }
        return expr;
    }