diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java index 8354d588b0..1aed2dc2de 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java @@ -16,7 +16,9 @@ package com.alibaba.druid.sql.dialect.mysql.visitor; import java.util.List; +import java.util.Properties; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; @@ -33,7 +35,9 @@ import com.alibaba.druid.sql.visitor.ParameterizedVisitor; public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor implements ParameterizedVisitor { - private int replaceCount; + private boolean shardingSupport = true; + + private int replaceCount; public MySqlParameterizedOutputVisitor(){ this(new StringBuilder()); @@ -41,6 +45,27 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor implemen public MySqlParameterizedOutputVisitor(Appendable appender){ super(appender); + + configFromPropety(System.getProperties()); + } + + public void configFromPropety(Properties properties) { + { + String property = properties.getProperty("druid.parameterized.shardingSupport"); + if ("true".equals(property)) { + this.setShardingSupport(true); + } else if ("false".equals(property)) { + this.setShardingSupport(false); + } + } + } + + public boolean isShardingSupport() { + return shardingSupport; + } + + public void setShardingSupport(boolean shardingSupport) { + this.shardingSupport = shardingSupport; } public int getReplaceCount() { @@ -57,7 +82,13 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor implemen public boolean visit(SQLIdentifierExpr x) { final String name = x.getName(); - if (x.getParent() instanceof SQLExprTableSource || x.getParent() instanceof SQLPropertyExpr) { + boolean computeSharding = isShardingSupport(); + if (computeSharding) { + SQLObject parent = x.getParent(); + computeSharding = parent instanceof SQLExprTableSource || parent instanceof SQLPropertyExpr; + } + + if (computeSharding) { int pos = name.lastIndexOf('_'); if (pos != -1 && pos != name.length()) { boolean isNumber = true; diff --git a/src/main/resources/support/http/resources/wall.html b/src/main/resources/support/http/resources/wall.html index 43a71ac97e..84988f6c0a 100644 --- a/src/main/resources/support/http/resources/wall.html +++ b/src/main/resources/support/http/resources/wall.html @@ -190,13 +190,24 @@ var white = whiteList[i]; html += ""; html += "" + white.sql + ""; + if (typeof white.sample == "undefined") { - html += "\"\""; + html += ""; } else { - html += "" + white.sample + ""; + html += "" + white.sample + ""; } - html += "" + white.executeCount + ""; - html += "" + white.fetchRowCount + ""; + + if (typeof white.executeCount == "undefined") { + html += ""; + } else { + html += "" + white.executeCount + ""; + } + + if (typeof white.fetchRowCount == "undefined") { + html += ""; + } else { + html += "" + white.fetchRowCount + ""; + } html += ""; } $("#dataTable3 tbody").html(html); @@ -209,13 +220,24 @@ var black = blackList[i]; html += ""; html += "" + black.sql + ""; + if (typeof black.sample == "undefined") { - html += "\"\""; + html += ""; } else { - html += "" + black.sample + ""; + html += "" + black.sample + ""; } - html += "" + black.executeCount + ""; - html += "" + black.fetchRowCount + ""; + + if (typeof black.executeCount == "undefined") { + html += ""; + } else { + html += "" + black.executeCount + ""; + } + + if (typeof black.fetchRowCount == "undefined") { + html += ""; + } else { + html += "" + black.fetchRowCount + ""; + } html += ""; } $("#dataTable4 tbody").html(html); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallPermitTableTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallPermitTableTest.java index 90ff591693..c9f3ca8428 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallPermitTableTest.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallPermitTableTest.java @@ -25,7 +25,7 @@ import com.alibaba.druid.wall.WallUtils; public class MySqlWallPermitTableTest extends TestCase { public void test_default() throws Exception { - Assert.assertFalse(WallUtils.isValidateMySql("select benchmark( 500000, sha1( 'test' ) ) FROM X")); + Assert.assertFalse(WallUtils.isValidateMySql("select * from t union select benchmark( 500000, sha1( 'test' ) ) FROM X")); } public void test_allow() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/OracleWallPermitFunctionTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/OracleWallPermitFunctionTest.java index 809958d103..b4f6fd4a0c 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/OracleWallPermitFunctionTest.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/OracleWallPermitFunctionTest.java @@ -30,7 +30,7 @@ import com.alibaba.druid.wall.WallUtils; public class OracleWallPermitFunctionTest extends TestCase { public void test_permitTable() throws Exception { - Assert.assertFalse(WallUtils.isValidateOracle("select SYS_CONTEXT ('USERENV', 'CURRENT_USER') from X")); + Assert.assertFalse(WallUtils.isValidateOracle("select * from t union select SYS_CONTEXT ('USERENV', 'CURRENT_USER') from X")); } public void test_permitTable_allow() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlParameterizedOutputVisitorTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlParameterizedOutputVisitorTest_3.java new file mode 100644 index 0000000000..150dd7b9a8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlParameterizedOutputVisitorTest_3.java @@ -0,0 +1,40 @@ +/* + * 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 junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class MySqlParameterizedOutputVisitorTest_3 extends TestCase { + protected void setUp() throws Exception { + System.setProperty("druid.parameterized.shardingSupport", "false"); + } + + protected void tearDown() throws Exception { + System.clearProperty("druid.parameterized.shardingSupport"); + } + + public void test_0() throws Exception { + String sql = "delete from alerts where not (exists (select metric1_.id from metrics metric1_ where id=alerts.metric_id))"; + Assert.assertSame(ParameterizedOutputVisitorUtils.parameterize(sql, JdbcConstants.MYSQL), sql); + } + + +}