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);
|
||||
|
||||
Reference in New Issue
Block a user