mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
mysql parser support DIV operator. issue #1526
This commit is contained in:
@@ -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"),
|
||||
|
||||
Reference in New Issue
Block a user