Merge remote-tracking branch 'upstream/master'

This commit is contained in:
kiki
2013-08-29 14:37:09 +08:00
9 changed files with 159 additions and 41 deletions
@@ -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;
}
}
@@ -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.");
@@ -1378,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) {
@@ -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);
@@ -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));
}
}
@@ -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));
}
}
@@ -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));
}
@@ -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);
@@ -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);
}
}
@@ -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 {