From 2e993b3cb540dcba7151be77c8ec9a465ec5ff76 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 4 Apr 2013 10:01:12 +0800 Subject: [PATCH 1/4] bug fixed for hibernate ddl --- .../druid/sql/dialect/mysql/parser/MySqlExprParser.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 f04194e9c9..43c2c9813d 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 @@ -523,6 +523,10 @@ public class MySqlExprParser extends SQLExprParser { return parseColumnRest(column); } + if (identifierEquals("precision") && column.getDataType().getName().equalsIgnoreCase("double")) { + lexer.nextToken(); + } + if (identifierEquals("PARTITION")) { throw new ParserException("syntax error " + lexer.token() + " " + lexer.stringVal()); } @@ -589,7 +593,7 @@ public class MySqlExprParser extends SQLExprParser { accept(Token.EQ); } } - + item.setValue(this.expr()); item.setTarget(var); From d2682272427cf35bf13fe706e0b773dbe0d52be4 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 5 Apr 2013 01:59:44 +0800 Subject: [PATCH 2/4] improve sql parser & wall filter --- .../mysql/parser/MySqlStatementParser.java | 3 +- .../mysql/visitor/MySqlSchemaStatVisitor.java | 4 +- .../druid/stat/DruidStatManagerFacade.java | 2 +- .../alibaba/druid/wall/WallCheckResult.java | 53 ++++- .../alibaba/druid/wall/WallFunctionStat.java | 6 + .../com/alibaba/druid/wall/WallProvider.java | 193 ++++++++++-------- .../druid/wall/WallSqlFunctionStat.java | 5 +- .../alibaba/druid/wall/WallSqlTableStat.java | 35 ++++ .../filter/wall/MySqlWallDescribteTest.java | 2 +- .../filter/wall/WallStatTest_WhiteList.java | 8 +- .../druid/bvt/pool/ConfigErrorTestMysql.java | 2 +- .../druid/bvt/sql/cobar/DALParserTest.java | 3 +- 12 files changed, 211 insertions(+), 105 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 29fddfbff3..9a53f962e1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -642,6 +642,7 @@ public class MySqlStatementParser extends SQLStatementParser { boolean full = false; if (lexer.token() == Token.FULL) { lexer.nextToken(); + full = true; } if (identifierEquals("PROCESSLIST")) { @@ -651,7 +652,7 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } - if (identifierEquals("COLUMNS")) { + if (identifierEquals("COLUMNS") || identifierEquals("FIELDS")) { lexer.nextToken(); MySqlShowColumnsStatement stmt = parseShowColumns(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 1d7a71db66..596e518992 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -422,7 +422,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlShowColumnsStatement x) { - return true; + return false; } @Override @@ -1283,7 +1283,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public boolean visit(MySqlAlterTableImportTablespace x) { return false; } - + @Override public void endVisit(MySqlAlterTableImportTablespace x) { diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index 11dc85cd5c..06296d5b10 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -186,7 +186,7 @@ public final class DruidStatManagerFacade { } @SuppressWarnings({ "rawtypes", "unchecked" }) - static Map mergWallStat(Map mapA, Map mapB) { + public static Map mergWallStat(Map mapA, Map mapB) { if (mapA.size() == 0) { return mapB; } diff --git a/src/main/java/com/alibaba/druid/wall/WallCheckResult.java b/src/main/java/com/alibaba/druid/wall/WallCheckResult.java index 0bde0dc64a..16e8fb2276 100644 --- a/src/main/java/com/alibaba/druid/wall/WallCheckResult.java +++ b/src/main/java/com/alibaba/druid/wall/WallCheckResult.java @@ -15,22 +15,51 @@ */ package com.alibaba.druid.wall; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Map; import com.alibaba.druid.sql.ast.SQLStatement; public class WallCheckResult { - private final List violations = new ArrayList(2); - private final List statementList = new ArrayList(2); + private final List statementList; + private final Map tableStats; + + private final List violations; + + private final Map functionStats; + + private final boolean syntaxError; public WallCheckResult(){ - + this(null); } - public WallCheckResult(Violation violation){ - this.violations.add(violation); + public WallCheckResult(WallSqlStat sqlStat){ + if (sqlStat != null) { + tableStats = sqlStat.getTableStats(); + violations = sqlStat.getViolations(); + functionStats = sqlStat.getFunctionStats(); + statementList = Collections.emptyList(); + syntaxError = sqlStat.isSyntaxError(); + } else { + tableStats = Collections.emptyMap(); + violations = Collections.emptyList(); + functionStats = Collections.emptyMap(); + statementList = Collections.emptyList(); + syntaxError = false; + } + } + + public WallCheckResult(List violations, Map tableStats, + Map functionStats, List statementList, + boolean syntaxError){ + this.tableStats = tableStats; + this.violations = violations; + this.functionStats = functionStats; + this.statementList = statementList; + this.syntaxError = syntaxError; } public List getViolations() { @@ -41,4 +70,16 @@ public class WallCheckResult { return statementList; } + + public Map getTableStats() { + return tableStats; + } + + public Map getFunctionStats() { + return functionStats; + } + + public boolean isSyntaxError() { + return syntaxError; + } } diff --git a/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java b/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java index 4f24a8953f..6b11d50961 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java +++ b/src/main/java/com/alibaba/druid/wall/WallFunctionStat.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.wall; +import java.util.Collections; +import java.util.Map; import java.util.concurrent.atomic.AtomicLongFieldUpdater; public class WallFunctionStat { @@ -39,4 +41,8 @@ public class WallFunctionStat { return "{\"invokeCount\":" + invokeCount + "}"; } + public Map toMap() { + return Collections.singletonMap("invokeCount", invokeCount); + } + } diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index aedbe294f9..57621f264b 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -47,7 +47,7 @@ public abstract class WallProvider { private int MAX_SQL_LENGTH = 2048; // 1k - private int whiteSqlMaxSize = 10000; // 1k + private int whiteSqlMaxSize = 2000; // 1k private LRUCache blackList; @@ -103,6 +103,10 @@ public abstract class WallProvider { public WallTableStat getTableStat(String tableName) { String lowerCaseName = tableName.toLowerCase(); + if (lowerCaseName.startsWith("`") && lowerCaseName.endsWith("`")) { + lowerCaseName = lowerCaseName.substring(1, lowerCaseName.length() - 1); + } + return getTableStatWithLowerName(lowerCaseName); } @@ -224,7 +228,7 @@ public abstract class WallProvider { lock.writeLock().unlock(); } } - + public void clearBlackList() { lock.writeLock().lock(); try { @@ -371,25 +375,111 @@ public abstract class WallProvider { } WallContext.createIfNotExists(this.dbType); - WallCheckResult result = new WallCheckResult(); if (config.isDoPrivilegedAllow() && ispPivileged()) { - return result; + return new WallCheckResult(); } // first step, check whiteList + boolean mulltiTenant = config.getTenantTablePattern() != null && config.getTenantTablePattern().length() > 0; + if (!mulltiTenant) { + WallCheckResult checkResult = checkWhiteAndBlackList(sql); + if (checkResult != null) { + return checkResult; + } + } + + hardCheckCount.incrementAndGet(); + final List violations = new ArrayList(); + List statementList = new ArrayList(); + boolean syntaxError = false; + try { + SQLStatementParser parser = createParser(sql); + parser.getLexer().setCommentHandler(WallCommentHandler.instance); + + if (!config.isCommentAllow()) { + parser.getLexer().setAllowComment(false); // deny comment + } + + parser.parseStatementList(statementList); + + final Token lastToken = parser.getLexer().token(); + if (lastToken != Token.EOF) { + violations.add(new IllegalSQLObjectViolation("not terminal sql, token " + lastToken, sql)); + } + } catch (NotAllowCommentException e) { + violations.add(new SyntaxErrorViolation(e, sql)); + incrementCommentDeniedCount(); + } catch (ParserException e) { + syntaxErrrorCount.incrementAndGet(); + syntaxError = true; + if (config.isStrictSyntaxCheck()) { + violations.add(new SyntaxErrorViolation(e, sql)); + } + } catch (Exception e) { + violations.add(new SyntaxErrorViolation(e, sql)); + } + + if (statementList.size() > 1 && !config.isMultiStatementAllow()) { + violations.add(new IllegalSQLObjectViolation("multi-statement not allow", sql)); + } + + WallVisitor visitor = createWallVisitor(); + + if (statementList.size() > 0) { + SQLStatement stmt = statementList.get(0); + try { + stmt.accept(visitor); + } catch (ParserException e) { + violations.add(new SyntaxErrorViolation(e, sql)); + } + } + + if (visitor.getViolations().size() > 0) { + violations.addAll(visitor.getViolations()); + } + + WallSqlStat sqlStat = null; + if (violations.size() > 0) { + violationCount.incrementAndGet(); + + if (sql.length() < MAX_SQL_LENGTH) { + sqlStat = addBlackSql(sql, context.getTableStats(), context.getFunctionStats(), violations, syntaxError); + } + } else { + if (sql.length() < MAX_SQL_LENGTH) { + sqlStat = addWhiteSql(sql, context.getTableStats(), context.getFunctionStats(), syntaxError); + } + } + + Map tableStats = null; + Map functionStats = null; + if (context != null) { + tableStats = context.getTableStats(); + functionStats = context.getFunctionStats(); + recordStats(tableStats, functionStats); + } + + if (sqlStat != null) { + new WallCheckResult(sqlStat); + } + + return new WallCheckResult(violations, tableStats, functionStats, statementList, syntaxError); + } + + private WallCheckResult checkWhiteAndBlackList(String sql) { { WallSqlStat sqlStat = getWhiteSql(sql); if (sqlStat != null) { whiteListHitCount.incrementAndGet(); sqlStat.incrementAndGetExecuteCount(); - + if (sqlStat.isSyntaxError()) { syntaxErrrorCount.incrementAndGet(); } recordStats(sqlStat.getTableStats(), sqlStat.getFunctionStats()); - return result; + return new WallCheckResult(sqlStat); } } // check black list @@ -405,80 +495,12 @@ public abstract class WallProvider { sqlStat.incrementAndGetExecuteCount(); recordStats(sqlStat.getTableStats(), sqlStat.getFunctionStats()); - List blackViolations = sqlStat.getViolations(); - result.getViolations().addAll(blackViolations); - return result; + return new WallCheckResult(sqlStat); } } - hardCheckCount.incrementAndGet(); - boolean syntaxError = false; - try { - SQLStatementParser parser = createParser(sql); - parser.getLexer().setCommentHandler(WallCommentHandler.instance); - - if (!config.isCommentAllow()) { - parser.getLexer().setAllowComment(false); // deny comment - } - - parser.parseStatementList(result.getStatementList()); - - final Token lastToken = parser.getLexer().token(); - if (lastToken != Token.EOF) { - result.getViolations().add(new IllegalSQLObjectViolation("not terminal sql, token " + lastToken, sql)); - } - } catch (NotAllowCommentException e) { - result.getViolations().add(new SyntaxErrorViolation(e, sql)); - incrementCommentDeniedCount(); - } catch (ParserException e) { - syntaxErrrorCount.incrementAndGet(); - syntaxError = true; - if (config.isStrictSyntaxCheck()) { - result.getViolations().add(new SyntaxErrorViolation(e, sql)); - } - } catch (Exception e) { - result.getViolations().add(new SyntaxErrorViolation(e, sql)); - } - - if (result.getViolations().size() == 0 && result.getStatementList().size() > 1 - && !config.isMultiStatementAllow()) { - result.getViolations().add(new IllegalSQLObjectViolation("multi-statement not allow", sql)); - } - - WallVisitor visitor = createWallVisitor(); - - if (result.getStatementList().size() > 0) { - SQLStatement stmt = result.getStatementList().get(0); - try { - stmt.accept(visitor); - } catch (ParserException e) { - result.getViolations().add(new SyntaxErrorViolation(e, sql)); - } - } - - if (visitor.getViolations().size() > 0) { - result.getViolations().addAll(visitor.getViolations()); - } - - if (result.getViolations().size() > 0) { - violationCount.incrementAndGet(); - - if (sql.length() < MAX_SQL_LENGTH) { - addBlackSql(sql, context.getTableStats(), context.getFunctionStats(), result.getViolations(), - syntaxError); - } - } else { - if (sql.length() < MAX_SQL_LENGTH) { - addWhiteSql(sql, context.getTableStats(), context.getFunctionStats(), syntaxError); - } - } - - if (context != null) { - recordStats(context.getTableStats(), context.getFunctionStats()); - } - - return result; + return null; } void recordStats(Map tableStats, Map functionStats) { @@ -551,7 +573,7 @@ public abstract class WallProvider { public long getViolationCount() { return violationCount.get(); } - + public long getHardCheckCount() { return hardCheckCount.get(); } @@ -589,6 +611,7 @@ public abstract class WallProvider { Map info = new LinkedHashMap(); info.put("checkCount", this.getCheckCount()); + info.put("hardCheckCount", this.getHardCheckCount()); info.put("violationCount", this.getViolationCount()); info.put("blackListHitCount", this.getBlackListHitCount()); info.put("blackListSize", this.getBlackList().size()); @@ -597,25 +620,21 @@ public abstract class WallProvider { info.put("syntaxErrrorCount", this.getSyntaxErrorCount()); { - List> tables = new ArrayList>(); + Map> tables = new LinkedHashMap>(); for (Map.Entry entry : this.tableStats.entrySet()) { - Map stat = new LinkedHashMap(); - stat.put("name", entry.getKey()); - entry.getValue().toMap(stat); - tables.add(stat); + tables.put(entry.getKey(), entry.getValue().toMap()); } info.put("tables", tables); } { - List> functions = new ArrayList>(); + Map> functions = new LinkedHashMap>(); for (Map.Entry entry : this.functionStats.entrySet()) { - Map stat = new HashMap(); - stat.put("name", entry.getValue()); - stat.put("invokeCount", entry.getValue().getInvokeCount()); - functions.add(stat); + functions.put(entry.getKey(), entry.getValue().toMap()); } info.put("functions", functions); } + info.put("whiteList", this.getWhiteList()); + info.put("blackList", this.getBlackList()); return info; } } diff --git a/src/main/java/com/alibaba/druid/wall/WallSqlFunctionStat.java b/src/main/java/com/alibaba/druid/wall/WallSqlFunctionStat.java index 02754a0ac0..3d4af1985f 100644 --- a/src/main/java/com/alibaba/druid/wall/WallSqlFunctionStat.java +++ b/src/main/java/com/alibaba/druid/wall/WallSqlFunctionStat.java @@ -26,5 +26,8 @@ public class WallSqlFunctionStat { public void incrementInvokeCount() { this.invokeCount++; } - + + public void addInvokeCount(int value) { + this.invokeCount += value; + } } diff --git a/src/main/java/com/alibaba/druid/wall/WallSqlTableStat.java b/src/main/java/com/alibaba/druid/wall/WallSqlTableStat.java index 36e8ce1112..c2c929b68d 100644 --- a/src/main/java/com/alibaba/druid/wall/WallSqlTableStat.java +++ b/src/main/java/com/alibaba/druid/wall/WallSqlTableStat.java @@ -34,6 +34,10 @@ public class WallSqlTableStat { public void incrementSelectCount() { this.selectCount++; } + + public void addSelectCount(int value) { + this.selectCount += value; + } public int getSelectIntoCount() { return selectIntoCount; @@ -42,6 +46,10 @@ public class WallSqlTableStat { public void incrementSelectIntoCount() { this.selectIntoCount++; } + + public void addSelectIntoCount(int value) { + this.selectIntoCount += value; + } public int getInsertCount() { return insertCount; @@ -50,6 +58,10 @@ public class WallSqlTableStat { public void incrementInsertCount() { this.insertCount++; } + + public void addInsertCount(int value) { + this.insertCount += value; + } public int getUpdateCount() { return updateCount; @@ -59,6 +71,10 @@ public class WallSqlTableStat { this.updateCount++; } + public void addUpdateCount(int value) { + this.deleteCount += value; + } + public int getDeleteCount() { return deleteCount; } @@ -67,6 +83,10 @@ public class WallSqlTableStat { this.deleteCount++; } + public void addDeleteCount(int value) { + this.deleteCount += value; + } + public int getTruncateCount() { return truncateCount; } @@ -75,6 +95,10 @@ public class WallSqlTableStat { this.truncateCount++; } + public void addTruncateCount(int value) { + this.truncateCount += value; + } + public int getCreateCount() { return createCount; } @@ -83,6 +107,10 @@ public class WallSqlTableStat { this.createCount++; } + public void addCreateCount(int value) { + this.createCount += value; + } + public int getAlterCount() { return alterCount; } @@ -91,6 +119,10 @@ public class WallSqlTableStat { this.alterCount++; } + public void addAlterCount(int value) { + this.alterCount += value; + } + public int getDropCount() { return dropCount; } @@ -99,4 +131,7 @@ public class WallSqlTableStat { this.dropCount++; } + public void addDropCount(int value) { + this.dropCount += value; + } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallDescribteTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallDescribteTest.java index f65ee3ba25..db30dc7a26 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallDescribteTest.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallDescribteTest.java @@ -38,7 +38,7 @@ public class MySqlWallDescribteTest extends TestCase { public void test_not_allow() throws Exception { WallConfig config = new WallConfig(); - config.setVariantCheck(true); + config.setDescribeAllow(false); Assert.assertFalse(WallUtils.isValidateMySql("describe t", config)); } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java index ee404dc669..77c6ce0b50 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java @@ -22,17 +22,17 @@ public class WallStatTest_WhiteList extends TestCase { public void testMySql() throws Exception { WallProvider provider = new MySqlWallProvider(); - for (int i = 0; i < 1001; ++i) { + for (int i = 0; i < 3001; ++i) { String sql = "select * from t where id = " + i; Assert.assertTrue(provider.checkValid(sql)); } WallTableStat tableStat = provider.getTableStat("t"); - Assert.assertEquals(1001, tableStat.getSelectCount()); + Assert.assertEquals(3001, tableStat.getSelectCount()); Assert.assertEquals(0, provider.getBlackListHitCount()); Assert.assertEquals(0, provider.getWhiteListHitCount()); - Assert.assertEquals(1000, provider.getWhiteList().size()); - Assert.assertEquals(1001, provider.getCheckCount()); + Assert.assertEquals(2000, provider.getWhiteList().size()); + Assert.assertEquals(3001, provider.getCheckCount()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/ConfigErrorTestMysql.java b/src/test/java/com/alibaba/druid/bvt/pool/ConfigErrorTestMysql.java index 54ae7e0cd0..82a3768684 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/ConfigErrorTestMysql.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/ConfigErrorTestMysql.java @@ -64,6 +64,6 @@ public class ConfigErrorTestMysql extends TestCase { Assert.assertEquals(0, LOG.getWarnCount()); dataSource.init(); - Assert.assertEquals(1, LOG.getWarnCount()); + Assert.assertEquals(0, LOG.getWarnCount()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DALParserTest.java b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DALParserTest.java index 4aa857d75e..bb0a005a1f 100755 --- a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DALParserTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DALParserTest.java @@ -18,9 +18,10 @@ */ package com.alibaba.druid.bvt.sql.cobar; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDescribeStatement; From 9ea3434bc4413f369a5fe2b3d6cc6f6726978733 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 5 Apr 2013 12:49:25 +0800 Subject: [PATCH 3/4] improve wall filter --- .../ast/statement/MySqlReplaceStatement.java | 36 +++++++--- .../druid/stat/DruidStatManagerFacade.java | 19 ++++- .../alibaba/druid/wall/WallSqlTableStat.java | 19 ++++- .../com/alibaba/druid/wall/WallTableStat.java | 18 ++++- .../druid/wall/spi/MySqlWallVisitor.java | 6 ++ .../druid/wall/spi/WallVisitorUtils.java | 2 + .../bvt/filter/wall/MySqlWallTest35.java | 45 ++++++++++++ .../bvt/filter/wall/WallStatTest_statMap.java | 51 ++++++++++++++ .../bvt/sql/mysql/MySqlCreateTableTest10.java | 69 +++++++++++++++++++ .../bvt/sql/mysql/MySqlShowFieldsTest.java | 57 +++++++++++++++ .../bvt/support/json/JSONParserTest3.java | 18 +++++ src/test/resources/bvt/sonar-sql.json | 1 + 12 files changed, 324 insertions(+), 17 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest35.java create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_statMap.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest10.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlShowFieldsTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/support/json/JSONParserTest3.java create mode 100644 src/test/resources/bvt/sonar-sql.json diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlReplaceStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlReplaceStatement.java index 918d677064..1dcaff2bfc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlReplaceStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlReplaceStatement.java @@ -21,27 +21,43 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; public class MySqlReplaceStatement extends MySqlStatementImpl { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private boolean lowPriority = false; - private boolean delayed = false; + private boolean lowPriority = false; + private boolean delayed = false; - private SQLName tableName; - private final List columns = new ArrayList(); - private List valuesList = new ArrayList(); - private SQLQueryExpr query; + private SQLExprTableSource tableSource; + private final List columns = new ArrayList(); + private List valuesList = new ArrayList(); + private SQLQueryExpr query; public SQLName getTableName() { - return tableName; + if (tableSource == null) { + return null; + } + + return (SQLName) tableSource.getExpr(); } public void setTableName(SQLName tableName) { - this.tableName = tableName; + this.setTableSource(new SQLExprTableSource(tableName)); + } + + public SQLExprTableSource getTableSource() { + return tableSource; + } + + public void setTableSource(SQLExprTableSource tableSource) { + if (tableSource != null) { + tableSource.setParent(this); + } + this.tableSource = tableSource; } public List getColumns() { @@ -79,7 +95,7 @@ public class MySqlReplaceStatement extends MySqlStatementImpl { public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, tableName); + acceptChild(visitor, tableSource); acceptChild(visitor, columns); acceptChild(visitor, valuesList); acceptChild(visitor, query); diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index 06296d5b10..5059d39691 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -30,6 +31,7 @@ import java.util.concurrent.atomic.AtomicLong; import com.alibaba.druid.VERSION; import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.support.http.stat.WebAppStatManager; import com.alibaba.druid.support.spring.stat.SpringStatManager; import com.alibaba.druid.util.DruidDataSourceUtils; @@ -195,6 +197,7 @@ public final class DruidStatManagerFacade { return mapA; } + Map newMap = new LinkedHashMap(); for (Object item : mapB.entrySet()) { Map.Entry entry = (Map.Entry) item; String key = (String) entry.getKey(); @@ -202,16 +205,26 @@ public final class DruidStatManagerFacade { Object valueA = mapA.get(key); if (valueA == null) { - mapA.put(key, valueB); + newMap.put(key, valueB); + } else if (valueB == null) { + newMap.put(key, valueA); } else { if (valueA instanceof Map && valueB instanceof Map) { Object newValue = mergWallStat((Map)valueA, (Map)valueB); - mapA.put(key, newValue); + newMap.put(key, newValue); + } else if (valueA instanceof Set && valueB instanceof Set) { + Set set = new HashSet(); + set.addAll((Set) valueA); + set.addAll((Set) valueB); + newMap.put(key, set); + } else { + Object sum = SQLEvalVisitorUtils.add(valueA, valueB); + newMap.put(key, sum); } } } - return null; + return newMap; } public List> getSqlStatDataList(Object datasource) { diff --git a/src/main/java/com/alibaba/druid/wall/WallSqlTableStat.java b/src/main/java/com/alibaba/druid/wall/WallSqlTableStat.java index c2c929b68d..3a5883f4b4 100644 --- a/src/main/java/com/alibaba/druid/wall/WallSqlTableStat.java +++ b/src/main/java/com/alibaba/druid/wall/WallSqlTableStat.java @@ -26,6 +26,19 @@ public class WallSqlTableStat { private int createCount; private int alterCount; private int dropCount; + private int replaceCount; + + public int getReplaceCount() { + return replaceCount; + } + + public int incrementReplaceCount() { + return replaceCount++; + } + + public void addReplaceCount(int value) { + this.replaceCount+= value; + } public int getSelectCount() { return selectCount; @@ -34,7 +47,7 @@ public class WallSqlTableStat { public void incrementSelectCount() { this.selectCount++; } - + public void addSelectCount(int value) { this.selectCount += value; } @@ -46,7 +59,7 @@ public class WallSqlTableStat { public void incrementSelectIntoCount() { this.selectIntoCount++; } - + public void addSelectIntoCount(int value) { this.selectIntoCount += value; } @@ -58,7 +71,7 @@ public class WallSqlTableStat { public void incrementInsertCount() { this.insertCount++; } - + public void addInsertCount(int value) { this.insertCount += value; } diff --git a/src/main/java/com/alibaba/druid/wall/WallTableStat.java b/src/main/java/com/alibaba/druid/wall/WallTableStat.java index 5eafe5eac7..36a25cf2e2 100644 --- a/src/main/java/com/alibaba/druid/wall/WallTableStat.java +++ b/src/main/java/com/alibaba/druid/wall/WallTableStat.java @@ -32,6 +32,7 @@ public class WallTableStat { private volatile long createCount; private volatile long alterCount; private volatile long dropCount; + private volatile long replaceCount; final static AtomicLongFieldUpdater selectCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, "selectCount"); @@ -51,6 +52,8 @@ public class WallTableStat { "alterCount"); final static AtomicLongFieldUpdater dropCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, "dropCount"); + final static AtomicLongFieldUpdater replaceCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "replaceCount"); public WallTableStat(){ @@ -91,6 +94,10 @@ public class WallTableStat { public long getDropCount() { return dropCount; } + + public long getReplaceCount() { + return replaceCount; + } public void addSqlTableStat(WallSqlTableStat stat) { { @@ -147,6 +154,12 @@ public class WallTableStat { dropCountUpdater.addAndGet(this, val); } } + { + long val = stat.getReplaceCount(); + if (val > 0) { + replaceCountUpdater.addAndGet(this, val); + } + } } public String toString() { @@ -155,7 +168,7 @@ public class WallTableStat { return JSONUtils.toJSONString(map); } - + public Map toMap() { Map map = new LinkedHashMap(); return toMap(map); @@ -186,6 +199,9 @@ public class WallTableStat { if (truncateCount > 0) { map.put("truncateCount", truncateCount); } + if (replaceCount > 0) { + map.put("replaceCount", replaceCount); + } return map; } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java index e3acf710f6..d9905e4c2e 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java @@ -47,6 +47,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStateme import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; @@ -342,4 +343,9 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi public boolean visit(SQLSetStatement x) { return false; } + + @Override + public boolean visit(MySqlReplaceStatement x) { + return true; + } } 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 4905e47773..199c7e441d 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -872,6 +872,8 @@ public class WallVisitorUtils { tableStat.incrementDeleteCount(); } else if (parent instanceof SQLUpdateStatement) { tableStat.incrementUpdateCount(); + } else if (parent instanceof MySqlReplaceStatement) { + tableStat.incrementReplaceCount(); } } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest35.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest35.java new file mode 100644 index 0000000000..5e47a218fc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest35.java @@ -0,0 +1,45 @@ +/* + * 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.support.json.JSONUtils; +import com.alibaba.druid.wall.WallProvider; +import com.alibaba.druid.wall.spi.MySqlWallProvider; + +/** + * SQLServerWallTest + * + * @author RaymondXiu + * @version 1.0, 2012-3-18 + * @see + */ +public class MySqlWallTest35 extends TestCase { + + public void test_true() throws Exception { + WallProvider provider = new MySqlWallProvider(); + + Assert.assertTrue(provider.checkValid(// + "REPLACE INTO `test2tb` VALUES " + // + "('51', '6714105741', '亦美珊不掉正品隐形文胸安全硅胶文胸 小胸聚拢比基尼游泳衣泳装', 'http://img03.taobaocdn.com/bao/uploaded/i3/16011019585534199/T1cnlaXA8bXXXXXXXX_!!0-item_pic.jpg', 'liqiang198163', 'c', '25.00', '20.00', '1000.00', '76', '529', '4.86', '4.91', '4.90', '0.00', '4.80', '2878', '77', '12', '15');")); // + + Assert.assertEquals(1, provider.getTableStat("test2tb").getReplaceCount()); + System.out.println(JSONUtils.toJSONString(provider.getStatsMap())); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_statMap.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_statMap.java new file mode 100644 index 0000000000..ee90b52573 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_statMap.java @@ -0,0 +1,51 @@ +package com.alibaba.druid.bvt.filter.wall; + +import java.util.Map; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.stat.DruidStatManagerFacade; +import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.druid.wall.WallContext; +import com.alibaba.druid.wall.WallProvider; +import com.alibaba.druid.wall.spi.MySqlWallProvider; + +public class WallStatTest_statMap extends TestCase { + + protected void setUp() throws Exception { + WallContext.clearContext(); + } + + protected void tearDown() throws Exception { + WallContext.clearContext(); + } + + public void testMySql() throws Exception { + WallProvider providerA = new MySqlWallProvider(); + + { + String sql = "select * from t where len(fname) = 1"; + Assert.assertTrue(providerA.checkValid(sql)); + } + + WallProvider providerB = new MySqlWallProvider(); + { + String sql = "select * from t where len(fname) = 2"; + Assert.assertTrue(providerB.checkValid(sql)); + } + + Map statMapA = providerA.getStatsMap(); + Map statMapB = providerB.getStatsMap(); + + System.out.println(JSONUtils.toJSONString(statMapA)); + System.out.println(JSONUtils.toJSONString(statMapB)); + + Map statMapMerged = DruidStatManagerFacade.mergWallStat(statMapA, statMapB); + System.out.println(JSONUtils.toJSONString(statMapMerged)); + + Assert.assertEquals(2L, statMapMerged.get("checkCount")); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest10.java new file mode 100644 index 0000000000..8423c8e3a6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest10.java @@ -0,0 +1,69 @@ +/* + * 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.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlCreateTableTest10 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "create table TACCOUNT (" + // + " ID varchar(36) not null," + // + " ACCOUNT varchar(100) not null," + // + " account_money double precision," + // + " NAME varchar(100) not null," + // + " TYPE integer," + // + " primary key (ID)" + // + " )"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLCreateTableStatement stmt = (SQLCreateTableStatement) statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("TACCOUNT"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("TACCOUNT", "ID"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("TACCOUNT", "ACCOUNT"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("TACCOUNT", "account_money"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("TACCOUNT", "NAME"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("TACCOUNT", "TYPE"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlShowFieldsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlShowFieldsTest.java new file mode 100644 index 0000000000..ff7b74d6f3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlShowFieldsTest.java @@ -0,0 +1,57 @@ +/* + * 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.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlShowFieldsTest extends MysqlTest { + + public void test_0() throws Exception { + String sql = "SHOW FIELDS FROM `schema_migrations`"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_price"))); +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); + + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/support/json/JSONParserTest3.java b/src/test/java/com/alibaba/druid/bvt/support/json/JSONParserTest3.java new file mode 100644 index 0000000000..878a7b2943 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/support/json/JSONParserTest3.java @@ -0,0 +1,18 @@ +package com.alibaba.druid.bvt.support.json; + +import java.util.LinkedHashMap; +import java.util.Map; + +import junit.framework.TestCase; + +import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.druid.util.IOUtils; + +public class JSONParserTest3 extends TestCase { + public void test_parse() throws Exception { + String text = IOUtils.readFromResource("bvt/sonar-sql.json"); + Map result = (Map)JSONUtils.parse(text); + LinkedHashMap wallStats = (LinkedHashMap) result.get("Content"); + System.out.println(wallStats.get("blackList")); + } +} diff --git a/src/test/resources/bvt/sonar-sql.json b/src/test/resources/bvt/sonar-sql.json new file mode 100644 index 0000000000..f6c55f99fc --- /dev/null +++ b/src/test/resources/bvt/sonar-sql.json @@ -0,0 +1 @@ +{"ResultCode":1,"Content":{"checkCount":1895,"violationCount":3,"blackListHitCount":2,"blackListSize":1,"whiteListHitCount":1867,"whiteListSize":25,"syntaxErrrorCount":3,"tables":{"active_dashboards":{"selectCount":1},"rules":{"selectCount":713,"updateCount":7},"notifications":{"selectCount":1},"properties":{"selectCount":2,"deleteCount":1,"insertCount":1},"rules_parameters":{"selectCount":851},"loaded_templates":{"selectCount":10},"alerts":{"deleteCount":2},"metrics":{"selectCount":147,"updateCount":143},"schema_info":{"selectCount":3},"schema_migrations":{"selectCount":5}},"functions":{},"whiteList":["SELECT MAX(order_index)\n FROM active_dashboards\n WHERE user_id IS NULL","delete from alerts where not (exists (select metric1_.id from metrics metric1_ where id=alerts.metric_id and metric1_.enabled=?))","SELECT count(*)\n FROM loaded_templates\n WHERE kee = ? AND template_type = ?","delete from alerts where not (exists (select metric1_.id from metrics metric1_ where id=alerts.metric_id))","INSERT INTO properties (prop_key, resource_id, user_id, text_value)\n VALUES (?, ?, ?, ?)","select * from schema_migrations","SET SQL_AUTO_IS_NULL=0","select metric0_.id as id11_, metric0_.best_value as best2_11_, metric0_.delete_historical_data as delete3_11_, metric0_.description as descript4_11_, metric0_.direction as direction11_, metric0_.domain as domain11_, metric0_.enabled as enabled11_, metric0_.hidden as hidden11_, metric0_.name as name11_, metric0_.short_name as short10_11_, metric0_.optimized_best_value as optimized11_11_, metric0_.origin as origin11_, metric0_.qualitative as qualita13_11_, metric0_.val_type as val14_11_, metric0_.user_managed as user15_11_, metric0_.worst_value as worst16_11_ from metrics metric0_","SELECT version FROM schema_migrations","select rule0_.id as id15_, rule0_.cardinality as cardinal2_15_, rule0_.plugin_config_key as plugin3_15_, rule0_.description as descript4_15_, rule0_.enabled as enabled15_, rule0_.plugin_rule_key as plugin6_15_, rule0_.name as name15_, rule0_.parent_id as parent10_15_, rule0_.plugin_name as plugin8_15_, rule0_.priority as priority15_ from rules rule0_ where rule0_.enabled=? and rule0_.plugin_name=? and rule0_.plugin_rule_key=?","select rule0_.id as id15_, rule0_.cardinality as cardinal2_15_, rule0_.plugin_config_key as plugin3_15_, rule0_.description as descript4_15_, rule0_.enabled as enabled15_, rule0_.plugin_rule_key as plugin6_15_, rule0_.name as name15_, rule0_.parent_id as parent10_15_, rule0_.plugin_name as plugin8_15_, rule0_.priority as priority15_ from rules rule0_ where rule0_.enabled=? and rule0_.plugin_name=? and rule0_.plugin_config_key=?","update metrics set enabled=0 where user_managed=0","update metrics set best_value=?, delete_historical_data=?, description=?, direction=?, domain=?, enabled=?, hidden=?, short_name=?, optimized_best_value=?, origin=?, qualitative=?, val_type=?, user_managed=?, worst_value=? where id=?","select params0_.rule_id as rule6_1_, params0_.id as id1_, params0_.id as id16_0_, params0_.default_value as default2_16_0_, params0_.description as descript3_16_0_, params0_.name as name16_0_, params0_.rule_id as rule6_16_0_, params0_.param_type as param5_16_0_ from rules_parameters params0_ where params0_.rule_id=?","select notificati0_.id as id25_, notificati0_.created_at as created2_25_, notificati0_.data as data25_ from notifications notificati0_ order by notificati0_.created_at ASC limit ?","select rule0_.id as col_0_0_ from rules rule0_ where (rule0_.parent_id is not null) and (exists (select rule1_.id from rules rule1_ where rule0_.parent_id=rule1_.id and rule1_.enabled=0))","update rules set enabled=0 where (parent_id is null) and plugin_name<>'manual'","update rules set cardinality=?, plugin_config_key=?, description=?, enabled=?, name=?, parent_id=?, plugin_name=?, priority=? where id=?","delete from properties where prop_key=? and resource_id is null and user_id is null","select p.id as id, p.prop_key as \"key\", p.text_value as value, p.resource_id as resourceId, p.user_id as userId\n from properties p\n where p.resource_id is null and p.user_id is null","select rule0_.id as col_0_0_ from rules rule0_ where (rule0_.parent_id is not null) and not (exists (select rule1_.id from rules rule1_ where rule0_.parent_id=rule1_.id))","select p.id as id, p.prop_key as \"key\", p.text_value as value, p.resource_id as resourceId, p.user_id as userId\n from properties p\n where p.prop_key=?\n \n AND p.resource_id is null\n \n \n \n AND p.user_id is null","SELECT * FROM `schema_info` LIMIT 1","select 1","select rule0_.id as id15_, rule0_.cardinality as cardinal2_15_, rule0_.plugin_config_key as plugin3_15_, rule0_.description as descript4_15_, rule0_.enabled as enabled15_, rule0_.plugin_rule_key as plugin6_15_, rule0_.name as name15_, rule0_.parent_id as parent10_15_, rule0_.plugin_name as plugin8_15_, rule0_.priority as priority15_ from rules rule0_ where rule0_.plugin_name=?"],"blackList":["SHOW FIELDS FROM `schema_migrations`"]}} \ No newline at end of file From 61341692aa48fec4745b45134a27eeb03ca0332c Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 5 Apr 2013 13:10:13 +0800 Subject: [PATCH 4/4] improve wall filter --- src/main/java/com/alibaba/druid/wall/WallProvider.java | 4 ++-- .../alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java | 2 +- .../druid/bvt/filter/wall/WallStatTest_blackList_1.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index 57621f264b..6b347dc8ba 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -47,11 +47,11 @@ public abstract class WallProvider { private int MAX_SQL_LENGTH = 2048; // 1k - private int whiteSqlMaxSize = 2000; // 1k + private int whiteSqlMaxSize = 500; // 1k private LRUCache blackList; - private int blackSqlMaxSize = 1000; // 1k + private int blackSqlMaxSize = 500; // 1k protected final WallConfig config; diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java index 77c6ce0b50..d7d3f9ac33 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_WhiteList.java @@ -31,7 +31,7 @@ public class WallStatTest_WhiteList extends TestCase { Assert.assertEquals(3001, tableStat.getSelectCount()); Assert.assertEquals(0, provider.getBlackListHitCount()); Assert.assertEquals(0, provider.getWhiteListHitCount()); - Assert.assertEquals(2000, provider.getWhiteList().size()); + Assert.assertEquals(500, provider.getWhiteList().size()); Assert.assertEquals(3001, provider.getCheckCount()); } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_blackList_1.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_blackList_1.java index 5a194d5d59..e02658acf9 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_blackList_1.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallStatTest_blackList_1.java @@ -32,7 +32,7 @@ public class WallStatTest_blackList_1 extends TestCase { Assert.assertEquals(0, provider.getBlackListHitCount()); Assert.assertEquals(0, provider.getWhiteListHitCount()); Assert.assertEquals(0, provider.getWhiteList().size()); - Assert.assertEquals(1000, provider.getBlackList().size()); + Assert.assertEquals(500, provider.getBlackList().size()); Assert.assertEquals(1001, provider.getCheckCount()); }