Search in sources :

Example 6 with Pair

use of com.alibaba.cobar.parser.util.Pair in project cobar by alibaba.

the class MySQLDMLInsertParser method onDuplicateUpdate.

/**
     * @return null for not exist
     */
private List<Pair<Identifier, Expression>> onDuplicateUpdate() throws SQLSyntaxErrorException {
    if (lexer.token() != KW_ON) {
        return null;
    }
    lexer.nextToken();
    matchIdentifier("DUPLICATE");
    match(KW_KEY);
    match(KW_UPDATE);
    List<Pair<Identifier, Expression>> list;
    Identifier col = identifier();
    match(OP_EQUALS, OP_ASSIGN);
    Expression expr = exprParser.expression();
    if (lexer.token() == PUNC_COMMA) {
        list = new LinkedList<Pair<Identifier, Expression>>();
        list.add(new Pair<Identifier, Expression>(col, expr));
        for (; lexer.token() == PUNC_COMMA; ) {
            lexer.nextToken();
            col = identifier();
            match(OP_EQUALS, OP_ASSIGN);
            expr = exprParser.expression();
            list.add(new Pair<Identifier, Expression>(col, expr));
        }
        return list;
    }
    list = new ArrayList<Pair<Identifier, Expression>>(1);
    list.add(new Pair<Identifier, Expression>(col, expr));
    return list;
}
Also used : Identifier(com.alibaba.cobar.parser.ast.expression.primary.Identifier) Expression(com.alibaba.cobar.parser.ast.expression.Expression) RowExpression(com.alibaba.cobar.parser.ast.expression.primary.RowExpression) QueryExpression(com.alibaba.cobar.parser.ast.expression.misc.QueryExpression) Pair(com.alibaba.cobar.parser.util.Pair)

Example 7 with Pair

use of com.alibaba.cobar.parser.util.Pair in project cobar by alibaba.

the class MySQLDMLParserTest method testGroupBy.

public void testGroupBy() throws SQLSyntaxErrorException {
    String sql = "group by c1 asc, c2 desc  , c3 with rollup";
    MySQLLexer lexer = new MySQLLexer(sql);
    MySQLDMLParser parser = getDMLParser(lexer);
    GroupBy groupBy = parser.groupBy();
    String output = output2MySQL(groupBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.ASC), new Pair<Expression, SortOrder>(new Identifier(null, "c2"), SortOrder.DESC), new Pair<Expression, SortOrder>(new Identifier(null, "c3"), SortOrder.ASC)), groupBy.getOrderByList());
    Assert.assertEquals("GROUP BY c1, c2 DESC, c3 WITH ROLLUP", output);
    sql = "group by c1 asc, c2 desc  , c3 ";
    lexer = new MySQLLexer(sql);
    parser = getDMLParser(lexer);
    groupBy = parser.groupBy();
    output = output2MySQL(groupBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.ASC), new Pair<Expression, SortOrder>(new Identifier(null, "c2"), SortOrder.DESC), new Pair<Expression, SortOrder>(new Identifier(null, "c3"), SortOrder.ASC)), groupBy.getOrderByList());
    Assert.assertEquals("GROUP BY c1, c2 DESC, c3", output);
    sql = "group by c1   ";
    lexer = new MySQLLexer(sql);
    parser = getDMLParser(lexer);
    groupBy = parser.groupBy();
    output = output2MySQL(groupBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.ASC)), groupBy.getOrderByList());
    Assert.assertEquals("GROUP BY c1", output);
    sql = "group by c1 asc  ";
    lexer = new MySQLLexer(sql);
    parser = getDMLParser(lexer);
    groupBy = parser.groupBy();
    output = output2MySQL(groupBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.ASC)), groupBy.getOrderByList());
    Assert.assertEquals("GROUP BY c1", output);
    sql = "group by c1 desc  ";
    lexer = new MySQLLexer(sql);
    parser = getDMLParser(lexer);
    groupBy = parser.groupBy();
    output = output2MySQL(groupBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.DESC)), groupBy.getOrderByList());
    Assert.assertEquals("GROUP BY c1 DESC", output);
    sql = "group by c1 with rollup  ";
    lexer = new MySQLLexer(sql);
    parser = getDMLParser(lexer);
    groupBy = parser.groupBy();
    output = output2MySQL(groupBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.ASC)), groupBy.getOrderByList());
    Assert.assertEquals("GROUP BY c1 WITH ROLLUP", output);
}
Also used : MySQLLexer(com.alibaba.cobar.parser.recognizer.mysql.lexer.MySQLLexer) GroupBy(com.alibaba.cobar.parser.ast.fragment.GroupBy) Identifier(com.alibaba.cobar.parser.ast.expression.primary.Identifier) Pair(com.alibaba.cobar.parser.util.Pair)

