mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved postgresql sql parser support. support POSIX Regular Expressions. issue #1391
This commit is contained in:
@@ -59,6 +59,10 @@ public enum SQLBinaryOperator {
|
||||
NotILike("NOT ILIKE", 110),
|
||||
AT_AT("@@", 110), // postgresql textsearch
|
||||
SIMILAR_TO("SIMILAR TO", 110),
|
||||
POSIX_Regular_Match("~", 110),
|
||||
POSIX_Regular_Match_Insensitive("~*", 110),
|
||||
POSIX_Regular_Not_Match("!~", 110),
|
||||
POSIX_Regular_Not_Match_POSIX_Regular_Match_Insensitive("!~*", 110),
|
||||
|
||||
RLike("RLIKE", 110),
|
||||
NotRLike("NOT RLIKE", 110),
|
||||
|
||||
@@ -626,6 +626,14 @@ public class Lexer {
|
||||
} else if (ch == '!') {
|
||||
scanChar();
|
||||
token = Token.BANGBANG; // postsql
|
||||
} else if (ch == '~') {
|
||||
scanChar();
|
||||
if (ch == '*') {
|
||||
scanChar();
|
||||
token = Token.BANG_TILDE_STAR; // postsql
|
||||
} else {
|
||||
token = Token.BANG_TILDE; // postsql
|
||||
}
|
||||
} else {
|
||||
token = Token.BANG;
|
||||
}
|
||||
@@ -636,7 +644,12 @@ public class Lexer {
|
||||
break;
|
||||
case '~':
|
||||
scanChar();
|
||||
token = Token.TILDE;
|
||||
if (ch == '*') {
|
||||
scanChar();
|
||||
token = Token.TILDE_STAR;
|
||||
} else {
|
||||
token = Token.TILDE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ParserException("TODO");
|
||||
|
||||
@@ -1492,16 +1492,49 @@ public class SQLExprParser extends SQLParser {
|
||||
}
|
||||
} else if (lexer.token() == Token.IN) {
|
||||
expr = inRest(expr);
|
||||
} else if (JdbcConstants.POSTGRESQL.equals(lexer.dbType)
|
||||
&& identifierEquals("SIMILAR")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.TO);
|
||||
} else if (JdbcConstants.POSTGRESQL.equals(lexer.dbType)) {
|
||||
if (identifierEquals("SIMILAR")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.TO);
|
||||
|
||||
rightExp = equality();
|
||||
rightExp = equality();
|
||||
|
||||
rightExp = relationalRest(rightExp);
|
||||
rightExp = relationalRest(rightExp);
|
||||
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.SIMILAR_TO, rightExp, getDbType());
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.SIMILAR_TO, rightExp, getDbType());
|
||||
} else if (lexer.token() == Token.TILDE) {
|
||||
lexer.nextToken();
|
||||
|
||||
rightExp = equality();
|
||||
|
||||
rightExp = relationalRest(rightExp);
|
||||
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.POSIX_Regular_Match, rightExp, getDbType());
|
||||
} else if (lexer.token() == Token.TILDE_STAR) {
|
||||
lexer.nextToken();
|
||||
|
||||
rightExp = equality();
|
||||
|
||||
rightExp = relationalRest(rightExp);
|
||||
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.POSIX_Regular_Match_Insensitive, rightExp, getDbType());
|
||||
} else if (lexer.token() == Token.BANG_TILDE) {
|
||||
lexer.nextToken();
|
||||
|
||||
rightExp = equality();
|
||||
|
||||
rightExp = relationalRest(rightExp);
|
||||
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.POSIX_Regular_Not_Match, rightExp, getDbType());
|
||||
} else if (lexer.token() == Token.BANG_TILDE_STAR) {
|
||||
lexer.nextToken();
|
||||
|
||||
rightExp = equality();
|
||||
|
||||
rightExp = relationalRest(rightExp);
|
||||
|
||||
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.POSIX_Regular_Not_Match_POSIX_Regular_Match_Insensitive, rightExp, getDbType());
|
||||
}
|
||||
}
|
||||
|
||||
return expr;
|
||||
|
||||
@@ -299,7 +299,10 @@ public enum Token {
|
||||
LT("<"),
|
||||
BANG("!"),
|
||||
BANGBANG("!!"),
|
||||
TILDE("~"),
|
||||
BANG_TILDE("!~"),
|
||||
BANG_TILDE_STAR("!~*"),
|
||||
TILDE("~"),
|
||||
TILDE_STAR("~*"),
|
||||
QUES("?"),
|
||||
COLON(":"),
|
||||
COLONCOLON(":"),
|
||||
|
||||
Reference in New Issue
Block a user