mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
sql parser support postgresql json operator
This commit is contained in:
@@ -33,6 +33,11 @@ public enum SQLBinaryOperator {
|
||||
Add("+", 70),
|
||||
Subtract("-", 70),
|
||||
|
||||
SubGt("->", 20),
|
||||
SubGtGt("->>", 20),
|
||||
PoundGt("#>", 20),
|
||||
PoundGtGt("#>>", 20),
|
||||
|
||||
LeftShift("<<", 80),
|
||||
RightShift(">>", 80),
|
||||
|
||||
|
||||
@@ -165,7 +165,17 @@ public class PGLexer extends Lexer {
|
||||
}
|
||||
|
||||
public void scanSharp() {
|
||||
token = Token.POUND;
|
||||
scanChar();
|
||||
if (ch == '>') {
|
||||
scanChar();
|
||||
if (ch == '>') {
|
||||
scanChar();
|
||||
token = Token.POUNDGTGT;
|
||||
} else {
|
||||
token = Token.POUNDGT;
|
||||
}
|
||||
} else {
|
||||
token = Token.POUND;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -510,7 +510,17 @@ public class Lexer {
|
||||
break;
|
||||
case '-':
|
||||
scanChar();
|
||||
token = Token.SUB;
|
||||
if (ch == '>') {
|
||||
scanChar();
|
||||
if (ch == '>') {
|
||||
scanChar();
|
||||
token = Token.SUBGTGT;
|
||||
} else {
|
||||
token = Token.SUBGT;
|
||||
}
|
||||
} else {
|
||||
token = Token.SUB;
|
||||
}
|
||||
break;
|
||||
case '*':
|
||||
scanChar();
|
||||
|
||||
@@ -152,11 +152,32 @@ public class SQLExprParser extends SQLParser {
|
||||
}
|
||||
|
||||
public SQLExpr bitXorRest(SQLExpr expr) {
|
||||
if (lexer.token() == Token.CARET) {
|
||||
Token token = lexer.token;
|
||||
if (token == Token.CARET) {
|
||||
lexer.nextToken();
|
||||
SQLExpr rightExp = primary();
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.BitwiseXor, rightExp, getDbType());
|
||||
expr = bitXorRest(expr);
|
||||
} else if (token == Token.SUBGT) {
|
||||
lexer.nextToken();
|
||||
SQLExpr rightExp = primary();
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.SubGt, rightExp, getDbType());
|
||||
expr = bitXorRest(expr);
|
||||
} else if (token == Token.SUBGTGT) {
|
||||
lexer.nextToken();
|
||||
SQLExpr rightExp = primary();
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.SubGtGt, rightExp, getDbType());
|
||||
expr = bitXorRest(expr);
|
||||
} else if (token == Token.POUNDGT) {
|
||||
lexer.nextToken();
|
||||
SQLExpr rightExp = primary();
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.PoundGt, rightExp, getDbType());
|
||||
expr = bitXorRest(expr);
|
||||
} else if (token == Token.POUNDGTGT) {
|
||||
lexer.nextToken();
|
||||
SQLExpr rightExp = primary();
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.PoundGtGt, rightExp, getDbType());
|
||||
expr = bitXorRest(expr);
|
||||
}
|
||||
|
||||
return expr;
|
||||
|
||||
@@ -315,6 +315,8 @@ public enum Token {
|
||||
BARSLASH("|/"),
|
||||
PLUS("+"),
|
||||
SUB("-"),
|
||||
SUBGT("->"),
|
||||
SUBGTGT("->>"),
|
||||
STAR("*"),
|
||||
SLASH("/"),
|
||||
AMP("&"),
|
||||
@@ -324,7 +326,9 @@ public enum Token {
|
||||
LTLT("<<"),
|
||||
GTGT(">>"),
|
||||
MONKEYS_AT("@"),
|
||||
POUND("#")
|
||||
POUND("#"),
|
||||
POUNDGT("#>"),
|
||||
POUNDGTGT("#>>")
|
||||
;
|
||||
|
||||
public final String name;
|
||||
|
||||
Reference in New Issue
Block a user