diff --git a/pom.xml b/pom.xml
index 3483d58905..f2e66d77b9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
-->
com.alibaba
druid
- 1.1.3-preview_14
+ 1.1.3-preview_23
jar
druid
@@ -463,7 +463,6 @@
2.5
provided
-
mysql
mysql-connector-java
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java
index 6d0ab311ee..d4c493f4f6 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java
@@ -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);
+// }
}
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java
index f1b72099b0..c70e52d005 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java
@@ -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);
diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
index bb6fe3ce21..ae4bb2a30f 100644
--- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
+++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
@@ -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());
}
diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java
index e0a1ef5241..f040296c0d 100644
--- a/src/main/java/com/alibaba/druid/sql/parser/Token.java
+++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java
@@ -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,
diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Issue1898.java b/src/test/java/com/alibaba/druid/bvt/bug/Issue1898.java
new file mode 100644
index 0000000000..00ae3e962b
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/bug/Issue1898.java
@@ -0,0 +1,16 @@
+package com.alibaba.druid.bvt.bug;
+
+import junit.framework.TestCase;
+import org.junit.Test;
+
+/**
+ * Created by wenshao on 14/08/2017.
+ */
+public class Issue1898 extends TestCase {
+ public void test_for_issue() throws Exception {
+ String sql = "SELECT 0 bSomething";
+ String formatted = com.alibaba.druid.sql.SQLUtils.format(sql, "mysql");
+// assertNotEquals("SELECT b'Something'", formatted);
+ assertEquals("SELECT 0 AS bSomething", formatted);
+ }
+}