improved sql parser, parameterized in expr and restore #1484.

This commit is contained in:
wenshao
2016-11-23 23:00:36 +08:00
parent 0ff90bff30
commit 3b21aba9c1
6 changed files with 202 additions and 141 deletions
@@ -16,6 +16,7 @@
package com.alibaba.druid.sql.dialect.mysql.visitor;
import java.security.AccessControlException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -148,6 +149,8 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatem
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateTableSource;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MysqlDeallocatePrepareStatement;
import com.alibaba.druid.sql.visitor.ExportParameterVisitor;
import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils;
import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.util.JdbcConstants;
@@ -695,7 +698,12 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
public boolean visit(SQLCharExpr x) {
if (this.parameterized
&& ParameterizedOutputVisitorUtils.checkParameterize(x)) {
return ParameterizedOutputVisitorUtils.visit(this, x);
print('?');
incrementReplaceCunt();
if (this instanceof ExportParameterVisitor || this.parameters != null) {
ExportParameterVisitorUtils.exportParameter(this.parameters, x);
}
return false;
}
print('\'');
@@ -735,7 +743,18 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
if (index >= 0 && index < parametersSize) {
Object param = this.getParameters().get(index);
printParameter(param);
if (param instanceof Collection && x.getParent() instanceof SQLInListExpr) {
boolean first = true;
for (Object item : (Collection) param) {
if (!first) {
print0(", ");
}
printParameter(item);
first = false;
}
} else {
printParameter(param);
}
return false;
}
}
@@ -2922,7 +2941,12 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public boolean visit(MySqlCharExpr x) {
if (parameterized && ParameterizedOutputVisitorUtils.checkParameterize(x)) {
return ParameterizedOutputVisitorUtils.visit(this, x);
print('?');
incrementReplaceCunt();
if (this instanceof ExportParameterVisitor || this.parameters != null) {
ExportParameterVisitorUtils.exportParameter(this.parameters, x);
}
return false;
}
print0(x.toString());
@@ -41,24 +41,12 @@ public class OracleParameterizedOutputVisitor extends OracleOutputVisitor implem
super(appender, printPostSemi);
}
public boolean visit(SQLInListExpr x) {
return ParameterizedOutputVisitorUtils.visit(this, x);
}
public boolean visit(SQLBinaryOpExpr x) {
x = ParameterizedOutputVisitorUtils.merge(this, x);
return super.visit(x);
}
public boolean visit(SQLIntegerExpr x) {
if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
return super.visit(x);
}
return ParameterizedOutputVisitorUtils.visit(this, x);
}
public boolean visit(SQLNumberExpr x) {
if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
return super.visit(x);
@@ -69,28 +57,4 @@ public class OracleParameterizedOutputVisitor extends OracleOutputVisitor implem
return false;
}
public boolean visit(SQLCharExpr x) {
if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
return super.visit(x);
}
return ParameterizedOutputVisitorUtils.visit(this, x);
}
public boolean visit(SQLNCharExpr x) {
if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
return super.visit(x);
}
return ParameterizedOutputVisitorUtils.visit(this, x);
}
public boolean visit(SQLNullExpr x) {
if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) {
return super.visit(x);
}
return ParameterizedOutputVisitorUtils.visit(this, x);
}
}