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) {