Example 8 with Pair

use of com.alibaba.cobar.parser.util.Pair in project cobar by alibaba.

the class MySQLDMLParserTest method testOrderBy.

public void testOrderBy() throws SQLSyntaxErrorException {
    String sql = "order by c1 asc, c2 desc  , c3 ";
    MySQLLexer lexer = new MySQLLexer(sql);
    MySQLDMLParser parser = getDMLParser(lexer);
    OrderBy orderBy = parser.orderBy();
    String output = output2MySQL(orderBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.ASC), new Pair<Expression, SortOrder>(new Identifier(null, "c2"), SortOrder.DESC), new Pair<Expression, SortOrder>(new Identifier(null, "c3"), SortOrder.ASC)), orderBy.getOrderByList());
    Assert.assertEquals("ORDER BY c1, c2 DESC, c3", output);
    sql = "order by c1   ";
    lexer = new MySQLLexer(sql);
    parser = getDMLParser(lexer);
    orderBy = parser.orderBy();
    output = output2MySQL(orderBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.ASC)), orderBy.getOrderByList());
    Assert.assertEquals("ORDER BY c1", output);
    sql = "order by c1 asc  ";
    lexer = new MySQLLexer(sql);
    parser = getDMLParser(lexer);
    orderBy = parser.orderBy();
    output = output2MySQL(orderBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.ASC)), orderBy.getOrderByList());
    Assert.assertEquals("ORDER BY c1", output);
    sql = "order by c1 desc  ";
    lexer = new MySQLLexer(sql);
    parser = getDMLParser(lexer);
    orderBy = parser.orderBy();
    output = output2MySQL(orderBy, sql);
    ListUtil.isEquals(ListUtil.createList(new Pair<Expression, SortOrder>(new Identifier(null, "c1"), SortOrder.DESC)), orderBy.getOrderByList());
    Assert.assertEquals("ORDER BY c1 DESC", output);
}
Also used : OrderBy(com.alibaba.cobar.parser.ast.fragment.OrderBy) MySQLLexer(com.alibaba.cobar.parser.recognizer.mysql.lexer.MySQLLexer) Identifier(com.alibaba.cobar.parser.ast.expression.primary.Identifier) Pair(com.alibaba.cobar.parser.util.Pair)

Example 9 with Pair

use of com.alibaba.cobar.parser.util.Pair in project cobar by alibaba.

the class MySQLExprParser method startedFromIdentifier.

/**
     * last token consumed is {@link MySQLToken#IDENTIFIER}, MUST NOT be
     * <code>null</code>
     */
