From c23bdc09077ea7e1284c80b2f9c229b204f83de5 Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 16 Oct 2017 01:53:58 +0800 Subject: [PATCH] improved sql parser. --- .../sqlserver/parser/SQLServerExprParser.java | 11 +++++++- .../ParameterizedOutputVisitorUtils.java | 21 ++++++++++++-- .../sql/visitor/ParameterizedVisitor.java | 3 ++ .../param/SQL_Parser_Parameterize_Test.java | 28 +++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/param/SQL_Parser_Parameterize_Test.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java index b7dbc31459..78e4452f53 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java @@ -40,7 +40,16 @@ public class SQLServerExprParser extends SQLExprParser { public final static long[] AGGREGATE_FUNCTIONS_CODES; static { - String[] strings = { "AVG", "COUNT", "MAX", "MIN", "ROW_NUMBER", "STDDEV", "SUM" }; + String[] strings = { + "AVG", + "COUNT", + "FIRST_VALUE", + "MAX", + "MIN", + "ROW_NUMBER", + "STDDEV", + "SUM" + }; AGGREGATE_FUNCTIONS_CODES = FnvHash.fnv1a_64_lower(strings, true); AGGREGATE_FUNCTIONS = new String[AGGREGATE_FUNCTIONS_CODES.length]; for (String str : strings) { 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 ef75ef5a0e..494228dd1e 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -34,10 +34,24 @@ public class ParameterizedOutputVisitorUtils { }; public static String parameterize(String sql, String dbType) { - return parameterize(sql, dbType, null); + return parameterize(sql, dbType, null, null); } - public static String parameterize(String sql, String dbType, SQLSelectListCache selectListCache) { + public static String parameterize(String sql + , String dbType + , SQLSelectListCache selectListCache) { + return parameterize(sql, dbType, selectListCache, null); + } + + public static String parameterize(String sql + , String dbType + , List outParameters) { + return parameterize(sql, dbType, null, outParameters); + } + + public static String parameterize(String sql + , String dbType + , SQLSelectListCache selectListCache, List outParameters) { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType, features); if (selectListCache != null) { @@ -51,6 +65,9 @@ public class ParameterizedOutputVisitorUtils { StringBuilder out = new StringBuilder(sql.length()); ParameterizedVisitor visitor = createParameterizedOutputVisitor(out, dbType); + if (outParameters != null) { + visitor.setOutputParameters(outParameters); + } for (int i = 0; i < statementList.size(); i++) { if (i > 0) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedVisitor.java index 4926e68e48..0246bef57d 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedVisitor.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.sql.visitor; +import java.util.List; + public interface ParameterizedVisitor extends PrintableVisitor { int getReplaceCount(); @@ -23,4 +25,5 @@ public interface ParameterizedVisitor extends PrintableVisitor { String getDbType(); + void setOutputParameters(List parameters); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/SQL_Parser_Parameterize_Test.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/SQL_Parser_Parameterize_Test.java new file mode 100644 index 0000000000..030ea56d28 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/SQL_Parser_Parameterize_Test.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +public class SQL_Parser_Parameterize_Test extends TestCase { + public void test_parameterized() throws Exception { + final String dbType = JdbcConstants.MYSQL; + + List outParameters = new ArrayList(); + String sql = "select * from t where id = 101 and age = 102 or name = 'wenshao'"; + String psql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType, outParameters); + assertEquals("SELECT *\n" + + "FROM t\n" + + "WHERE id = ?\n" + + "\tAND age = ?\n" + + "\tOR name = ?", psql); + + assertEquals(3, outParameters.size()); + assertEquals(101, outParameters.get(0)); + assertEquals(102, outParameters.get(1)); + assertEquals("wenshao", outParameters.get(2)); + } +}