From 1ccaaa5572dc8ce14eca5c9b8eafa7bd120aa017 Mon Sep 17 00:00:00 2001 From: tivenwang Date: Tue, 7 Jun 2016 10:56:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?mysql=20select=20*=20frm=20aaa=20limit=2020?= =?UTF-8?q?xxx=20=EF=BC=8Climit=E5=90=8E=E7=9A=84=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E6=97=A0=E6=B3=95=E8=BD=AC=E6=8D=A2=E4=B8=BA=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alibaba/druid/sql/parser/Lexer.java | 8 +++++- .../com/alibaba/druid/util/StringUtils.java | 16 ++++++++++- .../alibaba/druid/mysql/MysqlLimitTest.java | 28 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/mysql/MysqlLimitTest.java diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index bb9377f46f..bff27424f0 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.sql.parser; +import com.alibaba.druid.util.StringUtils; + import static com.alibaba.druid.sql.parser.CharTypes.isFirstIdentifierChar; import static com.alibaba.druid.sql.parser.CharTypes.isIdentifierChar; import static com.alibaba.druid.sql.parser.CharTypes.isWhitespace; @@ -1147,7 +1149,11 @@ public class Lexer { } public BigDecimal decimalValue() { - return new BigDecimal(subString(mark, bufPos).toCharArray()); + String value = subString(mark, bufPos); + if (!StringUtils.isNumeric(value)){ + throw new ParserException(value+" is not a number!"); + } + return new BigDecimal(value.toCharArray()); } public static interface CommentHandler { diff --git a/src/main/java/com/alibaba/druid/util/StringUtils.java b/src/main/java/com/alibaba/druid/util/StringUtils.java index 549c267b56..155e186afe 100644 --- a/src/main/java/com/alibaba/druid/util/StringUtils.java +++ b/src/main/java/com/alibaba/druid/util/StringUtils.java @@ -95,7 +95,7 @@ public class StringUtils { return a.equalsIgnoreCase(b); } - public static boolean isEmpty(String value) { + public static boolean isEmpty(CharSequence value) { if (value == null || value.length() == 0) { return true; } @@ -119,4 +119,18 @@ public class StringUtils { } return h; } + + public static boolean isNumeric(final CharSequence cs) { + if (isEmpty(cs)) { + return false; + } + final int sz = cs.length(); + for (int i = 0; i < sz; i++) { + if (!Character.isDigit(cs.charAt(i))) { + return false; + } + } + return true; + } + } diff --git a/src/test/java/com/alibaba/druid/mysql/MysqlLimitTest.java b/src/test/java/com/alibaba/druid/mysql/MysqlLimitTest.java new file mode 100644 index 0000000000..206805a27e --- /dev/null +++ b/src/test/java/com/alibaba/druid/mysql/MysqlLimitTest.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.mysql; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import junit.framework.TestCase; + +import java.util.List; + +/** + * Created by tianzhen.wtz on 2016/6/7. + * 类说明: + */ +public class MysqlLimitTest extends TestCase{ + + + public void testLimit(){ + String sql = "select * from aaa limit 20exx"; + SQLStatementParser statementParser = SQLParserUtils.createSQLStatementParser(sql, "mysql"); + try { + List sqlStatements = statementParser.parseStatementList(); + } catch (Exception e) { + assertTrue(e.getMessage().contains("is not a number!")); + } + + + } +} From 51a4fd2e2774d1daf4874df65e51139c4c681216 Mon Sep 17 00:00:00 2001 From: tivenwang Date: Tue, 7 Jun 2016 16:59:11 +0800 Subject: [PATCH 2/2] isNumber update --- .../java/com/alibaba/druid/sql/parser/Lexer.java | 3 ++- .../java/com/alibaba/druid/util/StringUtils.java | 14 -------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index bff27424f0..d53d185da8 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.parser; import com.alibaba.druid.util.StringUtils; +import org.apache.commons.lang.math.NumberUtils; import static com.alibaba.druid.sql.parser.CharTypes.isFirstIdentifierChar; import static com.alibaba.druid.sql.parser.CharTypes.isIdentifierChar; @@ -1150,7 +1151,7 @@ public class Lexer { public BigDecimal decimalValue() { String value = subString(mark, bufPos); - if (!StringUtils.isNumeric(value)){ + if (!NumberUtils.isNumber(value)){ throw new ParserException(value+" is not a number!"); } return new BigDecimal(value.toCharArray()); diff --git a/src/main/java/com/alibaba/druid/util/StringUtils.java b/src/main/java/com/alibaba/druid/util/StringUtils.java index 155e186afe..5252c4d025 100644 --- a/src/main/java/com/alibaba/druid/util/StringUtils.java +++ b/src/main/java/com/alibaba/druid/util/StringUtils.java @@ -119,18 +119,4 @@ public class StringUtils { } return h; } - - public static boolean isNumeric(final CharSequence cs) { - if (isEmpty(cs)) { - return false; - } - final int sz = cs.length(); - for (int i = 0; i < sz; i++) { - if (!Character.isDigit(cs.charAt(i))) { - return false; - } - } - return true; - } - }