improved sql parser pg json operation support. #1592

This commit is contained in:
wenshao
2017-01-26 23:27:19 +08:00
parent 6fbfef62b5
commit d9eccdbc45
7 changed files with 205 additions and 4 deletions
@@ -37,8 +37,11 @@ public enum SQLBinaryOperator {
SubGt("->", 20),
SubGtGt("->>", 20),
PoundGt("#>", 20),
PoundGtGt("#>>", 20),
PoundGtGt("#>>", 20),
QuesQues("??", 20),
QuesBar("?|", 20),
QuesAmp("?&", 20),
LeftShift("<<", 80),
RightShift(">>", 80),
@@ -450,7 +450,18 @@ public class Lexer {
return;
case '?':
scanChar();
token = Token.QUES;
if (ch == '?') {
scanChar();
token = Token.QUESQUES;
} else if (ch == '|') {
scanChar();
token = Token.QUESBAR;
} else if (ch == '&') {
scanChar();
token = Token.QUESAMP;
} else {
token = Token.QUES;
}
return;
case ';':
scanChar();
@@ -139,6 +139,21 @@ public class SQLExprParser extends SQLParser {
SQLExpr rightExp = primary();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.PoundGtGt, rightExp, getDbType());
expr = bitXorRest(expr);
} else if (token == Token.QUESQUES) {
lexer.nextToken();
SQLExpr rightExp = primary();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesQues, rightExp, getDbType());
expr = bitXorRest(expr);
} else if (token == Token.QUESBAR) {
lexer.nextToken();
SQLExpr rightExp = primary();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesBar, rightExp, getDbType());
expr = bitXorRest(expr);
} else if (token == Token.QUESAMP) {
lexer.nextToken();
SQLExpr rightExp = primary();
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.QuesAmp, rightExp, getDbType());
expr = bitXorRest(expr);
}
return expr;
@@ -305,7 +305,10 @@ public enum Token {
TILDE("~"),
TILDE_STAR("~*"),
TILDE_EQ("~="),
QUES("?"),
QUES("?"),
QUESQUES("??"),
QUESBAR("?|"),
QUESAMP("?&"),
COLON(":"),
COLONCOLON("::"),
COLONEQ(":="),