bug fixed for sql parser. issue #1898

This commit is contained in:
wenshao
2017-08-14 21:29:39 +08:00
parent e210b1608a
commit 5a201ce33c
6 changed files with 83 additions and 19 deletions
@@ -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,