From b9d6c01d99cd53b461830a20fa7ff199663e17d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Wed, 7 Oct 2020 01:05:41 +0800 Subject: [PATCH] improved oracle parameterize support, fix #3966 --- .../visitor/OracleASTParameterizedVisitor.java | 16 ++++++++++++++++ .../visitor/ParameterizedOutputVisitorUtils.java | 6 ++++++ .../MySqlParameterizedOutputVisitorTest_80.java | 14 ++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTParameterizedVisitor.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTParameterizedVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTParameterizedVisitor.java new file mode 100644 index 0000000000..4f3e7b1d90 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTParameterizedVisitor.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.sql.dialect.oracle.visitor; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.visitor.SQLASTParameterizedVisitor; + +import java.util.List; + +public class OracleASTParameterizedVisitor extends SQLASTParameterizedVisitor implements OracleASTVisitor { + public OracleASTParameterizedVisitor() { + super(DbType.oracle); + } + + public OracleASTParameterizedVisitor(List parameters) { + super(DbType.oracle, parameters); + } +} 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 6c9e438058..a07a3669eb 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -30,6 +30,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedVisitor; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTParameterizedVisitor; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleParameterizedOutputVisitor; import com.alibaba.druid.sql.dialect.phoenix.visitor.PhoenixOutputVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor; @@ -372,6 +373,11 @@ public class ParameterizedOutputVisitorUtils { MySqlParameterizedVisitor visitor = new MySqlParameterizedVisitor(outParameters); stmt.accept(visitor); return stmt; + } else if (dbType == DbType.oracle) { + SQLStatement stmt = SQLUtils.parseSingleStatement(sql, DbType.oracle); + OracleASTParameterizedVisitor visitor = new OracleASTParameterizedVisitor(outParameters); + stmt.accept(visitor); + return stmt; } else { throw new UnsupportedOperationException(); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_80.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_80.java index f599bf0be9..9e1fb278a5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_80.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_80.java @@ -47,4 +47,18 @@ public class MySqlParameterizedOutputVisitorTest_80 extends TestCase { "ORDER BY 1;", stmt.toString()); } + public void test3() { + + String sql = "/*test*/ select * from test ;"; + + assertEquals("/*test*/\n" + + "SELECT *\n" + + "FROM test;", ParameterizedOutputVisitorUtils.parameterizeOf(sql, DbType.mysql) + .toString()); + + assertEquals("/*test*/\n" + + "SELECT *\n" + + "FROM test;", ParameterizedOutputVisitorUtils.parameterizeOf(sql, DbType.oracle) + .toString()); + } }