private Expression startedFromIdentifier(final String consumed, String consumedUp) throws SQLSyntaxErrorException {
    Expression tempExpr;
    Expression tempExpr2;
    List<Expression> tempExprList;
    String tempStr;
    StringBuilder tempSb;
    boolean tempGroupDistinct;
    switch(lexer.token()) {
        case PUNC_DOT:
            for (tempExpr = new Identifier(null, consumed, consumedUp).setCacheEvalRst(cacheEvalRst); lexer.token() == PUNC_DOT; ) {
                switch(lexer.nextToken()) {
                    case IDENTIFIER:
                        tempExpr = new Identifier((Identifier) tempExpr, lexer.stringValue(), lexer.stringValueUppercase()).setCacheEvalRst(cacheEvalRst);
                        lexer.nextToken();
                        break;
                    case OP_ASTERISK:
                        lexer.nextToken();
                        return new Wildcard((Identifier) tempExpr).setCacheEvalRst(cacheEvalRst);
                    default:
                        throw err("expect IDENTIFIER or '*' after '.', but is " + lexer.token());
                }
            }
            return tempExpr;
        case LITERAL_BIT:
            if (consumed.charAt(0) != '_') {
                return new Identifier(null, consumed, consumedUp).setCacheEvalRst(cacheEvalRst);
            }
            tempStr = lexer.stringValue();
            lexer.nextToken();
            return new LiteralBitField(consumed, tempStr).setCacheEvalRst(cacheEvalRst);
        case LITERAL_HEX:
            if (consumed.charAt(0) != '_') {
                return new Identifier(null, consumed, consumedUp).setCacheEvalRst(cacheEvalRst);
            }
            LiteralHexadecimal hex = new LiteralHexadecimal(consumed, lexer.getSQL(), lexer.getOffsetCache(), lexer.getSizeCache(), charset);
            lexer.nextToken();
            return hex.setCacheEvalRst(cacheEvalRst);
        case LITERAL_CHARS:
            if (consumed.charAt(0) != '_') {
                return new Identifier(null, consumed, consumedUp).setCacheEvalRst(cacheEvalRst);
            }
            tempSb = new StringBuilder();
            do {
                lexer.appendStringContent(tempSb);
            } while (lexer.nextToken() == LITERAL_CHARS);
            return new LiteralString(consumed, tempSb.toString(), false).setCacheEvalRst(cacheEvalRst);
        case PUNC_LEFT_PAREN:
            consumedUp = Identifier.unescapeName(consumedUp);
            switch(functionManager.getParsingStrategy(consumedUp)) {
                case GET_FORMAT:
                    // GET_FORMAT({DATE|TIME|DATETIME},
                    // {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})
                    lexer.nextToken();
                    int gfi = matchIdentifier("DATE", "TIME", "DATETIME", "TIMESTAMP");
                    match(PUNC_COMMA);
                    Expression getFormatArg = expression();
                    match(PUNC_RIGHT_PAREN);
                    switch(gfi) {
                        case 0:
                            return new GetFormat(GetFormat.FormatType.DATE, getFormatArg);
                        case 1:
                            return new GetFormat(GetFormat.FormatType.TIME, getFormatArg);
                        case 2:
                        case 3:
                            return new GetFormat(GetFormat.FormatType.DATETIME, getFormatArg);
                    }
                    throw err("unexpected format type for GET_FORMAT()");
                case CAST:
                    lexer.nextToken();
                    tempExpr = expression();
                    match(KW_AS);
                    Pair<String, Pair<Expression, Expression>> type = type4specialFunc();
                    match(PUNC_RIGHT_PAREN);
                    Pair<Expression, Expression> info = type.getValue();
                    if (info != null) {
                        return new Cast(tempExpr, type.getKey(), info.getKey(), info.getValue()).setCacheEvalRst(cacheEvalRst);
                    } else {
                        return new Cast(tempExpr, type.getKey(), null, null).setCacheEvalRst(cacheEvalRst);
                    }
                case POSITION:
                    lexer.nextToken();
                    tempExprList = new ArrayList<Expression>(2);
                    tempExprList.add(expression());
                    match(KW_IN);
                    tempExprList.add(expression());
                    match(PUNC_RIGHT_PAREN);
                    return new Locate(tempExprList).setCacheEvalRst(cacheEvalRst);
                case SUBSTRING:
                    lexer.nextToken();
                    tempExprList = new ArrayList<Expression>(3);
                    tempExprList.add(expression());
                    match(PUNC_COMMA, KW_FROM);
                    tempExprList.add(expression());
                    switch(lexer.token()) {
                        case PUNC_COMMA:
                        case KW_FOR:
                            lexer.nextToken();
                            tempExprList.add(expression());
                        default:
                            match(PUNC_RIGHT_PAREN);
                    }
                    return new Substring(tempExprList).setCacheEvalRst(cacheEvalRst);
                case ROW:
                    lexer.nextToken();
                    tempExprList = expressionList(new LinkedList<Expression>());
                    return new RowExpression(tempExprList).setCacheEvalRst(cacheEvalRst);
                case TRIM:
                    Direction direction;
                    switch(lexer.nextToken()) {
                        case KW_BOTH:
                            lexer.nextToken();
                            direction = Direction.BOTH;
                            break;
                        case KW_LEADING:
                            lexer.nextToken();
                            direction = Direction.LEADING;
                            break;
                        case KW_TRAILING:
                            lexer.nextToken();
                            direction = Direction.TRAILING;
                            break;
                        default:
                            direction = Direction.DEFAULT;
                    }
                    if (direction == Direction.DEFAULT) {
                        tempExpr = expression();
                        if (lexer.token() == KW_FROM) {
                            lexer.nextToken();
                            tempExpr2 = expression();
                            match(PUNC_RIGHT_PAREN);
                            return new Trim(direction, tempExpr, tempExpr2).setCacheEvalRst(cacheEvalRst);
                        }
                        match(PUNC_RIGHT_PAREN);
                        return new Trim(direction, null, tempExpr).setCacheEvalRst(cacheEvalRst);
                    }
                    if (lexer.token() == KW_FROM) {
                        lexer.nextToken();
                        tempExpr = expression();
                        match(PUNC_RIGHT_PAREN);
                        return new Trim(direction, null, tempExpr).setCacheEvalRst(cacheEvalRst);
                    }
                    tempExpr = expression();
                    match(KW_FROM);
                    tempExpr2 = expression();
                    match(PUNC_RIGHT_PAREN);
                    return new Trim(direction, tempExpr, tempExpr2).setCacheEvalRst(cacheEvalRst);
                case AVG:
                    if (lexer.nextToken() == KW_DISTINCT) {
                        tempGroupDistinct = true;
                        lexer.nextToken();
                    } else {
                        tempGroupDistinct = false;
                    }
                    tempExpr = expression();
                    match(PUNC_RIGHT_PAREN);
                    return new Avg(tempExpr, tempGroupDistinct).setCacheEvalRst(cacheEvalRst);
                case MAX:
                    if (lexer.nextToken() == KW_DISTINCT) {
                        tempGroupDistinct = true;
                        lexer.nextToken();
                    } else {
                        tempGroupDistinct = false;
                    }
                    tempExpr = expression();
                    match(PUNC_RIGHT_PAREN);
                    return new Max(tempExpr, tempGroupDistinct).setCacheEvalRst(cacheEvalRst);
                case MIN:
                    if (lexer.nextToken() == KW_DISTINCT) {
                        tempGroupDistinct = true;
                        lexer.nextToken();
                    } else {
                        tempGroupDistinct = false;
                    }
                    tempExpr = expression();
                    match(PUNC_RIGHT_PAREN);
                    return new Min(tempExpr, tempGroupDistinct).setCacheEvalRst(cacheEvalRst);
                case SUM:
                    if (lexer.nextToken() == KW_DISTINCT) {
                        tempGroupDistinct = true;
                        lexer.nextToken();
                    } else {
                        tempGroupDistinct = false;
                    }
                    tempExpr = expression();
                    match(PUNC_RIGHT_PAREN);
                    return new Sum(tempExpr, tempGroupDistinct).setCacheEvalRst(cacheEvalRst);
                case COUNT:
                    if (lexer.nextToken() == KW_DISTINCT) {
                        lexer.nextToken();
                        tempExprList = expressionList(new LinkedList<Expression>());
                        return new Count(tempExprList).setCacheEvalRst(cacheEvalRst);
                    }
                    tempExpr = expression();
                    match(PUNC_RIGHT_PAREN);
                    return new Count(tempExpr).setCacheEvalRst(cacheEvalRst);
                case GROUP_CONCAT:
                    if (lexer.nextToken() == KW_DISTINCT) {
                        lexer.nextToken();
                        tempGroupDistinct = true;
                    } else {
                        tempGroupDistinct = false;
                    }
                    for (tempExprList = new LinkedList<Expression>(); ; ) {
                        tempExpr = expression();
                        tempExprList.add(tempExpr);
                        if (lexer.token() == PUNC_COMMA) {
                            lexer.nextToken();
                        } else {
                            break;
                        }
                    }
                    boolean isDesc = false;
                    List<Expression> appendedColumnNames = null;
                    // order by
                    tempExpr = null;
                    // literalChars
                    tempStr = null;
                    switch(lexer.token()) {
                        case KW_ORDER:
                            lexer.nextToken();
                            match(KW_BY);
                            tempExpr = expression();
                            if (lexer.token() == KW_ASC) {
                                lexer.nextToken();
                            } else if (lexer.token() == KW_DESC) {
                                isDesc = true;
                                lexer.nextToken();
                            }
                            for (appendedColumnNames = new LinkedList<Expression>(); lexer.token() == PUNC_COMMA; ) {
                                lexer.nextToken();
                                appendedColumnNames.add(expression());
                            }
                            if (lexer.token() != KW_SEPARATOR) {
                                break;
                            }
                        case KW_SEPARATOR:
                            lexer.nextToken();
                            tempSb = new StringBuilder();
                            lexer.appendStringContent(tempSb);
                            tempStr = LiteralString.getUnescapedString(tempSb.toString());
                            match(LITERAL_CHARS);
                            break;
                    }
                    match(PUNC_RIGHT_PAREN);
                    return new GroupConcat(tempGroupDistinct, tempExprList, tempExpr, isDesc, appendedColumnNames, tempStr).setCacheEvalRst(cacheEvalRst);
                case CHAR:
                    lexer.nextToken();
                    return functionChar();
                case CONVERT:
                    lexer.nextToken();
                    return functionConvert();
                case EXTRACT:
                    lexer.nextToken();
                    return extract();
                case TIMESTAMPDIFF:
                    lexer.nextToken();
                    return timestampdiff();
                case TIMESTAMPADD:
                    lexer.nextToken();
                    return timestampadd();
                case _ORDINARY:
                    return ordinaryFunction(consumed, consumedUp);
                case _DEFAULT:
                    return new Identifier(null, consumed, consumedUp).setCacheEvalRst(cacheEvalRst);
                default:
                    throw err("unexpected function parsing strategy for id of " + consumed);
            }
        default:
            return new Identifier(null, consumed, consumedUp).setCacheEvalRst(cacheEvalRst);
    }
}
Also used : Cast(com.alibaba.cobar.parser.ast.expression.primary.function.cast.Cast) LiteralHexadecimal(com.alibaba.cobar.parser.ast.expression.primary.literal.LiteralHexadecimal) LiteralString(com.alibaba.cobar.parser.ast.expression.primary.literal.LiteralString) Max(com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Max) GroupConcat(com.alibaba.cobar.parser.ast.expression.primary.function.groupby.GroupConcat) LiteralBitField(com.alibaba.cobar.parser.ast.expression.primary.literal.LiteralBitField) Locate(com.alibaba.cobar.parser.ast.expression.primary.function.string.Locate) LiteralString(com.alibaba.cobar.parser.ast.expression.primary.literal.LiteralString) Count(com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Count) Direction(com.alibaba.cobar.parser.ast.expression.primary.function.string.Trim.Direction) Identifier(com.alibaba.cobar.parser.ast.expression.primary.Identifier) Wildcard(com.alibaba.cobar.parser.ast.expression.primary.Wildcard) Pair(com.alibaba.cobar.parser.util.Pair) Substring(com.alibaba.cobar.parser.ast.expression.primary.function.string.Substring) GetFormat(com.alibaba.cobar.parser.ast.expression.primary.function.datetime.GetFormat) Trim(com.alibaba.cobar.parser.ast.expression.primary.function.string.Trim) RowExpression(com.alibaba.cobar.parser.ast.expression.primary.RowExpression) Sum(com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Sum) LinkedList(java.util.LinkedList) Avg(com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Avg) Min(com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Min) SubqueryAllExpression(com.alibaba.cobar.parser.ast.expression.misc.SubqueryAllExpression) MinusExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.MinusExpression) BetweenAndExpression(com.alibaba.cobar.parser.ast.expression.comparison.BetweenAndExpression) BitAndExpression(com.alibaba.cobar.parser.ast.expression.bit.BitAndExpression) ComparisionEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionEqualsExpression) NegativeValueExpression(com.alibaba.cobar.parser.ast.expression.logical.NegativeValueExpression) QueryExpression(com.alibaba.cobar.parser.ast.expression.misc.QueryExpression) CastBinaryExpression(com.alibaba.cobar.parser.ast.expression.type.CastBinaryExpression) InExpression(com.alibaba.cobar.parser.ast.expression.comparison.InExpression) BitInvertExpression(com.alibaba.cobar.parser.ast.expression.bit.BitInvertExpression) BitXORExpression(com.alibaba.cobar.parser.ast.expression.bit.BitXORExpression) FunctionExpression(com.alibaba.cobar.parser.ast.expression.primary.function.FunctionExpression) BitShiftExpression(com.alibaba.cobar.parser.ast.expression.bit.BitShiftExpression) BitOrExpression(com.alibaba.cobar.parser.ast.expression.bit.BitOrExpression) ComparisionGreaterThanOrEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionGreaterThanOrEqualsExpression) MatchExpression(com.alibaba.cobar.parser.ast.expression.primary.MatchExpression) ComparisionIsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionIsExpression) LogicalOrExpression(com.alibaba.cobar.parser.ast.expression.logical.LogicalOrExpression) ComparisionGreaterThanExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionGreaterThanExpression) ComparisionLessOrGreaterThanExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionLessOrGreaterThanExpression) SubqueryAnyExpression(com.alibaba.cobar.parser.ast.expression.misc.SubqueryAnyExpression) RegexpExpression(com.alibaba.cobar.parser.ast.expression.string.RegexpExpression) LogicalAndExpression(com.alibaba.cobar.parser.ast.expression.logical.LogicalAndExpression) ArithmeticMultiplyExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticMultiplyExpression) ComparisionLessThanOrEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionLessThanOrEqualsExpression) ComparisionNullSafeEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionNullSafeEqualsExpression) LikeExpression(com.alibaba.cobar.parser.ast.expression.string.LikeExpression) ArithmeticSubtractExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticSubtractExpression) SoundsLikeExpression(com.alibaba.cobar.parser.ast.expression.string.SoundsLikeExpression) ArithmeticIntegerDivideExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticIntegerDivideExpression) CollateExpression(com.alibaba.cobar.parser.ast.expression.type.CollateExpression) LogicalNotExpression(com.alibaba.cobar.parser.ast.expression.logical.LogicalNotExpression) Expression(com.alibaba.cobar.parser.ast.expression.Expression) AssignmentExpression(com.alibaba.cobar.parser.ast.expression.misc.AssignmentExpression) CaseWhenOperatorExpression(com.alibaba.cobar.parser.ast.expression.primary.CaseWhenOperatorExpression) LogicalXORExpression(com.alibaba.cobar.parser.ast.expression.logical.LogicalXORExpression) UserExpression(com.alibaba.cobar.parser.ast.expression.misc.UserExpression) ArithmeticAddExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticAddExpression) ComparisionNotEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionNotEqualsExpression) RowExpression(com.alibaba.cobar.parser.ast.expression.primary.RowExpression) ComparisionLessThanExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionLessThanExpression) ArithmeticModExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticModExpression) ArithmeticDivideExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticDivideExpression)

