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); + } +}