sql parser support postgresql json operator

This commit is contained in:
高铁
2016-06-29 16:40:06 +08:00
parent c565260990
commit 022c0fe620
9 changed files with 274 additions and 4 deletions
@@ -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;