From b5daf4a8f5a46307db4d1ae33b148e13fae771ef Mon Sep 17 00:00:00 2001 From: yakolee Date: Wed, 4 Jun 2014 18:27:31 +0800 Subject: [PATCH 1/3] improve sql parser --- .../sql/dialect/mysql/parser/MySqlExprParser.java | 6 +++++- .../druid/sql/visitor/SQLEvalVisitorUtils.java | 12 ++++++++++++ .../alibaba/druid/sql/visitor/functions/Char.java | 7 +++++-- 3 files changed, 22 insertions(+), 3 deletions(-) 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 3be6b62fef..deef36e75f 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 @@ -22,7 +22,6 @@ import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLHexExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; @@ -484,6 +483,11 @@ public class MySqlExprParser extends SQLExprParser { lexer.nextToken(); return userName; } + + if(lexer.token() == Token.ERROR) { + throw new ParserException("syntax error, token: " + lexer.token() + " " + lexer.stringVal() + ", pos : " + + lexer.pos()); + } return super.primaryRest(expr); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 18003fd8a9..4a95120d50 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -1239,6 +1239,14 @@ public class SQLEvalVisitorUtils { return castToLong(list.get(0)); } } + + if (val instanceof Boolean) { + if (((Boolean) val).booleanValue()) { + return 1l; + } else { + return 0l; + } + } return ((Number) val).longValue(); } @@ -1431,6 +1439,10 @@ public class SQLEvalVisitorUtils { return null; } + if(a == EVAL_VALUE_NULL || b == EVAL_VALUE_NULL) { + return null; + } + if (a instanceof String) { a = castToNumber((String) a); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Char.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Char.java index 27f9146982..301fb4352d 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/functions/Char.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Char.java @@ -42,8 +42,11 @@ public class Char implements Function { int charCode = ((Number) paramValue).intValue(); buf.append((char) charCode); } else if (paramValue instanceof String) { - int charCode = new BigDecimal((String)paramValue).intValue(); - buf.append((char) charCode); + try { + int charCode = new BigDecimal((String) paramValue).intValue(); + buf.append((char) charCode); + } catch (NumberFormatException e) { + } } else { return SQLEvalVisitor.EVAL_ERROR; } From d20b1f684e8f16a092ad54ce406a0aa85d7f2bd5 Mon Sep 17 00:00:00 2001 From: yakolee Date: Thu, 5 Jun 2014 19:36:52 +0800 Subject: [PATCH 2/3] bugfix --- .../sql/visitor/SQLEvalVisitorUtils.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 4a95120d50..a6f626cce2 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -1330,8 +1330,12 @@ public class SQLEvalVisitorUtils { return new BigInteger(val); } catch (NumberFormatException e) { } - - return new BigDecimal(val); + + try { + return new BigDecimal(val); + } catch (NumberFormatException e) { + return 0; + } } public static Date castToDate(Object val) { @@ -1426,6 +1430,18 @@ public class SQLEvalVisitorUtils { if (a == null || b == null) { return null; } + + if(a == EVAL_VALUE_NULL || b == EVAL_VALUE_NULL) { + return null; + } + + if (a instanceof String) { + a = castToNumber((String) a); + } + + if (b instanceof String) { + b = castToNumber((String) b); + } if (a instanceof Long || b instanceof Long) { return castToLong(a).longValue() | castToLong(b).longValue(); @@ -1660,6 +1676,10 @@ public class SQLEvalVisitorUtils { if (a == null || b == null) { return false; } + + if (a == EVAL_VALUE_NULL || b == EVAL_VALUE_NULL) { + return false; + } if (a.equals(b)) { return true; From f8d29879310705ca0c9dd8da02c83c09a8792420 Mon Sep 17 00:00:00 2001 From: yakolee Date: Fri, 6 Jun 2014 18:43:49 +0800 Subject: [PATCH 3/3] bugfix --- .../sql/visitor/SQLEvalVisitorUtils.java | 25 ++++++++++++++++++- .../sql/visitor/functions/Substring.java | 4 +-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index a6f626cce2..7564d5f2c2 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -1418,6 +1418,18 @@ public class SQLEvalVisitorUtils { if (a == null || b == null) { return null; } + + if(a == EVAL_VALUE_NULL || b == EVAL_VALUE_NULL) { + return null; + } + + if (a instanceof String) { + a = castToNumber((String) a); + } + + if (b instanceof String) { + b = castToNumber((String) b); + } if (a instanceof Long || b instanceof Long) { return castToLong(a).longValue() & castToLong(b).longValue(); @@ -1503,7 +1515,18 @@ public class SQLEvalVisitorUtils { } if (a instanceof Long || b instanceof Long) { - return castToLong(a) / castToLong(b); + Long longA = castToLong(a); + Long longB = castToLong(b); + if (longB == 0) { + if (longA > 0) { + return Double.POSITIVE_INFINITY; + } else if (longA < 0) { + return Double.NEGATIVE_INFINITY; + } else { + return Double.NaN; + } + } + return longA / longB; } if (a instanceof Integer || b instanceof Integer) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Substring.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Substring.java index 9e11949825..fe6ecb9914 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/functions/Substring.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Substring.java @@ -50,7 +50,7 @@ public class Substring implements Function { if (paramSize == 2) { - if (index < 0) { + if (index <= 0) { int lastIndex = str.length() + index; return str.substring(lastIndex); } @@ -68,7 +68,7 @@ public class Substring implements Function { int len = ((Number) param2Value).intValue(); String result; - if (index < 0) { + if (index <= 0) { int lastIndex = str.length() + index; result = str.substring(lastIndex); } else {