From 72c9665577f4f759c9758883ce4b1c1bc18a97ac Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 17 Jun 2013 23:34:35 +0800 Subject: [PATCH] add testcase & remove unused code --- .../druid/sql/ast/SQLDataTypeImpl.java | 36 +- .../com/alibaba/druid/sql/ast/SQLOrderBy.java | 30 +- .../druid/sql/ast/expr/SQLBinaryOpExpr.java | 14 +- .../druid/sql/ast/expr/SQLCastExpr.java | 8 - .../sql/ast/expr/SQLDateLiteralValue.java | 56 --- .../sql/ast/statement/SQLExprTableSource.java | 21 + .../sql/ast/statement/SQLIndexDefinition.java | 21 - .../sql/ast/statement/SQLSelectItem.java | 31 +- .../ast/statement/SQLSelectOrderByItem.java | 27 ++ .../ast/statement/SQLTableConstaintImpl.java | 32 -- .../mysql/ast/expr/MySqlExtractExpr.java | 7 - .../mysql/ast/expr/MySqlHexadecimalExpr.java | 31 -- .../ast/statement/MySqlSelectQueryBlock.java | 14 +- .../oracle/ast/expr/OracleExtractExpr.java | 9 - .../ast/stmt/OracleSelectQueryBlock.java | 53 +-- .../oracle/parser/OracleExprParser.java | 12 + .../oracle/parser/OracleTokenType.java | 74 ---- .../transact/ast/TransactSQLSelect.java | 20 - .../druid/sql/parser/SQLExprParser.java | 15 +- .../druid/sql/parser/SQLParseException.java | 15 +- .../com/alibaba/druid/stat/JdbcSqlStat.java | 190 +++------ .../alibaba/druid/stat/JdbcSqlStatValue.java | 206 ++++++++-- .../alibaba/druid/stat/JdbcTraceManager.java | 1 + .../druid/support/http/stat/WebURIStat.java | 212 +++++----- .../support/http/stat/WebURIStatValue.java | 295 +++++++++++++ .../SpringIbatisBeanNameAutoProxyCreator.java | 8 +- .../support/profile/ProfileEntryKey.java | 6 + .../support/profile/ProfileEntryStat.java | 11 + .../profile/ProfileEntryStatValue.java | 80 ++++ .../druid/support/profile/ProfileStat.java | 28 +- .../alibaba/druid/util/JdbcSqlStatUtils.java | 30 +- .../alibaba/druid/util/LazyCompositeData.java | 194 --------- .../alibaba/druid/util/ThreadLocalRandom.java | 199 --------- .../com/alibaba/druid/wall/WallFilter.java | 25 +- .../alibaba/druid/wall/WallSQLException.java | 8 - .../com/alibaba/druid/wall/WallTableStat.java | 13 +- .../com/alibaba/druid/TestTraceFilter.java | 2 + .../bvt/filter/wall/WallFilterTest2.java | 386 ++++++++++++++++++ .../bvt/filter/wall/WallSQLExceptionTest.java | 16 + .../druid/bvt/pool/TestActiveTrace.java | 5 +- .../bvt/spring/SqlMapClientWrapperTest.java | 2 +- .../sql/EqualTest_OracleTimestampExpr.java | 37 ++ .../sql/EqualTest_SQLSelectQueryBlock.java | 17 + .../druid/bvt/sql/EqualTest_aggreate.java | 37 ++ .../bvt/sql/EqualTest_aggreate_over.java | 37 ++ .../alibaba/druid/bvt/sql/EqualTest_any.java | 37 ++ .../druid/bvt/sql/EqualTest_binary.java | 38 ++ .../druid/bvt/sql/EqualTest_binaryOp.java | 37 ++ .../druid/bvt/sql/EqualTest_boolean.java | 38 ++ .../alibaba/druid/bvt/sql/EqualTest_cast.java | 41 ++ .../druid/bvt/sql/EqualTest_cursor.java | 37 ++ .../druid/bvt/sql/EqualTest_dbLink.java | 37 ++ .../druid/bvt/sql/EqualTest_exists.java | 37 ++ .../bvt/sql/EqualTest_extract_mysql.java | 37 ++ .../bvt/sql/EqualTest_extract_oracle.java | 37 ++ .../druid/bvt/sql/EqualTest_inList.java | 37 ++ ...{EqualTest.java => EqualTest_inquery.java} | 2 +- .../bvt/sql/EqualTest_inquery_mysql.java | 37 ++ .../bvt/sql/EqualTest_inquery_oracle.java | 38 ++ .../bvt/sql/EqualTest_interval_mysql.java | 38 ++ .../druid/bvt/sql/EqualTest_mysqlMatch.java | 8 + .../alibaba/druid/bvt/sql/EqualTest_not.java | 37 ++ .../druid/bvt/sql/EqualTest_number.java | 37 ++ .../druid/bvt/sql/EqualTest_orderBy.java | 41 ++ .../druid/bvt/sql/EqualTest_query.java | 37 ++ .../alibaba/druid/bvt/sql/EqualTest_some.java | 37 ++ .../druid/bvt/sql/EqualTest_unary.java | 37 ++ .../druid/bvt/sql/EqualTest_unary_mysql.java | 37 ++ .../druid/bvt/sql/SQLParseExceptionTest.java | 13 + .../druid/bvt/stat/JdbcTraceManagerTest.java | 13 + .../bvt/support/http/util/IPRangeTest.java | 3 +- .../bvt/support/monitor/PushServiceTest.java | 12 + .../alibaba/druid/bvt/utils/PGUtilsTest.java | 22 + .../bvt/utils/ThreadLocalRandomTest.java | 15 - .../pool/ibatis/spring-config-ibatis-1.xml | 44 ++ 75 files changed, 2415 insertions(+), 1077 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateLiteralValue.java delete mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLIndexDefinition.java delete mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableConstaintImpl.java delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlHexadecimalExpr.java delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleTokenType.java delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/transact/ast/TransactSQLSelect.java create mode 100644 src/main/java/com/alibaba/druid/support/http/stat/WebURIStatValue.java create mode 100644 src/main/java/com/alibaba/druid/support/profile/ProfileEntryStatValue.java delete mode 100644 src/main/java/com/alibaba/druid/util/LazyCompositeData.java delete mode 100644 src/main/java/com/alibaba/druid/util/ThreadLocalRandom.java create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/WallFilterTest2.java create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/WallSQLExceptionTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleTimestampExpr.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_SQLSelectQueryBlock.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_aggreate.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_aggreate_over.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_any.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binary.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binaryOp.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_boolean.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_cast.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_cursor.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_dbLink.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_exists.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_extract_mysql.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_extract_oracle.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inList.java rename src/test/java/com/alibaba/druid/bvt/sql/{EqualTest.java => EqualTest_inquery.java} (95%) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery_mysql.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery_oracle.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_interval_mysql.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_not.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_number.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_orderBy.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_query.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_some.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_unary.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_unary_mysql.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/SQLParseExceptionTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/stat/JdbcTraceManagerTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/support/monitor/PushServiceTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/utils/PGUtilsTest.java delete mode 100644 src/test/java/com/alibaba/druid/bvt/utils/ThreadLocalRandomTest.java create mode 100644 src/test/resources/com/alibaba/druid/pool/ibatis/spring-config-ibatis-1.xml diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java index 21c7fb62d9..49a83c844d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java @@ -57,18 +57,28 @@ public class SQLDataTypeImpl extends SQLObjectImpl implements SQLDataType { return this.arguments; } - public void output(StringBuffer buf) { - buf.append(this.name); - if (this.arguments.size() > 0) { - buf.append("("); - int i = 0; - for (int size = this.arguments.size(); i < size; ++i) { - if (i != 0) { - buf.append(", "); - } - ((SQLExpr) this.arguments.get(i)).output(buf); - } - buf.append(")"); - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((arguments == null) ? 0 : arguments.hashCode()); + 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 (getClass() != obj.getClass()) return false; + SQLDataTypeImpl other = (SQLDataTypeImpl) obj; + if (arguments == null) { + if (other.arguments != null) return false; + } else if (!arguments.equals(other.arguments)) return false; + 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/SQLOrderBy.java b/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java index 40826b7f6c..0221bc22dd 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java @@ -42,16 +42,24 @@ public class SQLOrderBy extends SQLObjectImpl { visitor.endVisit(this); } - public void output(StringBuffer buf) { - buf.append("ORDER "); - buf.append("BY "); - - int i = 0; - for (int size = this.items.size(); i < size; ++i) { - if (i != 0) { - buf.append(", "); - } - this.items.get(i).output(buf); - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((items == null) ? 0 : items.hashCode()); + return result; } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + SQLOrderBy other = (SQLOrderBy) obj; + if (items == null) { + if (other.items != null) return false; + } else if (!items.equals(other.items)) return false; + return true; + } + } 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 db2a2435e8..9d7817c8f4 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 @@ -24,9 +24,9 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable { private static final long serialVersionUID = 1L; - private SQLExpr left; - private SQLExpr right; - private SQLBinaryOperator operator; + private SQLExpr left; + private SQLExpr right; + private SQLBinaryOperator operator; public SQLBinaryOpExpr(){ @@ -76,14 +76,6 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable { this.operator = operator; } - public void output(StringBuffer buf) { - this.left.output(buf); - buf.append(" "); - buf.append(this.operator.name); - buf.append(" "); - this.right.output(buf); - } - protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.left); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCastExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCastExpr.java index dce42ce5b3..1249f54c13 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCastExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCastExpr.java @@ -50,14 +50,6 @@ public class SQLCastExpr extends SQLExprImpl { this.dataType = dataType; } - public void output(StringBuffer buf) { - buf.append("CAST("); - this.expr.output(buf); - buf.append(" AS "); - this.dataType.output(buf); - buf.append(")"); - } - protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.expr); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateLiteralValue.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateLiteralValue.java deleted file mode 100644 index 0a76714402..0000000000 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateLiteralValue.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.ast.expr; - -public class SQLDateLiteralValue { - - private int years; - private int months; - private int days; - - public int getYears() { - return years; - } - - public void setYears(int years) { - this.years = years; - } - - public int getMonths() { - return months; - } - - public void setMonths(int months) { - this.months = months; - } - - public int getDays() { - return days; - } - - public void setDays(int days) { - this.days = days; - } - - public void output(StringBuffer buf) { - buf.append(years); - buf.append("-"); - buf.append(months); - buf.append("-"); - buf.append(days); - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java index fadba0061d..a8c3e7b4dd 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java @@ -54,4 +54,25 @@ public class SQLExprTableSource extends SQLTableSourceImpl { public void output(StringBuffer buf) { this.expr.output(buf); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((expr == null) ? 0 : expr.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + SQLExprTableSource other = (SQLExprTableSource) obj; + if (expr == null) { + if (other.expr != null) return false; + } else if (!expr.equals(other.expr)) return false; + return true; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLIndexDefinition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLIndexDefinition.java deleted file mode 100644 index ba90a3db9a..0000000000 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLIndexDefinition.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.ast.statement; - - -public class SQLIndexDefinition { - -} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java index 5d78228a68..fe740dc152 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java @@ -29,15 +29,15 @@ public class SQLSelectItem extends SQLObjectImpl { public SQLSelectItem(){ } - - public SQLSelectItem(SQLExpr expr) { + + public SQLSelectItem(SQLExpr expr){ this(expr, null); } public SQLSelectItem(SQLExpr expr, String alias){ this.expr = expr; this.alias = alias; - + if (expr != null) { expr.setParent(this); } @@ -76,4 +76,29 @@ public class SQLSelectItem extends SQLObjectImpl { } visitor.endVisit(this); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((alias == null) ? 0 : alias.hashCode()); + result = prime * result + ((expr == null) ? 0 : expr.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + SQLSelectItem other = (SQLSelectItem) obj; + if (alias == null) { + if (other.alias != null) return false; + } else if (!alias.equals(other.alias)) return false; + if (expr == null) { + if (other.expr != null) return false; + } else if (!expr.equals(other.expr)) return false; + return true; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java index 846322744c..663bd1ee57 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectOrderByItem.java @@ -63,4 +63,31 @@ public class SQLSelectOrderByItem extends SQLObjectImpl { visitor.endVisit(this); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((collate == null) ? 0 : collate.hashCode()); + result = prime * result + ((expr == null) ? 0 : expr.hashCode()); + result = prime * result + ((type == null) ? 0 : type.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + SQLSelectOrderByItem other = (SQLSelectOrderByItem) obj; + if (collate == null) { + if (other.collate != null) return false; + } else if (!collate.equals(other.collate)) return false; + if (expr == null) { + if (other.expr != null) return false; + } else if (!expr.equals(other.expr)) return false; + if (type != other.type) return false; + return true; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableConstaintImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableConstaintImpl.java deleted file mode 100644 index 163620fa3c..0000000000 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableConstaintImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.ast.statement; - -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -@SuppressWarnings("serial") -public class SQLTableConstaintImpl extends SQLConstaintImpl implements SQLTableConstaint { - - public SQLTableConstaintImpl(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlExtractExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlExtractExpr.java index 5222174260..a04e37407f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlExtractExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlExtractExpr.java @@ -46,13 +46,6 @@ public class MySqlExtractExpr extends SQLExprImpl implements MySqlExpr { this.unit = unit; } - @Override - public void output(StringBuffer buf) { - value.output(buf); - buf.append(' '); - buf.append(unit.name()); - } - protected void accept0(SQLASTVisitor visitor) { MySqlASTVisitor mysqlVisitor = (MySqlASTVisitor) visitor; mysqlVisitor.visit(this); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlHexadecimalExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlHexadecimalExpr.java deleted file mode 100644 index 16c5be906d..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlHexadecimalExpr.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.mysql.ast.expr; - -import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; - - -public class MySqlHexadecimalExpr extends MySqlExprImpl implements SQLLiteralExpr { - - private static final long serialVersionUID = 1L; - - @Override - public void accept0(MySqlASTVisitor visitor) { - - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java index f24b7388f8..64d1a21a08 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java @@ -248,19 +248,7 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO return; } - if (visitor.visit(this)) { - acceptChild(visitor, this.selectList); - acceptChild(visitor, this.from); - acceptChild(visitor, this.where); - acceptChild(visitor, this.groupBy); - acceptChild(visitor, this.orderBy); - acceptChild(visitor, this.limit); - acceptChild(visitor, this.procedureName); - acceptChild(visitor, this.procedureArgumentList); - acceptChild(visitor, this.into); - } - - visitor.endVisit(this); + super.accept0(visitor); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleExtractExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleExtractExpr.java index 9e2a548a5d..0bc303200f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleExtractExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleExtractExpr.java @@ -46,15 +46,6 @@ public class OracleExtractExpr extends SQLExprImpl implements OracleExpr { this.from = from; } - public void output(StringBuffer buf) { - buf.append("EXTRACT("); - buf.append(this.unit.name()); - buf.append(" FROM "); - this.from.output(buf); - buf.append(")"); - } - - @Override protected void accept0(SQLASTVisitor visitor) { this.accept0((OracleASTVisitor) visitor); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java index d26cc5b3e9..5af1444117 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java @@ -19,8 +19,6 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLCommentHint; -import com.alibaba.druid.sql.ast.SQLSetQuantifier; -import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; @@ -66,14 +64,7 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock { return; } - if (visitor.visit(this)) { - acceptChild(visitor, this.selectList); - acceptChild(visitor, this.into); - acceptChild(visitor, this.from); - acceptChild(visitor, this.where); - acceptChild(visitor, this.groupBy); - } - visitor.endVisit(this); + super.accept0(visitor); } protected void accept0(OracleASTVisitor visitor) { @@ -89,46 +80,4 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock { } visitor.endVisit(this); } - - public void output(StringBuffer buf) { - buf.append("SELECT "); - - if (SQLSetQuantifier.ALL == this.distionOption) { - buf.append("ALL "); - } else if (SQLSetQuantifier.DISTINCT == this.distionOption) { - buf.append("DISTINCT "); - } else if (SQLSetQuantifier.UNIQUE == this.distionOption) { - buf.append("UNIQUE "); - } - - int i = 0; - for (int size = this.selectList.size(); i < size; ++i) { - if (i != 0) { - buf.append(", "); - } - ((SQLSelectItem) this.selectList.get(i)).output(buf); - } - - buf.append(" FROM "); - if (this.from != null) { - buf.append("DUAL"); - } else { - this.from.output(buf); - } - - if (this.where != null) { - buf.append(" WHERE "); - this.where.output(buf); - } - - if (this.hierachicalQueryClause != null) { - buf.append(" "); - this.hierachicalQueryClause.output(buf); - } - - if (this.groupBy != null) { - buf.append(" "); - this.groupBy.output(buf); - } - } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index d2e36b9644..dbd4d15df7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -366,6 +366,12 @@ public class OracleExprParser extends SQLExprParser { sqlExpr = new OracleBinaryDoubleExpr(Double.parseDouble(lexer.numberString())); lexer.nextToken(); break; + case LPAREN: + lexer.nextToken(); + sqlExpr = expr(); + accept(Token.RPAREN); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Plus, sqlExpr); + break; default: throw new ParserException("TODO"); } @@ -412,6 +418,12 @@ public class OracleExprParser extends SQLExprParser { sqlExpr = expr(); sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr); break; + case LPAREN: + lexer.nextToken(); + sqlExpr = expr(); + accept(Token.RPAREN); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr); + break; default: throw new ParserException("TODO " + lexer.token()); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleTokenType.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleTokenType.java deleted file mode 100644 index e576cb6d1b..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleTokenType.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.oracle.parser; - -public final class OracleTokenType { - - public static final int LineComment = 0; - public static final int Identifier = 1; - public static final int Variable = 2; - public static final int Keyword = 3; - public static final int Operator = 4; - public static final int Punctuation = 5; - public static final int Char = 6; - public static final int NChar = 7; - public static final int Int = 8; - public static final int Float = 9; - public static final int Double = 10; - public static final int Decimal = 11; - public static final int EOF = 12; - public static final int Unknown = 13; - public static final int MultiLineComment = 14; - public static final int Long = 15; - public static final int HINT = 16; - - public static final String typename(int tokType) { - switch (tokType) { - case 0: - return "Comment"; - case 1: - return "Identifier"; - case 2: - return "Variable"; - case 3: - return "Keyword"; - case 4: - return "Operator"; - case 5: - return "Punctuation"; - case 6: - return "Char"; - case 7: - return "NChar"; - case 8: - return "Int"; - case 9: - return "Float"; - case 10: - return "Double"; - case 11: - return "Decimal"; - case 12: - return "EOF"; - case 16: - return "Hints"; - case 13: - case 14: - case 15: - } - return "Unknown"; - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/transact/ast/TransactSQLSelect.java b/src/main/java/com/alibaba/druid/sql/dialect/transact/ast/TransactSQLSelect.java deleted file mode 100644 index 7181ea4047..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/transact/ast/TransactSQLSelect.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.transact.ast; - -public class TransactSQLSelect { - -} diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 9daf0f2e29..6b6f12a4ae 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -335,13 +335,20 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); break; case IDENTIFIER: // 当负号后面为字段的情况 - sqlExpr = new SQLIdentifierExpr('-' + lexer.stringVal()); + sqlExpr = new SQLIdentifierExpr(lexer.stringVal()); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr); lexer.nextToken(); break; case QUES: sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, new SQLVariantRefExpr("?")); lexer.nextToken(); break; + case LPAREN: + lexer.nextToken(); + sqlExpr = expr(); + accept(Token.RPAREN); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr); + break; default: throw new ParserException("TODO : " + lexer.token()); } @@ -357,6 +364,12 @@ public class SQLExprParser extends SQLParser { sqlExpr = new SQLNumberExpr(lexer.decimalValue()); lexer.nextToken(); break; + case LPAREN: + lexer.nextToken(); + sqlExpr = expr(); + accept(Token.RPAREN); + sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Plus, sqlExpr); + break; default: throw new ParserException("TODO"); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParseException.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParseException.java index 655e0c5db8..cdc82ec196 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParseException.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParseException.java @@ -20,20 +20,7 @@ import com.alibaba.druid.DruidRuntimeException; /** * @author wenshao */ +@SuppressWarnings("serial") @Deprecated public class SQLParseException extends DruidRuntimeException { - - private static final long serialVersionUID = 1L; - - public SQLParseException(){ - super(); - } - - public SQLParseException(String message){ - super(message); - } - - public SQLParseException(String message, Throwable cause){ - super(message, cause); - } } diff --git a/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java b/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java index 74a9dc0fbf..fe7573ca99 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java @@ -15,8 +15,9 @@ */ package com.alibaba.druid.stat; +import static com.alibaba.druid.util.JdbcSqlStatUtils.get; + import java.util.Date; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicLongFieldUpdater; @@ -30,12 +31,8 @@ import javax.management.openmbean.SimpleType; import com.alibaba.druid.proxy.DruidDriver; import com.alibaba.druid.proxy.jdbc.StatementExecuteType; -import com.alibaba.druid.util.IOUtils; import com.alibaba.druid.util.JMXUtils; -/** - * @author wenshao - */ public final class JdbcSqlStat implements JdbcSqlStatMBean { private final String sql; @@ -378,85 +375,90 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { inputStreamOpenCountUpdater.set(this, 0); readerOpenCountUpdater.set(this, 0); } - + public JdbcSqlStatValue getValueAndReset() { + return getValue(true); + } + + public JdbcSqlStatValue getValue(boolean reset) { JdbcSqlStatValue val = new JdbcSqlStatValue(); - val.sql = sql; - val.executeLastStartTime = executeLastStartTime; + val.setDbType(dbType); + val.setSql(sql); + val.setExecuteLastStartTime(executeLastStartTime); executeLastStartTime = 0; - val.executeBatchSizeTotal = executeBatchSizeTotalUpdater.getAndSet(this, 0); - val.executeBatchSizeMax = executeBatchSizeMaxUpdater.getAndSet(this, 0); + val.setExecuteBatchSizeTotal(get(this, executeBatchSizeTotalUpdater, reset)); + val.setExecuteBatchSizeMax(get(this, executeBatchSizeMaxUpdater, reset)); - val.executeSuccessCount = executeSuccessCountUpdater.getAndSet(this, 0); - val.executeSpanNanoTotal = executeSpanNanoTotalUpdater.getAndSet(this, 0); - val.executeSpanNanoMax = executeSpanNanoMaxUpdater.getAndSet(this, 0); - val.executeNanoSpanMaxOccurTime = executeNanoSpanMaxOccurTime; + val.setExecuteSuccessCount(get(this, executeSuccessCountUpdater, reset)); + val.setExecuteSpanNanoTotal(get(this, executeSpanNanoTotalUpdater, reset)); + val.setExecuteSpanNanoMax(get(this, executeSpanNanoMaxUpdater, reset)); + val.setExecuteNanoSpanMaxOccurTime(executeNanoSpanMaxOccurTime); executeNanoSpanMaxOccurTime = 0; - val.runningCount = this.runningCount; + val.setRunningCount(this.runningCount); - val.concurrentMax = concurrentMaxUpdater.getAndSet(this, 0); + val.setConcurrentMax(get(this, concurrentMaxUpdater, reset)); - val.executeErrorCount = executeErrorCountUpdater.getAndSet(this, 0); + val.setExecuteErrorCount(get(this, executeErrorCountUpdater, reset)); - val.executeErrorLast = executeErrorLast; + val.setExecuteErrorLast(executeErrorLast); executeErrorLast = null; - val.executeErrorLastTime = executeErrorLastTime; + val.setExecuteErrorLastTime(executeErrorLastTime); executeErrorLastTime = 0; - val.updateCount = updateCountUpdater.getAndSet(this, 0); - val.updateCountMax = updateCountMaxUpdater.getAndSet(this, 0); - val.fetchRowCount = fetchRowCountUpdater.getAndSet(this, 0); - val.fetchRowCountMax = fetchRowCountMaxUpdater.getAndSet(this, 0); + val.setUpdateCount(get(this, updateCountUpdater, reset)); + val.setUpdateCountMax(get(this, updateCountMaxUpdater, reset)); + val.setFetchRowCount(get(this, fetchRowCountUpdater, reset)); + val.setFetchRowCountMax(get(this, fetchRowCountMaxUpdater, reset)); - val.histogram_0_1 = histogram_0_1_Updater.getAndSet(this, 0); - val.histogram_1_10 = histogram_1_10_Updater.getAndSet(this, 0); - val.histogram_10_100 = histogram_10_100_Updater.getAndSet(this, 0); - val.histogram_100_1000 = histogram_100_1000_Updater.getAndSet(this, 0); - val.histogram_1000_10000 = histogram_1000_10000_Updater.getAndSet(this, 0); - val.histogram_10000_100000 = histogram_10000_100000_Updater.getAndSet(this, 0); - val.histogram_100000_1000000 = histogram_100000_1000000_Updater.getAndSet(this, 0); - val.histogram_1000000_more = histogram_1000000_more_Updater.getAndSet(this, 0); + val.histogram_0_1 = get(this, histogram_0_1_Updater, reset); + val.histogram_1_10 = get(this, histogram_1_10_Updater, reset); + val.histogram_10_100 = get(this, histogram_10_100_Updater, reset); + val.histogram_100_1000 = get(this, histogram_100_1000_Updater, reset); + val.histogram_1000_10000 = get(this, histogram_1000_10000_Updater, reset); + val.histogram_10000_100000 = get(this, histogram_10000_100000_Updater, reset); + val.histogram_100000_1000000 = get(this, histogram_100000_1000000_Updater, reset); + val.histogram_1000000_more = get(this, histogram_1000000_more_Updater, reset); - val.lastSlowParameters = lastSlowParameters; + val.setLastSlowParameters(lastSlowParameters); lastSlowParameters = null; - val.inTransactionCount = inTransactionCountUpdater.getAndSet(this, 0); - val.resultSetHoldTimeNano = resultSetHoldTimeNanoUpdater.getAndSet(this, 0); - val.executeAndResultSetHoldTime = executeAndResultSetHoldTimeUpdater.getAndSet(this, 0); + val.setInTransactionCount(get(this, inTransactionCountUpdater, reset)); + val.setResultSetHoldTimeNano(get(this, resultSetHoldTimeNanoUpdater, reset)); + val.setExecuteAndResultSetHoldTime(get(this, executeAndResultSetHoldTimeUpdater, reset)); - val.fetchRowCount_0_1 = fetchRowCount_0_1_Updater.getAndSet(this, 0); - val.fetchRowCount_1_10 = fetchRowCount_1_10_Updater.getAndSet(this, 0); - val.fetchRowCount_10_100 = fetchRowCount_10_100_Updater.getAndSet(this, 0); - val.fetchRowCount_100_1000 = fetchRowCount_100_1000_Updater.getAndSet(this, 0); - val.fetchRowCount_1000_10000 = fetchRowCount_1000_10000_Updater.getAndSet(this, 0); - val.fetchRowCount_10000_more = fetchRowCount_10000_more_Updater.getAndSet(this, 0); + val.fetchRowCount_0_1 = get(this, fetchRowCount_0_1_Updater, reset); + val.fetchRowCount_1_10 = get(this, fetchRowCount_1_10_Updater, reset); + val.fetchRowCount_10_100 = get(this, fetchRowCount_10_100_Updater, reset); + val.fetchRowCount_100_1000 = get(this, fetchRowCount_100_1000_Updater, reset); + val.fetchRowCount_1000_10000 = get(this, fetchRowCount_1000_10000_Updater, reset); + val.fetchRowCount_10000_more = get(this, fetchRowCount_10000_more_Updater, reset); - val.updateCount_0_1 = updateCount_0_1_Updater.getAndSet(this, 0); - val.updateCount_1_10 = updateCount_1_10_Updater.getAndSet(this, 0); - val.updateCount_10_100 = updateCount_10_100_Updater.getAndSet(this, 0); - val.updateCount_100_1000 = updateCount_100_1000_Updater.getAndSet(this, 0); - val.updateCount_1000_10000 = updateCount_1000_10000_Updater.getAndSet(this, 0); - val.updateCount_10000_more = updateCount_10000_more_Updater.getAndSet(this, 0); + val.updateCount_0_1 = get(this, updateCount_0_1_Updater, reset); + val.updateCount_1_10 = get(this, updateCount_1_10_Updater, reset); + val.updateCount_10_100 = get(this, updateCount_10_100_Updater, reset); + val.updateCount_100_1000 = get(this, updateCount_100_1000_Updater, reset); + val.updateCount_1000_10000 = get(this, updateCount_1000_10000_Updater, reset); + val.updateCount_10000_more = get(this, updateCount_10000_more_Updater, reset); - val.executeAndResultHoldTime_0_1 = executeAndResultHoldTime_0_1_Updater.getAndSet(this, 0); - val.executeAndResultHoldTime_1_10 = executeAndResultHoldTime_1_10_Updater.getAndSet(this, 0); - val.executeAndResultHoldTime_10_100 = executeAndResultHoldTime_10_100_Updater.getAndSet(this, 0); - val.executeAndResultHoldTime_100_1000 = executeAndResultHoldTime_100_1000_Updater.getAndSet(this, 0); - val.executeAndResultHoldTime_1000_10000 = executeAndResultHoldTime_1000_10000_Updater.getAndSet(this, 0); - val.executeAndResultHoldTime_10000_100000 = executeAndResultHoldTime_10000_100000_Updater.getAndSet(this, 0); - val.executeAndResultHoldTime_100000_1000000 = executeAndResultHoldTime_100000_1000000_Updater.getAndSet(this, 0); - val.executeAndResultHoldTime_1000000_more = executeAndResultHoldTime_1000000_more_Updater.getAndSet(this, 0); + val.executeAndResultHoldTime_0_1 = get(this, executeAndResultHoldTime_0_1_Updater, reset); + val.executeAndResultHoldTime_1_10 = get(this, executeAndResultHoldTime_1_10_Updater, reset); + val.executeAndResultHoldTime_10_100 = get(this, executeAndResultHoldTime_10_100_Updater, reset); + val.executeAndResultHoldTime_100_1000 = get(this, executeAndResultHoldTime_100_1000_Updater, reset); + val.executeAndResultHoldTime_1000_10000 = get(this, executeAndResultHoldTime_1000_10000_Updater, reset); + val.executeAndResultHoldTime_10000_100000 = get(this, executeAndResultHoldTime_10000_100000_Updater, reset); + val.executeAndResultHoldTime_100000_1000000 = get(this, executeAndResultHoldTime_100000_1000000_Updater, reset); + val.executeAndResultHoldTime_1000000_more = get(this, executeAndResultHoldTime_1000000_more_Updater, reset); - val.blobOpenCount = blobOpenCountUpdater.getAndSet(this, 0); - val.clobOpenCount = clobOpenCountUpdater.getAndSet(this, 0); - val.readStringLength = readStringLengthUpdater.getAndSet(this, 0); - val.readBytesLength = readBytesLengthUpdater.getAndSet(this, 0); - val.inputStreamOpenCount = inputStreamOpenCountUpdater.getAndSet(this, 0); - val.readerOpenCount = readerOpenCountUpdater.getAndSet(this, 0); + val.setBlobOpenCount(get(this, blobOpenCountUpdater, reset)); + val.setClobOpenCount(get(this, clobOpenCountUpdater, reset)); + val.setReadStringLength(get(this, readStringLengthUpdater, reset)); + val.setReadBytesLength(get(this, readBytesLengthUpdater, reset)); + val.setInputStreamOpenCount(get(this, inputStreamOpenCountUpdater, reset)); + val.setReaderOpenCount(get(this, readerOpenCountUpdater, reset)); return val; } @@ -922,71 +924,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { } public Map getData() throws JMException { - Map map = new HashMap(); - - // 0 - 4 - map.put("ID", id); - map.put("DataSource", dataSource); - map.put("SQL", sql); - map.put("ExecuteCount", getExecuteCount()); - map.put("ErrorCount", getErrorCount()); - - // 5 - 9 - map.put("TotalTime", getExecuteMillisTotal()); - map.put("LastTime", getExecuteLastStartTime()); - map.put("MaxTimespan", getExecuteMillisMax()); - map.put("LastError", JMXUtils.getErrorCompositeData(this.getExecuteErrorLast())); - map.put("EffectedRowCount", getUpdateCount()); - - // 10 - 14 - map.put("FetchRowCount", getFetchRowCount()); - map.put("MaxTimespanOccurTime", getExecuteNanoSpanMaxOccurTime()); - map.put("BatchSizeMax", getExecuteBatchSizeMax()); - map.put("BatchSizeTotal", getExecuteBatchSizeTotal()); - map.put("ConcurrentMax", getConcurrentMax()); - - // 15 - - map.put("RunningCount", getRunningCount()); // 15 - map.put("Name", getName()); // 16 - map.put("File", getFile()); // 17 - - Throwable lastError = this.executeErrorLast; - if (lastError != null) { - map.put("LastErrorMessage", lastError.getMessage()); // 18 - map.put("LastErrorClass", lastError.getClass().getName()); // 19 - - map.put("LastErrorStackTrace", IOUtils.getStackTrace(lastError)); // 20 - map.put("LastErrorTime", new Date(executeErrorLastTime)); // 21 - } else { - map.put("LastErrorMessage", null); - map.put("LastErrorClass", null); - map.put("LastErrorStackTrace", null); - map.put("LastErrorTime", null); - } - - map.put("DbType", dbType); // 22 - map.put("URL", null); // 23 - map.put("InTransactionCount", getInTransactionCount()); // 24 - - map.put("Histogram", this.getHistogramValues()); // 25 - map.put("LastSlowParameters", lastSlowParameters); // 26 - map.put("ResultSetHoldTime", getResultSetHoldTimeMilis()); // 27 - map.put("ExecuteAndResultSetHoldTime", this.getExecuteAndResultSetHoldTimeMilis()); // 28 - map.put("FetchRowCountHistogram", this.getFetchRowCountHistogramValues()); // 29 - - map.put("EffectedRowCountHistogram", this.getUpdateCountHistogramValues()); // 30 - map.put("ExecuteAndResultHoldTimeHistogram", this.getExecuteAndResultHoldTimeHistogramValues()); // 31 - map.put("EffectedRowCountMax", getUpdateCountMax()); // 32 - map.put("FetchRowCountMax", getFetchRowCountMax()); // 33 - map.put("ClobOpenCount", getClobOpenCount()); // 34 - - map.put("BlobOpenCount", getBlobOpenCount()); // 35 - map.put("ReadStringLength", getReadStringLength()); // 36 - map.put("ReadBytesLength", getReadBytesLength()); // 37 - map.put("InputStreamOpenCount", getInputStreamOpenCount()); // 38 - map.put("ReaderOpenCount", getReaderOpenCount()); // 39 - - return map; + return getValue(false).getData(); } public long[] getHistogramValues() { diff --git a/src/main/java/com/alibaba/druid/stat/JdbcSqlStatValue.java b/src/main/java/com/alibaba/druid/stat/JdbcSqlStatValue.java index a7e5cc2241..8b9648bf78 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcSqlStatValue.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcSqlStatValue.java @@ -15,6 +15,15 @@ */ package com.alibaba.druid.stat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import javax.management.JMException; + +import com.alibaba.druid.util.IOUtils; +import com.alibaba.druid.util.JMXUtils; + public class JdbcSqlStatValue { protected String sql; @@ -81,14 +90,14 @@ public class JdbcSqlStatValue { }; } - public long executeAndResultHoldTime_0_1; - public long executeAndResultHoldTime_1_10; - public int executeAndResultHoldTime_10_100; - public int executeAndResultHoldTime_100_1000; - public int executeAndResultHoldTime_1000_10000; - public int executeAndResultHoldTime_10000_100000; - public int executeAndResultHoldTime_100000_1000000; - public int executeAndResultHoldTime_1000000_more; + protected long executeAndResultHoldTime_0_1; + protected long executeAndResultHoldTime_1_10; + protected int executeAndResultHoldTime_10_100; + protected int executeAndResultHoldTime_100_1000; + protected int executeAndResultHoldTime_1000_10000; + protected int executeAndResultHoldTime_10000_100000; + protected int executeAndResultHoldTime_100000_1000000; + protected int executeAndResultHoldTime_1000000_more; public long[] getExecuteAndResultHoldHistogram() { return new long[] { executeAndResultHoldTime_0_1, // @@ -102,12 +111,12 @@ public class JdbcSqlStatValue { }; } - public long fetchRowCount_0_1; - public long fetchRowCount_1_10; - public long fetchRowCount_10_100; - public int fetchRowCount_100_1000; - public int fetchRowCount_1000_10000; - public int fetchRowCount_10000_more; + protected long fetchRowCount_0_1; + protected long fetchRowCount_1_10; + protected long fetchRowCount_10_100; + protected int fetchRowCount_100_1000; + protected int fetchRowCount_1000_10000; + protected int fetchRowCount_10000_more; public long[] getFetchRowHistogram() { return new long[] { fetchRowCount_0_1, // @@ -119,12 +128,12 @@ public class JdbcSqlStatValue { }; } - public long updateCount_0_1; - public long updateCount_1_10; - public long updateCount_10_100; - public int updateCount_100_1000; - public int updateCount_1000_10000; - public int updateCount_10000_more; + protected long updateCount_0_1; + protected long updateCount_1_10; + protected long updateCount_10_100; + protected int updateCount_100_1000; + protected int updateCount_1000_10000; + protected int updateCount_10000_more; public long[] getUpdateHistogram() { return new long[] { updateCount_0_1, // @@ -172,9 +181,17 @@ public class JdbcSqlStatValue { this.dataSource = dataSource; } - public long getExecuteLastStartTime() { + public long getExecuteLastStartTimeMillis() { return executeLastStartTime; } + + public Date getExecuteLastStartTime() { + if (executeLastStartTime <= 0) { + return null; + } + + return new Date(executeLastStartTime); + } public void setExecuteLastStartTime(long executeLastStartTime) { this.executeLastStartTime = executeLastStartTime; @@ -244,7 +261,7 @@ public class JdbcSqlStatValue { this.resultSetHoldTimeNano = resultSetHoldTimeNano; } - public long getExecuteAndResultSetHoldTime() { + public long getExecuteAndResultSetHoldTimeNano() { return executeAndResultSetHoldTime; } @@ -276,9 +293,23 @@ public class JdbcSqlStatValue { this.dbType = dbType; } - public long getExecuteNanoSpanMaxOccurTime() { + public long getExecuteNanoSpanMaxOccurTimeMillis() { return executeNanoSpanMaxOccurTime; } + + public Date getExecuteNanoSpanMaxOccurTime() { + if (executeNanoSpanMaxOccurTime <= 0) { + return null; + } + return new Date(executeNanoSpanMaxOccurTime); + } + + public Date getExecuteErrorLastTime() { + if (executeErrorLastTime <= 0) { + return null; + } + return new Date(executeErrorLastTime); + } public void setExecuteNanoSpanMaxOccurTime(long executeNanoSpanMaxOccurTime) { this.executeNanoSpanMaxOccurTime = executeNanoSpanMaxOccurTime; @@ -300,7 +331,7 @@ public class JdbcSqlStatValue { this.executeErrorLast = executeErrorLast; } - public long getExecuteErrorLastTime() { + public long getExecuteErrorLastTimeMillis() { return executeErrorLastTime; } @@ -404,4 +435,131 @@ public class JdbcSqlStatValue { this.readerOpenCount = readerOpenCount; } + public long[] getHistogramValues() { + return new long[] { + // + histogram_0_1, // + histogram_1_10, // + histogram_10_100, // + histogram_100_1000, // + histogram_1000_10000, // + histogram_10000_100000, // + histogram_100000_1000000, // + histogram_1000000_more // + }; + } + + public long[] getFetchRowCountHistogramValues() { + return new long[] { + // + fetchRowCount_0_1, // + fetchRowCount_1_10, // + fetchRowCount_10_100, // + fetchRowCount_100_1000, // + fetchRowCount_1000_10000, // + fetchRowCount_10000_more // + }; + } + + public long[] getUpdateCountHistogramValues() { + return new long[] { + // + updateCount_0_1, // + updateCount_1_10, // + updateCount_10_100, // + updateCount_100_1000, // + updateCount_1000_10000, // + updateCount_10000_more // + }; + } + + public long[] getExecuteAndResultHoldTimeHistogramValues() { + return new long[] { + // + executeAndResultHoldTime_0_1, // + executeAndResultHoldTime_1_10, // + executeAndResultHoldTime_10_100, // + executeAndResultHoldTime_100_1000, // + executeAndResultHoldTime_1000_10000, // + executeAndResultHoldTime_10000_100000, // + executeAndResultHoldTime_100000_1000000, // + executeAndResultHoldTime_1000000_more // + }; + } + + public long getResultSetHoldTimeMilis() { + return getResultSetHoldTimeNano() / (1000 * 1000); + } + + public long getExecuteAndResultSetHoldTimeMilis() { + return getExecuteAndResultSetHoldTimeNano() / (1000 * 1000); + } + + public Map getData() throws JMException { + Map map = new HashMap(); + + // 0 - 4 + map.put("ID", id); + map.put("DataSource", dataSource); + map.put("SQL", sql); + map.put("ExecuteCount", getExecuteCount()); + map.put("ErrorCount", getExecuteErrorCount()); + + // 5 - 9 + map.put("TotalTime", getExecuteMillisTotal()); + map.put("LastTime", getExecuteLastStartTime()); + map.put("MaxTimespan", getExecuteMillisMax()); + map.put("LastError", JMXUtils.getErrorCompositeData(this.getExecuteErrorLast())); + map.put("EffectedRowCount", getUpdateCount()); + + // 10 - 14 + map.put("FetchRowCount", getFetchRowCount()); + map.put("MaxTimespanOccurTime", getExecuteNanoSpanMaxOccurTime()); + map.put("BatchSizeMax", (long) getExecuteBatchSizeMax()); + map.put("BatchSizeTotal", getExecuteBatchSizeTotal()); + map.put("ConcurrentMax", (long) getConcurrentMax()); + + // 15 - + map.put("RunningCount", (long) getRunningCount()); // 15 + map.put("Name", getName()); // 16 + map.put("File", getFile()); // 17 + + Throwable lastError = this.executeErrorLast; + if (lastError != null) { + map.put("LastErrorMessage", lastError.getMessage()); // 18 + map.put("LastErrorClass", lastError.getClass().getName()); // 19 + + map.put("LastErrorStackTrace", IOUtils.getStackTrace(lastError)); // 20 + map.put("LastErrorTime", new Date(executeErrorLastTime)); // 21 + } else { + map.put("LastErrorMessage", null); + map.put("LastErrorClass", null); + map.put("LastErrorStackTrace", null); + map.put("LastErrorTime", null); + } + + map.put("DbType", dbType); // 22 + map.put("URL", null); // 23 + map.put("InTransactionCount", getInTransactionCount()); // 24 + + map.put("Histogram", this.getHistogramValues()); // 25 + map.put("LastSlowParameters", lastSlowParameters); // 26 + map.put("ResultSetHoldTime", getResultSetHoldTimeMilis()); // 27 + map.put("ExecuteAndResultSetHoldTime", this.getExecuteAndResultSetHoldTimeMilis()); // 28 + map.put("FetchRowCountHistogram", this.getFetchRowCountHistogramValues()); // 29 + + map.put("EffectedRowCountHistogram", this.getUpdateCountHistogramValues()); // 30 + map.put("ExecuteAndResultHoldTimeHistogram", this.getExecuteAndResultHoldTimeHistogramValues()); // 31 + map.put("EffectedRowCountMax", getUpdateCountMax()); // 32 + map.put("FetchRowCountMax", getFetchRowCountMax()); // 33 + map.put("ClobOpenCount", getClobOpenCount()); // 34 + + map.put("BlobOpenCount", getBlobOpenCount()); // 35 + map.put("ReadStringLength", getReadStringLength()); // 36 + map.put("ReadBytesLength", getReadBytesLength()); // 37 + map.put("InputStreamOpenCount", getInputStreamOpenCount()); // 38 + map.put("ReaderOpenCount", getReaderOpenCount()); // 39 + + return map; + } } diff --git a/src/main/java/com/alibaba/druid/stat/JdbcTraceManager.java b/src/main/java/com/alibaba/druid/stat/JdbcTraceManager.java index 99ec14af3c..ba6f9d2199 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcTraceManager.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcTraceManager.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.stat; +@Deprecated public class JdbcTraceManager implements JdbcTraceManagerMBean { private final static JdbcTraceManager instance = new JdbcTraceManager(); diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java index 918fd2846e..c32a5fd87c 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java @@ -15,95 +15,92 @@ */ package com.alibaba.druid.support.http.stat; +import static com.alibaba.druid.util.JdbcSqlStatUtils.get; + import java.util.Date; -import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicLongFieldUpdater; -import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import com.alibaba.druid.support.profile.ProfileStat; public class WebURIStat { - private final String uri; + private final String uri; - private volatile int runningCount; - private volatile int concurrentMax; - private volatile long requestCount; - private volatile long requestTimeNano; - final static AtomicIntegerFieldUpdater runningCountUpdater = AtomicIntegerFieldUpdater.newUpdater(WebURIStat.class, - "runningCount"); - final static AtomicIntegerFieldUpdater concurrentMaxUpdater = AtomicIntegerFieldUpdater.newUpdater(WebURIStat.class, - "concurrentMax"); - final static AtomicLongFieldUpdater requestCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "requestCount"); - final static AtomicLongFieldUpdater requestTimeNanoUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "requestTimeNano"); + private volatile int runningCount; + private volatile int concurrentMax; + private volatile long requestCount; + private volatile long requestTimeNano; + final static AtomicIntegerFieldUpdater runningCountUpdater = AtomicIntegerFieldUpdater.newUpdater(WebURIStat.class, + "runningCount"); + final static AtomicIntegerFieldUpdater concurrentMaxUpdater = AtomicIntegerFieldUpdater.newUpdater(WebURIStat.class, + "concurrentMax"); + final static AtomicLongFieldUpdater requestCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "requestCount"); + final static AtomicLongFieldUpdater requestTimeNanoUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "requestTimeNano"); - private volatile long jdbcFetchRowCount; - private volatile long jdbcFetchRowPeak; // 单次请求读取行数的峰值 - final static AtomicLongFieldUpdater jdbcFetchRowCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcFetchRowCount"); - final static AtomicLongFieldUpdater jdbcFetchRowPeakUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcFetchRowPeak"); + private volatile long jdbcFetchRowCount; + private volatile long jdbcFetchRowPeak; // 单次请求读取行数的峰值 + final static AtomicLongFieldUpdater jdbcFetchRowCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcFetchRowCount"); + final static AtomicLongFieldUpdater jdbcFetchRowPeakUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcFetchRowPeak"); - private volatile long jdbcUpdateCount; - private volatile long jdbcUpdatePeak; // 单次请求更新行数的峰值 - final static AtomicLongFieldUpdater jdbcUpdateCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcUpdateCount"); - final static AtomicLongFieldUpdater jdbcUpdatePeakUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcUpdatePeak"); + private volatile long jdbcUpdateCount; + private volatile long jdbcUpdatePeak; // 单次请求更新行数的峰值 + final static AtomicLongFieldUpdater jdbcUpdateCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcUpdateCount"); + final static AtomicLongFieldUpdater jdbcUpdatePeakUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcUpdatePeak"); - private volatile long jdbcExecuteCount; - private volatile long jdbcExecuteErrorCount; - private volatile long jdbcExecutePeak; // 单次请求执行SQL次数的峰值 - private volatile long jdbcExecuteTimeNano; - final static AtomicLongFieldUpdater jdbcExecuteCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcExecuteCount"); - final static AtomicLongFieldUpdater jdbcExecuteErrorCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcExecuteErrorCount"); - final static AtomicLongFieldUpdater jdbcExecutePeakUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcExecutePeak"); - final static AtomicLongFieldUpdater jdbcExecuteTimeNanoUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcExecuteTimeNano"); + private volatile long jdbcExecuteCount; + private volatile long jdbcExecuteErrorCount; + private volatile long jdbcExecutePeak; // 单次请求执行SQL次数的峰值 + private volatile long jdbcExecuteTimeNano; + final static AtomicLongFieldUpdater jdbcExecuteCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcExecuteCount"); + final static AtomicLongFieldUpdater jdbcExecuteErrorCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcExecuteErrorCount"); + final static AtomicLongFieldUpdater jdbcExecutePeakUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcExecutePeak"); + final static AtomicLongFieldUpdater jdbcExecuteTimeNanoUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcExecuteTimeNano"); - private volatile long jdbcCommitCount; - private volatile long jdbcRollbackCount; - final static AtomicLongFieldUpdater jdbcCommitCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcCommitCount"); - final static AtomicLongFieldUpdater jdbcRollbackCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcRollbackCount"); + private volatile long jdbcCommitCount; + private volatile long jdbcRollbackCount; + final static AtomicLongFieldUpdater jdbcCommitCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcCommitCount"); + final static AtomicLongFieldUpdater jdbcRollbackCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcRollbackCount"); - private volatile long jdbcPoolConnectionOpenCount; - private volatile long jdbcPoolConnectionCloseCount; - final static AtomicLongFieldUpdater jdbcPoolConnectionOpenCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcPoolConnectionOpenCount"); - final static AtomicLongFieldUpdater jdbcPoolConnectionCloseCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcPoolConnectionCloseCount"); + private volatile long jdbcPoolConnectionOpenCount; + private volatile long jdbcPoolConnectionCloseCount; + final static AtomicLongFieldUpdater jdbcPoolConnectionOpenCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcPoolConnectionOpenCount"); + final static AtomicLongFieldUpdater jdbcPoolConnectionCloseCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcPoolConnectionCloseCount"); - private volatile long jdbcResultSetOpenCount; - private volatile long jdbcResultSetCloseCount; + private volatile long jdbcResultSetOpenCount; + private volatile long jdbcResultSetCloseCount; - private volatile long errorCount; + private volatile long errorCount; - private volatile long lastAccessTimeMillis = -1L; + private volatile long lastAccessTimeMillis = -1L; - private volatile ProfileStat profiletat; + private volatile ProfileStat profiletat = new ProfileStat(); - final static AtomicLongFieldUpdater jdbcResultSetOpenCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcResultSetOpenCount"); - final static AtomicLongFieldUpdater jdbcResultSetCloseCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "jdbcResultSetCloseCount"); - final static AtomicLongFieldUpdater errorCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, - "errorCount"); - final static AtomicReferenceFieldUpdater profiletatUpdater; + final static AtomicLongFieldUpdater jdbcResultSetOpenCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcResultSetOpenCount"); + final static AtomicLongFieldUpdater jdbcResultSetCloseCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "jdbcResultSetCloseCount"); + final static AtomicLongFieldUpdater errorCountUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "errorCount"); + final static AtomicLongFieldUpdater lastAccessTimeMillisUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "lastAccessTimeMillis"); - static { - profiletatUpdater = AtomicReferenceFieldUpdater.newUpdater(WebURIStat.class, ProfileStat.class, "profiletat"); - } - - private final static ThreadLocal currentLocal = new ThreadLocal(); + private final static ThreadLocal currentLocal = new ThreadLocal(); public WebURIStat(String uri){ super(); @@ -364,48 +361,49 @@ public class WebURIStat { } public ProfileStat getProfiletat() { - if (profiletat != null) { - return profiletat; - } - - profiletatUpdater.compareAndSet(this, null, new ProfileStat()); - return profiletat; } + public WebURIStatValue getValue(boolean reset) { + WebURIStatValue val = new WebURIStatValue(); + + val.setUri(uri); + + val.setRunningCount(runningCount); + val.setConcurrentMax(get(this, concurrentMaxUpdater, reset)); + val.setRequestCount(get(this, requestCountUpdater, reset)); + val.setRequestTimeNano(get(this, requestTimeNanoUpdater, reset)); + + val.setJdbcFetchRowCount(get(this, jdbcFetchRowCountUpdater, reset)); + val.setJdbcFetchRowPeak(get(this, jdbcFetchRowPeakUpdater, reset)); + + val.setJdbcUpdateCount(get(this, jdbcUpdateCountUpdater, reset)); + val.setJdbcUpdatePeak(get(this, jdbcUpdatePeakUpdater, reset)); + + val.setJdbcExecuteCount(get(this, jdbcExecuteCountUpdater, reset)); + val.setJdbcExecuteErrorCount(get(this, jdbcExecuteErrorCountUpdater, reset)); + val.setJdbcExecutePeak(get(this, jdbcExecutePeakUpdater, reset)); + val.setJdbcExecuteTimeNano(get(this, jdbcExecuteTimeNanoUpdater, reset)); + + val.setJdbcCommitCount(get(this, jdbcCommitCountUpdater, reset)); + val.setJdbcRollbackCount(get(this, jdbcRollbackCountUpdater, reset)); + + val.setJdbcPoolConnectionOpenCount(get(this, jdbcPoolConnectionOpenCountUpdater, reset)); + val.setJdbcPoolConnectionCloseCount(get(this, jdbcPoolConnectionCloseCountUpdater, reset)); + + val.setJdbcResultSetOpenCount(get(this, jdbcResultSetOpenCountUpdater, reset)); + val.setJdbcResultSetCloseCount(get(this, jdbcResultSetCloseCountUpdater, reset)); + + val.setErrorCount(get(this, errorCountUpdater, reset)); + + val.setLastAccessTimeMillis(get(this, lastAccessTimeMillisUpdater, reset)); + + val.setProfileEntryStatValueList(this.getProfiletat().getStatValue(reset)); + + return val; + } + public Map getStatData() { - Map data = new LinkedHashMap(); - - data.put("URI", this.getUri()); - data.put("RunningCount", this.getRunningCount()); - data.put("ConcurrentMax", this.getConcurrentMax()); - data.put("RequestCount", this.getRequestCount()); - data.put("RequestTimeMillis", this.getRequestTimeMillis()); - data.put("ErrorCount", this.getErrorCount()); - data.put("LastAccessTime", this.getLastAccessTime()); - - data.put("JdbcCommitCount", this.getJdbcCommitCount()); - data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); - - data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); - data.put("JdbcExecuteErrorCount", this.getJdbcExecuteErrorCount()); - data.put("JdbcExecutePeak", this.getJdbcExecutePeak()); - data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); - - data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); - data.put("JdbcFetchRowPeak", this.getJdbcFetchRowPeak()); - - data.put("JdbcUpdateCount", this.getJdbcUpdateCount()); - data.put("JdbcUpdatePeak", this.getJdbcUpdatePeak()); - - data.put("JdbcPoolConnectionOpenCount", this.getJdbcPoolConnectionOpenCount()); - data.put("JdbcPoolConnectionCloseCount", this.getJdbcPoolConnectionCloseCount()); - - data.put("JdbcResultSetOpenCount", this.getJdbcResultSetOpenCount()); - data.put("JdbcResultSetCloseCount", this.getJdbcResultSetCloseCount()); - - data.put("Profiles", this.getProfiletat().getStatData()); - - return data; + return getValue(false).getStatData(); } } diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStatValue.java b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStatValue.java new file mode 100644 index 0000000000..13434cc1af --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStatValue.java @@ -0,0 +1,295 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.support.http.stat; + +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.druid.support.profile.ProfileEntryStatValue; + +public class WebURIStatValue { + + protected String uri; + + protected int runningCount; + protected int concurrentMax; + protected long requestCount; + protected long requestTimeNano; + + protected long jdbcFetchRowCount; + protected long jdbcFetchRowPeak; + + protected long jdbcUpdateCount; + protected long jdbcUpdatePeak; + + protected long jdbcExecuteCount; + protected long jdbcExecuteErrorCount; + protected long jdbcExecutePeak; // 单次请求执行SQL次数的峰值 + protected long jdbcExecuteTimeNano; + + protected long jdbcCommitCount; + protected long jdbcRollbackCount; + + protected long jdbcPoolConnectionOpenCount; + protected long jdbcPoolConnectionCloseCount; + + protected long jdbcResultSetOpenCount; + protected long jdbcResultSetCloseCount; + + protected long errorCount; + + protected long lastAccessTimeMillis = -1L; + + private List profileEntryStatValueList; + + public List getProfileEntryStatValueList() { + return profileEntryStatValueList; + } + + public void setProfileEntryStatValueList(List profileEntryStatValueList) { + this.profileEntryStatValueList = profileEntryStatValueList; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public int getRunningCount() { + return runningCount; + } + + public void setRunningCount(int runningCount) { + this.runningCount = runningCount; + } + + public int getConcurrentMax() { + return concurrentMax; + } + + public void setConcurrentMax(int concurrentMax) { + this.concurrentMax = concurrentMax; + } + + public long getRequestCount() { + return requestCount; + } + + public void setRequestCount(long requestCount) { + this.requestCount = requestCount; + } + + public long getRequestTimeNano() { + return requestTimeNano; + } + + public void setRequestTimeNano(long requestTimeNano) { + this.requestTimeNano = requestTimeNano; + } + + public long getJdbcFetchRowCount() { + return jdbcFetchRowCount; + } + + public void setJdbcFetchRowCount(long jdbcFetchRowCount) { + this.jdbcFetchRowCount = jdbcFetchRowCount; + } + + public long getJdbcFetchRowPeak() { + return jdbcFetchRowPeak; + } + + public void setJdbcFetchRowPeak(long jdbcFetchRowPeak) { + this.jdbcFetchRowPeak = jdbcFetchRowPeak; + } + + public long getJdbcUpdateCount() { + return jdbcUpdateCount; + } + + public void setJdbcUpdateCount(long jdbcUpdateCount) { + this.jdbcUpdateCount = jdbcUpdateCount; + } + + public long getJdbcUpdatePeak() { + return jdbcUpdatePeak; + } + + public void setJdbcUpdatePeak(long jdbcUpdatePeak) { + this.jdbcUpdatePeak = jdbcUpdatePeak; + } + + public long getJdbcExecuteCount() { + return jdbcExecuteCount; + } + + public void setJdbcExecuteCount(long jdbcExecuteCount) { + this.jdbcExecuteCount = jdbcExecuteCount; + } + + public long getJdbcExecuteErrorCount() { + return jdbcExecuteErrorCount; + } + + public void setJdbcExecuteErrorCount(long jdbcExecuteErrorCount) { + this.jdbcExecuteErrorCount = jdbcExecuteErrorCount; + } + + public long getJdbcExecutePeak() { + return jdbcExecutePeak; + } + + public void setJdbcExecutePeak(long jdbcExecutePeak) { + this.jdbcExecutePeak = jdbcExecutePeak; + } + + public long getJdbcExecuteTimeNano() { + return jdbcExecuteTimeNano; + } + + public void setJdbcExecuteTimeNano(long jdbcExecuteTimeNano) { + this.jdbcExecuteTimeNano = jdbcExecuteTimeNano; + } + + public long getJdbcCommitCount() { + return jdbcCommitCount; + } + + public void setJdbcCommitCount(long jdbcCommitCount) { + this.jdbcCommitCount = jdbcCommitCount; + } + + public long getJdbcRollbackCount() { + return jdbcRollbackCount; + } + + public void setJdbcRollbackCount(long jdbcRollbackCount) { + this.jdbcRollbackCount = jdbcRollbackCount; + } + + public long getJdbcPoolConnectionOpenCount() { + return jdbcPoolConnectionOpenCount; + } + + public void setJdbcPoolConnectionOpenCount(long jdbcPoolConnectionOpenCount) { + this.jdbcPoolConnectionOpenCount = jdbcPoolConnectionOpenCount; + } + + public long getJdbcPoolConnectionCloseCount() { + return jdbcPoolConnectionCloseCount; + } + + public void setJdbcPoolConnectionCloseCount(long jdbcPoolConnectionCloseCount) { + this.jdbcPoolConnectionCloseCount = jdbcPoolConnectionCloseCount; + } + + public long getJdbcResultSetOpenCount() { + return jdbcResultSetOpenCount; + } + + public void setJdbcResultSetOpenCount(long jdbcResultSetOpenCount) { + this.jdbcResultSetOpenCount = jdbcResultSetOpenCount; + } + + public long getJdbcResultSetCloseCount() { + return jdbcResultSetCloseCount; + } + + public void setJdbcResultSetCloseCount(long jdbcResultSetCloseCount) { + this.jdbcResultSetCloseCount = jdbcResultSetCloseCount; + } + + public long getErrorCount() { + return errorCount; + } + + public void setErrorCount(long errorCount) { + this.errorCount = errorCount; + } + + public long getLastAccessTimeMillis() { + return lastAccessTimeMillis; + } + + public void setLastAccessTimeMillis(long lastAccessTimeMillis) { + this.lastAccessTimeMillis = lastAccessTimeMillis; + } + + public long getRequestTimeMillis() { + return getRequestTimeNano() / (1000 * 1000); + } + + public Date getLastAccessTime() { + if (lastAccessTimeMillis < 0L) { + return null; + } + + return new Date(lastAccessTimeMillis); + } + + public long getJdbcExecuteTimeMillis() { + return getJdbcExecuteTimeNano() / (1000 * 1000); + } + + public Map getStatData() { + Map data = new LinkedHashMap(); + + data.put("URI", this.getUri()); + data.put("RunningCount", this.getRunningCount()); + data.put("ConcurrentMax", this.getConcurrentMax()); + data.put("RequestCount", this.getRequestCount()); + data.put("RequestTimeMillis", this.getRequestTimeMillis()); + data.put("ErrorCount", this.getErrorCount()); + data.put("LastAccessTime", this.getLastAccessTime()); + + data.put("JdbcCommitCount", this.getJdbcCommitCount()); + data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); + + data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); + data.put("JdbcExecuteErrorCount", this.getJdbcExecuteErrorCount()); + data.put("JdbcExecutePeak", this.getJdbcExecutePeak()); + data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); + + data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); + data.put("JdbcFetchRowPeak", this.getJdbcFetchRowPeak()); + + data.put("JdbcUpdateCount", this.getJdbcUpdateCount()); + data.put("JdbcUpdatePeak", this.getJdbcUpdatePeak()); + + data.put("JdbcPoolConnectionOpenCount", this.getJdbcPoolConnectionOpenCount()); + data.put("JdbcPoolConnectionCloseCount", this.getJdbcPoolConnectionCloseCount()); + + data.put("JdbcResultSetOpenCount", this.getJdbcResultSetOpenCount()); + data.put("JdbcResultSetCloseCount", this.getJdbcResultSetCloseCount()); + + if (this.profileEntryStatValueList != null) { + int size = profileEntryStatValueList.size(); + List> profileDataList = new ArrayList>(size); + for (int i = 0; i < size; ++i) { + profileDataList.add(profileEntryStatValueList.get(i).getData()); + } + data.put("Profiles", profileDataList); + } + + return data; + } +} diff --git a/src/main/java/com/alibaba/druid/support/ibatis/SpringIbatisBeanNameAutoProxyCreator.java b/src/main/java/com/alibaba/druid/support/ibatis/SpringIbatisBeanNameAutoProxyCreator.java index 1697d567a5..47cc2b9cbb 100644 --- a/src/main/java/com/alibaba/druid/support/ibatis/SpringIbatisBeanNameAutoProxyCreator.java +++ b/src/main/java/com/alibaba/druid/support/ibatis/SpringIbatisBeanNameAutoProxyCreator.java @@ -29,14 +29,18 @@ import com.ibatis.sqlmap.engine.impl.ExtendedSqlMapClient; @SuppressWarnings({ "serial", "deprecation" }) public class SpringIbatisBeanNameAutoProxyCreator extends BeanNameAutoProxyCreator implements SpringIbatisBeanNameAutoProxyCreatorMBean { - private final static Log LOG = LogFactory.getLog(SpringIbatisBeanNameAutoProxyCreator.class); + private final static Log LOG = LogFactory.getLog(SpringIbatisBeanNameAutoProxyCreator.class); - private final List proxyBeanNames = new ArrayList(); + private List proxyBeanNames = new ArrayList(); public List getProxyBeanNames() { return proxyBeanNames; } + public void setProxyBeanNames(List proxyBeanNames) { + this.proxyBeanNames = proxyBeanNames; + } + @SuppressWarnings("rawtypes") protected Object createProxy(Class beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) { diff --git a/src/main/java/com/alibaba/druid/support/profile/ProfileEntryKey.java b/src/main/java/com/alibaba/druid/support/profile/ProfileEntryKey.java index cb3ee8db03..6f44e2c039 100644 --- a/src/main/java/com/alibaba/druid/support/profile/ProfileEntryKey.java +++ b/src/main/java/com/alibaba/druid/support/profile/ProfileEntryKey.java @@ -37,6 +37,12 @@ public class ProfileEntryKey { public String getType() { return type; } + + public void fillValue(ProfileEntryStatValue value) { + value.setParentName(parentName); + value.setName(name); + value.setType(type); + } @Override public int hashCode() { diff --git a/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStat.java b/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStat.java index 393444be92..0ec9391c74 100644 --- a/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStat.java +++ b/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStat.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.support.profile; +import static com.alibaba.druid.util.JdbcSqlStatUtils.get; + import java.util.concurrent.atomic.AtomicLongFieldUpdater; public class ProfileEntryStat { @@ -30,6 +32,15 @@ public class ProfileEntryStat { executeTimeNanosUpdater = AtomicLongFieldUpdater.newUpdater(ProfileEntryStat.class, "executeTimeNanos"); } + public ProfileEntryStatValue getValue(boolean reset) { + ProfileEntryStatValue val = new ProfileEntryStatValue(); + + val.setExecuteCount(get(this, executeCountUpdater, reset)); + val.setExecuteTimeNanos(get(this, executeCountUpdater, reset)); + + return val; + } + public long getExecuteCount() { return executeCount; } diff --git a/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStatValue.java b/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStatValue.java new file mode 100644 index 0000000000..2587b0eb77 --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/profile/ProfileEntryStatValue.java @@ -0,0 +1,80 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.support.profile; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class ProfileEntryStatValue { + + private String parentName; + private String name; + private String type; + private long executeCount = 0; + private long executeTimeNanos = 0; + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public long getExecuteCount() { + return executeCount; + } + + public void setExecuteCount(long executeCount) { + this.executeCount = executeCount; + } + + public long getExecuteTimeNanos() { + return executeTimeNanos; + } + + public void setExecuteTimeNanos(long executeTimeNanos) { + this.executeTimeNanos = executeTimeNanos; + } + + public Map getData() { + Map entryData = new LinkedHashMap(); + + entryData.put("Name", this.getName()); + entryData.put("Parent", this.getParentName()); + entryData.put("Type", this.getType()); + entryData.put("ExecuteCount", this.getExecuteCount()); + entryData.put("ExecuteTimeMillis", this.getExecuteTimeNanos() / 1000 / 1000); + + return entryData; + } +} diff --git a/src/main/java/com/alibaba/druid/support/profile/ProfileStat.java b/src/main/java/com/alibaba/druid/support/profile/ProfileStat.java index 2f8fdda339..f4ef062892 100644 --- a/src/main/java/com/alibaba/druid/support/profile/ProfileStat.java +++ b/src/main/java/com/alibaba/druid/support/profile/ProfileStat.java @@ -75,25 +75,33 @@ public class ProfileStat { } public List> getStatData() { - List> list = new ArrayList>(); + + List statValueList = getStatValue(false); + + int size = statValueList.size(); + List> list = new ArrayList>(size); + for (int i = 0; i < size; ++i) { + list.add(statValueList.get(i).getData()); + } + + return list; + } + + public List getStatValue(boolean reset) { + List list = new ArrayList(); lock.readLock().lock(); try { for (Map.Entry entry : entries.entrySet()) { - Map entryData = new LinkedHashMap(); + ProfileEntryStatValue entryStatValue = entry.getValue().getValue(reset); + entry.getKey().fillValue(entryStatValue); - entryData.put("Name", entry.getKey().getName()); - entryData.put("Parent", entry.getKey().getParentName()); - entryData.put("Type", entry.getKey().getType()); - entryData.put("ExecuteCount", entry.getValue().getExecuteCount()); - entryData.put("ExecuteTimeMillis", entry.getValue().getExecuteTimeNanos() / 1000 / 1000); - - list.add(entryData); + list.add(entryStatValue); } } finally { lock.readLock().unlock(); } - + Collections.reverse(list); return list; diff --git a/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java b/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java index 1e9c99cb58..2a951b5c2c 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java @@ -18,22 +18,24 @@ package com.alibaba.druid.util; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Map; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.concurrent.atomic.AtomicLongFieldUpdater; import com.alibaba.druid.stat.JdbcSqlStat; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; - public class JdbcSqlStatUtils { + private final static Log LOG = LogFactory.getLog(JdbcSqlStatUtils.class); - + @SuppressWarnings("unchecked") public static Map getData(Object jdbcSqlStat) { try { if (jdbcSqlStat.getClass() == JdbcSqlStat.class) { return ((JdbcSqlStat) jdbcSqlStat).getData(); } - + Method method = jdbcSqlStat.getClass().getMethod("getData"); Object obj = method.invoke(jdbcSqlStat); return (Map) obj; @@ -42,7 +44,7 @@ public class JdbcSqlStatUtils { return null; } } - + public static long[] rtrim(long[] array) { int notZeroLen = array.length; for (int i = array.length - 1; i >= 0; --i, notZeroLen--) { @@ -50,11 +52,27 @@ public class JdbcSqlStatUtils { break; } } - + if (notZeroLen != array.length) { array = Arrays.copyOf(array, notZeroLen); } - + return array; } + + public static int get(T stat, AtomicIntegerFieldUpdater updater, boolean reset) { + if (reset) { + return updater.getAndSet(stat, 0); + } else { + return updater.get(stat); + } + } + + public static long get(T stat, AtomicLongFieldUpdater updater, boolean reset) { + if (reset) { + return updater.getAndSet(stat, 0); + } else { + return updater.get(stat); + } + } } diff --git a/src/main/java/com/alibaba/druid/util/LazyCompositeData.java b/src/main/java/com/alibaba/druid/util/LazyCompositeData.java deleted file mode 100644 index 8ff6b0c517..0000000000 --- a/src/main/java/com/alibaba/druid/util/LazyCompositeData.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.util; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import javax.management.openmbean.CompositeData; -import javax.management.openmbean.CompositeType; -import javax.management.openmbean.OpenType; -import javax.management.openmbean.TabularType; - -/** - * This abstract class provides the implementation of the CompositeData interface. A CompositeData object will be lazily - * created only when the CompositeData interface is used. Classes that extends this abstract class will implement the - * getCompositeData() method. The object returned by the getCompositeData() is an instance of CompositeData such that - * the instance serializes itself as the type CompositeDataSupport. - */ -public abstract class LazyCompositeData implements CompositeData, Serializable { - - private CompositeData compositeData; - - // Implementation of the CompositeData interface - public boolean containsKey(String key) { - return compositeData().containsKey(key); - } - - public boolean containsValue(Object value) { - return compositeData().containsValue(value); - } - - public boolean equals(Object obj) { - return compositeData().equals(obj); - } - - public Object get(String key) { - return compositeData().get(key); - } - - public Object[] getAll(String[] keys) { - return compositeData().getAll(keys); - } - - public CompositeType getCompositeType() { - return compositeData().getCompositeType(); - } - - public int hashCode() { - return compositeData().hashCode(); - } - - public String toString() { - /** FIXME: What should this be?? */ - return compositeData().toString(); - } - - public Collection values() { - return compositeData().values(); - } - - /* - * Lazy creation of a CompositeData object only when the CompositeData interface is used. - */ - private synchronized CompositeData compositeData() { - if (compositeData != null) { - return compositeData; - } - compositeData = getCompositeData(); - return compositeData; - } - - /** - * Designate to a CompositeData object when writing to an output stream during serialization so that the receiver - * only requires JMX 1.2 classes but not any implementation specific class. - */ - protected Object writeReplace() throws java.io.ObjectStreamException { - return compositeData(); - } - - /** - * Returns the CompositeData representing this object. The returned CompositeData object must be an instance of - * javax.management.openmbean.CompositeDataSupport class so that no implementation specific class is required for - * unmarshalling besides JMX 1.2 classes. - */ - protected abstract CompositeData getCompositeData(); - - // Helper methods - static String getString(CompositeData cd, String itemName) { - if (cd == null) { - throw new IllegalArgumentException("Null CompositeData"); - } - - return (String) cd.get(itemName); - } - - static boolean getBoolean(CompositeData cd, String itemName) { - if (cd == null) { - throw new IllegalArgumentException("Null CompositeData"); - } - - return ((Boolean) cd.get(itemName)).booleanValue(); - } - - static long getLong(CompositeData cd, String itemName) { - if (cd == null) { - throw new IllegalArgumentException("Null CompositeData"); - } - - return ((Number) cd.get(itemName)).longValue(); - } - - static int getInt(CompositeData cd, String itemName) { - if (cd == null) { - throw new IllegalArgumentException("Null CompositeData"); - } - - return ((Number) cd.get(itemName)).intValue(); - } - - /** - * Compares two CompositeTypes and returns true if all items in type1 exist in type2 and their item types are the - * same. - */ - protected static boolean isTypeMatched(CompositeType type1, CompositeType type2) { - if (type1 == type2) { - return true; - } - - // We can't use CompositeType.isValue() since it returns false - // if the type name doesn't match. - Set allItems = type1.keySet(); - - // Check all items in the type1 exist in type2 - if (!type2.keySet().containsAll(allItems)) { - return false; - } - - for (Iterator iter = allItems.iterator(); iter.hasNext();) { - String item = (String) iter.next(); - OpenType ot1 = type1.getType(item); - OpenType ot2 = type2.getType(item); - if (ot1 instanceof CompositeType) { - if (!(ot2 instanceof CompositeType)) { - return false; - } - if (!isTypeMatched((CompositeType) ot1, (CompositeType) ot2)) { - return false; - } - } else if (ot1 instanceof TabularType) { - if (!(ot2 instanceof TabularType)) { - return false; - } - if (!isTypeMatched((TabularType) ot1, (TabularType) ot2)) { - return false; - } - } else if (!ot1.equals(ot2)) { - return false; - } - } - return true; - } - - protected static boolean isTypeMatched(TabularType type1, TabularType type2) { - if (type1 == type2) { - return true; - } - - List list1 = type1.getIndexNames(); - List list2 = type2.getIndexNames(); - - // check if the list of index names are the same - if (!list1.equals(list2)) { - return false; - } - - return isTypeMatched(type1.getRowType(), type2.getRowType()); - } -} diff --git a/src/main/java/com/alibaba/druid/util/ThreadLocalRandom.java b/src/main/java/com/alibaba/druid/util/ThreadLocalRandom.java deleted file mode 100644 index 1859ed23c0..0000000000 --- a/src/main/java/com/alibaba/druid/util/ThreadLocalRandom.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.util; - -import java.util.Random; - -/** - * A random number generator isolated to the current thread. Like the global {@link java.util.Random} generator used by - * the {@link java.lang.Math} class, a {@code ThreadLocalRandom} is initialized with an internally generated seed that - * may not otherwise be modified. When applicable, use of {@code ThreadLocalRandom} rather than shared {@code Random} - * objects in concurrent programs will typically encounter much less overhead and contention. Use of - * {@code ThreadLocalRandom} is particularly appropriate when multiple tasks (for example, each a {@link ForkJoinTask}) - * use random numbers in parallel in thread pools. - *

- * Usages of this class should typically be of the form: {@code ThreadLocalRandom.current().nextX(...)} (where {@code X} - * is {@code Int}, {@code Long}, etc). When all usages are of this form, it is never possible to accidently share a - * {@code ThreadLocalRandom} across multiple threads. - *

- * This class also provides additional commonly used bounded random generation methods. - * - * @since 1.7 - * @author Doug Lea - */ -public class ThreadLocalRandom extends Random { - - // same constants as Random, but must be redeclared because private - private static final long multiplier = 0x5DEECE66DL; - private static final long addend = 0xBL; - private static final long mask = (1L << 48) - 1; - - /** - * The random seed. We can't use super.seed. - */ - private long rnd; - - /** - * Initialization flag to permit calls to setSeed to succeed only while executing the Random constructor. We can't - * allow others since it would cause setting seed in one part of a program to unintentionally impact other usages by - * the thread. - */ - boolean initialized; - - // Padding to help avoid memory contention among seed updates in - // different TLRs in the common case that they are located near - // each other. - @SuppressWarnings("unused") - private long pad0, pad1, pad2, pad3, pad4, pad5, pad6, pad7; - - /** - * The actual ThreadLocal - */ - private static final ThreadLocal localRandom = new ThreadLocal() { - - protected ThreadLocalRandom initialValue() { - return new ThreadLocalRandom(); - } - }; - - /** - * Constructor called only by localRandom.initialValue. - */ - ThreadLocalRandom(){ - super(); - initialized = true; - } - - /** - * Returns the current thread's {@code ThreadLocalRandom}. - * - * @return the current thread's {@code ThreadLocalRandom} - */ - public static ThreadLocalRandom current() { - return localRandom.get(); - } - - /** - * Throws {@code UnsupportedOperationException}. Setting seeds in this generator is not supported. - * - * @throws UnsupportedOperationException always - */ - public void setSeed(long seed) { - if (initialized) { - throw new UnsupportedOperationException(); - } - rnd = (seed ^ multiplier) & mask; - } - - protected int next(int bits) { - rnd = (rnd * multiplier + addend) & mask; - return (int) (rnd >>> (48 - bits)); - } - - /** - * Returns a pseudorandom, uniformly distributed value between the given least value (inclusive) and bound - * (exclusive). - * - * @param least the least value returned - * @param bound the upper bound (exclusive) - * @throws IllegalArgumentException if least greater than or equal to bound - * @return the next value - */ - public int nextInt(int least, int bound) { - if (least >= bound) { - throw new IllegalArgumentException(); - } - return nextInt(bound - least) + least; - } - - /** - * Returns a pseudorandom, uniformly distributed value between 0 (inclusive) and the specified value (exclusive). - * - * @param n the bound on the random number to be returned. Must be positive. - * @return the next value - * @throws IllegalArgumentException if n is not positive - */ - public long nextLong(long n) { - if (n <= 0) { - throw new IllegalArgumentException("n must be positive"); - } - // Divide n by two until small enough for nextInt. On each - // iteration (at most 31 of them but usually much less), - // randomly choose both whether to include high bit in result - // (offset) and whether to continue with the lower vs upper - // half (which makes a difference only if odd). - long offset = 0; - while (n >= Integer.MAX_VALUE) { - int bits = next(2); - long half = n >>> 1; - long nextn = ((bits & 2) == 0) ? half : n - half; - if ((bits & 1) == 0) { - offset += n - nextn; - } - n = nextn; - } - return offset + nextInt((int) n); - } - - /** - * Returns a pseudorandom, uniformly distributed value between the given least value (inclusive) and bound - * (exclusive). - * - * @param least the least value returned - * @param bound the upper bound (exclusive) - * @return the next value - * @throws IllegalArgumentException if least greater than or equal to bound - */ - public long nextLong(long least, long bound) { - if (least >= bound) { - throw new IllegalArgumentException(); - } - return nextLong(bound - least) + least; - } - - /** - * Returns a pseudorandom, uniformly distributed {@code double} value between 0 (inclusive) and the specified value - * (exclusive). - * - * @param n the bound on the random number to be returned. Must be positive. - * @return the next value - * @throws IllegalArgumentException if n is not positive - */ - public double nextDouble(double n) { - if (n <= 0) { - throw new IllegalArgumentException("n must be positive"); - } - return nextDouble() * n; - } - - /** - * Returns a pseudorandom, uniformly distributed value between the given least value (inclusive) and bound - * (exclusive). - * - * @param least the least value returned - * @param bound the upper bound (exclusive) - * @return the next value - * @throws IllegalArgumentException if least greater than or equal to bound - */ - public double nextDouble(double least, double bound) { - if (least >= bound) { - throw new IllegalArgumentException(); - } - return nextDouble() * (bound - least) + least; - } - - private static final long serialVersionUID = -5851777807851030925L; -} diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index 5b0285221a..3a41b68770 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -168,6 +168,11 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { WallContext.clearContext(); } } + + @Override + public void preparedStatement_addBatch(FilterChain chain, PreparedStatementProxy statement) throws SQLException { + chain.preparedStatement_addBatch(statement); + } @Override public PreparedStatementProxy connection_prepareStatement(FilterChain chain, ConnectionProxy connection, String sql) @@ -324,6 +329,8 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { if (!firstResult) { int updateCount = statement.getUpdateCount(); statExecuteUpdate(updateCount); + } else { + setSqlStatAttribute(statement); } return firstResult; } finally { @@ -343,6 +350,8 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { if (!firstResult) { int updateCount = statement.getUpdateCount(); statExecuteUpdate(updateCount); + } else { + setSqlStatAttribute(statement); } return firstResult; } finally { @@ -360,6 +369,8 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { if (!firstResult) { int updateCount = statement.getUpdateCount(); statExecuteUpdate(updateCount); + } else { + setSqlStatAttribute(statement); } return firstResult; } finally { @@ -377,6 +388,8 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { if (!firstResult) { int updateCount = statement.getUpdateCount(); statExecuteUpdate(updateCount); + } else { + setSqlStatAttribute(statement); } return firstResult; } finally { @@ -389,10 +402,11 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { WallSqlStat sqlStat = (WallSqlStat) statement.getAttribute(ATTR_SQL_STAT); try { int[] updateCounts = chain.statement_executeBatch(statement); + int updateCount = 0; for (int i = 0; i < updateCounts.length; ++i) { - int updateCount = updateCounts[i]; - statExecuteUpdate(sqlStat, updateCount); + updateCount += updateCounts[i]; } + statExecuteUpdate(sqlStat, updateCount); return updateCounts; } finally { WallContext.clearContext(); @@ -498,11 +512,12 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { @Override public int preparedStatement_executeUpdate(FilterChain chain, PreparedStatementProxy statement) throws SQLException { int updateCount = chain.preparedStatement_executeUpdate(statement); - statExecuteUpdate(updateCount); + WallSqlStat sqlStat = (WallSqlStat) statement.getAttribute(ATTR_SQL_STAT); + statExecuteUpdate(sqlStat, updateCount); return updateCount; } - public void setSqlStatAttribute(PreparedStatementProxy stmt) { + public void setSqlStatAttribute(StatementProxy stmt) { WallContext context = WallContext.current(); if (context == null) { return; @@ -555,6 +570,8 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { tableStat.addDeleteDataCount(updateCount); } else if (sqlTableStat.getUpdateCount() > 0) { tableStat.addUpdateDataCount(updateCount); + } else if (sqlTableStat.getInsertCount() > 0) { + tableStat.addInsertDataCount(updateCount); } } } diff --git a/src/main/java/com/alibaba/druid/wall/WallSQLException.java b/src/main/java/com/alibaba/druid/wall/WallSQLException.java index 36fb405dec..a3d12f5434 100644 --- a/src/main/java/com/alibaba/druid/wall/WallSQLException.java +++ b/src/main/java/com/alibaba/druid/wall/WallSQLException.java @@ -21,10 +21,6 @@ public class WallSQLException extends SQLException { private static final long serialVersionUID = 1L; - public WallSQLException(){ - super(); - } - public WallSQLException(String reason, Throwable cause){ super(reason, cause); } @@ -33,8 +29,4 @@ public class WallSQLException extends SQLException { super(reason); } - public WallSQLException(Throwable cause){ - super(cause); - } - } diff --git a/src/main/java/com/alibaba/druid/wall/WallTableStat.java b/src/main/java/com/alibaba/druid/wall/WallTableStat.java index 3a455b0f19..e33f5df1f9 100644 --- a/src/main/java/com/alibaba/druid/wall/WallTableStat.java +++ b/src/main/java/com/alibaba/druid/wall/WallTableStat.java @@ -35,6 +35,7 @@ public class WallTableStat { private volatile long replaceCount; private volatile long deleteDataCount; private volatile long updateDataCount; + private volatile long insertDataCount; private volatile long fetchRowCount; final static AtomicLongFieldUpdater selectCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, @@ -60,6 +61,8 @@ public class WallTableStat { final static AtomicLongFieldUpdater deleteDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, "deleteDataCount"); + final static AtomicLongFieldUpdater insertDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, + "insertDataCount"); final static AtomicLongFieldUpdater updateDataCountUpdater = AtomicLongFieldUpdater.newUpdater(WallTableStat.class, "updateDataCount"); @@ -117,11 +120,19 @@ public class WallTableStat { public void addDeleteDataCount(long delta) { deleteDataCountUpdater.addAndGet(this, delta); } - + public long getUpdateDataCount() { return this.updateDataCount; } + public long getInsertDataCount() { + return this.insertDataCount; + } + + public void addInsertDataCount(long delta) { + insertDataCountUpdater.addAndGet(this, delta); + } + public void addUpdateDataCount(long delta) { updateDataCountUpdater.addAndGet(this, delta); } diff --git a/src/test/java/com/alibaba/druid/TestTraceFilter.java b/src/test/java/com/alibaba/druid/TestTraceFilter.java index d473ac24d8..c05cd6915b 100644 --- a/src/test/java/com/alibaba/druid/TestTraceFilter.java +++ b/src/test/java/com/alibaba/druid/TestTraceFilter.java @@ -25,6 +25,7 @@ import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.stat.JdbcTraceManager; import com.alibaba.druid.util.JMXUtils; +@SuppressWarnings("deprecation") public class TestTraceFilter extends TestCase { public void test_loop() throws Exception { @@ -45,5 +46,6 @@ public class TestTraceFilter extends TestCase { Thread.sleep(1000); } + dataSource.close(); } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallFilterTest2.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallFilterTest2.java new file mode 100644 index 0000000000..c14f1cacf5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallFilterTest2.java @@ -0,0 +1,386 @@ +package com.alibaba.druid.bvt.filter.wall; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.druid.wall.WallFilter; + +public class WallFilterTest2 extends TestCase { + + private DruidDataSource dataSource; + private WallFilter wallFilter; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + + dataSource.setUrl("jdbc:h2:mem:wall_test;"); + dataSource.setFilters("wall"); + dataSource.setDbType(JdbcConstants.MARIADB); + dataSource.init(); + + wallFilter = (WallFilter) dataSource.getProxyFilters().get(0); + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void test_wallFilter() throws Exception { + Assert.assertEquals(JdbcConstants.MARIADB, wallFilter.getDbType()); + Assert.assertFalse(wallFilter.isLogViolation()); + wallFilter.setLogViolation(true); + Assert.assertTrue(wallFilter.isLogViolation()); + wallFilter.setLogViolation(false); + Assert.assertFalse(wallFilter.isLogViolation()); + + Assert.assertTrue(wallFilter.isThrowException()); + wallFilter.setThrowException(false); + Assert.assertFalse(wallFilter.isThrowException()); + wallFilter.setThrowException(true); + Assert.assertTrue(wallFilter.isThrowException()); + + wallFilter.clearProviderCache(); + wallFilter.getProviderWhiteList(); + Assert.assertTrue(wallFilter.isInited()); + + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("CREATE TABLE t (FID INTEGER, FNAME VARCHAR(50))"); + stmt.close(); + conn.close(); + } + Assert.assertEquals(1, wallFilter.getProvider().getTableStat("t").getCreateCount()); + + { + Connection conn = dataSource.getConnection(); + String sql = "INSERT INTO t (FID, FNAME) VALUES (?, ?)"; + + for (int i = 0; i < 10; ++i) { + PreparedStatement stmt = conn.prepareStatement(sql, Statement.NO_GENERATED_KEYS); + stmt.setInt(1, i + 10); + stmt.setString(2, "a" + (i + 10)); + stmt.execute(); + stmt.close(); + } + + conn.close(); + } + Assert.assertEquals(10, wallFilter.getProvider().getTableStat("t").getInsertCount()); + Assert.assertEquals(10, wallFilter.getProvider().getTableStat("t").getInsertDataCount()); + + { + Connection conn = dataSource.getConnection(); + String sql = "INSERT INTO t (FID, FNAME) VALUES (?, ?)"; + + PreparedStatement stmt = conn.prepareStatement(sql, Statement.NO_GENERATED_KEYS); + for (int i = 0; i < 10; ++i) { + stmt.setInt(1, i + 20); + stmt.setString(2, "a" + (i + 20)); + stmt.addBatch(); + } + stmt.executeBatch(); + stmt.close(); + + conn.close(); + } + Assert.assertEquals(11, wallFilter.getProvider().getTableStat("t").getInsertCount()); + Assert.assertEquals(20, wallFilter.getProvider().getTableStat("t").getInsertDataCount()); + + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + for (int i = 0; i < 10; ++i) { + stmt.addBatch("INSERT INTO t (FID, FNAME) VALUES (" + i + ", 'a" + i + "')"); + } + stmt.executeBatch(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(21, wallFilter.getProvider().getTableStat("t").getInsertCount()); + Assert.assertEquals(0, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + { + String sql = "SELECT * FROM T"; + + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(30, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T"; + + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, + ResultSet.CONCUR_READ_ONLY, + ResultSet.HOLD_CURSORS_OVER_COMMIT); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(60, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T LIMIT 10"; + + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql, new int[0]); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(70, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T LIMIT 10"; + + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql, new String[0]); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(80, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T LIMIT 10"; + + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareCall(sql); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(90, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T LIMIT 10"; + + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareCall(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(100, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T"; + + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareCall(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, + ResultSet.HOLD_CURSORS_OVER_COMMIT); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(130, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T LIMIT 10"; + + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + stmt.execute(sql, Statement.NO_GENERATED_KEYS); + ResultSet rs = stmt.getResultSet(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(140, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T LIMIT 10"; + + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, + ResultSet.HOLD_CURSORS_OVER_COMMIT); + stmt.execute(sql, new int[0]); + ResultSet rs = stmt.getResultSet(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(150, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + String sql = "SELECT * FROM T LIMIT 10"; + + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, + ResultSet.HOLD_CURSORS_OVER_COMMIT); + stmt.execute(sql, new String[0]); + ResultSet rs = stmt.getResultSet(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(160, wallFilter.getProvider().getTableStat("t").getFetchRowCount()); + + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.executeUpdate("DELETE from t where FID = 0"); + stmt.close(); + conn.close(); + } + Assert.assertEquals(1, wallFilter.getProvider().getTableStat("t").getDeleteDataCount()); + Assert.assertEquals(0, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.executeUpdate("DELETE from t where FID = 1 OR FID = 2", Statement.NO_GENERATED_KEYS); + stmt.close(); + conn.close(); + } + Assert.assertEquals(3, wallFilter.getProvider().getTableStat("t").getDeleteDataCount()); + Assert.assertEquals(0, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.executeUpdate("DELETE from t where FID = 3", new int[0]); + stmt.close(); + conn.close(); + } + Assert.assertEquals(4, wallFilter.getProvider().getTableStat("t").getDeleteDataCount()); + Assert.assertEquals(0, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.executeUpdate("DELETE from t where FID = 4", new String[0]); + stmt.close(); + conn.close(); + } + Assert.assertEquals(5, wallFilter.getProvider().getTableStat("t").getDeleteDataCount()); + Assert.assertEquals(0, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + + { + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement("DELETE from t where FID = ?"); + stmt.setInt(1, 5); + stmt.executeUpdate(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(6, wallFilter.getProvider().getTableStat("t").getDeleteDataCount()); + Assert.assertEquals(0, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("update t SET fname = 'xx' where FID = 13 OR FID = 14"); + stmt.close(); + conn.close(); + } + Assert.assertEquals(2, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + + { + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement("update t SET fname = 'xx' where FID = ? OR FID = ?"); + stmt.setInt(1, 13); + stmt.setInt(2, 14); + stmt.execute(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(4, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + + { + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement("update t SET fname = 'xx' where FID = ? OR FID = ?"); + stmt.setInt(1, 13); + stmt.setInt(2, 14); + stmt.execute(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(6, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + { + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement("update t SET fname = 'xx' where FID = ?"); + + stmt.setInt(1, 13); + stmt.addBatch(); + + stmt.setInt(1, 14); + stmt.addBatch(); + + stmt.executeBatch(); + stmt.close(); + conn.close(); + } + Assert.assertEquals(8, wallFilter.getProvider().getTableStat("t").getUpdateDataCount()); + + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("truncate table t"); + stmt.close(); + conn.close(); + } + Assert.assertEquals(1, wallFilter.getProvider().getTableStat("t").getTruncateCount()); + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("drop table t"); + stmt.close(); + conn.close(); + } + Assert.assertEquals(1, wallFilter.getProvider().getTableStat("t").getDropCount()); + + Assert.assertEquals(0, wallFilter.getViolationCount()); + wallFilter.resetViolationCount(); + wallFilter.checkValid("select 1"); + Assert.assertEquals(0, wallFilter.getViolationCount()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallSQLExceptionTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallSQLExceptionTest.java new file mode 100644 index 0000000000..6792b1a4c9 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallSQLExceptionTest.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.filter.wall; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.wall.WallSQLException; + + +public class WallSQLExceptionTest extends TestCase { + public void test_wall() throws Exception { + WallSQLException ex = new WallSQLException("", new RuntimeException()); + Assert.assertEquals("", ex.getMessage()); + Assert.assertNotNull(ex.getCause()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestActiveTrace.java b/src/test/java/com/alibaba/druid/bvt/pool/TestActiveTrace.java index e5f6104ec4..fb74c3f142 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestActiveTrace.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestActiveTrace.java @@ -17,9 +17,10 @@ package com.alibaba.druid.bvt.pool; import java.sql.Connection; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.stat.DruidDataSourceStatManager; @@ -46,7 +47,7 @@ public class TestActiveTrace extends TestCase { } public void test_activeTrace() throws Exception { - for (int i = 0; i < 1000 * 1000; ++i) { + for (int i = 0; i < 1000 * 10; ++i) { dataSource.shrink(); Connection conn = dataSource.getConnection(); diff --git a/src/test/java/com/alibaba/druid/bvt/spring/SqlMapClientWrapperTest.java b/src/test/java/com/alibaba/druid/bvt/spring/SqlMapClientWrapperTest.java index d4fc6a29c6..010cb53334 100644 --- a/src/test/java/com/alibaba/druid/bvt/spring/SqlMapClientWrapperTest.java +++ b/src/test/java/com/alibaba/druid/bvt/spring/SqlMapClientWrapperTest.java @@ -21,7 +21,7 @@ public class SqlMapClientWrapperTest extends TestCase { private ClassPathXmlApplicationContext context = null; protected void setUp() throws Exception { - context = new ClassPathXmlApplicationContext("com/alibaba/druid/pool/ibatis/spring-config-ibatis.xml"); + context = new ClassPathXmlApplicationContext("com/alibaba/druid/pool/ibatis/spring-config-ibatis-1.xml"); DataSource dataSource = (DataSource) context.getBean("dataSource"); { Connection conn = dataSource.getConnection(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleTimestampExpr.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleTimestampExpr.java new file mode 100644 index 0000000000..0608a82094 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleTimestampExpr.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_OracleTimestampExpr extends TestCase { + + public void test_exits() throws Exception { + String sql = "TIMESTAMP '' AT TIME ZONE ''"; + String sql_c = "TIMESTAMP '' AT TIME ZONE 'a'"; + OracleTimestampExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (OracleTimestampExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (OracleTimestampExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (OracleTimestampExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new OracleTimestampExpr(), new OracleTimestampExpr()); + Assert.assertEquals(new OracleTimestampExpr().hashCode(), new OracleTimestampExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_SQLSelectQueryBlock.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_SQLSelectQueryBlock.java new file mode 100644 index 0000000000..d6cac4aa2f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_SQLSelectQueryBlock.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; + +public class EqualTest_SQLSelectQueryBlock extends TestCase { + + public void test_eq() throws Exception { + SQLSelectQueryBlock exprA = new SQLSelectQueryBlock(); + SQLSelectQueryBlock exprB = new SQLSelectQueryBlock(); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + Assert.assertEquals(exprA, exprB); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_aggreate.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_aggreate.java new file mode 100644 index 0000000000..99ca939841 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_aggreate.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_aggreate extends TestCase { + + public void test_exits() throws Exception { + String sql = "count(*)"; + String sql_c = "count(id)"; + SQLAggregateExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLAggregateExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLAggregateExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLAggregateExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLAggregateExpr(null), new SQLAggregateExpr(null)); + Assert.assertEquals(new SQLAggregateExpr(null).hashCode(), new SQLAggregateExpr(null).hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_aggreate_over.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_aggreate_over.java new file mode 100644 index 0000000000..d82ecb198e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_aggreate_over.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.parser.SQLExprParser; + +public class EqualTest_aggreate_over extends TestCase { + + public void test_exits() throws Exception { + String sql = "count(*) OVER (ORDER BY f1)"; + String sql_c = "count(id) OVER (ORDER BY f2)"; + SQLAggregateExpr exprA, exprB, exprC; + { + SQLExprParser parser = new SQLExprParser(sql); + exprA = (SQLAggregateExpr) parser.expr(); + } + { + SQLExprParser parser = new SQLExprParser(sql); + exprB = (SQLAggregateExpr) parser.expr(); + } + { + SQLExprParser parser = new SQLExprParser(sql_c); + exprC = (SQLAggregateExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLAggregateExpr(null), new SQLAggregateExpr(null)); + Assert.assertEquals(new SQLAggregateExpr(null).hashCode(), new SQLAggregateExpr(null).hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_any.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_any.java new file mode 100644 index 0000000000..506ea80ba0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_any.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_any extends TestCase { + + public void test_exits() throws Exception { + String sql = "any(select id from t)"; + String sql_c = "any(select id from t1)"; + SQLAnyExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLAnyExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLAnyExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLAnyExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLAnyExpr(), new SQLAnyExpr()); + Assert.assertEquals(new SQLAnyExpr().hashCode(), new SQLAnyExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binary.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binary.java new file mode 100644 index 0000000000..67c45272c7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binary.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; +import com.alibaba.druid.sql.parser.SQLExprParser; + +public class EqualTest_binary extends TestCase { + + public void test_exits() throws Exception { + String sql = "b'01010'"; + String sql_c = "b'010101'"; + MySqlBinaryExpr exprA, exprB, exprC; + { + SQLExprParser parser = new MySqlExprParser(sql); + exprA = (MySqlBinaryExpr) parser.expr(); + } + { + SQLExprParser parser = new MySqlExprParser(sql); + exprB = (MySqlBinaryExpr) parser.expr(); + } + { + SQLExprParser parser = new MySqlExprParser(sql_c); + exprC = (MySqlBinaryExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new MySqlBinaryExpr(), new MySqlBinaryExpr()); + Assert.assertEquals(new MySqlBinaryExpr().hashCode(), new MySqlBinaryExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binaryOp.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binaryOp.java new file mode 100644 index 0000000000..4c1472da11 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binaryOp.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_binaryOp extends TestCase { + + public void test_exits() throws Exception { + String sql = "a > b"; + String sql_c = "a > 2"; + SQLBinaryOpExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLBinaryOpExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLBinaryOpExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLBinaryOpExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLBinaryOpExpr(), new SQLBinaryOpExpr()); + Assert.assertEquals(new SQLBinaryOpExpr().hashCode(), new SQLBinaryOpExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_boolean.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_boolean.java new file mode 100644 index 0000000000..9bca1c33bc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_boolean.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; +import com.alibaba.druid.sql.parser.SQLExprParser; + +public class EqualTest_boolean extends TestCase { + + public void test_exits() throws Exception { + String sql = "true"; + String sql_c = "false"; + MySqlBooleanExpr exprA, exprB, exprC; + { + SQLExprParser parser = new MySqlExprParser(sql); + exprA = (MySqlBooleanExpr) parser.expr(); + } + { + SQLExprParser parser = new MySqlExprParser(sql); + exprB = (MySqlBooleanExpr) parser.expr(); + } + { + SQLExprParser parser = new MySqlExprParser(sql_c); + exprC = (MySqlBooleanExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new MySqlBooleanExpr(), new MySqlBooleanExpr()); + Assert.assertEquals(new MySqlBooleanExpr().hashCode(), new MySqlBooleanExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_cast.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_cast.java new file mode 100644 index 0000000000..5d479fe9e0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_cast.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.SQLDataTypeImpl; +import com.alibaba.druid.sql.ast.expr.SQLCastExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_cast extends TestCase { + + public void test_exits() throws Exception { + String sql = "cast(a as varchar(50))"; + String sql_c = "cast(b as varchar(50))"; + SQLCastExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLCastExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLCastExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLCastExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLCastExpr(), new SQLCastExpr()); + Assert.assertEquals(new SQLCastExpr().hashCode(), new SQLCastExpr().hashCode()); + + Assert.assertEquals(new SQLDataTypeImpl(), new SQLDataTypeImpl()); + Assert.assertEquals(new SQLDataTypeImpl().hashCode(), new SQLDataTypeImpl().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_cursor.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_cursor.java new file mode 100644 index 0000000000..cb63ce1056 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_cursor.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_cursor extends TestCase { + + public void test_exits() throws Exception { + String sql = "CURSOR(select id from t)"; + String sql_c = "CURSOR(select id from t1)"; + OracleCursorExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (OracleCursorExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (OracleCursorExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (OracleCursorExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new OracleCursorExpr(), new OracleCursorExpr()); + Assert.assertEquals(new OracleCursorExpr().hashCode(), new OracleCursorExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_dbLink.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_dbLink.java new file mode 100644 index 0000000000..bc4705d693 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_dbLink.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_dbLink extends TestCase { + + public void test_eq() throws Exception { + String sql = "a@b"; + String sql_c = "a@c"; + OracleDbLinkExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (OracleDbLinkExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (OracleDbLinkExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (OracleDbLinkExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new OracleDbLinkExpr(), new OracleDbLinkExpr()); + Assert.assertEquals(new OracleDbLinkExpr().hashCode(), new OracleDbLinkExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_exists.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_exists.java new file mode 100644 index 0000000000..58c1dded38 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_exists.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLExistsExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_exists extends TestCase { + + public void test_exits() throws Exception { + String sql = "exists (select 1)"; + String sql_c = "not exists (select 1)"; + SQLExistsExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLExistsExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLExistsExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLExistsExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLExistsExpr(), new SQLExistsExpr()); + Assert.assertEquals(new SQLExistsExpr().hashCode(), new SQLExistsExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_extract_mysql.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_extract_mysql.java new file mode 100644 index 0000000000..d4894f55b6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_extract_mysql.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; + +public class EqualTest_extract_mysql extends TestCase { + + public void test_exits() throws Exception { + String sql = "EXTRACT (YEAR FROM x)"; + String sql_c = "EXTRACT (MONTH FROM y)"; + MySqlExtractExpr exprA, exprB, exprC; + { + MySqlExprParser parser = new MySqlExprParser(sql); + exprA = (MySqlExtractExpr) parser.expr(); + } + { + MySqlExprParser parser = new MySqlExprParser(sql); + exprB = (MySqlExtractExpr) parser.expr(); + } + { + MySqlExprParser parser = new MySqlExprParser(sql_c); + exprC = (MySqlExtractExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new MySqlExtractExpr(), new MySqlExtractExpr()); + Assert.assertEquals(new MySqlExtractExpr().hashCode(), new MySqlExtractExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_extract_oracle.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_extract_oracle.java new file mode 100644 index 0000000000..b5aeab6d98 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_extract_oracle.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_extract_oracle extends TestCase { + + public void test_exits() throws Exception { + String sql = "EXTRACT(MONTH FROM x)"; + String sql_c = "EXTRACT(MONTH FROM 7)"; + OracleExtractExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (OracleExtractExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (OracleExtractExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (OracleExtractExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new OracleExtractExpr(), new OracleExtractExpr()); + Assert.assertEquals(new OracleExtractExpr().hashCode(), new OracleExtractExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inList.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inList.java new file mode 100644 index 0000000000..607ee923a5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inList.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLInListExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_inList extends TestCase { + + public void test_exits() throws Exception { + String sql = "x in (1, 2, 3)"; + String sql_c = "x not in (1, 2, 3)"; + SQLInListExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLInListExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLInListExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLInListExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLInListExpr(), new SQLInListExpr()); + Assert.assertEquals(new SQLInListExpr().hashCode(), new SQLInListExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery.java similarity index 95% rename from src/test/java/com/alibaba/druid/bvt/sql/EqualTest.java rename to src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery.java index 3ddcaea4f5..e2bf8acd6a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery.java @@ -7,7 +7,7 @@ import org.junit.Assert; import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; -public class EqualTest extends TestCase { +public class EqualTest_inquery extends TestCase { public void test_exits() throws Exception { String sql = "fstate in (select state from t_status)"; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery_mysql.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery_mysql.java new file mode 100644 index 0000000000..21a21e7bef --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery_mysql.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; +import com.alibaba.druid.sql.parser.SQLExprParser; + +public class EqualTest_inquery_mysql extends TestCase { + + public void test_exits() throws Exception { + String sql = "fstate in (select state from t_status)"; + String sql_c = "fstate_c in (select state from t_status)"; + SQLInSubQueryExpr exprA, exprB, exprC; + { + SQLExprParser parser = new SQLExprParser(sql); + exprA = (SQLInSubQueryExpr) parser.expr(); + } + { + SQLExprParser parser = new SQLExprParser(sql); + exprB = (SQLInSubQueryExpr) parser.expr(); + } + { + SQLExprParser parser = new SQLExprParser(sql_c); + exprC = (SQLInSubQueryExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLInSubQueryExpr(), new SQLInSubQueryExpr()); + Assert.assertEquals(new SQLInSubQueryExpr().hashCode(), new SQLInSubQueryExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery_oracle.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery_oracle.java new file mode 100644 index 0000000000..4681c89f82 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_inquery_oracle.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; +import com.alibaba.druid.sql.parser.SQLExprParser; + +public class EqualTest_inquery_oracle extends TestCase { + + public void test_exits() throws Exception { + String sql = "fstate in (select state from t_status)"; + String sql_c = "fstate_c in (select state from t_status)"; + SQLInSubQueryExpr exprA, exprB, exprC; + { + SQLExprParser parser = new OracleExprParser(sql); + exprA = (SQLInSubQueryExpr) parser.expr(); + } + { + SQLExprParser parser = new OracleExprParser(sql); + exprB = (SQLInSubQueryExpr) parser.expr(); + } + { + SQLExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLInSubQueryExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLInSubQueryExpr(), new SQLInSubQueryExpr()); + Assert.assertEquals(new SQLInSubQueryExpr().hashCode(), new SQLInSubQueryExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_interval_mysql.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_interval_mysql.java new file mode 100644 index 0000000000..36c337fb46 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_interval_mysql.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; +import com.alibaba.druid.sql.parser.SQLExprParser; + +public class EqualTest_interval_mysql extends TestCase { + + public void test_exits() throws Exception { + String sql = "INTERVAL 3 YEAR"; + String sql_c = "INTERVAL 3 MONTH"; + MySqlIntervalExpr exprA, exprB, exprC; + { + SQLExprParser parser = new MySqlExprParser(sql); + exprA = (MySqlIntervalExpr) parser.expr(); + } + { + SQLExprParser parser = new MySqlExprParser(sql); + exprB = (MySqlIntervalExpr) parser.expr(); + } + { + SQLExprParser parser = new MySqlExprParser(sql_c); + exprC = (MySqlIntervalExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new MySqlIntervalExpr(), new MySqlIntervalExpr()); + Assert.assertEquals(new MySqlIntervalExpr().hashCode(), new MySqlIntervalExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_mysqlMatch.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_mysqlMatch.java index 70e3f00678..13acb648a7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_mysqlMatch.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_mysqlMatch.java @@ -33,5 +33,13 @@ public class EqualTest_mysqlMatch extends TestCase { Assert.assertEquals(new MySqlMatchAgainstExpr(), new MySqlMatchAgainstExpr()); Assert.assertEquals(new MySqlMatchAgainstExpr().hashCode(), new MySqlMatchAgainstExpr().hashCode()); + + exprA.setColumns(null); + exprB.setColumns(null); + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_not.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_not.java new file mode 100644 index 0000000000..1c39ebfcfb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_not.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLNotExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_not extends TestCase { + + public void test_exits() throws Exception { + String sql = "not f1 = f2"; + String sql_c = "not f1 = f3"; + SQLNotExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLNotExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLNotExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLNotExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLNotExpr(), new SQLNotExpr()); + Assert.assertEquals(new SQLNotExpr().hashCode(), new SQLNotExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_number.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_number.java new file mode 100644 index 0000000000..0e1e66dd05 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_number.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_number extends TestCase { + + public void test_exits() throws Exception { + String sql = "3.5"; + String sql_c = "3.51"; + SQLNumberExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLNumberExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLNumberExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLNumberExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLNumberExpr(), new SQLNumberExpr()); + Assert.assertEquals(new SQLNumberExpr().hashCode(), new SQLNumberExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_orderBy.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_orderBy.java new file mode 100644 index 0000000000..fdd0575218 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_orderBy.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.SQLOrderBy; +import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; +import com.alibaba.druid.sql.parser.SQLExprParser; + +public class EqualTest_orderBy extends TestCase { + + public void test_exits() throws Exception { + String sql = "ORDER BY f1"; + String sql_c = "ORDER BY f2"; + SQLOrderBy exprA, exprB, exprC; + { + SQLExprParser parser = new SQLExprParser(sql); + exprA = (SQLOrderBy) parser.parseOrderBy(); + } + { + SQLExprParser parser = new SQLExprParser(sql); + exprB = (SQLOrderBy) parser.parseOrderBy(); + } + { + SQLExprParser parser = new SQLExprParser(sql_c); + exprC = (SQLOrderBy) parser.parseOrderBy(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLOrderBy(), new SQLOrderBy()); + Assert.assertEquals(new SQLOrderBy().hashCode(), new SQLOrderBy().hashCode()); + + Assert.assertEquals(new SQLSelectOrderByItem(), new SQLSelectOrderByItem()); + Assert.assertEquals(new SQLSelectOrderByItem().hashCode(), new SQLSelectOrderByItem().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_query.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_query.java new file mode 100644 index 0000000000..e109eed909 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_query.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_query extends TestCase { + + public void test_exits() throws Exception { + String sql = "(select id from t)"; + String sql_c = "(select id from t1)"; + SQLQueryExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLQueryExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLQueryExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLQueryExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLQueryExpr(), new SQLQueryExpr()); + Assert.assertEquals(new SQLQueryExpr().hashCode(), new SQLQueryExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_some.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_some.java new file mode 100644 index 0000000000..8311d82921 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_some.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLSomeExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_some extends TestCase { + + public void test_exits() throws Exception { + String sql = "some(select id from t)"; + String sql_c = "some(select id from t1)"; + SQLSomeExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLSomeExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLSomeExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLSomeExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLSomeExpr(), new SQLSomeExpr()); + Assert.assertEquals(new SQLSomeExpr().hashCode(), new SQLSomeExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_unary.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_unary.java new file mode 100644 index 0000000000..47c791e094 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_unary.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_unary extends TestCase { + + public void test_exits() throws Exception { + String sql = "-a"; + String sql_c = "-(a+1 + +(b+1))"; + SQLUnaryExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLUnaryExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLUnaryExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLUnaryExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLUnaryExpr(), new SQLUnaryExpr()); + Assert.assertEquals(new SQLUnaryExpr().hashCode(), new SQLUnaryExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_unary_mysql.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_unary_mysql.java new file mode 100644 index 0000000000..618650daaa --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_unary_mysql.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; + +public class EqualTest_unary_mysql extends TestCase { + + public void test_exits() throws Exception { + String sql = "-a"; + String sql_c = "-(a+1 + +(b+1))"; + SQLUnaryExpr exprA, exprB, exprC; + { + MySqlExprParser parser = new MySqlExprParser(sql); + exprA = (SQLUnaryExpr) parser.expr(); + } + { + MySqlExprParser parser = new MySqlExprParser(sql); + exprB = (SQLUnaryExpr) parser.expr(); + } + { + MySqlExprParser parser = new MySqlExprParser(sql_c); + exprC = (SQLUnaryExpr) parser.expr(); + } + Assert.assertEquals(exprA, exprB); + Assert.assertNotEquals(exprA, exprC); + Assert.assertTrue(exprA.equals(exprA)); + Assert.assertFalse(exprA.equals(new Object())); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + + Assert.assertEquals(new SQLUnaryExpr(), new SQLUnaryExpr()); + Assert.assertEquals(new SQLUnaryExpr().hashCode(), new SQLUnaryExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/SQLParseExceptionTest.java b/src/test/java/com/alibaba/druid/bvt/sql/SQLParseExceptionTest.java new file mode 100644 index 0000000000..c30d58dd60 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/SQLParseExceptionTest.java @@ -0,0 +1,13 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.parser.SQLParseException; + +@SuppressWarnings("deprecation") +public class SQLParseExceptionTest extends TestCase { + + public void test_new() throws Exception { + new SQLParseException(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/stat/JdbcTraceManagerTest.java b/src/test/java/com/alibaba/druid/bvt/stat/JdbcTraceManagerTest.java new file mode 100644 index 0000000000..fc9d05b24f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/stat/JdbcTraceManagerTest.java @@ -0,0 +1,13 @@ +package com.alibaba.druid.bvt.stat; + +import junit.framework.TestCase; + +import com.alibaba.druid.stat.JdbcTraceManager; + +@SuppressWarnings("deprecation") +public class JdbcTraceManagerTest extends TestCase { + + public void test_instance() throws Exception { + JdbcTraceManager.getInstance(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/support/http/util/IPRangeTest.java b/src/test/java/com/alibaba/druid/bvt/support/http/util/IPRangeTest.java index 938a08503d..fb8a4b8ed4 100644 --- a/src/test/java/com/alibaba/druid/bvt/support/http/util/IPRangeTest.java +++ b/src/test/java/com/alibaba/druid/bvt/support/http/util/IPRangeTest.java @@ -31,7 +31,8 @@ public class IPRangeTest extends TestCase { assertTrue(rang.isIPAddressInRange(new IPAddress("128.242.127.2"))); assertFalse(rang.isIPAddressInRange(new IPAddress("128.242.126.2"))); - + + rang.toString(); } public void test_ipRange_1() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/support/monitor/PushServiceTest.java b/src/test/java/com/alibaba/druid/bvt/support/monitor/PushServiceTest.java new file mode 100644 index 0000000000..f5b8da8290 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/support/monitor/PushServiceTest.java @@ -0,0 +1,12 @@ +package com.alibaba.druid.bvt.support.monitor; + +import junit.framework.TestCase; + +import com.alibaba.druid.support.monitor.PushService; + +public class PushServiceTest extends TestCase { + + public void test_0() throws Exception { + PushService.getInstance(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/utils/PGUtilsTest.java b/src/test/java/com/alibaba/druid/bvt/utils/PGUtilsTest.java new file mode 100644 index 0000000000..04709fe2f0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/utils/PGUtilsTest.java @@ -0,0 +1,22 @@ +package com.alibaba.druid.bvt.utils; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.util.PGUtils; + +public class PGUtilsTest extends TestCase { + + public void test_error() throws Exception { + new PGUtils(); + + Exception error = null; + try { + PGUtils.createXAConnection(null); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/utils/ThreadLocalRandomTest.java b/src/test/java/com/alibaba/druid/bvt/utils/ThreadLocalRandomTest.java deleted file mode 100644 index 4598b9d144..0000000000 --- a/src/test/java/com/alibaba/druid/bvt/utils/ThreadLocalRandomTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.alibaba.druid.bvt.utils; - -import junit.framework.TestCase; - -import com.alibaba.druid.util.ThreadLocalRandom; - -public class ThreadLocalRandomTest extends TestCase { - public void test_random() throws Exception { - ThreadLocalRandom.current().nextBoolean(); - ThreadLocalRandom.current().nextDouble(); - ThreadLocalRandom.current().nextFloat(); - ThreadLocalRandom.current().nextInt(); - ThreadLocalRandom.current().nextLong(); - } -} diff --git a/src/test/resources/com/alibaba/druid/pool/ibatis/spring-config-ibatis-1.xml b/src/test/resources/com/alibaba/druid/pool/ibatis/spring-config-ibatis-1.xml new file mode 100644 index 0000000000..93ede430ce --- /dev/null +++ b/src/test/resources/com/alibaba/druid/pool/ibatis/spring-config-ibatis-1.xml @@ -0,0 +1,44 @@ + + + + + + + master-sqlMapClient + + sequence-dao + + + + + + + + + + + + + + + + + + + + + + + + + +