From 40ccaee0e38595dbbae58e9f22006b275d16a816 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 28 Aug 2013 21:44:03 +0800 Subject: [PATCH 1/2] bug fixed for eval --- .../com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java | 4 +--- 1 file changed, 1 insertion(+), 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 3ae7ff0da6..6481ea4b01 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -1117,9 +1117,7 @@ public class SQLEvalVisitorUtils { return true; } - if ("0".equals(val) || "false".equalsIgnoreCase((String) val)) { - return false; - } + return false; } throw new IllegalArgumentException(val.getClass() + " not supported."); From d179a8752eaaa4b71da4d5b0340ef1fb3c6207da Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 29 Aug 2013 14:31:21 +0800 Subject: [PATCH 2/2] improve sql wall --- .../sql/dialect/mysql/parser/MySqlLexer.java | 27 +++++----- .../sql/visitor/SQLEvalVisitorUtils.java | 6 ++- .../druid/wall/spi/WallVisitorUtils.java | 8 +-- .../bvt/filter/wall/MySqlWallTest139.java | 53 +++++++++++++++++++ .../bvt/filter/wall/SQLServerWallTest_10.java | 41 ++++++++++++++ .../bvt/filter/wall/SQLServerWallTest_9.java | 8 +-- .../bvt/sql/cobar/DMLInsertParserTest.java | 11 ---- .../cobar/DMLInsertParserTest_Special.java | 38 +++++++++++++ .../alibaba/druid/test/wall/ResourceTest.java | 4 +- 9 files changed, 158 insertions(+), 38 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest139.java create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_10.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLInsertParserTest_Special.java 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 c3e35fc519..39939fac41 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 @@ -345,19 +345,20 @@ public class MySqlLexer extends Lexer { putChar(ch); break; } - } else { - if (ch == '\'') { - scanChar(); - if (ch != '\'') { - token = LITERAL_CHARS; - break; - } else { - initBuff(bufPos); - arraycopy(mark + 1, buf, 0, bufPos); - hasSpecial = true; - putChar('\''); - continue; - } + + continue; + } + if (ch == '\'') { + scanChar(); + if (ch != '\'') { + token = LITERAL_CHARS; + break; + } else { + initBuff(bufPos); + arraycopy(mark + 1, buf, 0, bufPos); + hasSpecial = true; + putChar('\''); + continue; } } 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 6481ea4b01..218a1b835f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -1376,7 +1376,11 @@ public class SQLEvalVisitorUtils { if (decimalB.scale() < decimalA.scale()) { decimalB = decimalB.setScale(decimalA.scale()); } - return decimalA.divide(decimalB, BigDecimal.ROUND_HALF_UP); + try { + return decimalA.divide(decimalB); + } catch (ArithmeticException ex) { + return decimalA.divide(decimalB, BigDecimal.ROUND_HALF_UP); + } } if (a instanceof Double || b instanceof Double) { diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 46e7f4965b..5c2f777ea7 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -228,11 +228,11 @@ public class WallVisitorUtils { Object whereValue = getConditionValue(visitor, where, visitor.getConfig().isSelectWhereAlwayTrueCheck()); - if (queryBlockFromIsNull(visitor, x, false) && whereValue != null) { - addViolation(visitor, ErrorCode.EMPTY_QUERY_HAS_CONDITION, "empty select has condition", x); - } - if (Boolean.TRUE == whereValue) { + if (queryBlockFromIsNull(visitor, x, false)) { + addViolation(visitor, ErrorCode.EMPTY_QUERY_HAS_CONDITION, "empty select has condition", x); + } + boolean isSimpleConstExpr = false; SQLExpr first = getFirst(where); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest139.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest139.java new file mode 100644 index 0000000000..6c14e2a493 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest139.java @@ -0,0 +1,53 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.filter.wall; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.wall.WallProvider; +import com.alibaba.druid.wall.spi.MySqlWallProvider; + +public class MySqlWallTest139 extends TestCase { + + public void test_false() throws Exception { + WallProvider provider = new MySqlWallProvider(); + + String sql = "select count(1) as total "// + + " from (" // + + " select '' buyer_nick from dual " // + + " where 1=0 "// + + " union " // + + " select distinct buyer_nick "// + + " from sys_info.orders "// + + " where 1=1 and receiver_district in ('平谷区')" // + + ") a " // + + "inner join (" // + + " select buyer_nick from ("// + + " select distinct buyer_nick "// + + " from sys_info.orders " // + + " where 1=1 and created > '2013-07-28' "// + + " ) recent_days " // + + "inner join (" // + + " select distinct buyer_nick " // + + " from sys_info.orders " // + + " where 1=1 and seller_nick in ('创维官方旗舰店') " // + + " ) seller_nick using(buyer_nick) "// + + ") b using(buyer_nick)"; + Assert.assertTrue(provider.checkValid(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_10.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_10.java new file mode 100644 index 0000000000..5542df157c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_10.java @@ -0,0 +1,41 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.filter.wall; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.wall.WallProvider; +import com.alibaba.druid.wall.spi.SQLServerWallProvider; + +/** + * SQLServerWallTest + * + * @see + */ +public class SQLServerWallTest_10 extends TestCase { + + public void test_true() throws Exception { + WallProvider provider = new SQLServerWallProvider(); + + String sql = "select top 50 * FROM [V_Goods_WithAvailableStockQuantity] where Status='����' and (Code like '%mu%' ESCAPE '\' or Model like '%mu%' ESCAPE '\' or Spec like '%mu%' ESCAPE '\' or BarCode like '%mu%' ESCAPE '\' or ProductName like '%mu%' ESCAPE '\' or dbo.F_GetPY(ProductName) like '%mu%' ESCAPE '\') "; + + Assert.assertTrue(provider.checkValid(sql)); + + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_9.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_9.java index cb31deadd5..6f723bf90b 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_9.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_9.java @@ -15,22 +15,16 @@ */ package com.alibaba.druid.bvt.filter.wall; -import java.util.Collections; - import junit.framework.TestCase; import org.junit.Assert; -import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; -import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.wall.WallProvider; import com.alibaba.druid.wall.spi.SQLServerWallProvider; /** * SQLServerWallTest * - * @author RaymondXiu - * @version 1.0, 2012-3-18 * @see */ public class SQLServerWallTest_9 extends TestCase { @@ -44,7 +38,7 @@ public class SQLServerWallTest_9 extends TestCase { + " AND status='P'" // + " AND islast=0" // + " AND NOT EXISTS (select m.id from project_measures m WHERE m.snapshot_id=s.id)"; - + Assert.assertTrue(provider.checkValid(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLInsertParserTest.java b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLInsertParserTest.java index bce5932d5a..e0402c84b0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLInsertParserTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLInsertParserTest.java @@ -96,17 +96,6 @@ public class DMLInsertParserTest extends TestCase { "\n\t('12''34')", output); } - public void testInsert_7() throws Exception { - String sql = "insErt LOW_PRIORITY t1 (col1, t1.col2) VALUE (123,'123\\'4') oN dupLicatE key UPDATE ex.col1=?"; - MySqlStatementParser parser = new MySqlStatementParser(sql); - SQLStatement stmt = parser.parseStatementList().get(0); - parser.match(Token.EOF); - String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("INSERT LOW_PRIORITY INTO t1 (col1, t1.col2)\nVALUES (123, '123''4')" + // - "\nON DUPLICATE KEY UPDATE ex.col1 = ?", - output); - } - public void testInsert_8() throws Exception { String sql = "insErt LOW_PRIORITY t1 (col1, t1.col2) select id from t3 oN dupLicatE key UPDATE ex.col1=?"; MySqlStatementParser parser = new MySqlStatementParser(sql); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLInsertParserTest_Special.java b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLInsertParserTest_Special.java new file mode 100644 index 0000000000..fb4a79defb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLInsertParserTest_Special.java @@ -0,0 +1,38 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.cobar; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.Token; + +public class DMLInsertParserTest_Special extends TestCase { + public void testInsert_7() throws Exception { + String sql = "insErt LOW_PRIORITY t1 (col1, t1.col2) VALUE (123,'123\\'4') oN dupLicatE key UPDATE ex.col1=?"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("INSERT LOW_PRIORITY INTO t1 (col1, t1.col2)\nVALUES (123, '123''4')" + // + "\nON DUPLICATE KEY UPDATE ex.col1 = ?", + output); + } +} diff --git a/src/test/java/com/alibaba/druid/test/wall/ResourceTest.java b/src/test/java/com/alibaba/druid/test/wall/ResourceTest.java index 2ac9245005..08dde7f39c 100644 --- a/src/test/java/com/alibaba/druid/test/wall/ResourceTest.java +++ b/src/test/java/com/alibaba/druid/test/wall/ResourceTest.java @@ -16,12 +16,12 @@ public class ResourceTest extends TestCase { private String[] items; protected void setUp() throws Exception { - File file = new File("D:\\error_sql"); + File file = new File("D:\\scan_error.txt"); FileInputStream is = new FileInputStream(file); String all = Utils.read(is); is.close(); - items = all.split("\\|\\n\\|"); + items = all.split("\\|\\r\\n\\|"); } public void test_xx() throws Exception {