From 9ea3434bc4413f369a5fe2b3d6cc6f6726978733 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 5 Apr 2013 12:49:25 +0800 Subject: [PATCH] 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