diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java index 0de4ee60af..ae3ecade71 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java @@ -194,4 +194,88 @@ public class OdpsLexer extends Lexer { } } + + public void scanNumber() { + mark = pos; + + if (ch == '-') { + bufPos++; + ch = charAt(++pos); + } + + for (;;) { + if (ch >= '0' && ch <= '9') { + bufPos++; + } else { + break; + } + ch = charAt(++pos); + } + + boolean isDouble = false; + + if (ch == '.') { + if (charAt(pos + 1) == '.') { + token = Token.LITERAL_INT; + return; + } + bufPos++; + ch = charAt(++pos); + isDouble = true; + + for (;;) { + if (ch >= '0' && ch <= '9') { + bufPos++; + } else { + break; + } + ch = charAt(++pos); + } + } + + if (ch == 'e' || ch == 'E') { + bufPos++; + ch = charAt(++pos); + + if (ch == '+' || ch == '-') { + bufPos++; + ch = charAt(++pos); + } + + for (;;) { + if (ch >= '0' && ch <= '9') { + bufPos++; + } else { + break; + } + ch = charAt(++pos); + } + + isDouble = true; + } + + if (isDouble) { + token = Token.LITERAL_FLOAT; + } else { + if (isFirstIdentifierChar(ch) && !(ch == 'b' && bufPos == 1 && charAt(pos - 1) == '0')) { + bufPos++; + for (;;) { + ch = charAt(++pos); + + if (!isIdentifierChar(ch)) { + break; + } + + bufPos++; + continue; + } + + stringVal = addSymbol(); + token = Token.IDENTIFIER; + } else { + token = Token.LITERAL_INT; + } + } + } + } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/parser/MySqlParserResourceTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/parser/MySqlParserResourceTest.java index 5837f05bd9..3489e04773 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/parser/MySqlParserResourceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/parser/MySqlParserResourceTest.java @@ -47,6 +47,7 @@ public class MySqlParserResourceTest extends TestCase { exec_test("bvt/parser/mysql-11.txt"); exec_test("bvt/parser/mysql-12.txt"); exec_test("bvt/parser/mysql-13.txt"); + exec_test("bvt/parser/mysql-15.txt"); } public void exec_test(String resource) throws Exception { diff --git a/src/test/resources/bvt/parser/mysql-15.txt b/src/test/resources/bvt/parser/mysql-15.txt new file mode 100644 index 0000000000..5699ef42b4 --- /dev/null +++ b/src/test/resources/bvt/parser/mysql-15.txt @@ -0,0 +1,3 @@ +SELECT a.id AS 888appId, a.name AS 999appName +--------------------------- +SELECT a.id AS 888appId, a.name AS 999appName