Example 10 with Pair

use of com.alibaba.cobar.parser.util.Pair in project cobar by alibaba.

the class MySQLExprParser method caseWhenExpression.

/**
     * first <code>CASE</code> has been consumed
     */
private Expression caseWhenExpression() throws SQLSyntaxErrorException {
    Expression comparee = null;
    if (lexer.token() != KW_WHEN) {
        comparee = expression();
    }
    List<Pair<Expression, Expression>> list = new LinkedList<Pair<Expression, Expression>>();
    for (; lexer.token() == KW_WHEN; ) {
        lexer.nextToken();
        Expression when = expression();
        match(KW_THEN);
        Expression then = expression();
        if (when == null || then == null)
            throw err("when or then is null in CASE WHEN expression");
        list.add(new Pair<Expression, Expression>(when, then));
    }
    if (list.isEmpty()) {
        throw err("at least one WHEN ... THEN branch for CASE ... WHEN syntax");
    }
    Expression elseValue = null;
    switch(lexer.token()) {
        case KW_ELSE:
            lexer.nextToken();
            elseValue = expression();
        default:
            matchIdentifier("END");
    }
    return new CaseWhenOperatorExpression(comparee, list, elseValue).setCacheEvalRst(cacheEvalRst);
}
Also used : CaseWhenOperatorExpression(com.alibaba.cobar.parser.ast.expression.primary.CaseWhenOperatorExpression) SubqueryAllExpression(com.alibaba.cobar.parser.ast.expression.misc.SubqueryAllExpression) MinusExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.MinusExpression) BetweenAndExpression(com.alibaba.cobar.parser.ast.expression.comparison.BetweenAndExpression) BitAndExpression(com.alibaba.cobar.parser.ast.expression.bit.BitAndExpression) ComparisionEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionEqualsExpression) NegativeValueExpression(com.alibaba.cobar.parser.ast.expression.logical.NegativeValueExpression) QueryExpression(com.alibaba.cobar.parser.ast.expression.misc.QueryExpression) CastBinaryExpression(com.alibaba.cobar.parser.ast.expression.type.CastBinaryExpression) InExpression(com.alibaba.cobar.parser.ast.expression.comparison.InExpression) BitInvertExpression(com.alibaba.cobar.parser.ast.expression.bit.BitInvertExpression) BitXORExpression(com.alibaba.cobar.parser.ast.expression.bit.BitXORExpression) FunctionExpression(com.alibaba.cobar.parser.ast.expression.primary.function.FunctionExpression) BitShiftExpression(com.alibaba.cobar.parser.ast.expression.bit.BitShiftExpression) BitOrExpression(com.alibaba.cobar.parser.ast.expression.bit.BitOrExpression) ComparisionGreaterThanOrEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionGreaterThanOrEqualsExpression) MatchExpression(com.alibaba.cobar.parser.ast.expression.primary.MatchExpression) ComparisionIsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionIsExpression) LogicalOrExpression(com.alibaba.cobar.parser.ast.expression.logical.LogicalOrExpression) ComparisionGreaterThanExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionGreaterThanExpression) ComparisionLessOrGreaterThanExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionLessOrGreaterThanExpression) SubqueryAnyExpression(com.alibaba.cobar.parser.ast.expression.misc.SubqueryAnyExpression) RegexpExpression(com.alibaba.cobar.parser.ast.expression.string.RegexpExpression) LogicalAndExpression(com.alibaba.cobar.parser.ast.expression.logical.LogicalAndExpression) ArithmeticMultiplyExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticMultiplyExpression) ComparisionLessThanOrEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionLessThanOrEqualsExpression) ComparisionNullSafeEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionNullSafeEqualsExpression) LikeExpression(com.alibaba.cobar.parser.ast.expression.string.LikeExpression) ArithmeticSubtractExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticSubtractExpression) SoundsLikeExpression(com.alibaba.cobar.parser.ast.expression.string.SoundsLikeExpression) ArithmeticIntegerDivideExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticIntegerDivideExpression) CollateExpression(com.alibaba.cobar.parser.ast.expression.type.CollateExpression) LogicalNotExpression(com.alibaba.cobar.parser.ast.expression.logical.LogicalNotExpression) Expression(com.alibaba.cobar.parser.ast.expression.Expression) AssignmentExpression(com.alibaba.cobar.parser.ast.expression.misc.AssignmentExpression) CaseWhenOperatorExpression(com.alibaba.cobar.parser.ast.expression.primary.CaseWhenOperatorExpression) LogicalXORExpression(com.alibaba.cobar.parser.ast.expression.logical.LogicalXORExpression) UserExpression(com.alibaba.cobar.parser.ast.expression.misc.UserExpression) ArithmeticAddExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticAddExpression) ComparisionNotEqualsExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionNotEqualsExpression) RowExpression(com.alibaba.cobar.parser.ast.expression.primary.RowExpression) ComparisionLessThanExpression(com.alibaba.cobar.parser.ast.expression.comparison.ComparisionLessThanExpression) ArithmeticModExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticModExpression) ArithmeticDivideExpression(com.alibaba.cobar.parser.ast.expression.arithmeic.ArithmeticDivideExpression) LinkedList(java.util.LinkedList) Pair(com.alibaba.cobar.parser.util.Pair)

