From 7711945dcca085088786eb8fcf185c70acc40357 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 3 Nov 2011 20:48:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3SQL=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E8=B6=85=E9=95=BF=E6=9D=A1=E4=BB=B6=E6=97=B6=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../druid/sql/ast/expr/SQLBinaryOpExpr.java | 44 +++++++++++++++++++ .../druid/sql/ast/expr/SQLIdentifierExpr.java | 32 ++++++++++++++ .../druid/sql/ast/expr/SQLPropertyExpr.java | 40 +++++++++++++++++ .../druid/sql/ast/expr/SQLVariantRefExpr.java | 32 ++++++++++++++ .../MySqlParameterizedOutputVisitor.java | 17 +++++-- .../OracleParameterizedOutputVisitor.java | 15 ++++++- 6 files changed, 175 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java index f39e8bdef1..42d3e31472 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java @@ -86,4 +86,48 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable { visitor.endVisit(this); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((left == null) ? 0 : left.hashCode()); + result = prime * result + ((operator == null) ? 0 : operator.hashCode()); + result = prime * result + ((right == null) ? 0 : right.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof SQLBinaryOpExpr)) { + return false; + } + SQLBinaryOpExpr other = (SQLBinaryOpExpr) obj; + if (left == null) { + if (other.left != null) { + return false; + } + } else if (!left.equals(other.left)) { + return false; + } + if (operator != other.operator) { + return false; + } + if (right == null) { + if (other.right != null) { + return false; + } + } else if (!right.equals(other.right)) { + return false; + } + return true; + } + + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java index a60e18274f..fb8d29f0e9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java @@ -51,4 +51,36 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { visitor.endVisit(this); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof SQLIdentifierExpr)) { + return false; + } + SQLIdentifierExpr other = (SQLIdentifierExpr) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java index c372a9b961..ae1776e4b9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java @@ -66,4 +66,44 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { visitor.endVisit(this); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((owner == null) ? 0 : owner.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof SQLPropertyExpr)) { + return false; + } + SQLPropertyExpr other = (SQLPropertyExpr) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + if (owner == null) { + if (other.owner != null) { + return false; + } + } else if (!owner.equals(other.owner)) { + return false; + } + return true; + } + + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java index c5992eaa5a..030d2b1e65 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java @@ -51,4 +51,36 @@ public class SQLVariantRefExpr extends SQLExprImpl { visitor.endVisit(this); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof SQLVariantRefExpr)) { + return false; + } + SQLVariantRefExpr other = (SQLVariantRefExpr) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java index c3fef1d96e..953c2578ff 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java @@ -42,7 +42,7 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor { return super.visit(x); } - + public boolean visit(SQLNullExpr x) { print('?'); return false; @@ -65,8 +65,19 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor { x = new SQLBinaryOpExpr(new SQLVariantRefExpr("?"), x.getOperator(), x.getRight()); } - if (x.getRight() instanceof SQLBinaryOpExpr) { - x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), merge((SQLBinaryOpExpr) x.getRight())); + for (;;) { + if (x.getRight() instanceof SQLBinaryOpExpr) { + if (x.getLeft() instanceof SQLBinaryOpExpr) { + SQLBinaryOpExpr leftBinaryExpr = (SQLBinaryOpExpr) x.getLeft(); + if (leftBinaryExpr.getRight().equals(x.getRight())) { + x = leftBinaryExpr; + continue; + } + } + x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), merge((SQLBinaryOpExpr) x.getRight())); + } + + break; } if (x.getLeft() instanceof SQLBinaryOpExpr) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleParameterizedOutputVisitor.java index d3482dd18d..3e3273b9e7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleParameterizedOutputVisitor.java @@ -64,8 +64,19 @@ public class OracleParameterizedOutputVisitor extends OracleOutputVisitor { x = new SQLBinaryOpExpr(new SQLVariantRefExpr("?"), x.getOperator(), x.getRight()); } - if (x.getRight() instanceof SQLBinaryOpExpr) { - x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), merge((SQLBinaryOpExpr) x.getRight())); + for (;;) { + if (x.getRight() instanceof SQLBinaryOpExpr) { + if (x.getLeft() instanceof SQLBinaryOpExpr) { + SQLBinaryOpExpr leftBinaryExpr = (SQLBinaryOpExpr) x.getLeft(); + if (leftBinaryExpr.getRight().equals(x.getRight())) { + x = leftBinaryExpr; + continue; + } + } + x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), merge((SQLBinaryOpExpr) x.getRight())); + } + + break; } if (x.getLeft() instanceof SQLBinaryOpExpr) {