From 031e30c7098cf38deaeb8ed3c0603832df96706f Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 30 Oct 2017 12:55:42 +0800 Subject: [PATCH] improved sql parser. --- src/main/java/com/alibaba/druid/VERSION.java | 2 +- .../mysql/visitor/MySqlOutputVisitor.java | 60 ++----------------- .../ParameterizedOutputVisitorUtils.java | 14 ++++- .../sql/visitor/SQLASTOutputVisitor.java | 2 + .../com/alibaba/druid/wall/WallProvider.java | 2 +- 5 files changed, 23 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/alibaba/druid/VERSION.java b/src/main/java/com/alibaba/druid/VERSION.java index bcfc07a6aa..98ceaa1c6e 100644 --- a/src/main/java/com/alibaba/druid/VERSION.java +++ b/src/main/java/com/alibaba/druid/VERSION.java @@ -19,7 +19,7 @@ public final class VERSION { public final static int MajorVersion = 1; public final static int MinorVersion = 1; - public final static int RevisionVersion = 5; + public final static int RevisionVersion = 6; public static String getVersionNumber() { return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index d91eaf051e..e7db099cd2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -644,35 +644,19 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } } - String varName = x.getName(); if (x.isGlobal()) { print0("@@global."); - } else { -// if ((!varName.startsWith("@")) // / -// && (!varName.equals("?")) // -// && (!varName.startsWith("#")) // -// && (!varName.startsWith("$")) // -// && (!varName.startsWith(":"))) { -// -// boolean subPartitionOption = false; -// if (x.getParent() != null) { -// subPartitionOption = x.getParent().getParent() instanceof SQLSubPartitionBy; -// } -// -// if (!subPartitionOption) { -// print0("@@"); -// } -// } } - for (int i = 0; i < x.getName().length(); ++i) { - char ch = x.getName().charAt(i); + String varName = x.getName(); + for (int i = 0; i < varName.length(); ++i) { + char ch = varName.charAt(i); if (ch == '\'') { - if (x.getName().startsWith("@@") && i == 2) { + if (varName.startsWith("@@") && i == 2) { print(ch); - } else if (x.getName().startsWith("@") && i == 1) { + } else if (varName.startsWith("@") && i == 1) { print(ch); - } else if (i != 0 && i != x.getName().length() - 1) { + } else if (i != 0 && i != varName.length() - 1) { print0("\\'"); } else { print(ch); @@ -2462,38 +2446,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } -// public boolean visit(SQLUnionQuery x) { -// print('('); -// x.getLeft().accept(this); -// print(')'); -// println(); -// print0(ucase ? x.getOperator().name : x.getOperator().name_lcase); -// println(); -// -// SQLSelectQuery right = x.getRight(); -// boolean needParen = ! (right instanceof SQLUnionQuery); -// -// if (needParen) { -// print('('); -// right.accept(this); -// print(')'); -// } else { -// right.accept(this); -// } -// -// if (x.getOrderBy() != null) { -// println(); -// x.getOrderBy().accept(this); -// } -// -// if (x.getLimit() != null) { -// println(); -// x.getLimit().accept(this); -// } -// -// return false; -// } - @Override public boolean visit(MySqlUseIndexHint x) { print0(ucase ? "USE INDEX " : "use index "); 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 494228dd1e..b8109fb18b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -18,6 +18,10 @@ package com.alibaba.druid.sql.visitor; import java.util.List; import com.alibaba.druid.sql.ast.*; +import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; +import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.db2.visitor.DB2OutputVisitor; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleParameterizedOutputVisitor; @@ -78,7 +82,15 @@ public class ParameterizedOutputVisitorUtils { if (stmt.hasBeforeComment()) { stmt.getBeforeCommentsDirect().clear(); } - stmt.accept(visitor); + + Class stmtClass = stmt.getClass(); + if (stmtClass == SQLSelectStatement.class) { // only for performance + SQLSelectStatement selectStatement = (SQLSelectStatement) stmt; + visitor.visit(selectStatement); + visitor.postVisit(selectStatement); + } else { + stmt.accept(visitor); + } } if (visitor.getReplaceCount() == 0 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 9b3f47948d..d0493ec1fa 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1870,6 +1870,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (expr instanceof SQLIdentifierExpr) { print0(((SQLIdentifierExpr) expr).getName()); + } else if (expr instanceof SQLPropertyExpr) { + visit((SQLPropertyExpr) expr); } else { printExpr(expr); } diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index 14182deee0..77f7db4d0b 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -460,7 +460,7 @@ public abstract class WallProvider { String mergedSql; try { - mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType); + mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType, (List) null); } catch (Exception ex) { // skip return null;