use of com.alibaba.cobar.parser.ast.expression.Expression in project cobar by alibaba.
the class MySQLExprParser method collateExpression.
private Expression collateExpression(String consumed, String consumedUp) throws SQLSyntaxErrorException {
for (Expression expr = userExpression(consumed, consumedUp); ; ) {
if (lexer.token() == KW_COLLATE) {
lexer.nextToken();
String collateName = lexer.stringValue();
match(IDENTIFIER);
expr = new CollateExpression(expr, collateName).setCacheEvalRst(cacheEvalRst);
continue;
}
return expr;
}
}
use of com.alibaba.cobar.parser.ast.expression.Expression in project cobar by alibaba.
the class MySQLExprParser method timestampadd.
/**
* first '(' has been consumed
*/
private Timestampadd timestampadd() throws SQLSyntaxErrorException {
IntervalPrimary.Unit unit = intervalPrimaryUnit();
match(PUNC_COMMA);
Expression interval = expression();
match(PUNC_COMMA);
Expression expr = expression();
match(PUNC_RIGHT_PAREN);
List<Expression> argument = new ArrayList<Expression>(2);
argument.add(interval);
argument.add(expr);
Timestampadd func = new Timestampadd(unit, argument);
func.setCacheEvalRst(cacheEvalRst);
return func;
}
use of com.alibaba.cobar.parser.ast.expression.Expression in project cobar by alibaba.
the class MySQLExprParser method comparisionExpression.
/**
* <code>BETWEEN ... AND</code> has lower precedence than other comparison
* operator
*/
private Expression comparisionExpression() throws SQLSyntaxErrorException {
Expression temp;
for (Expression fst = bitOrExpression(null, null); ; ) {
switch(lexer.token()) {
case KW_NOT:
lexer.nextToken();
switch(lexer.token()) {
case KW_BETWEEN:
lexer.nextToken();
Expression snd = comparisionExpression();
match(KW_AND);
Expression trd = comparisionExpression();
return new BetweenAndExpression(true, fst, snd, trd).setCacheEvalRst(cacheEvalRst);
case KW_RLIKE:
case KW_REGEXP:
lexer.nextToken();
temp = bitOrExpression(null, null);
fst = new RegexpExpression(true, fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case KW_LIKE:
lexer.nextToken();
temp = bitOrExpression(null, null);
Expression escape = null;
if (equalsIdentifier("ESCAPE") >= 0) {
lexer.nextToken();
escape = bitOrExpression(null, null);
}
fst = new LikeExpression(true, fst, temp, escape).setCacheEvalRst(cacheEvalRst);
continue;
case KW_IN:
if (lexer.nextToken() != PUNC_LEFT_PAREN) {
lexer.addCacheToke(KW_IN);
return fst;
}
Expression in = rightOprandOfIn();
fst = new InExpression(true, fst, in).setCacheEvalRst(cacheEvalRst);
continue;
default:
throw err("unexpect token after NOT: " + lexer.token());
}
case KW_BETWEEN:
lexer.nextToken();
Expression snd = comparisionExpression();
match(KW_AND);
Expression trd = comparisionExpression();
return new BetweenAndExpression(false, fst, snd, trd).setCacheEvalRst(cacheEvalRst);
case KW_RLIKE:
case KW_REGEXP:
lexer.nextToken();
temp = bitOrExpression(null, null);
fst = new RegexpExpression(false, fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case KW_LIKE:
lexer.nextToken();
temp = bitOrExpression(null, null);
Expression escape = null;
if (equalsIdentifier("ESCAPE") >= 0) {
lexer.nextToken();
escape = bitOrExpression(null, null);
}
fst = new LikeExpression(false, fst, temp, escape).setCacheEvalRst(cacheEvalRst);
continue;
case KW_IN:
if (lexer.nextToken() != PUNC_LEFT_PAREN) {
lexer.addCacheToke(KW_IN);
return fst;
}
temp = rightOprandOfIn();
fst = new InExpression(false, fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case KW_IS:
switch(lexer.nextToken()) {
case KW_NOT:
switch(lexer.nextToken()) {
case LITERAL_NULL:
lexer.nextToken();
fst = new ComparisionIsExpression(fst, ComparisionIsExpression.IS_NOT_NULL).setCacheEvalRst(cacheEvalRst);
continue;
case LITERAL_BOOL_FALSE:
lexer.nextToken();
fst = new ComparisionIsExpression(fst, ComparisionIsExpression.IS_NOT_FALSE).setCacheEvalRst(cacheEvalRst);
continue;
case LITERAL_BOOL_TRUE:
lexer.nextToken();
fst = new ComparisionIsExpression(fst, ComparisionIsExpression.IS_NOT_TRUE).setCacheEvalRst(cacheEvalRst);
continue;
default:
matchIdentifier("UNKNOWN");
fst = new ComparisionIsExpression(fst, ComparisionIsExpression.IS_NOT_UNKNOWN).setCacheEvalRst(cacheEvalRst);
continue;
}
case LITERAL_NULL:
lexer.nextToken();
fst = new ComparisionIsExpression(fst, ComparisionIsExpression.IS_NULL).setCacheEvalRst(cacheEvalRst);
continue;
case LITERAL_BOOL_FALSE:
lexer.nextToken();
fst = new ComparisionIsExpression(fst, ComparisionIsExpression.IS_FALSE).setCacheEvalRst(cacheEvalRst);
continue;
case LITERAL_BOOL_TRUE:
lexer.nextToken();
fst = new ComparisionIsExpression(fst, ComparisionIsExpression.IS_TRUE).setCacheEvalRst(cacheEvalRst);
continue;
default:
matchIdentifier("UNKNOWN");
fst = new ComparisionIsExpression(fst, ComparisionIsExpression.IS_UNKNOWN).setCacheEvalRst(cacheEvalRst);
continue;
}
case OP_EQUALS:
lexer.nextToken();
temp = anyAllExpression();
fst = new ComparisionEqualsExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case OP_NULL_SAFE_EQUALS:
lexer.nextToken();
temp = bitOrExpression(null, null);
fst = new ComparisionNullSafeEqualsExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case OP_GREATER_OR_EQUALS:
lexer.nextToken();
temp = anyAllExpression();
fst = new ComparisionGreaterThanOrEqualsExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case OP_GREATER_THAN:
lexer.nextToken();
temp = anyAllExpression();
fst = new ComparisionGreaterThanExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case OP_LESS_OR_EQUALS:
lexer.nextToken();
temp = anyAllExpression();
fst = new ComparisionLessThanOrEqualsExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case OP_LESS_THAN:
lexer.nextToken();
temp = anyAllExpression();
fst = new ComparisionLessThanExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case OP_LESS_OR_GREATER:
lexer.nextToken();
temp = anyAllExpression();
fst = new ComparisionLessOrGreaterThanExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
case OP_NOT_EQUALS:
lexer.nextToken();
temp = anyAllExpression();
fst = new ComparisionNotEqualsExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
default:
if (equalsIdentifier("SOUNDS") >= 0) {
lexer.nextToken();
match(KW_LIKE);
temp = bitOrExpression(null, null);
fst = new SoundsLikeExpression(fst, temp).setCacheEvalRst(cacheEvalRst);
continue;
}
return fst;
}
}
}
use of com.alibaba.cobar.parser.ast.expression.Expression in project cobar by alibaba.
the class MySQLExprParser method logicalNotExpression.
/**
* <code>'NOT'* higherPRJExpr</code>
*
* @throws SQLSyntaxErrorException
*/
private Expression logicalNotExpression() throws SQLSyntaxErrorException {
int not = 0;
for (; lexer.token() == KW_NOT; ++not) {
lexer.nextToken();
}
Expression expr = comparisionExpression();
for (; not > 0; --not) {
expr = new LogicalNotExpression(expr).setCacheEvalRst(cacheEvalRst);
}
return expr;
}
use of com.alibaba.cobar.parser.ast.expression.Expression in project cobar by alibaba.
the class MySQLExprParser method expressionList.
/**
* first <code>'('</code> has been consumed. At least one element. Consume
* last ')' after invocation <br/>
* <code>'(' expr (',' expr)* ')'</code>
*/
private List<Expression> expressionList(List<Expression> exprList) throws SQLSyntaxErrorException {
for (; ; ) {
Expression expr = expression();
exprList.add(expr);
switch(lexer.token()) {
case PUNC_COMMA:
lexer.nextToken();
break;
case PUNC_RIGHT_PAREN:
lexer.nextToken();
return exprList;
default:
throw err("unexpected token: " + lexer.token());
}
}
}
Aggregations