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);
+ }
+
+
+}