mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for sql parser. issue #1898
This commit is contained in:
@@ -195,12 +195,12 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
expr = new SQLHexExpr(charValue);
|
||||
|
||||
return primaryRest(expr);
|
||||
} else if (ident.equalsIgnoreCase("b")) {
|
||||
String charValue = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
expr = new SQLBinaryExpr(charValue);
|
||||
|
||||
return primaryRest(expr);
|
||||
// } else if (ident.equalsIgnoreCase("b")) {
|
||||
// String charValue = lexer.stringVal();
|
||||
// lexer.nextToken();
|
||||
// expr = new SQLBinaryExpr(charValue);
|
||||
//
|
||||
// return primaryRest(expr);
|
||||
} else if (ident.startsWith("_")) {
|
||||
String charValue = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
@@ -277,15 +277,15 @@ public class MySqlExprParser extends SQLExprParser {
|
||||
|
||||
return primaryRest(expr);
|
||||
}
|
||||
} else if (expr instanceof SQLIntegerExpr) {
|
||||
SQLIntegerExpr intExpr = (SQLIntegerExpr) expr;
|
||||
String binaryString = lexer.stringVal();
|
||||
if (intExpr.getNumber().intValue() == 0 && binaryString.startsWith("b")) {
|
||||
lexer.nextToken();
|
||||
expr = new SQLBinaryExpr(binaryString.substring(1));
|
||||
|
||||
return primaryRest(expr);
|
||||
}
|
||||
// } else if (expr instanceof SQLIntegerExpr) {
|
||||
// SQLIntegerExpr intExpr = (SQLIntegerExpr) expr;
|
||||
// String binaryString = lexer.stringVal();
|
||||
// if (intExpr.getNumber().intValue() == 0 && binaryString.startsWith("b")) {
|
||||
// lexer.nextToken();
|
||||
// expr = new SQLBinaryExpr(binaryString.substring(1));
|
||||
//
|
||||
// return primaryRest(expr);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -218,8 +218,29 @@ public class MySqlLexer extends Lexer {
|
||||
public void scanIdentifier() {
|
||||
final char first = ch;
|
||||
|
||||
if (ch == '`') {
|
||||
if (ch == 'b' && charAt(pos + 1) == '\'') {
|
||||
int i = 2;
|
||||
int mark = pos + 2;
|
||||
for (;;++i) {
|
||||
char ch = charAt(pos + i);
|
||||
if (ch == '0' || ch == '1') {
|
||||
continue;
|
||||
} else if (ch == '\'') {
|
||||
bufPos += i;
|
||||
pos += (i + 1);
|
||||
stringVal = subString(mark, i - 2);
|
||||
this.ch = charAt(pos);
|
||||
token = Token.BITS;
|
||||
return;
|
||||
} else if (ch == EOI) {
|
||||
throw new ParserException("illegal identifier. " + info());
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ch == '`') {
|
||||
mark = pos;
|
||||
bufPos = 1;
|
||||
char ch;
|
||||
@@ -453,6 +474,26 @@ public class MySqlLexer extends Lexer {
|
||||
public void scanNumber() {
|
||||
mark = pos;
|
||||
|
||||
if (ch == '0' && charAt(pos + 1) == 'b') {
|
||||
int i = 2;
|
||||
int mark = pos + 2;
|
||||
for (;;++i) {
|
||||
char ch = charAt(pos + i);
|
||||
if (ch == '0' || ch == '1') {
|
||||
continue;
|
||||
} else if (ch >= '2' && ch <= '9') {
|
||||
break;
|
||||
} else {
|
||||
bufPos += i;
|
||||
pos += i;
|
||||
stringVal = subString(mark, i - 2);
|
||||
this.ch = charAt(pos);
|
||||
token = Token.BITS;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ch == '-') {
|
||||
bufPos++;
|
||||
ch = charAt(++pos);
|
||||
|
||||
@@ -652,6 +652,12 @@ public class SQLExprParser extends SQLParser {
|
||||
lexer.nextToken();
|
||||
sqlExpr = new SQLBooleanExpr(false);
|
||||
break;
|
||||
case BITS: {
|
||||
String strVal = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
sqlExpr = new SQLBinaryExpr(strVal);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ParserException("ERROR" + lexer.info());
|
||||
}
|
||||
|
||||
@@ -130,6 +130,8 @@ public enum Token {
|
||||
SHOW("SHOW"),
|
||||
REPLACE("REPLACE"),
|
||||
|
||||
BITS,
|
||||
|
||||
// MySql procedure add by zz
|
||||
WHILE("WHILE"),
|
||||
DO("DO"),
|
||||
@@ -256,7 +258,7 @@ public enum Token {
|
||||
LITERAL_HEX,
|
||||
LITERAL_CHARS,
|
||||
LITERAL_NCHARS,
|
||||
|
||||
|
||||
LITERAL_ALIAS,
|
||||
LINE_COMMENT,
|
||||
MULTI_LINE_COMMENT,
|
||||
|
||||
Reference in New Issue
Block a user