From d3a2d087e88178d95accc2464a7fb526c312762a Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 11 Dec 2016 16:12:40 +0800 Subject: [PATCH] improved SQLUtils & add testcase for issue #1542 --- .../java/com/alibaba/druid/sql/SQLUtils.java | 20 +++++++- .../oracle/select/OracleSelectTest_param.java | 51 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest_param.java diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index b89d82e989..ee7d8c3874 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -75,6 +75,7 @@ public class SQLUtils { } visitor.setUppCase(option.isUppCase()); visitor.setPrettyFormat(option.isPrettyFormat()); + visitor.setParameterized(option.isParameterized()); sqlObject.accept(visitor); @@ -285,6 +286,7 @@ public class SQLUtils { } visitor.setUppCase(option.isUppCase()); visitor.setPrettyFormat(option.isPrettyFormat()); + visitor.setParameterized(option.isParameterized()); if (tableMapping != null) { visitor.setTableMapping(tableMapping); @@ -640,19 +642,25 @@ public class SQLUtils { public static class FormatOption { private boolean ucase = true; - private boolean prettyFormat = false; + private boolean prettyFormat = true; + private boolean parameterized = false; public FormatOption() { } public FormatOption(boolean ucase) { - this.ucase = ucase; + this(ucase, true); } public FormatOption(boolean ucase, boolean prettyFormat) { + this(ucase, prettyFormat, false); + } + + public FormatOption(boolean ucase, boolean prettyFormat, boolean parameterized) { this.ucase = ucase; this.prettyFormat = prettyFormat; + this.parameterized = parameterized; } public boolean isUppCase() { @@ -670,6 +678,14 @@ public class SQLUtils { public void setPrettyFormat(boolean prettyFormat) { this.prettyFormat = prettyFormat; } + + public boolean isParameterized() { + return parameterized; + } + + public void setParameterized(boolean parameterized) { + this.parameterized = parameterized; + } } public static String refactor(String sql, String dbType, Map tableMapping) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest_param.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest_param.java new file mode 100644 index 0000000000..364fab3ec5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest_param.java @@ -0,0 +1,51 @@ +/* + * Copyright 1999-2101 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.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest_param extends OracleTest { + private String dbType = JdbcConstants.ORACLE; + + public void test_0() throws Exception { + String sql = // + "select c1 from t1 t where t.c2=1 and (t.c3=1 or t.c3=5)"; // + + List statementList = SQLUtils.parseStatements(sql, dbType); + assertEquals(1, statementList.size()); + + SQLStatement stmt = statementList.get(0); + + assertEquals("SELECT c1\n" + + "FROM t1 t\n" + + "WHERE t.c2 = 1\n" + + "\tAND (t.c3 = 1\n" + + "\t\tOR t.c3 = 5)", SQLUtils.toSQLString(stmt, dbType)); + + assertEquals("SELECT c1\n" + + "FROM t1 t\n" + + "WHERE t.c2 = ?\n" + + "\tAND t.c3 = ?", SQLUtils.toSQLString(stmt, dbType, new SQLUtils.FormatOption(true, true, true))); + } +}