Merge pull request #2172 from JohnCailj/dev

parameterized inList expr supported; example: id in (1,2,3,4) --> id IN ( ? , ? , ? , ? )
This commit is contained in:
温绍
2017-12-07 18:00:31 +08:00
committed by GitHub
4 changed files with 61 additions and 5 deletions
@@ -61,9 +61,18 @@ public class ParameterizedOutputVisitorUtils {
return parameterize(sql, dbType, null, outParameters);
}
private static void configVisitorFeatures(ParameterizedVisitor visitor, VisitorFeature ...features) {
if(features != null) {
for (int i = 0; i < features.length; i++) {
visitor.config(features[i], true);
}
}
}
public static String parameterize(String sql
, String dbType
, SQLSelectListCache selectListCache, List<Object> outParameters) {
, SQLSelectListCache selectListCache, List<Object> outParameters, VisitorFeature ...visitorFeatures) {
final SQLParserFeature[] features = outParameters == null
? defaultFeatures2
@@ -85,6 +94,7 @@ public class ParameterizedOutputVisitorUtils {
if (outParameters != null) {
visitor.setOutputParameters(outParameters);
}
configVisitorFeatures(visitor, visitorFeatures);
for (int i = 0; i < statementList.size(); i++) {
SQLStatement stmt = statementList.get(i);
@@ -133,13 +143,13 @@ public class ParameterizedOutputVisitorUtils {
public static long parameterizeHash(String sql
, String dbType
, List<Object> outParameters) {
return parameterizeHash(sql, dbType, null, outParameters);
return parameterizeHash(sql, dbType, null, outParameters, null);
}
public static long parameterizeHash(String sql
, String dbType
, SQLSelectListCache selectListCache
, List<Object> outParameters) {
, List<Object> outParameters, VisitorFeature ...visitorFeatures) {
final SQLParserFeature[] features = outParameters == null
? defaultFeatures2
@@ -162,6 +172,7 @@ public class ParameterizedOutputVisitorUtils {
if (outParameters != null) {
visitor.setOutputParameters(outParameters);
}
configVisitorFeatures(visitor, visitorFeatures);
if (stmtSize == 1) {
SQLStatement stmt = statementList.get(0);
@@ -77,6 +77,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
protected int replaceCount;
protected boolean parameterizedMergeInList = false;
protected boolean parameterizedQuesUnMergeInList = false;
protected boolean parameterized = false;
protected boolean shardingSupport = false;
@@ -102,6 +103,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
public SQLASTOutputVisitor(Appendable appender, boolean parameterized){
this.appender = appender;
this.config(VisitorFeature.OutputParameterized, parameterized);
this.config(VisitorFeature.OutputParameterizedQuesUnMergeInList, parameterizedQuesUnMergeInList);
}
public int getReplaceCount() {
@@ -216,6 +218,14 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
this.parameterizedMergeInList = parameterizedMergeInList;
}
public boolean isParameterizedQuesUnMergeInList() {
return isEnabled(VisitorFeature.OutputParameterizedQuesUnMergeInList);
}
public void setParameterizedQuesUnMergeInList(boolean parameterizedQuesUnMergeInList) {
config(VisitorFeature.OutputParameterizedQuesUnMergeInList, parameterizedQuesUnMergeInList);
}
public boolean isExportTables() {
return exportTables;
}
@@ -1208,9 +1218,22 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
printExpr(x.getExpr());
if (x.isNot()) {
print(ucase ? " NOT IN (?)" : " not in (?)");
print(ucase ? " NOT" : " not");
} else {
print(ucase ? " IN (?)" : " in (?)");
print(ucase ? " IN" : " in");
}
if(!isParameterizedQuesUnMergeInList() || targetList.size() == 1) {
print(" (?)");
} else {
print(" (");
for (int i = 0; i < targetList.size(); i++) {
if(i != 0) {
print(",");
}
print(" ?");
}
print(")");
}
if (changed) {
@@ -5794,6 +5817,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
super.setFeatures(features);
this.ucase = isEnabled(VisitorFeature.OutputUCase);
this.parameterized = isEnabled(VisitorFeature.OutputParameterized);
this.parameterizedQuesUnMergeInList = isEnabled(VisitorFeature.OutputParameterizedQuesUnMergeInList);
}
/////////////// for oracle
@@ -23,6 +23,7 @@ public enum VisitorFeature {
OutputUseInsertValueClauseOriginalString,
OutputSkipSelectListCacheString,
OutputSkipInsertColumnsString,
OutputParameterizedQuesUnMergeInList
;
private VisitorFeature(){
@@ -16,6 +16,7 @@
package com.alibaba.druid.bvt.sql.mysql.param;
import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils;
import com.alibaba.druid.sql.visitor.VisitorFeature;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
@@ -40,4 +41,23 @@ public class SQL_Parser_Parameterize_Test extends TestCase {
assertEquals(102, outParameters.get(1));
assertEquals("wenshao", outParameters.get(2));
}
public void test_parameterized_2() throws Exception {
final String dbType = JdbcConstants.MYSQL;
List<Object> outParameters = new ArrayList<Object>();
String sql = "select * from t where id = 101 or id in (1,2,3,4)";
String psql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType, null, outParameters, VisitorFeature.OutputParameterizedQuesUnMergeInList);
assertEquals("SELECT *\n" +
"FROM t\n" +
"WHERE id = ?\n" +
"\tOR id IN ( ?, ?, ?, ?)", psql);
assertEquals(5, outParameters.size());
assertEquals(101, outParameters.get(0));
assertEquals(1, outParameters.get(1));
assertEquals(2, outParameters.get(2));
assertEquals(3, outParameters.get(3));
assertEquals(4, outParameters.get(4));
}
}