mysql parser support DIV operator. issue #1526

This commit is contained in:
wenshao
2016-12-04 21:04:06 +08:00
parent 47891422c4
commit b3ca3e74b6
6 changed files with 98 additions and 5 deletions
@@ -26,7 +26,8 @@ public enum SQLBinaryOperator {
BitwiseXor("^", 50),
Multiply("*", 60),
Divide("/", 60),
Divide("/", 60),
DIV("DIV", 60), // mysql integer division
Modulus("%", 60),
Mod("MOD", 60),
@@ -87,13 +87,19 @@ public class MySqlExprParser extends SQLExprParser {
}
public SQLExpr multiplicativeRest(SQLExpr expr) {
if (lexer.token() == Token.IDENTIFIER && "MOD".equalsIgnoreCase(lexer.stringVal())) {
final Token token = lexer.token();
if (token == Token.IDENTIFIER && "MOD".equalsIgnoreCase(lexer.stringVal())) {
lexer.nextToken();
SQLExpr rightExp = primary();
rightExp = relationalRest(rightExp);
return new SQLBinaryOpExpr(expr, SQLBinaryOperator.Modulus, rightExp, JdbcConstants.MYSQL);
} else if (token == Token.DIV) {
lexer.nextToken();
SQLExpr rightExp = bitXor();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.DIV, rightExp, getDbType());
expr = multiplicativeRest(expr);
}
return super.multiplicativeRest(expr);
@@ -52,6 +52,7 @@ public class MySqlLexer extends Lexer {
map.put("ROW", Token.ROW);
map.put("BEGIN", Token.BEGIN);
map.put("END", Token.END);
map.put("DIV", Token.DIV);
// for oceanbase & mysql 5.7
map.put("PARTITION", Token.PARTITION);
@@ -159,17 +159,18 @@ public class SQLExprParser extends SQLParser {
}
public SQLExpr multiplicativeRest(SQLExpr expr) {
if (lexer.token() == Token.STAR) {
final Token token = lexer.token();
if (token == Token.STAR) {
lexer.nextToken();
SQLExpr rightExp = bitXor();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Multiply, rightExp, getDbType());
expr = multiplicativeRest(expr);
} else if (lexer.token() == Token.SLASH) {
} else if (token == Token.SLASH) {
lexer.nextToken();
SQLExpr rightExp = bitXor();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Divide, rightExp, getDbType());
expr = multiplicativeRest(expr);
} else if (lexer.token() == Token.PERCENT) {
} else if (token == Token.PERCENT) {
lexer.nextToken();
SQLExpr rightExp = bitXor();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Modulus, rightExp, getDbType());
@@ -142,6 +142,7 @@ public enum Token {
UNDO("UNDO"),
SQLSTATE("SQLSTATE"),
CONDITION("CONDITION"),
DIV("DIV"),
//postgresql
WINDOW("WINDOW"),