diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java index 823fa0588f..f571bb0723 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java @@ -20,13 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.dialect.db2.visitor.DB2ExportParameterVisitor; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlExportParameterVisitor; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleExportParameterVisitor; @@ -106,6 +100,11 @@ public final class ExportParameterVisitorUtils { replace = true; } + if (param instanceof SQLHexExpr) { + value = ((SQLHexExpr) param).toBytes(); + replace = true; + } + if (replace) { SQLObject parent = param.getParent(); if (parent != null) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 7f9499155f..124168d8a5 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1457,6 +1457,25 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return; } + if (param instanceof byte[]) { + byte[] bytes = (byte[]) param; + int bytesLen = bytes.length; + char[] chars = new char[bytesLen * 2 + 3]; + chars[0] = 'x'; + chars[1] = '\''; + for (int i = 0; i < bytes.length; i++) { + int a = bytes[i] & 0xFF; + int b0 = a >> 4; + int b1 = a & 0xf; + + chars[i * 2 + 2] = (char) (b0 + (b0 < 10 ? 48 : 55)); //hexChars[b0]; + chars[i * 2 + 3] = (char) (b1 + (b1 < 10 ? 48 : 55)); + } + chars[chars.length - 1] = '\''; + print0(new String(chars)); + return; + } + print0("'" + param.getClass().getName() + "'"); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_38.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_38.java new file mode 100644 index 0000000000..c0e5ba8067 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_38.java @@ -0,0 +1,39 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_38 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "SELECT lower(hex(file_md5)) as file_md5,\n" + + " lower(hex(thumb)) as thumb,st\n" + + " FROM t_f_p_thumb\n" + + " WHERE file_md5 = x'84C1F969587F5FD1942148EE9D36A0FB'"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + // List parameters = new ArrayList(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + // visitor.setParameters(parameters); + visitor.setExportTables(true); + visitor.setPrettyFormat(false); + statement.accept(visitor); + assertEquals("SELECT lower(hex(file_md5)) AS file_md5, lower(hex(thumb)) AS thumb, st FROM t_f_p_thumb WHERE file_md5 = ?", out.toString()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_38_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_38_1.java new file mode 100644 index 0000000000..fe5a2273d5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_38_1.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.serializer.SerializerFeature; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_38_1 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "SELECT lower(hex(file_md5)) as file_md5,\n" + + " lower(hex(thumb)) as thumb,st\n" + + " FROM t_f_p_thumb\n" + + " WHERE file_md5 = x'84C1F969587F5FD1942148EE9D36A0FB'"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + System.out.println(psql); + String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName); + System.out.println(params_json); + JSONArray jsonArray = JSON.parseArray(params_json); + System.out.println(JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName)); + + String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray); + System.out.println(rsql); + } +}