修正参数不当的问题

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@213 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-05-30 03:31:50 +00:00
parent 642f3b90b1
commit 846b9bb816
9 changed files with 222 additions and 80 deletions
@@ -9,11 +9,14 @@ import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLNCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor {
private static final String ATTR_PARAMS_SKIP = "_params.skip_";
public MySqlParameterizedOutputVisitor(Appendable appender){
super(appender);
}
@@ -26,30 +29,27 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor {
x.getExpr().accept(this);
if (x.isNot()) {
print(" NOT IN (##)");
print(" NOT IN (?)");
} else {
print(" IN (##)");
print(" IN (?)");
}
return false;
}
public boolean visit(SQLBinaryOpExpr x) {
if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr) {
print(x.getLeft().toString());
print(' ');
print(x.getOperator().name);
print(' ');
print(x.getRight().toString());
return false;
}
x = merge(x);
return super.visit(x);
}
public SQLBinaryOpExpr merge(SQLBinaryOpExpr x) {
if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr) {
x.getLeft().getAttributes().put(ATTR_PARAMS_SKIP, true);
x.getRight().getAttributes().put(ATTR_PARAMS_SKIP, true);
return x;
}
if (x.getRight() instanceof SQLLiteralExpr) {
x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), new SQLVariantRefExpr("?"));
}
@@ -63,7 +63,7 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor {
}
if (x.getLeft() instanceof SQLBinaryOpExpr) {
x = new SQLBinaryOpExpr((SQLBinaryOpExpr) x.getLeft(), x.getOperator(), x.getRight());
x = new SQLBinaryOpExpr(merge((SQLBinaryOpExpr) x.getLeft()), x.getOperator(), x.getRight());
}
// ID = ? OR ID = ? => ID = ?
@@ -83,6 +83,17 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor {
}
}
}
if ((left.getLeft() instanceof SQLPropertyExpr) && (right.getLeft() instanceof SQLPropertyExpr)) {
String leftColumn = left.getLeft().toString();
String rightColumn = right.getLeft().toString();
if (leftColumn.equals(rightColumn)) {
if ((left.getRight() instanceof SQLVariantRefExpr) && (right.getRight() instanceof SQLVariantRefExpr)) {
return left; // merge
}
}
}
}
}
}
@@ -91,21 +102,37 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor {
}
public boolean visit(SQLIntegerExpr x) {
if (Boolean.TRUE.equals(x.getAttribute(ATTR_PARAMS_SKIP))) {
return super.visit(x);
}
print('?');
return false;
}
public boolean visit(SQLNumberExpr x) {
if (Boolean.TRUE.equals(x.getAttribute(ATTR_PARAMS_SKIP))) {
return super.visit(x);
}
print('?');
return false;
}
public boolean visit(SQLCharExpr x) {
if (Boolean.TRUE.equals(x.getAttribute(ATTR_PARAMS_SKIP))) {
return super.visit(x);
}
print('?');
return false;
}
public boolean visit(SQLNCharExpr x) {
if (Boolean.TRUE.equals(x.getAttribute(ATTR_PARAMS_SKIP))) {
return super.visit(x);
}
print('?');
return false;
}
@@ -9,10 +9,12 @@ import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLNCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
public class OracleParameterizedOutputVisitor extends OracleOutputVisitor {
private static final String ATTR_PARAMS_SKIP = "_params.skip_";
public OracleParameterizedOutputVisitor(Appendable appender){
super(appender);
}
@@ -25,30 +27,27 @@ public class OracleParameterizedOutputVisitor extends OracleOutputVisitor {
x.getExpr().accept(this);
if (x.isNot()) {
print(" NOT IN (##)");
print(" NOT IN (?)");
} else {
print(" IN (##)");
print(" IN (?)");
}
return false;
}
public boolean visit(SQLBinaryOpExpr x) {
if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr) {
print(x.getLeft().toString());
print(' ');
print(x.getOperator().name);
print(' ');
print(x.getRight().toString());
return false;
}
x = merge(x);
return super.visit(x);
}
public SQLBinaryOpExpr merge(SQLBinaryOpExpr x) {
if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr) {
x.getLeft().getAttributes().put(ATTR_PARAMS_SKIP, true);
x.getRight().getAttributes().put(ATTR_PARAMS_SKIP, true);
return x;
}
if (x.getRight() instanceof SQLLiteralExpr) {
x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), new SQLVariantRefExpr("?"));
}
@@ -82,6 +81,17 @@ public class OracleParameterizedOutputVisitor extends OracleOutputVisitor {
}
}
}
if ((left.getLeft() instanceof SQLPropertyExpr) && (right.getLeft() instanceof SQLPropertyExpr)) {
String leftColumn = left.getLeft().toString();
String rightColumn = right.getLeft().toString();
if (leftColumn.equals(rightColumn)) {
if ((left.getRight() instanceof SQLVariantRefExpr) && (right.getRight() instanceof SQLVariantRefExpr)) {
return left; // merge
}
}
}
}
}
}
@@ -90,21 +100,37 @@ public class OracleParameterizedOutputVisitor extends OracleOutputVisitor {
}
public boolean visit(SQLIntegerExpr x) {
if (Boolean.TRUE.equals(x.getAttribute(ATTR_PARAMS_SKIP))) {
return super.visit(x);
}
print('?');
return false;
}
public boolean visit(SQLNumberExpr x) {
if (Boolean.TRUE.equals(x.getAttribute(ATTR_PARAMS_SKIP))) {
return super.visit(x);
}
print('?');
return false;
}
public boolean visit(SQLCharExpr x) {
if (Boolean.TRUE.equals(x.getAttribute(ATTR_PARAMS_SKIP))) {
return super.visit(x);
}
print('?');
return false;
}
public boolean visit(SQLNCharExpr x) {
if (Boolean.TRUE.equals(x.getAttribute(ATTR_PARAMS_SKIP))) {
return super.visit(x);
}
print('?');
return false;
}