diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 9ec5ca8da9..fcfb40deca 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1921,7 +1921,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat value.setTransactionHistogram(this.getTransactionHistogram().toArrayAndReset()); value.setConnectionHoldTimeHistogram(this.getDataSourceStat().getConnectionHoldHistogram().toArrayAndReset()); - value.removeAbandoned = this.isRemoveAbandoned(); + value.setRemoveAbandoned(this.isRemoveAbandoned()); value.setClobOpenCount(this.getDataSourceStat().getClobOpenCountAndReset()); value.setBlobOpenCount(this.getDataSourceStat().getBlobOpenCountAndReset()); diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 8246a29411..d7ac1c80e7 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -777,6 +777,10 @@ public class SQLUtils { } public static String normalize(String name) { + if (name == null) { + return null; + } + if (name.length() > 2) { char c0 = name.charAt(0); char x0 = name.charAt(name.length() - 1); @@ -859,5 +863,49 @@ public class SQLUtils { return caseExpr; } + + public static boolean replaceInParent(SQLExpr expr, SQLExpr target) { + if (expr == null) { + return false; + } + + SQLObject parent = expr.getParent(); + + if (parent instanceof SQLBinaryOpExpr) { + SQLBinaryOpExpr binaryParent = (SQLBinaryOpExpr) expr.getParent(); + if (binaryParent.getLeft() == expr) { + binaryParent.setLeft(target); + return true; + } else if (binaryParent.getRight() == expr) { + binaryParent.setRight(target); + return true; + } else { + return false; + } + } + + if (parent instanceof SQLSelectOrderByItem){ + SQLSelectOrderByItem orderByItem = (SQLSelectOrderByItem) parent; + if (orderByItem.getExpr() == expr) { + orderByItem.setExpr(target); + return true; + } + return false; + } + + if (parent instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) parent; + List parameters = methodInvokeExpr.getParameters(); + for (int i = 0; i < parameters.size(); ++i) { + if (parameters.get(i) == expr) { + parameters.set(i, target); + return true; + } + } + return false; + } + + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java index 62fb086a3c..ecc0a2fdea 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java @@ -23,6 +23,7 @@ import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import com.alibaba.druid.util.Utils; public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable { @@ -147,6 +148,25 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable { return true; } + + public boolean equalsIgoreOrder(SQLBinaryOpExpr other) { + if (this == other) { + return true; + } + if (other == null) { + return false; + } + + if (operator != other.operator) { + return false; + } + + return (Utils.equals(this.left, other.left) + && Utils.equals(this.right, other.right)) + || (Utils.equals(this.left, other.right) + && Utils.equals(this.right, other.left)); + } + public SQLBinaryOpExpr clone() { return new SQLBinaryOpExpr(left, operator, right, dbType); } @@ -155,7 +175,7 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable { return SQLUtils.toSQLString(this, getDbType()); } - public static SQLExpr combine(List items, SQLBinaryOperator op) { + public static SQLExpr combine(List items, SQLBinaryOperator op) { if (items == null || op == null) { return null; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java index 701a6f55da..579222e7dc 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java @@ -183,7 +183,6 @@ public class SQLSelect extends SQLObjectImpl { public boolean isSimple() { return withSubQuery == null - && orderBy == null && (hints == null || hints.size() == 0) && restriction == null && (!forBrowse) diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java index 765cfc0076..d306e0bca0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java @@ -272,6 +272,9 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery acceptChild(visitor, this.startWith); acceptChild(visitor, this.connectBy); acceptChild(visitor, this.groupBy); + acceptChild(visitor, this.orderBy); + acceptChild(visitor, this.waitTime); + acceptChild(visitor, this.limit); } visitor.endVisit(this); } @@ -386,4 +389,30 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery public void setBracket(boolean bracket) { this.bracket = bracket; } + + public SQLTableSource findTableSource(String alias) { + return findTableSource(from, alias); + } + + private static SQLTableSource findTableSource(SQLTableSource from, String alias) { + if (from == null || alias == null) { + return null; + } + + if (alias.equalsIgnoreCase(from.computeAlias())) { + return from; + } + + if (from instanceof SQLJoinTableSource) { + SQLJoinTableSource join = (SQLJoinTableSource) from; + SQLTableSource result = findTableSource(join.getLeft(), alias); + if (result != null) { + return result; + } + + return findTableSource(join.getRight(), alias); + } + + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java index f260fcf0eb..aea0b58b7b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java @@ -135,6 +135,9 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock { acceptChild(visitor, this.startWith); acceptChild(visitor, this.connectBy); acceptChild(visitor, this.groupBy); + acceptChild(visitor, this.orderBy); + acceptChild(visitor, this.waitTime); + acceptChild(visitor, this.limit); acceptChild(visitor, this.modelClause); acceptChild(visitor, this.forUpdateOf); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java index 682254dd25..cc3d2ffe6f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -163,8 +163,10 @@ public class ParameterizedOutputVisitorUtils { SQLObject parent = x.getParent(); if (left instanceof SQLLiteralExpr && right instanceof SQLLiteralExpr) { - if (x.getOperator() == SQLBinaryOperator.Equality // - || x.getOperator() == SQLBinaryOperator.NotEqual) { + SQLBinaryOperator op = x.getOperator(); + if (op == SQLBinaryOperator.Equality + || op == SQLBinaryOperator.NotEqual + || op == SQLBinaryOperator.LessThanOrGreater) { if((left instanceof SQLIntegerExpr) && (right instanceof SQLIntegerExpr) ) { if (((SQLIntegerExpr) left).getNumber().intValue() < 100) { left.putAttribute(ATTR_PARAMS_SKIP, true); 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 87c745c241..625b61df99 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -38,6 +38,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes; import com.alibaba.druid.sql.ast.statement.SQLDeclareStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreatePackageStatement; import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.druid.util.JdbcUtils; public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements ParameterizedVisitor, PrintableVisitor { @@ -347,7 +348,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (parameters != null && parameters.size() > 0 - && x.getOperator() == SQLBinaryOperator.Equality + && operator == SQLBinaryOperator.Equality && x.getRight() instanceof SQLVariantRefExpr ) { SQLVariantRefExpr right = (SQLVariantRefExpr) x.getRight(); @@ -866,8 +867,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (parent instanceof SQLBinaryOpExpr) { SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) parent; SQLExpr left = binaryOpExpr.getLeft(); + SQLBinaryOperator op = binaryOpExpr.getOperator(); if (left instanceof SQLIdentifierExpr - && binaryOpExpr.getOperator() == SQLBinaryOperator.Equality) { + && op == SQLBinaryOperator.Equality) { String name = ((SQLIdentifierExpr) left).getName(); if ("rownum".equals(name)) { print(1); @@ -900,7 +902,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet printMethodOwner(owner); } - printFunctionName(x.getMethodName()); + String function = x.getMethodName(); + printFunctionName(function); print('('); List parameters = x.getParameters(); @@ -909,6 +912,18 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet print0(", "); } SQLExpr param = x.getParameters().get(i); + + if (parameterized) { + if (JdbcUtils.ORACLE.equalsIgnoreCase(dbType)) { + if (size == 2 && i == 1 && param instanceof SQLCharExpr) { + if ("TO_CHAR".equalsIgnoreCase(function) + || "TO_DATE".equalsIgnoreCase(function)) { + param.putAttribute(ParameterizedOutputVisitorUtils.ATTR_PARAMS_SKIP, true); + } + } + } + } + param.accept(this); } diff --git a/src/main/java/com/alibaba/druid/util/Utils.java b/src/main/java/com/alibaba/druid/util/Utils.java index ac77fd45e7..5b37b2833d 100644 --- a/src/main/java/com/alibaba/druid/util/Utils.java +++ b/src/main/java/com/alibaba/druid/util/Utils.java @@ -330,5 +330,8 @@ public class Utils { b[off + 1] = (byte) (val >>> 48); b[off + 0] = (byte) (val >>> 56); } - + + public static boolean equals(Object a, Object b) { + return (a == b) || (a != null && a.equals(b)); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_39.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_39.java new file mode 100644 index 0000000000..66ec9f878f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_39.java @@ -0,0 +1,59 @@ +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.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_39 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "select * from t where 1 = 1 or id = 3"; + + 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(); + assertEquals("SELECT *\n" + + "FROM t\n" + + "WHERE 1 = 1\n" + + "\tOR id = ?", psql); + String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName); + System.out.println(params_json); + JSONArray jsonArray = JSON.parseArray(params_json); + String json = JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName); + assertEquals("[3]", json); + + String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray); + assertEquals("SELECT *\n" + + "FROM t\n" + + "WHERE 1 = 1\n" + + "\tOR id = 3", rsql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_40.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_40.java new file mode 100644 index 0000000000..881aaa9e9a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_40.java @@ -0,0 +1,59 @@ +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.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_40 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "select * from t where 1 <> 1 or id = 3"; + + 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(); + assertEquals("SELECT *\n" + + "FROM t\n" + + "WHERE 1 <> 1\n" + + "\tOR id = ?", psql); + String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName); + System.out.println(params_json); + JSONArray jsonArray = JSON.parseArray(params_json); + String json = JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName); + assertEquals("[3]", json); + + String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray); + assertEquals("SELECT *\n" + + "FROM t\n" + + "WHERE 1 <> 1\n" + + "\tOR id = 3", rsql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_10.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_10.java new file mode 100644 index 0000000000..057e5ce8a7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_10.java @@ -0,0 +1,75 @@ +/* + * Copyright 1999-2017 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.update; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +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.Column; +import com.alibaba.druid.wall.WallUtils; +import org.junit.Assert; + +import java.util.List; + +public class MySqlUpdateTest_10 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "UPDATE car_tt set gps_url=null WHERE id = ?"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = 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(2, visitor.getColumns().size()); + // Assert.assertEquals(2, visitor.getConditions().size()); + + Assert.assertTrue(visitor.containsTable("car_tt")); + + Assert.assertTrue(visitor.getColumns().contains(new Column("car_tt", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("car_tt", "gps_url"))); + + { + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("UPDATE car_tt\n" + + "SET gps_url = NULL\n" + + "WHERE id = ?", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + Assert.assertEquals("update car_tt\n" + + "set gps_url = null\n" + + "where id = ?", // + output); + } + + assertTrue(WallUtils.isValidateMySql(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/param/Oracle_param_1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/param/Oracle_param_1.java new file mode 100644 index 0000000000..c2445d138a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/param/Oracle_param_1.java @@ -0,0 +1,55 @@ +package com.alibaba.druid.bvt.sql.oracle.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.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 Oracle_param_1 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM dual;"; + + 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.ORACLE); + 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(); + assertEquals("SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD')\n" + + "FROM dual", psql); + String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName); + System.out.println(params_json); + JSONArray jsonArray = JSON.parseArray(params_json); + String json = JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName); + assertEquals("[]", json); + + String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray); + assertEquals("SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD')\n" + + "FROM dual", rsql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/param/Oracle_param_2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/param/Oracle_param_2.java new file mode 100644 index 0000000000..b8c51f2467 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/param/Oracle_param_2.java @@ -0,0 +1,55 @@ +package com.alibaba.druid.bvt.sql.oracle.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.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 Oracle_param_2 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "SELECT TO_DATE('2013-02-11', 'YYYY-MM-DD') FROM dual;"; + + 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.ORACLE); + 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(); + assertEquals("SELECT TO_DATE(?, 'YYYY-MM-DD')\n" + + "FROM dual", psql); + String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName); + System.out.println(params_json); + JSONArray jsonArray = JSON.parseArray(params_json); + String json = JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName); + assertEquals("[\"2013-02-11\"]", json); + + String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray); + assertEquals("SELECT TO_DATE('2013-02-11', 'YYYY-MM-DD')\n" + + "FROM dual", rsql); + } +}