Aggregations

Pair (com.alibaba.cobar.parser.util.Pair)22 Expression (com.alibaba.cobar.parser.ast.expression.Expression)20 RowExpression (com.alibaba.cobar.parser.ast.expression.primary.RowExpression)13 Identifier (com.alibaba.cobar.parser.ast.expression.primary.Identifier)12 InExpression (com.alibaba.cobar.parser.ast.expression.comparison.InExpression)11 QueryExpression (com.alibaba.cobar.parser.ast.expression.misc.QueryExpression)10 BetweenAndExpression (com.alibaba.cobar.parser.ast.expression.comparison.BetweenAndExpression)8 ComparisionEqualsExpression (com.alibaba.cobar.parser.ast.expression.comparison.ComparisionEqualsExpression)8 ComparisionIsExpression (com.alibaba.cobar.parser.ast.expression.comparison.ComparisionIsExpression)8 ComparisionNullSafeEqualsExpression (com.alibaba.cobar.parser.ast.expression.comparison.ComparisionNullSafeEqualsExpression)8 LogicalAndExpression (com.alibaba.cobar.parser.ast.expression.logical.LogicalAndExpression)8 LogicalOrExpression (com.alibaba.cobar.parser.ast.expression.logical.LogicalOrExpression)8 UserExpression (com.alibaba.cobar.parser.ast.expression.misc.UserExpression)8 CaseWhenOperatorExpression (com.alibaba.cobar.parser.ast.expression.primary.CaseWhenOperatorExpression)8 MatchExpression (com.alibaba.cobar.parser.ast.expression.primary.MatchExpression)8 FunctionExpression (com.alibaba.cobar.parser.ast.expression.primary.function.FunctionExpression)8 LikeExpression (com.alibaba.cobar.parser.ast.expression.string.LikeExpression)8 CollateExpression (com.alibaba.cobar.parser.ast.expression.type.CollateExpression)8 ASTNode (com.alibaba.cobar.parser.ast.ASTNode)6 BinaryOperatorExpression (com.alibaba.cobar.parser.ast.expression.BinaryOperatorExpression)6