From b199d3043f9d108ebb38d294e673ac95b539688f Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 17 Jun 2013 00:34:41 +0800 Subject: [PATCH 1/2] add testcase --- .../java/com/alibaba/druid/mock/MockClob.java | 4 +- .../alibaba/druid/pool/DruidDataSource.java | 100 +++---- .../druid/pool/DruidDataSourceStatValue.java | 23 -- .../druid/sql/ast/expr/SQLBetweenExpr.java | 12 - .../druid/sql/ast/expr/SQLCaseExpr.java | 55 ++-- .../druid/sql/ast/expr/SQLExistsExpr.java | 18 +- .../druid/sql/ast/statement/SQLSelect.java | 47 +++- .../ast/statement/SQLSelectQueryBlock.java | 71 ++--- .../ast/statement/MySqlBinlogStatement.java | 1 + .../statement/MySqlCreateUserStatement.java | 2 + .../mysql/ast/statement/MySqlDropUser.java | 1 + .../ast/statement/MySqlKillStatement.java | 1 + .../ast/statement/MySqlResetStatement.java | 1 + .../ast/statement/MySqlSelectQueryBlock.java | 61 +++- .../mysql/ast/statement/MySqlTableIndex.java | 21 +- .../oracle/ast/clause/ModelClause.java | 8 + .../oracle/ast/expr/OracleCursorExpr.java | 1 + .../oracle/ast/expr/OracleIsSetExpr.java | 1 + .../oracle/parser/OracleSelectParser.java | 1 + .../oracle/visitor/OracleOutputVisitor.java | 2 +- .../druid/sql/visitor/SQLASTVisitor.java | 12 +- .../sql/visitor/SQLASTVisitorAdapter.java | 73 ++--- .../sql/visitor/SQLEvalVisitorUtils.java | 29 +- .../druid/support/http/util/IPRange.java | 81 +----- .../druid/support/json/JSONWriter.java | 5 + .../druid/support/logging/Resources.java | 261 ------------------ .../com/alibaba/druid/util/JdbcUtils.java | 38 +-- .../filter/EncodingConvertFilterTest2.java | 182 +++++++++++- .../druid/bvt/filter/log/LogFilterTest3.java | 2 +- .../bvt/filter/log/Slf4jLogFilterTest.java | 47 ++++ .../com/alibaba/druid/bvt/pool/Case1.java | 3 +- .../druid/bvt/proxy/CounterFilterTest.java | 4 + .../bvt/spring/SqlMapClientWrapperTest.java | 132 +++++++++ .../bvt/spring/SqlMapExecutorWrapperTest.java | 1 - .../spring/SqlMapExecutorWrapperTest_2.java | 132 +++++++++ .../com/alibaba/druid/bvt/sql/EqualTest.java | 34 +++ .../com/alibaba/druid/bvt/sql/EqualTest2.java | 34 +++ .../druid/bvt/sql/EqualTest_OracleDate.java | 17 ++ .../druid/bvt/sql/EqualTest_between.java | 37 +++ .../alibaba/druid/bvt/sql/EqualTest_case.java | 37 +++ .../druid/bvt/sql/EqualTest_groupSet.java | 17 ++ .../druid/bvt/sql/EqualTest_mysqlMatch.java | 37 +++ .../bvt/sql/SQLASTVisitorAdapterTest.java | 76 +++++ .../druid/bvt/sql/eval/EvalMethodAbsTest.java | 31 ++- .../bvt/sql/eval/EvalMethodAcosTest.java | 20 ++ .../bvt/sql/eval/EvalMethodAsinTest.java | 23 +- .../bvt/sql/eval/EvalMethodAtan2Test.java | 23 +- .../bvt/sql/eval/EvalMethodAtanTest.java | 23 +- .../bvt/sql/eval/EvalMethodCeilTest.java | 24 +- .../druid/bvt/sql/eval/EvalMethodCosTest.java | 20 ++ .../bvt/sql/eval/EvalMethodLog10Test.java | 20 ++ .../druid/bvt/sql/eval/EvalMethodLogTest.java | 20 ++ .../bvt/sql/eval/EvalMethodPowerTest.java | 22 +- .../druid/bvt/sql/eval/EvalMethodSinTest.java | 22 +- .../bvt/sql/eval/EvalMethodSqrtTest.java | 22 +- .../druid/bvt/sql/eval/EvalMethodTanTest.java | 20 ++ .../druid/bvt/sql/eval/EvalTest_add.java | 10 +- .../druid/bvt/sql/eval/EvalTest_add_long.java | 18 +- .../bvt/sql/eval/EvalTest_add_short.java | 4 + .../druid/bvt/sql/eval/EvalTest_div.java | 70 ++++- .../druid/bvt/sql/eval/EvalTest_gt.java | 26 +- .../druid/bvt/sql/eval/EvalTest_gt_true.java | 58 ++++ .../druid/bvt/sql/eval/EvalTest_lt.java | 26 +- .../druid/bvt/sql/eval/EvalTest_lt_false.java | 58 ++++ .../bvt/sql/eval/EvalTest_multi_short.java | 27 ++ .../sql/mysql/MySqlASTVisitorAdapterTest.java | 214 ++++++++++++++ .../bvt/sql/mysql/MySqlCreateTableTest46.java | 58 ++++ .../sql/mysql/SHOW_STATUS_Syntax_Test.java | 25 +- .../bvt/sql/oracle/OracleIntervalTest.java | 3 +- .../bvt/sql/oracle/OracleSelectTest18.java | 2 +- .../bvt/sql/oracle/OracleSelectTest42.java | 15 +- .../bvt/sql/oracle/OracleSelectTest44.java | 68 +++++ .../oracle/OracleSubqueryFactoringTest.java | 29 +- .../visitor/OracleASTVisitorAdapterTest.java | 230 +++++++++++++++ .../postgresql/PGASTVisitorAdapterTest.java | 31 +++ .../support/spring/DruidLobCreatorTest.java | 43 +++ .../utils/ConcurrentIdentityHashMapTest3.java | 39 +++ .../druid/bvt/utils/JSONWriterTest.java | 29 ++ .../druid/bvt/utils/JdbcUtilsTest1.java | 58 ++++ .../java/com/alibaba/druid/spring/User.java | 10 +- .../com/alibaba/druid/pool/ibatis/User.xml | 19 +- 81 files changed, 2491 insertions(+), 691 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/log/Slf4jLogFilterTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/spring/SqlMapClientWrapperTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/spring/SqlMapExecutorWrapperTest_2.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest2.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleDate.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_between.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_case.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_groupSet.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/EqualTest_mysqlMatch.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/SQLASTVisitorAdapterTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_gt_true.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_lt_false.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_multi_short.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest46.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest44.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGASTVisitorAdapterTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/support/spring/DruidLobCreatorTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/utils/JSONWriterTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/utils/JdbcUtilsTest1.java diff --git a/src/main/java/com/alibaba/druid/mock/MockClob.java b/src/main/java/com/alibaba/druid/mock/MockClob.java index 62f0a6127b..85797bdb66 100644 --- a/src/main/java/com/alibaba/druid/mock/MockClob.java +++ b/src/main/java/com/alibaba/druid/mock/MockClob.java @@ -16,6 +16,7 @@ package com.alibaba.druid.mock; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; @@ -26,6 +27,7 @@ public class MockClob implements Clob { private byte[] bytes; + private ByteArrayOutputStream out = new ByteArrayOutputStream(); public MockClob(){ this(new byte[0]); @@ -81,7 +83,7 @@ public int setString(long pos, String str, int offset, int len) throws SQLExcept @Override public OutputStream setAsciiStream(long pos) throws SQLException { - return null; + return out; } @Override diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index d4a278b587..bd128cd05c 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -318,10 +318,10 @@ public void resetStat() { transactionHistogram.reset(); cachedPreparedStatementDeleteCount.set(0); recycleErrorCount.set(0); - + resetCount.incrementAndGet(); } - + public long getResetCount() { return this.resetCount.get(); } @@ -1445,19 +1445,19 @@ public DruidDataSourceStatValue getStatValueAndReset() { lock.lock(); try { - value.poolingCount = this.poolingCount; - value.poolingPeak = this.poolingPeak; - value.poolingPeakTime = this.poolingPeakTime; + value.setPoolingCount(this.poolingCount); + value.setPoolingPeak(this.poolingPeak); + value.setPoolingPeakTime(this.poolingPeakTime); - value.activeCount = this.activeCount; - value.activePeak = this.activePeak; - value.activePeakTime = this.activePeakTime; + value.setActiveCount(this.activeCount); + value.setActivePeak(this.activePeak); + value.setActivePeakTime(this.activePeakTime); - value.connectCount = this.connectCount; - value.closeCount = this.closeCount; - value.waitThreadCount = lock.getWaitQueueLength(notEmpty); - value.notEmptyWaitCount = this.notEmptyWaitCount; - value.notEmptyWaitNanos = this.notEmptyWaitNanos; + value.setConnectCount(this.connectCount); + value.setCloseCount(this.closeCount); + value.setWaitThreadCount(lock.getWaitQueueLength(notEmpty)); + value.setNotEmptyWaitCount(this.notEmptyWaitCount); + value.setNotEmptyWaitNanos(this.notEmptyWaitNanos); // reset this.poolingPeak = 0; @@ -1473,56 +1473,56 @@ public DruidDataSourceStatValue getStatValueAndReset() { lock.unlock(); } - value.name = this.getName(); - value.dbType = this.getDbType(); - value.driverClassName = this.getDriverClassName(); + value.setName(this.getName()); + value.setDbType(this.getDbType()); + value.setDriverClassName(this.getDriverClassName()); - value.url = this.getUrl(); - value.userName = this.getUsername(); - value.filterClassNames = this.getFilterClassNames(); + value.setUrl(this.getUrl()); + value.setUserName(this.getUsername()); + value.setFilterClassNames(this.getFilterClassNames()); - value.initialSize = this.getInitialSize(); - value.minIdle = this.getMinIdle(); - value.maxActive = this.getMaxActive(); + value.setInitialSize(this.getInitialSize()); + value.setMinIdle(this.getMinIdle()); + value.setMaxActive(this.getMaxActive()); - value.queryTimeout = this.getQueryTimeout(); - value.transactionQueryTimeout = this.getTransactionQueryTimeout(); - value.loginTimeout = this.getLoginTimeout(); - value.validConnectionCheckerClassName = this.getValidConnectionCheckerClassName(); - value.exceptionSorterClassName = this.getExceptionSorterClassName(); + value.setQueryTimeout(this.getQueryTimeout()); + value.setTransactionQueryTimeout(this.getTransactionQueryTimeout()); + value.setLoginTimeout(this.getLoginTimeout()); + value.setValidConnectionCheckerClassName(this.getValidConnectionCheckerClassName()); + value.setExceptionSorterClassName(this.getExceptionSorterClassName()); - value.testOnBorrow = this.isTestOnBorrow(); - value.testOnReturn = this.isTestOnReturn(); - value.testWhileIdle = this.isTestWhileIdle(); + value.setTestOnBorrow(this.isTestOnBorrow()); + value.setTestOnReturn(this.isTestOnReturn()); + value.setTestWhileIdle(this.isTestWhileIdle()); - value.defaultAutoCommit = this.isDefaultAutoCommit(); - value.defaultReadOnly = this.isDefaultAutoCommit(); - value.defaultTransactionIsolation = this.getDefaultTransactionIsolation(); + value.setDefaultAutoCommit(this.isDefaultAutoCommit()); + value.setDefaultReadOnly(this.isDefaultAutoCommit()); + value.setDefaultTransactionIsolation(this.getDefaultTransactionIsolation()); - value.logicConnectErrorCount = connectErrorCount.getAndSet(0); + value.setLogicConnectErrorCount(connectErrorCount.getAndSet(0)); - value.physicalConnectCount = createCount.getAndSet(0); - value.physicalCloseCount = destroyCount.getAndSet(0); - value.physicalConnectErrorCount = createErrorCount.getAndSet(0); + value.setPhysicalConnectCount(createCount.getAndSet(0)); + value.setPhysicalCloseCount(destroyCount.getAndSet(0)); + value.setPhysicalConnectErrorCount(createErrorCount.getAndSet(0)); - value.executeCount = this.executeCount.getAndSet(0); - value.errorCount = errorCount.getAndSet(0); - value.commitCount = commitCount.getAndSet(0); - value.rollbackCount = rollbackCount.getAndSet(0); + value.setExecuteCount(this.executeCount.getAndSet(0)); + value.setErrorCount(errorCount.getAndSet(0)); + value.setCommitCount(commitCount.getAndSet(0)); + value.setRollbackCount(rollbackCount.getAndSet(0)); - value.pstmtCacheHitCount = cachedPreparedStatementHitCount.getAndSet(0); - value.pstmtCacheMissCount = cachedPreparedStatementMissCount.getAndSet(0); + value.setPstmtCacheHitCount(cachedPreparedStatementHitCount.getAndSet(0)); + value.setPstmtCacheMissCount(cachedPreparedStatementMissCount.getAndSet(0)); - value.startTransactionCount = startTransactionCount.getAndSet(0); - value.transactionHistogram = this.getTransactionHistogram().toArrayAndReset(); + value.setStartTransactionCount(startTransactionCount.getAndSet(0)); + value.setTransactionHistogram(this.getTransactionHistogram().toArrayAndReset()); - value.connectionHoldTimeHistogram = this.getDataSourceStat().getConnectionHoldHistogram().toArrayAndReset(); + value.setConnectionHoldTimeHistogram(this.getDataSourceStat().getConnectionHoldHistogram().toArrayAndReset()); value.removeAbandoned = this.isRemoveAbandoned(); - value.clobOpenCount = this.getDataSourceStat().getClobOpenCountAndReset(); - value.blobOpenCount = this.getDataSourceStat().getBlobOpenCountAndReset(); + value.setClobOpenCount(this.getDataSourceStat().getClobOpenCountAndReset()); + value.setBlobOpenCount(this.getDataSourceStat().getBlobOpenCountAndReset()); - value.sqlSkipCount = this.getDataSourceStat().getSkipSqlCountAndReset(); - value.sqlList = this.getDataSourceStat().getSqlStatMapAndReset(); + value.setSqlSkipCount(this.getDataSourceStat().getSkipSqlCountAndReset()); + value.setSqlList(this.getDataSourceStat().getSqlStatMapAndReset()); return value; } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatValue.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatValue.java index e0e1107d1b..4f64e28d3e 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatValue.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatValue.java @@ -17,10 +17,8 @@ import java.util.Date; import java.util.List; -import java.util.Map; import com.alibaba.druid.stat.JdbcSqlStatValue; -import com.alibaba.druid.support.json.JSONUtils; public class DruidDataSourceStatValue { @@ -81,27 +79,6 @@ public class DruidDataSourceStatValue { protected List sqlList; - @SuppressWarnings("unchecked") - public void fromJSON(String json) { -// protected String dbType; -// protected String driverClassName; -// protected String url; -// protected String userName; -// protected List filterClassNames; -// protected boolean removeAbandoned; -// - Map map = (Map) JSONUtils.parse(json); - fromJSON(map); - } - - public void fromJSON(Map map) { - this.name = (String) map.get("name"); - this.dbType = (String) map.get("dbType"); - this.driverClassName = (String) map.get("driverClassName"); - this.url = (String) map.get("url"); - this.userName = (String) map.get("userName"); - } - public Date getPoolingPeakTime() { if (poolingPeakTime <= 0) { return null; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBetweenExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBetweenExpr.java index ed08ed9844..c09395bb58 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBetweenExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBetweenExpr.java @@ -44,18 +44,6 @@ public SQLBetweenExpr(SQLExpr testExpr, boolean not, SQLExpr beginExpr, SQLExpr this.not = not; } - public void output(StringBuffer buf) { - this.testExpr.output(buf); - if (this.not) { - buf.append(" NOT BETWEEN "); - } else { - buf.append(" BETWEEN "); - } - this.beginExpr.output(buf); - buf.append(" AND "); - this.endExpr.output(buf); - } - protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.testExpr); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseExpr.java index 826c28424d..22c348e372 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseExpr.java @@ -35,29 +35,6 @@ public SQLCaseExpr(){ } - public void output(StringBuffer buf) { - buf.append("CASE "); - if (this.valueExpr != null) { - this.valueExpr.output(buf); - buf.append(" "); - } - - int i = 0; - for (int size = this.items.size(); i < size; ++i) { - if (i != 0) { - buf.append(" "); - } - ((Item) this.items.get(i)).output(buf); - } - - if (this.elseExpr != null) { - buf.append(" ELSE "); - this.elseExpr.output(buf); - } - - buf.append(" END"); - } - public SQLExpr getValueExpr() { return this.valueExpr; } @@ -138,13 +115,6 @@ public void setValueExpr(SQLExpr valueExpr) { this.valueExpr = valueExpr; } - public void output(StringBuffer buf) { - buf.append("WHEN "); - this.conditionExpr.output(buf); - buf.append(" THEN "); - this.valueExpr.output(buf); - } - protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.conditionExpr); @@ -152,6 +122,31 @@ protected void accept0(SQLASTVisitor visitor) { } visitor.endVisit(this); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((conditionExpr == null) ? 0 : conditionExpr.hashCode()); + result = prime * result + ((valueExpr == null) ? 0 : valueExpr.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; + Item other = (Item) obj; + if (conditionExpr == null) { + if (other.conditionExpr != null) return false; + } else if (!conditionExpr.equals(other.conditionExpr)) return false; + if (valueExpr == null) { + if (other.valueExpr != null) return false; + } else if (!valueExpr.equals(other.valueExpr)) return false; + return true; + } + } @Override diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLExistsExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLExistsExpr.java index fcc07f6181..1f986b123c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLExistsExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLExistsExpr.java @@ -32,13 +32,11 @@ public SQLExistsExpr(){ } public SQLExistsExpr(SQLSelect subQuery){ - - this.subQuery = subQuery; + this.setSubQuery(subQuery); } public SQLExistsExpr(SQLSelect subQuery, boolean not){ - - this.subQuery = subQuery; + this.setSubQuery(subQuery); this.not = not; } @@ -55,16 +53,10 @@ public SQLSelect getSubQuery() { } public void setSubQuery(SQLSelect subQuery) { - this.subQuery = subQuery; - } - - public void output(StringBuffer buf) { - if (this.not) { - buf.append("NOT "); + if (subQuery != null) { + subQuery.setParent(this); } - buf.append("EXISTS ("); - this.subQuery.output(buf); - buf.append(")"); + this.subQuery = subQuery; } protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java index 43ed527510..2239f68af9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java @@ -21,17 +21,17 @@ public class SQLSelect extends SQLObjectImpl { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; protected SQLWithSubqueryClause withSubQuery; - protected SQLSelectQuery query; - protected SQLOrderBy orderBy; + protected SQLSelectQuery query; + protected SQLOrderBy orderBy; public SQLSelect(){ } - - public SQLSelect(SQLSelectQuery query) { + + public SQLSelect(SQLSelectQuery query){ this.setQuery(query); } @@ -62,15 +62,6 @@ public void setOrderBy(SQLOrderBy orderBy) { this.orderBy = orderBy; } - public void output(StringBuffer buf) { - this.query.output(buf); - buf.append(" "); - - if (this.orderBy != null) { - this.orderBy.output(buf); - } - } - protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.query); @@ -80,4 +71,32 @@ protected void accept0(SQLASTVisitor visitor) { visitor.endVisit(this); } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((orderBy == null) ? 0 : orderBy.hashCode()); + result = prime * result + ((query == null) ? 0 : query.hashCode()); + result = prime * result + ((withSubQuery == null) ? 0 : withSubQuery.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; + SQLSelect other = (SQLSelect) obj; + if (orderBy == null) { + if (other.orderBy != null) return false; + } else if (!orderBy.equals(other.orderBy)) return false; + if (query == null) { + if (other.query != null) return false; + } else if (!query.equals(other.query)) return false; + if (withSubQuery == null) { + if (other.withSubQuery != null) return false; + } else if (!withSubQuery.equals(other.withSubQuery)) return false; + return true; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java index afaa708fd5..5be303709b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java @@ -19,7 +19,6 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLSelectQueryBlock extends SQLSelectQuery { @@ -103,40 +102,42 @@ protected void accept0(SQLASTVisitor visitor) { 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); - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + distionOption; + result = prime * result + ((from == null) ? 0 : from.hashCode()); + result = prime * result + ((groupBy == null) ? 0 : groupBy.hashCode()); + result = prime * result + ((into == null) ? 0 : into.hashCode()); + result = prime * result + ((selectList == null) ? 0 : selectList.hashCode()); + result = prime * result + ((where == null) ? 0 : where.hashCode()); + return result; + } - if (this.groupBy != null) { - buf.append(" "); - this.groupBy.output(buf); - } + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + SQLSelectQueryBlock other = (SQLSelectQueryBlock) obj; + if (distionOption != other.distionOption) return false; + if (from == null) { + if (other.from != null) return false; + } else if (!from.equals(other.from)) return false; + if (groupBy == null) { + if (other.groupBy != null) return false; + } else if (!groupBy.equals(other.groupBy)) return false; + if (into == null) { + if (other.into != null) return false; + } else if (!into.equals(other.into)) return false; + if (selectList == null) { + if (other.selectList != null) return false; + } else if (!selectList.equals(other.selectList)) return false; + if (where == null) { + if (other.where != null) return false; + } else if (!where.equals(other.where)) return false; + return true; } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlBinlogStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlBinlogStatement.java index 7f77d9dcf2..52a54fa530 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlBinlogStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlBinlogStatement.java @@ -35,5 +35,6 @@ public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, expr); } + visitor.endVisit(this); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateUserStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateUserStatement.java index 74ccb120f4..34bbd6ef8f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateUserStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateUserStatement.java @@ -41,6 +41,7 @@ public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, users); } + visitor.endVisit(this); } public static class UserSpecification extends MySqlObjectImpl { @@ -82,6 +83,7 @@ public void accept0(MySqlASTVisitor visitor) { acceptChild(visitor, password); acceptChild(visitor, authPlugin); } + visitor.endVisit(this); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropUser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropUser.java index 4272c06655..255ed56235 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropUser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropUser.java @@ -39,5 +39,6 @@ public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, users); } + visitor.endVisit(this); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java index 596cb3052e..554f69b574 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java @@ -47,5 +47,6 @@ public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, threadId); } + visitor.endVisit(this); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlResetStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlResetStatement.java index 90eba671bb..84de942221 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlResetStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlResetStatement.java @@ -35,5 +35,6 @@ public void setOptions(List options) { public void accept0(MySqlASTVisitor visitor) { visitor.visit(this); + visitor.endVisit(this); } } 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 74138433d5..f24b7388f8 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 @@ -55,12 +55,12 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO public MySqlSelectQueryBlock(){ } - + public int getHintsSize() { if (hints == null) { return 0; } - + return hints.size(); } @@ -185,6 +185,62 @@ public void setLimit(Limit limit) { this.limit = limit; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (bigResult ? 1231 : 1237); + result = prime * result + (bufferResult ? 1231 : 1237); + result = prime * result + ((cache == null) ? 0 : cache.hashCode()); + result = prime * result + (calcFoundRows ? 1231 : 1237); + result = prime * result + (forUpdate ? 1231 : 1237); + result = prime * result + (hignPriority ? 1231 : 1237); + result = prime * result + ((hints == null) ? 0 : hints.hashCode()); + result = prime * result + ((limit == null) ? 0 : limit.hashCode()); + result = prime * result + (lockInShareMode ? 1231 : 1237); + result = prime * result + ((orderBy == null) ? 0 : orderBy.hashCode()); + result = prime * result + ((procedureArgumentList == null) ? 0 : procedureArgumentList.hashCode()); + result = prime * result + ((procedureName == null) ? 0 : procedureName.hashCode()); + result = prime * result + (smallResult ? 1231 : 1237); + result = prime * result + (straightJoin ? 1231 : 1237); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + MySqlSelectQueryBlock other = (MySqlSelectQueryBlock) obj; + if (bigResult != other.bigResult) return false; + if (bufferResult != other.bufferResult) return false; + if (cache == null) { + if (other.cache != null) return false; + } else if (!cache.equals(other.cache)) return false; + if (calcFoundRows != other.calcFoundRows) return false; + if (forUpdate != other.forUpdate) return false; + if (hignPriority != other.hignPriority) return false; + if (hints == null) { + if (other.hints != null) return false; + } else if (!hints.equals(other.hints)) return false; + if (limit == null) { + if (other.limit != null) return false; + } else if (!limit.equals(other.limit)) return false; + if (lockInShareMode != other.lockInShareMode) return false; + if (orderBy == null) { + if (other.orderBy != null) return false; + } else if (!orderBy.equals(other.orderBy)) return false; + if (procedureArgumentList == null) { + if (other.procedureArgumentList != null) return false; + } else if (!procedureArgumentList.equals(other.procedureArgumentList)) return false; + if (procedureName == null) { + if (other.procedureName != null) return false; + } else if (!procedureName.equals(other.procedureName)) return false; + if (smallResult != other.smallResult) return false; + if (straightJoin != other.straightJoin) return false; + return true; + } + @Override protected void accept0(SQLASTVisitor visitor) { if (visitor instanceof MySqlASTVisitor) { @@ -258,6 +314,7 @@ protected void accept0(SQLASTVisitor visitor) { acceptChild(visitor, offset); acceptChild(visitor, rowCount); } + mysqlVisitor.endVisit(this); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlTableIndex.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlTableIndex.java index e6ce999e16..b39f8f7c7e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlTableIndex.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlTableIndex.java @@ -20,13 +20,12 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.statement.SQLTableElement; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; @SuppressWarnings("serial") -public class MySqlTableIndex extends SQLObjectImpl implements SQLTableElement { +public class MySqlTableIndex extends MySqlObjectImpl implements SQLTableElement { private SQLName name; private String indexType; @@ -56,21 +55,7 @@ public List getColumns() { return columns; } - @Override - protected void accept0(SQLASTVisitor visitor) { - if (visitor instanceof MySqlASTVisitor) { - accept0((MySqlASTVisitor) visitor); - return; - } - - if (visitor.visit(this)) { - acceptChild(visitor, name); - acceptChild(visitor, columns); - } - visitor.endVisit(this); - } - - protected void accept0(MySqlASTVisitor visitor) { + public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, name); acceptChild(visitor, columns); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java index da201c19d7..30d2c4a3b5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java @@ -40,6 +40,7 @@ public void accept0(OracleASTVisitor visitor) { acceptChild(visitor, referenceModelClauses); acceptChild(visitor, mainModel); } + visitor.endVisit(this); } public MainModelClause getMainModel() { @@ -104,6 +105,7 @@ public void setAll(boolean all) { @Override public void accept0(OracleASTVisitor visitor) { visitor.visit(this); + visitor.endVisit(this); } } @@ -179,6 +181,7 @@ public void accept0(OracleASTVisitor visitor) { acceptChild(visitor, dimensionByColumns); acceptChild(visitor, measuresColumns); } + visitor.endVisit(this); } } @@ -211,6 +214,7 @@ public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, expr); } + visitor.endVisit(this); } } @@ -281,6 +285,7 @@ public void accept0(OracleASTVisitor visitor) { acceptChild(visitor, modelColumnClause); acceptChild(visitor, modelRulesClause); } + visitor.endVisit(this); } } @@ -324,6 +329,7 @@ public void accept0(OracleASTVisitor visitor) { acceptChild(visitor, until); acceptChild(visitor, cellAssignmentItems); } + visitor.endVisit(this); } } @@ -391,6 +397,7 @@ public void accept0(OracleASTVisitor visitor) { acceptChild(visitor, orderBy); acceptChild(visitor, expr); } + visitor.endVisit(this); } } @@ -419,6 +426,7 @@ public void accept0(OracleASTVisitor visitor) { acceptChild(visitor, measureColumn); acceptChild(visitor, conditions); } + visitor.endVisit(this); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleCursorExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleCursorExpr.java index 05d644aa30..94e2a6b987 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleCursorExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleCursorExpr.java @@ -52,6 +52,7 @@ public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, query); } + visitor.endVisit(this); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsSetExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsSetExpr.java index e2a90e5339..94dc181831 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsSetExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsSetExpr.java @@ -51,6 +51,7 @@ public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, nestedTable); } + visitor.endVisit(this); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 644ea15a13..6b93b5263c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -729,6 +729,7 @@ public SQLTableSource parseTableSource() { if (identifierEquals("ONLY")) { lexer.nextToken(); + tableReference.setOnly(true); accept(Token.LPAREN); parseTableSourceQueryTableExpr(tableReference); accept(Token.RPAREN); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 8455055e38..710eea3c53 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -179,7 +179,7 @@ public boolean isPrintPostSemi() { } public void postVisit(SQLObject x) { - if (!printPostSemi) { + if (!isPrintPostSemi()) { return; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index eb0fa11ebe..1495188265 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -93,10 +93,8 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; -import com.alibaba.druid.sql.ast.statement.SQLTableElement; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; -import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.ast.statement.SQLUseStatement; @@ -232,10 +230,6 @@ public interface SQLASTVisitor { void endVisit(SQLCreateTableStatement x); - boolean visit(SQLTableElement x); - - void endVisit(SQLTableElement x); - boolean visit(SQLColumnDefinition x); void endVisit(SQLColumnDefinition x); @@ -276,10 +270,6 @@ public interface SQLASTVisitor { void endVisit(SQLCreateViewStatement x); - boolean visit(SQLUniqueConstraint x); - - void endVisit(SQLUniqueConstraint x); - boolean visit(NotNullConstraint x); void endVisit(NotNullConstraint x); @@ -455,7 +445,7 @@ public interface SQLASTVisitor { boolean visit(SQLExprHint x); void endVisit(SQLExprHint x); - + boolean visit(SQLAlterTableDropConstraint x); void endVisit(SQLAlterTableDropConstraint x); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 66ad3a9bd6..ec778d5987 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -94,10 +94,8 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; -import com.alibaba.druid.sql.ast.statement.SQLTableElement; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; -import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.ast.statement.SQLUseStatement; @@ -314,13 +312,6 @@ public boolean visit(SQLCreateTableStatement x) { public void endVisit(SQLCreateTableStatement x) { } - public boolean visit(SQLTableElement x) { - return true; - } - - public void endVisit(SQLTableElement x) { - } - public boolean visit(SQLColumnDefinition x) { return true; } @@ -377,13 +368,6 @@ public boolean visit(SQLCreateViewStatement x) { public void endVisit(SQLCreateViewStatement x) { } - public boolean visit(SQLUniqueConstraint x) { - return true; - } - - public void endVisit(SQLUniqueConstraint x) { - } - public boolean visit(NotNullConstraint x) { return true; } @@ -662,7 +646,7 @@ public void endVisit(SQLCommentHint x) { @Override public void endVisit(SQLCreateDatabaseStatement x) { - + } @Override @@ -677,7 +661,7 @@ public boolean visit(SQLAlterTableDropIndex x) { @Override public void endVisit(SQLAlterTableDropIndex x) { - + } @Override @@ -687,7 +671,7 @@ public boolean visit(SQLAlterTableAddPrimaryKey x) { @Override public void endVisit(SQLAlterTableAddPrimaryKey x) { - + } @Override @@ -701,7 +685,7 @@ public boolean visit(SQLOver x) { @Override public void endVisit(SQLColumnPrimaryKey x) { - + } @Override @@ -717,11 +701,11 @@ public void endVisit(SQLWithSubqueryClause x) { public boolean visit(SQLWithSubqueryClause x) { return true; } - + @Override public void endVisit(SQLWithSubqueryClause.Entry x) { } - + @Override public boolean visit(SQLWithSubqueryClause.Entry x) { return true; @@ -734,12 +718,12 @@ public boolean visit(SQLCharactorDataType x) { @Override public void endVisit(SQLCharactorDataType x) { - + } @Override public void endVisit(SQLAlterTableAlterColumn x) { - + } @Override @@ -754,7 +738,7 @@ public boolean visit(SQLCheck x) { @Override public void endVisit(SQLCheck x) { - + } @Override @@ -764,17 +748,17 @@ public boolean visit(SQLAlterTableDropForeinKey x) { @Override public void endVisit(SQLAlterTableDropForeinKey x) { - + } - + @Override public boolean visit(SQLAlterTableDropPrimaryKey x) { return true; } - + @Override public void endVisit(SQLAlterTableDropPrimaryKey x) { - + } @Override @@ -784,7 +768,7 @@ public boolean visit(SQLAlterTableDisableKeys x) { @Override public void endVisit(SQLAlterTableDisableKeys x) { - + } @Override @@ -794,17 +778,17 @@ public boolean visit(SQLAlterTableEnableKeys x) { @Override public void endVisit(SQLAlterTableEnableKeys x) { - + } - + @Override public boolean visit(SQLAlterTableStatement x) { return true; } - + @Override public void endVisit(SQLAlterTableStatement x) { - + } @Override @@ -814,7 +798,7 @@ public boolean visit(SQLAlterTableAddForeignKey x) { @Override public void endVisit(SQLAlterTableAddForeignKey x) { - + } @Override @@ -824,26 +808,27 @@ public boolean visit(SQLAlterTableDisableConstraint x) { @Override public void endVisit(SQLAlterTableDisableConstraint x) { - + } - + @Override public boolean visit(SQLAlterTableEnableConstraint x) { return true; } - + @Override public void endVisit(SQLAlterTableEnableConstraint x) { - + } + @Override public boolean visit(SQLColumnCheck x) { return true; } - + @Override public void endVisit(SQLColumnCheck x) { - + } @Override @@ -853,9 +838,9 @@ public boolean visit(SQLExprHint x) { @Override public void endVisit(SQLExprHint x) { - + } - + @Override public boolean visit(SQLAlterTableDropConstraint x) { return true; @@ -863,6 +848,6 @@ public boolean visit(SQLAlterTableDropConstraint x) { @Override public void endVisit(SQLAlterTableDropConstraint x) { - + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index fd2558a5b1..9b299cae7a 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -1006,7 +1006,7 @@ public static Byte castToByte(Object val) { } public static Short castToShort(Object val) { - if (val == null) { + if (val == null || val == EVAL_VALUE_NULL) { return null; } @@ -1078,7 +1078,7 @@ public static Long castToLong(Object val) { } public static Float castToFloat(Object val) { - if (val == null) { + if (val == null || val == EVAL_VALUE_NULL) { return null; } @@ -1090,7 +1090,7 @@ public static Float castToFloat(Object val) { } public static Double castToDouble(Object val) { - if (val == null) { + if (val == null || val == EVAL_VALUE_NULL) { return null; } @@ -1191,11 +1191,21 @@ public static Object div(Object a, Object b) { } if (a instanceof Double || b instanceof Double) { - return castToDouble(a) / (castToDouble(b)); + Double doubleA = castToDouble(a); + Double doubleB = castToDouble(b); + if (doubleA == null || doubleB == null) { + return null; + } + return doubleA / doubleB; } if (a instanceof Float || b instanceof Float) { - return castToFloat(a) / (castToFloat(b)); + Float floatA = castToFloat(a); + Float floatB = castToFloat(b); + if (floatA == null || floatB == null) { + return null; + } + return floatA / floatB; } if (a instanceof BigInteger || b instanceof BigInteger) { @@ -1559,7 +1569,14 @@ public static Object multi(Object a, Object b) { } if (a instanceof Short || b instanceof Short) { - return castToShort(a) * castToShort(b); + Short shortA = castToShort(a); + Short shortB = castToShort(b); + + if (shortA == null || shortB == null) { + return null; + } + + return shortA * shortB; } if (a instanceof Byte || b instanceof Byte) { diff --git a/src/main/java/com/alibaba/druid/support/http/util/IPRange.java b/src/main/java/com/alibaba/druid/support/http/util/IPRange.java index bfb0ad9889..d898797614 100644 --- a/src/main/java/com/alibaba/druid/support/http/util/IPRange.java +++ b/src/main/java/com/alibaba/druid/support/http/util/IPRange.java @@ -64,52 +64,6 @@ public IPRange(String range){ parseRange(range); } - // ------------------------------------------------------------------------- - /** - * Constructor. - * - * @param ipAddress Reference to the IP address number - * @param subnetMask Reference to the subnet mask - * @exception InvalidIPRangeException Throws this exception when the combination of the IP address and the subnet - * mask does not define a valid IP range. - * @exception InvalidIPAddressException Throws this exception if the specified IP address or subnet mask do ne - * define a valid IP number. - */ - public IPRange(IPAddress ipAddress, IPAddress subnetMask){ - if ((ipAddress == null) || (subnetMask == null)) { - throw new IllegalArgumentException(); - } - - this.ipAddress = ipAddress; - this.ipSubnetMask = subnetMask; - - extendedNetworkPrefix = computeNetworkPrefixFromMask(subnetMask); - if (extendedNetworkPrefix == -1) { - throw new IllegalArgumentException(); - } - } - - // ------------------------------------------------------------------------- - /** - * Constructor. - * - * @param ipAddress The reference on the IP address. - * @param extendedNetworkPrefix The extended network prefix (0-32). - */ - public IPRange(IPAddress ipAddress, int extendedNetworkPrefix){ - if (ipAddress == null) { - throw new IllegalArgumentException(); - } - - if ((extendedNetworkPrefix < 0) || (extendedNetworkPrefix > 32)) { - throw new IllegalArgumentException(); - } - - this.ipAddress = ipAddress; - this.extendedNetworkPrefix = extendedNetworkPrefix; - this.ipSubnetMask = computeMaskFromNetworkPrefix(extendedNetworkPrefix); - } - // ------------------------------------------------------------------------- /** * Return the encapsulated IP address. @@ -155,37 +109,6 @@ public String toString() { return result.toString(); } - /* - * (non-Javadoc) - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + extendedNetworkPrefix; - result = prime * result + ((ipAddress == null) ? 0 : ipAddress.hashCode()); - result = prime * result + ((ipSubnetMask == null) ? 0 : ipSubnetMask.hashCode()); - return result; - } - - // ------------------------------------------------------------------------- - /** - * Compare the specified IP range to the encapsulated one. - * - * @param another The IP range to be compared. - * @return Return true if the encapsulated IP range is the same as the specified one, otherwise return - * false. - */ - public boolean equals(Object another) { - if (another instanceof IPRange) { - IPRange range = (IPRange) another; - - return (ipAddress.equals(range.getIPAddress()) && (extendedNetworkPrefix == range.extendedNetworkPrefix)); - } - return false; - } - // ------------------------------------------------------------------------- /** * Parse the IP range string representation. @@ -265,7 +188,7 @@ public static String toDecimalString(String inBinaryIpAddress) { int octet = Integer.parseInt(binary[c], 2); decimalip.append(octet); if (c < 3) { - + decimalip.append('.'); } } @@ -311,7 +234,7 @@ public boolean isIPAddressInRange(IPAddress address) { if (ipSubnetMask == null) { return this.ipAddress.equals(address); } - + int result1 = address.getIPAddress() & ipSubnetMask.getIPAddress(); int result2 = ipAddress.getIPAddress() & ipSubnetMask.getIPAddress(); diff --git a/src/main/java/com/alibaba/druid/support/json/JSONWriter.java b/src/main/java/com/alibaba/druid/support/json/JSONWriter.java index 817d389121..7fe7ff3203 100644 --- a/src/main/java/com/alibaba/druid/support/json/JSONWriter.java +++ b/src/main/java/com/alibaba/druid/support/json/JSONWriter.java @@ -195,6 +195,11 @@ public void writeArray(Collection list) { } public void writeString(String text) { + if (text == null) { + writeNull(); + return; + } + write('"'); for (int i = 0; i < text.length(); ++i) { char c = text.charAt(i); diff --git a/src/main/java/com/alibaba/druid/support/logging/Resources.java b/src/main/java/com/alibaba/druid/support/logging/Resources.java index b4a9439fc5..4517682288 100644 --- a/src/main/java/com/alibaba/druid/support/logging/Resources.java +++ b/src/main/java/com/alibaba/druid/support/logging/Resources.java @@ -15,15 +15,6 @@ */ package com.alibaba.druid.support.logging; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.URL; -import java.net.URLConnection; -import java.nio.charset.Charset; -import java.util.Properties; /** * A class to simplify access to resources through the classloader. @@ -32,11 +23,6 @@ public final class Resources extends Object { private static ClassLoader defaultClassLoader; - /** - * Charset to use when calling getResourceAsReader. null means use the system default. - */ - private static Charset charset; - private Resources(){ } @@ -58,212 +44,6 @@ public static void setDefaultClassLoader(ClassLoader defaultClassLoader) { Resources.defaultClassLoader = defaultClassLoader; } - /** - * Returns the URL of the resource on the classpath - * - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static URL getResourceURL(String resource) throws IOException { - return getResourceURL(getClassLoader(), resource); - } - - /** - * Returns the URL of the resource on the classpath - * - * @param loader The classloader used to load the resource - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static URL getResourceURL(ClassLoader loader, String resource) throws IOException { - URL url = null; - - if (loader != null) { - url = loader.getResource(resource); - } - - if (url == null) { - url = ClassLoader.getSystemResource(resource); - } - - if (url == null) { - throw new IOException("Could not find resource " + resource); - } - - return url; - } - - /** - * Returns a resource on the classpath as a Stream object - * - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static InputStream getResourceAsStream(String resource) throws IOException { - return getResourceAsStream(getClassLoader(), resource); - } - - /** - * Returns a resource on the classpath as a Stream object - * - * @param loader The classloader used to load the resource - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException { - InputStream in = null; - if (loader != null) { - in = loader.getResourceAsStream(resource); - } - if (in == null) { - in = ClassLoader.getSystemResourceAsStream(resource); - } - if (in == null) { - throw new IOException("Could not find resource " + resource); - } - return in; - } - - /** - * Returns a resource on the classpath as a Properties object - * - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static Properties getResourceAsProperties(String resource) throws IOException { - Properties props = new Properties(); - InputStream in = null; - String propfile = resource; - in = getResourceAsStream(propfile); - props.load(in); - in.close(); - return props; - } - - /** - * Returns a resource on the classpath as a Properties object - * - * @param loader The classloader used to load the resource - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static Properties getResourceAsProperties(ClassLoader loader, String resource) throws IOException { - Properties props = new Properties(); - InputStream in = null; - String propfile = resource; - in = getResourceAsStream(loader, propfile); - props.load(in); - in.close(); - return props; - } - - /** - * Returns a resource on the classpath as a Reader object - * - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static Reader getResourceAsReader(String resource) throws IOException { - Reader reader; - if (charset == null) { - reader = new InputStreamReader(getResourceAsStream(resource)); - } else { - reader = new InputStreamReader(getResourceAsStream(resource), charset); - } - - return reader; - } - - /** - * Returns a resource on the classpath as a Reader object - * - * @param loader The classloader used to load the resource - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static Reader getResourceAsReader(ClassLoader loader, String resource) throws IOException { - Reader reader; - if (charset == null) { - reader = new InputStreamReader(getResourceAsStream(loader, resource)); - } else { - reader = new InputStreamReader(getResourceAsStream(loader, resource), charset); - } - - return reader; - } - - /** - * Returns a resource on the classpath as a File object - * - * @param resource The resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static File getResourceAsFile(String resource) throws IOException { - return new File(getResourceURL(resource).getFile()); - } - - /** - * Returns a resource on the classpath as a File object - * - * @param loader - the classloader used to load the resource - * @param resource - the resource to find - * @return The resource - * @throws IOException If the resource cannot be found or read - */ - public static File getResourceAsFile(ClassLoader loader, String resource) throws IOException { - return new File(getResourceURL(loader, resource).getFile()); - } - - /** - * Gets a URL as an input stream - * - * @param urlString - the URL to get - * @return An input stream with the data from the URL - * @throws IOException If the resource cannot be found or read - */ - public static InputStream getUrlAsStream(String urlString) throws IOException { - URL url = new URL(urlString); - URLConnection conn = url.openConnection(); - return conn.getInputStream(); - } - - /** - * Gets a URL as a Reader - * - * @param urlString - the URL to get - * @return A Reader with the data from the URL - * @throws IOException If the resource cannot be found or read - */ - public static Reader getUrlAsReader(String urlString) throws IOException { - return new InputStreamReader(getUrlAsStream(urlString)); - } - - /** - * Gets a URL as a Properties object - * - * @param urlString - the URL to get - * @return A Properties object with the data from the URL - * @throws IOException If the resource cannot be found or read - */ - public static Properties getUrlAsProperties(String urlString) throws IOException { - Properties props = new Properties(); - InputStream in = null; - String propfile = urlString; - in = getUrlAsStream(propfile); - props.load(in); - in.close(); - return props; - } - /** * Loads a class * @@ -284,32 +64,6 @@ public static Class classForName(String className) throws ClassNotFoundExcept return clazz; } - /** - * Creates an instance of a class - * - * @param className - the class to create - * @return An instance of the class - * @throws ClassNotFoundException If the class cannot be found (duh!) - * @throws InstantiationException If the class cannot be instantiaed - * @throws IllegalAccessException If the class is not public, or other access problems arise - */ - public static Object instantiate(String className) throws ClassNotFoundException, InstantiationException, - IllegalAccessException { - return instantiate(classForName(className)); - } - - /** - * Creates an instance of a class - * - * @param clazz - the class to create - * @return An instance of the class - * @throws InstantiationException If the class cannot be instantiaed - * @throws IllegalAccessException If the class is not public, or other access problems arise - */ - public static Object instantiate(Class clazz) throws InstantiationException, IllegalAccessException { - return clazz.newInstance(); - } - private static ClassLoader getClassLoader() { if (defaultClassLoader != null) { return defaultClassLoader; @@ -318,19 +72,4 @@ private static ClassLoader getClassLoader() { } } - public static Charset getCharset() { - return charset; - } - - /** - * Use this method to set the Charset to be used when calling the getResourceAsReader methods. This will allow - * iBATIS to function properly when the system default encoding doesn't deal well with unicode (IBATIS-340, - * IBATIS-349) - * - * @param charset - */ - public static void setCharset(Charset charset) { - Resources.charset = charset; - } - } diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index ac0159e66d..5b9d3e3c8d 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -478,36 +478,40 @@ public static Driver createDriver(String driverClassName) throws SQLException { } public static Driver createDriver(ClassLoader classLoader, String driverClassName) throws SQLException { + Class clazz = null; if (classLoader != null) { try { - return (Driver) classLoader.loadClass(driverClassName).newInstance(); - } catch (IllegalAccessException e) { - throw new SQLException(e.getMessage(), e); - } catch (InstantiationException e) { - throw new SQLException(e.getMessage(), e); + clazz = classLoader.loadClass(driverClassName); } catch (ClassNotFoundException e) { - throw new SQLException(e.getMessage(), e); + // skip + } + } + + if (clazz == null) { + try { + ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + if (contextLoader != null) { + clazz = contextLoader.loadClass(driverClassName); + } + } catch (ClassNotFoundException e) { + // skip } } - try { - return (Driver) Class.forName(driverClassName).newInstance(); - } catch (IllegalAccessException e) { - throw new SQLException(e.getMessage(), e); - } catch (InstantiationException e) { - throw new SQLException(e.getMessage(), e); - } catch (ClassNotFoundException e) { - // skip + if (clazz == null) { + try { + clazz = Class.forName(driverClassName); + } catch (ClassNotFoundException e) { + throw new SQLException(e.getMessage(), e); + } } try { - return (Driver) Thread.currentThread().getContextClassLoader().loadClass(driverClassName).newInstance(); + return (Driver) clazz.newInstance(); } catch (IllegalAccessException e) { throw new SQLException(e.getMessage(), e); } catch (InstantiationException e) { throw new SQLException(e.getMessage(), e); - } catch (ClassNotFoundException e) { - throw new SQLException(e.getMessage(), e); } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/EncodingConvertFilterTest2.java b/src/test/java/com/alibaba/druid/bvt/filter/EncodingConvertFilterTest2.java index 44b8a5b152..1d5e272008 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/EncodingConvertFilterTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/EncodingConvertFilterTest2.java @@ -15,24 +15,33 @@ */ package com.alibaba.druid.bvt.filter; +import java.io.Reader; +import java.io.StringReader; import java.sql.CallableStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; +import java.sql.Types; +import java.util.Collections; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.filter.encoding.EncodingConvertFilter; import com.alibaba.druid.mock.MockCallableStatement; import com.alibaba.druid.mock.MockDriver; import com.alibaba.druid.mock.MockPreparedStatement; import com.alibaba.druid.mock.MockResultSet; +import com.alibaba.druid.mock.MockResultSetMetaData; import com.alibaba.druid.mock.MockStatementBase; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidPooledConnection; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; +import com.alibaba.druid.util.IOUtils; import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.druid.util.jdbc.ResultSetMetaDataBase.ColumnMetaData; public class EncodingConvertFilterTest2 extends TestCase { @@ -51,7 +60,7 @@ protected void setUp() throws Exception { dataSource.setFilters("encoding"); dataSource.setDriver(new MockDriver() { - + public ResultSet createResultSet(MockPreparedStatement stmt) { return new MyResultSet(stmt); } @@ -74,7 +83,7 @@ protected void tearDown() throws Exception { public void test_stat() throws Exception { Assert.assertTrue(dataSource.isInited()); - + EncodingConvertFilter filter = (EncodingConvertFilter) dataSource.getProxyFilters().get(0); DruidPooledConnection conn = dataSource.getConnection(); @@ -88,21 +97,145 @@ public void test_stat() throws Exception { stmt.execute(); String param1 = (String) raw.getParameters().get(0); - Assert.assertEquals(PARAM_VALUE, new String(param1.getBytes(SERVER_ENCODING), CLIENT_ENCODING)); + String C_TEXT = new String(param1.getBytes(SERVER_ENCODING), CLIENT_ENCODING); + Assert.assertEquals(PARAM_VALUE, C_TEXT); Assert.assertFalse(param1.equals(PARAM_VALUE)); - + MyResultSet rawRs = new MyResultSet(raw); - + rawRs.setValue(filter.encode((ConnectionProxy) conn.getConnection(), text)); - + raw.getOutParameters().add(rawRs); - + ResultSet rs = (ResultSet) stmt.getObject(1); - - rs.next(); - Assert.assertEquals(text, rs.getString(1)); + rs.next(); + Assert.assertEquals(text, rs.getString(1)); + Assert.assertEquals(text, rs.getString("1")); + Assert.assertEquals(text, rs.getObject(1)); + Assert.assertEquals(text, rs.getObject("1")); + Assert.assertEquals(text, rs.getObject(1, Collections.>emptyMap())); + Assert.assertEquals(text, rs.getObject("1", Collections.>emptyMap())); + + Assert.assertEquals(text, rs.getString(2)); + Assert.assertEquals(text, rs.getString("2")); + Assert.assertEquals(text, rs.getObject(2)); + Assert.assertEquals(text, rs.getObject("2")); + Assert.assertEquals(text, rs.getObject(2, Collections.>emptyMap())); + Assert.assertEquals(text, rs.getObject("2", Collections.>emptyMap())); + + Assert.assertEquals(text, rs.getString(3)); + Assert.assertEquals(text, rs.getString("3")); + Assert.assertEquals(text, rs.getObject(3)); + Assert.assertEquals(text, rs.getObject("3")); + Assert.assertEquals(text, rs.getObject(3, Collections.>emptyMap())); + Assert.assertEquals(text, rs.getObject("3", Collections.>emptyMap())); + + Assert.assertEquals(text, rs.getString(4)); + Assert.assertEquals(text, rs.getString("4")); + Assert.assertEquals(text, rs.getObject(4)); + Assert.assertEquals(text, rs.getObject("4")); + Assert.assertEquals(text, rs.getObject(4, Collections.>emptyMap())); + Assert.assertEquals(text, rs.getObject("4", Collections.>emptyMap())); + + stmt.registerOutParameter(2, Types.VARCHAR); + stmt.registerOutParameter(3, Types.CLOB); + raw.getOutParameters().add(param1); + raw.getOutParameters().add(param1); + + + Assert.assertEquals(C_TEXT, stmt.getString(4)); + Assert.assertEquals(C_TEXT, stmt.getString("4")); + Assert.assertEquals(C_TEXT, stmt.getObject(4)); + Assert.assertEquals(C_TEXT, stmt.getObject("4")); + Assert.assertEquals(C_TEXT, stmt.getObject(4, Collections.>emptyMap())); + Assert.assertEquals(C_TEXT, stmt.getObject("4", Collections.>emptyMap())); + + Assert.assertEquals(C_TEXT, stmt.getString(5)); + Assert.assertEquals(C_TEXT, stmt.getString("5")); + Assert.assertEquals(C_TEXT, stmt.getObject(5)); + Assert.assertEquals(C_TEXT, stmt.getObject("5")); + Assert.assertEquals(C_TEXT, stmt.getObject(5, Collections.>emptyMap())); + Assert.assertEquals(C_TEXT, stmt.getObject("5", Collections.>emptyMap())); + + stmt.setObject(1, C_TEXT); + Assert.assertEquals(param1, raw.getParameters().get(0)); + + stmt.setObject(2, new StringReader(C_TEXT)); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(1))); + + stmt.setCharacterStream(3, new StringReader(C_TEXT)); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(2))); + + stmt.setCharacterStream(4, new StringReader(C_TEXT), C_TEXT.length()); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(3))); + + stmt.setCharacterStream(5, new StringReader(C_TEXT), (long) C_TEXT.length()); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(4))); + + stmt.setObject(6, C_TEXT, Types.VARCHAR); + Assert.assertEquals(param1, raw.getParameters().get(5)); + stmt.setObject(7, new StringReader(C_TEXT), Types.VARCHAR); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(6))); + + stmt.setObject(8, C_TEXT, Types.VARCHAR, 0); + Assert.assertEquals(param1, raw.getParameters().get(7)); + stmt.setObject(9, new StringReader(C_TEXT), Types.VARCHAR, 0); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(8))); + + stmt.setObject(10, 1, Types.INTEGER); + Assert.assertEquals(1, raw.getParameters().get(9)); + + stmt.setObject(11, 2, Types.INTEGER, 0); + Assert.assertEquals(2, raw.getParameters().get(10)); + + stmt.setObject(12, 3); + Assert.assertEquals(3, raw.getParameters().get(11)); + + stmt.setObject("13", C_TEXT, Types.VARCHAR); + Assert.assertEquals(param1, raw.getParameters().get(12)); + stmt.setObject("14", new StringReader(C_TEXT), Types.VARCHAR); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(13))); + + stmt.setObject("15", C_TEXT, Types.VARCHAR, 0); + Assert.assertEquals(param1, raw.getParameters().get(14)); + stmt.setObject("16", new StringReader(C_TEXT), Types.VARCHAR, 0); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(15))); + + stmt.setObject("17", 1, Types.INTEGER); + Assert.assertEquals(1, raw.getParameters().get(16)); + + stmt.setObject("18", 2, Types.INTEGER, 0); + Assert.assertEquals(2, raw.getParameters().get(17)); + + stmt.setObject("19", 3); + Assert.assertEquals(3, raw.getParameters().get(18)); + + stmt.setCharacterStream("20", new StringReader(C_TEXT)); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(19))); + + stmt.setCharacterStream("21", new StringReader(C_TEXT), C_TEXT.length()); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(20))); + + stmt.setCharacterStream("22", new StringReader(C_TEXT), (long) C_TEXT.length()); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(21))); + + stmt.setObject("23", C_TEXT); + Assert.assertEquals(param1, raw.getParameters().get(22)); + + stmt.setObject("24", new StringReader(C_TEXT)); + Assert.assertEquals(param1, IOUtils.read((Reader) raw.getParameters().get(23))); + + stmt.setObject("25", 1, Types.INTEGER); + Assert.assertEquals(1, raw.getParameters().get(24)); + + stmt.setObject("26", 2, Types.INTEGER, 0); + Assert.assertEquals(2, raw.getParameters().get(25)); + + stmt.setObject("27", 3); + Assert.assertEquals(3, raw.getParameters().get(26)); + rs.close(); stmt.close(); @@ -112,10 +245,31 @@ public void test_stat() throws Exception { public static class MyResultSet extends MockResultSet { - private String value; + private String value; + private MockResultSetMetaData meta = new MockResultSetMetaData(); public MyResultSet(Statement statement){ super(statement); + { + ColumnMetaData column = new ColumnMetaData(); + column.setColumnType(Types.VARCHAR); + meta.getColumns().add(column); + } + { + ColumnMetaData column = new ColumnMetaData(); + column.setColumnType(Types.LONGVARCHAR); + meta.getColumns().add(column); + } + { + ColumnMetaData column = new ColumnMetaData(); + column.setColumnType(Types.CHAR); + meta.getColumns().add(column); + } + { + ColumnMetaData column = new ColumnMetaData(); + column.setColumnType(Types.CLOB); + meta.getColumns().add(column); + } } public String getObject(int index) throws SQLException { @@ -134,5 +288,9 @@ public void setValue(String value) { this.value = value; } + @Override + public ResultSetMetaData getMetaData() { + return meta; + } } } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/log/LogFilterTest3.java b/src/test/java/com/alibaba/druid/bvt/filter/log/LogFilterTest3.java index d5d9a80789..5e7903e240 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/log/LogFilterTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/log/LogFilterTest3.java @@ -17,7 +17,7 @@ protected void setUp() throws Exception { System.setProperty("druid.log.stmt.executableSql", "true"); dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:derby:classpath:petstore-db"); - dataSource.setFilters("log4j"); + dataSource.setFilters("log4j,slf4j"); } public void test_select() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/filter/log/Slf4jLogFilterTest.java b/src/test/java/com/alibaba/druid/bvt/filter/log/Slf4jLogFilterTest.java new file mode 100644 index 0000000000..f93c6236f6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/log/Slf4jLogFilterTest.java @@ -0,0 +1,47 @@ +package com.alibaba.druid.bvt.filter.log; + +import junit.framework.TestCase; + +import org.junit.Assert; +import org.slf4j.LoggerFactory; + +import com.alibaba.druid.filter.logging.Slf4jLogFilter; + + +public class Slf4jLogFilterTest extends TestCase { + public void test_slf4j() throws Exception { + Slf4jLogFilter filter = new Slf4jLogFilter(); + Assert.assertEquals("druid.sql.DataSource", filter.getDataSourceLoggerName()); + Assert.assertEquals("druid.sql.Connection", filter.getConnectionLoggerName()); + Assert.assertEquals("druid.sql.Statement", filter.getStatementLoggerName()); + Assert.assertEquals("druid.sql.ResultSet", filter.getResultSetLoggerName()); + + filter.setDataSourceLoggerName("x.sql.DataSource"); + filter.setConnectionLoggerName("x.sql.Connection"); + filter.setStatementLoggerName("x.sql.Statement"); + filter.setResultSetLoggerName("x.sql.ResultSet"); + + Assert.assertEquals("x.sql.DataSource", filter.getDataSourceLoggerName()); + Assert.assertEquals("x.sql.Connection", filter.getConnectionLoggerName()); + Assert.assertEquals("x.sql.Statement", filter.getStatementLoggerName()); + Assert.assertEquals("x.sql.ResultSet", filter.getResultSetLoggerName()); + + filter.setDataSourceLogger(LoggerFactory.getLogger("y.sql.DataSource")); + filter.setConnectionLogger(LoggerFactory.getLogger("y.sql.Connection")); + filter.setStatementLogger(LoggerFactory.getLogger("y.sql.Statement")); + filter.setResultSetLogger(LoggerFactory.getLogger("y.sql.ResultSet")); + + Assert.assertEquals("y.sql.DataSource", filter.getDataSourceLoggerName()); + Assert.assertEquals("y.sql.Connection", filter.getConnectionLoggerName()); + Assert.assertEquals("y.sql.Statement", filter.getStatementLoggerName()); + Assert.assertEquals("y.sql.ResultSet", filter.getResultSetLoggerName()); + + filter.isDataSourceLogEnabled(); + filter.isConnectionLogEnabled(); + filter.isConnectionLogErrorEnabled(); + filter.isStatementLogEnabled(); + filter.isStatementLogErrorEnabled(); + filter.isResultSetLogEnabled(); + filter.isResultSetLogErrorEnabled(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/Case1.java b/src/test/java/com/alibaba/druid/bvt/pool/Case1.java index 6f977e9f5c..9095cc5367 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/Case1.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/Case1.java @@ -19,9 +19,10 @@ import java.sql.SQLException; import java.util.Properties; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.mock.MockDriver; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.stat.DruidDataSourceStatManager; diff --git a/src/test/java/com/alibaba/druid/bvt/proxy/CounterFilterTest.java b/src/test/java/com/alibaba/druid/bvt/proxy/CounterFilterTest.java index e3d98e1927..3eaec5a74c 100644 --- a/src/test/java/com/alibaba/druid/bvt/proxy/CounterFilterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/proxy/CounterFilterTest.java @@ -101,6 +101,10 @@ public void test_count_filter() throws Exception { conn.close(); conn.close(); + + dataSource.getCompositeData(); + dataSource.getProperties(); + dataSource.getDataSourceMBeanDomain(); } } diff --git a/src/test/java/com/alibaba/druid/bvt/spring/SqlMapClientWrapperTest.java b/src/test/java/com/alibaba/druid/bvt/spring/SqlMapClientWrapperTest.java new file mode 100644 index 0000000000..d4fc6a29c6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/spring/SqlMapClientWrapperTest.java @@ -0,0 +1,132 @@ +package com.alibaba.druid.bvt.spring; + +import java.sql.Connection; +import java.sql.Statement; +import java.util.Collections; + +import javax.sql.DataSource; + +import junit.framework.TestCase; + +import org.junit.Assert; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.alibaba.druid.spring.User; +import com.alibaba.druid.support.ibatis.SqlMapClientWrapper; +import com.ibatis.sqlmap.client.event.RowHandler; +import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl; + +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"); + DataSource dataSource = (DataSource) context.getBean("dataSource"); + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("CREATE TABLE sequence_seed (value INTEGER, name VARCHAR(50))"); + stmt.close(); + conn.close(); + } + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("CREATE TABLE t_User (id BIGINT, name VARCHAR(50))"); + stmt.close(); + conn.close(); + } + } + + protected void tearDown() throws Exception { + DataSource dataSource = (DataSource) context.getBean("dataSource"); + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("DROP TABLE sequence_seed"); + stmt.close(); + conn.close(); + } + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("DROP TABLE t_User"); + stmt.close(); + conn.close(); + } + context.close(); + } + + public void test_wrap() throws Exception { + SqlMapClientImpl client = (SqlMapClientImpl) context.getBean("master-sqlMapClient"); + Assert.assertNotNull(client); + + SqlMapClientWrapper wrapper = new SqlMapClientWrapper(client); + + wrapper.insert("User.insert", new User(12345678, "aaa")); + { + Exception error = null; + try { + wrapper.insert("User.insert"); + } catch (Exception ex) { + error = ex; + } + Assert.assertNotNull(error); + } + wrapper.update("User.update", new User(12345678, "bbb")); + { + Exception error = null; + try { + wrapper.update("User.update"); + } catch (Exception ex) { + error = ex; + } + Assert.assertNotNull(error); + } + + Assert.assertNotNull((User) wrapper.queryForObject("User.select")); + Assert.assertNotNull((User) wrapper.queryForObject("User.select", Collections.emptyMap())); + Assert.assertNotNull((User) wrapper.queryForObject("User.select", Collections.emptyMap(), new User())); + + Assert.assertEquals(1, wrapper.queryForList("User.select").size()); + Assert.assertEquals(1, wrapper.queryForList("User.select", Collections.emptyMap()).size()); + Assert.assertEquals(1, wrapper.queryForList("User.select", Collections.emptyMap(), 0, 2).size()); + + wrapper.queryWithRowHandler("User.select", new RowHandler() { + + @Override + public void handleRow(Object valueObject) { + + } + }); + wrapper.queryWithRowHandler("User.select", Collections.emptyMap(), new RowHandler() { + + @Override + public void handleRow(Object valueObject) { + + } + }); + + Assert.assertEquals(1, wrapper.queryForPaginatedList("User.select", 10).size()); + Assert.assertEquals(1, wrapper.queryForPaginatedList("User.select", Collections.emptyMap(), 10).size()); + + Assert.assertNotNull(wrapper.queryForMap("User.select", Collections.emptyMap(), "id")); + Assert.assertNotNull(wrapper.queryForMap("User.select", Collections.emptyMap(), "id", "name")); + + wrapper.delete("User.delete", 12345678L); + { + Exception error = null; + try { + wrapper.delete("User.delete"); + } catch (Exception ex) { + error = ex; + } + Assert.assertNotNull(error); + } + + wrapper.startBatch(); + wrapper.executeBatch(); + wrapper.executeBatchDetailed(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/spring/SqlMapExecutorWrapperTest.java b/src/test/java/com/alibaba/druid/bvt/spring/SqlMapExecutorWrapperTest.java index 6ed337b5db..323c19fe87 100644 --- a/src/test/java/com/alibaba/druid/bvt/spring/SqlMapExecutorWrapperTest.java +++ b/src/test/java/com/alibaba/druid/bvt/spring/SqlMapExecutorWrapperTest.java @@ -22,7 +22,6 @@ protected void tearDown() throws Exception { context.close(); } - @SuppressWarnings("deprecation") public void test_wrap() throws Exception { SqlMapClientImpl client = (SqlMapClientImpl) context.getBean("master-sqlMapClient"); Assert.assertNotNull(client); diff --git a/src/test/java/com/alibaba/druid/bvt/spring/SqlMapExecutorWrapperTest_2.java b/src/test/java/com/alibaba/druid/bvt/spring/SqlMapExecutorWrapperTest_2.java new file mode 100644 index 0000000000..bb75e6eeb4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/spring/SqlMapExecutorWrapperTest_2.java @@ -0,0 +1,132 @@ +package com.alibaba.druid.bvt.spring; + +import java.sql.Connection; +import java.sql.Statement; +import java.util.Collections; + +import javax.sql.DataSource; + +import junit.framework.TestCase; + +import org.junit.Assert; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.alibaba.druid.spring.User; +import com.alibaba.druid.support.ibatis.SqlMapExecutorWrapper; +import com.ibatis.sqlmap.client.event.RowHandler; +import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl; + +public class SqlMapExecutorWrapperTest_2 extends TestCase { + + private ClassPathXmlApplicationContext context = null; + + protected void setUp() throws Exception { + context = new ClassPathXmlApplicationContext("com/alibaba/druid/pool/ibatis/spring-config-ibatis.xml"); + DataSource dataSource = (DataSource) context.getBean("dataSource"); + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("CREATE TABLE sequence_seed (value INTEGER, name VARCHAR(50))"); + stmt.close(); + conn.close(); + } + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("CREATE TABLE t_User (id BIGINT, name VARCHAR(50))"); + stmt.close(); + conn.close(); + } + } + + protected void tearDown() throws Exception { + DataSource dataSource = (DataSource) context.getBean("dataSource"); + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("DROP TABLE sequence_seed"); + stmt.close(); + conn.close(); + } + { + Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + stmt.execute("DROP TABLE t_User"); + stmt.close(); + conn.close(); + } + context.close(); + } + + public void test_wrap() throws Exception { + SqlMapClientImpl client = (SqlMapClientImpl) context.getBean("master-sqlMapClient"); + Assert.assertNotNull(client); + + SqlMapExecutorWrapper wrapper = new SqlMapExecutorWrapper(client, client); + + wrapper.insert("User.insert", new User(12345678, "aaa")); + { + Exception error = null; + try { + wrapper.insert("User.insert"); + } catch (Exception ex) { + error = ex; + } + Assert.assertNotNull(error); + } + wrapper.update("User.update", new User(12345678, "bbb")); + { + Exception error = null; + try { + wrapper.update("User.update"); + } catch (Exception ex) { + error = ex; + } + Assert.assertNotNull(error); + } + + Assert.assertNotNull((User) wrapper.queryForObject("User.select")); + Assert.assertNotNull((User) wrapper.queryForObject("User.select", Collections.emptyMap())); + Assert.assertNotNull((User) wrapper.queryForObject("User.select", Collections.emptyMap(), new User())); + + Assert.assertEquals(1, wrapper.queryForList("User.select").size()); + Assert.assertEquals(1, wrapper.queryForList("User.select", Collections.emptyMap()).size()); + Assert.assertEquals(1, wrapper.queryForList("User.select", Collections.emptyMap(), 0, 2).size()); + + wrapper.queryWithRowHandler("User.select", new RowHandler() { + + @Override + public void handleRow(Object valueObject) { + + } + }); + wrapper.queryWithRowHandler("User.select", Collections.emptyMap(), new RowHandler() { + + @Override + public void handleRow(Object valueObject) { + + } + }); + + Assert.assertEquals(1, wrapper.queryForPaginatedList("User.select", 10).size()); + Assert.assertEquals(1, wrapper.queryForPaginatedList("User.select", Collections.emptyMap(), 10).size()); + + Assert.assertNotNull(wrapper.queryForMap("User.select", Collections.emptyMap(), "id")); + Assert.assertNotNull(wrapper.queryForMap("User.select", Collections.emptyMap(), "id", "name")); + + wrapper.delete("User.delete", 12345678L); + { + Exception error = null; + try { + wrapper.delete("User.delete"); + } catch (Exception ex) { + error = ex; + } + Assert.assertNotNull(error); + } + + wrapper.startBatch(); + wrapper.executeBatch(); + wrapper.executeBatchDetailed(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest.java new file mode 100644 index 0000000000..3ddcaea4f5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest.java @@ -0,0 +1,34 @@ +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.mysql.parser.MySqlExprParser; + +public class EqualTest 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; + { + MySqlExprParser parser = new MySqlExprParser(sql); + exprA = (SQLInSubQueryExpr) parser.expr(); + } + { + MySqlExprParser parser = new MySqlExprParser(sql); + exprB = (SQLInSubQueryExpr) parser.expr(); + } + { + MySqlExprParser parser = new MySqlExprParser(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()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest2.java new file mode 100644 index 0000000000..1dcdb9750d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest2.java @@ -0,0 +1,34 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest2 extends TestCase { + + public void test_exits() throws Exception { + String sql = "INTERVAL '30.12345' SECOND(2, 4)"; + String sql_c = "INTERVAL '30.12345' SECOND(2, 3)"; + OracleIntervalExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (OracleIntervalExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (OracleIntervalExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (OracleIntervalExpr) 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()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleDate.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleDate.java new file mode 100644 index 0000000000..1077a844a1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleDate.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; + +public class EqualTest_OracleDate extends TestCase { + + public void test_eq() throws Exception { + OracleDateExpr exprA = new OracleDateExpr(); + OracleDateExpr exprB = new OracleDateExpr(); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + Assert.assertEquals(exprA, exprB); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_between.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_between.java new file mode 100644 index 0000000000..6338968204 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_between.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.SQLBetweenExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_between extends TestCase { + + public void test_exits() throws Exception { + String sql = "x between 1 AND 2"; + String sql_c = "x between 1 AND 3"; + SQLBetweenExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLBetweenExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLBetweenExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLBetweenExpr) 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 SQLBetweenExpr(), new SQLBetweenExpr()); + Assert.assertEquals(new SQLBetweenExpr().hashCode(), new SQLBetweenExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_case.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_case.java new file mode 100644 index 0000000000..87534df139 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_case.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.SQLCaseExpr; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; + +public class EqualTest_case extends TestCase { + + public void test_exits() throws Exception { + String sql = "case x when 1 then 0 else 2 end"; + String sql_c = "case x when 2 then 0 else 2 end"; + SQLCaseExpr exprA, exprB, exprC; + { + OracleExprParser parser = new OracleExprParser(sql); + exprA = (SQLCaseExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql); + exprB = (SQLCaseExpr) parser.expr(); + } + { + OracleExprParser parser = new OracleExprParser(sql_c); + exprC = (SQLCaseExpr) 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 SQLCaseExpr(), new SQLCaseExpr()); + Assert.assertEquals(new SQLCaseExpr().hashCode(), new SQLCaseExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_groupSet.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_groupSet.java new file mode 100644 index 0000000000..0dfe838e1a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_groupSet.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; + +public class EqualTest_groupSet extends TestCase { + + public void test_eq() throws Exception { + GroupingSetExpr exprA = new GroupingSetExpr(); + GroupingSetExpr exprB = new GroupingSetExpr(); + Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); + Assert.assertEquals(exprA, exprB); + } +} 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 new file mode 100644 index 0000000000..70e3f00678 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_mysqlMatch.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.MySqlMatchAgainstExpr; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; + +public class EqualTest_mysqlMatch extends TestCase { + + public void test_exits() throws Exception { + String sql = "MATCH (f1, f2) AGAINST (f3 IN BOOLEAN MODE)"; + String sql_c = "MATCH (f1, f2) AGAINST (f4 IN BOOLEAN MODE)"; + MySqlMatchAgainstExpr exprA, exprB, exprC; + { + MySqlExprParser parser = new MySqlExprParser(sql); + exprA = (MySqlMatchAgainstExpr) parser.expr(); + } + { + MySqlExprParser parser = new MySqlExprParser(sql); + exprB = (MySqlMatchAgainstExpr) parser.expr(); + } + { + MySqlExprParser parser = new MySqlExprParser(sql_c); + exprC = (MySqlMatchAgainstExpr) 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 MySqlMatchAgainstExpr(), new MySqlMatchAgainstExpr()); + Assert.assertEquals(new MySqlMatchAgainstExpr().hashCode(), new MySqlMatchAgainstExpr().hashCode()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/SQLASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/SQLASTVisitorAdapterTest.java new file mode 100644 index 0000000000..234a7e442e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/SQLASTVisitorAdapterTest.java @@ -0,0 +1,76 @@ +package com.alibaba.druid.bvt.sql; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.ast.SQLOver; +import com.alibaba.druid.sql.ast.expr.SQLAllExpr; +import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr; +import com.alibaba.druid.sql.ast.expr.SQLDefaultExpr; +import com.alibaba.druid.sql.ast.expr.SQLInListExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.expr.SQLSomeExpr; +import com.alibaba.druid.sql.ast.statement.NotNullConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLCallStatement; +import com.alibaba.druid.sql.ast.statement.SQLColumnCheck; +import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; +import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement; +import com.alibaba.druid.sql.ast.statement.SQLExprHint; +import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement; +import com.alibaba.druid.sql.ast.statement.SQLSavePointStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause; +import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; + +public class SQLASTVisitorAdapterTest extends TestCase { + + public void test_adapter() throws Exception { + SQLASTVisitorAdapter adapter = new SQLASTVisitorAdapter(); + new SQLBinaryOpExpr().accept(adapter); + new SQLInListExpr().accept(adapter); + new SQLSelectQueryBlock().accept(adapter); + new SQLDropTableStatement().accept(adapter); + new SQLCreateTableStatement().accept(adapter); + new SQLDeleteStatement().accept(adapter); + new SQLCurrentOfCursorExpr ().accept(adapter); + new SQLInsertStatement ().accept(adapter); + new SQLUpdateStatement ().accept(adapter); + new NotNullConstraint ().accept(adapter); + new SQLMethodInvokeExpr ().accept(adapter); + new SQLCallStatement ().accept(adapter); + new SQLSomeExpr ().accept(adapter); + new SQLAnyExpr ().accept(adapter); + new SQLAllExpr ().accept(adapter); + new SQLDefaultExpr ().accept(adapter); + new SQLCommentStatement ().accept(adapter); + new SQLDropViewStatement ().accept(adapter); + new SQLSavePointStatement ().accept(adapter); + new SQLReleaseSavePointStatement ().accept(adapter); + new SQLCreateDatabaseStatement ().accept(adapter); + new SQLAlterTableDropIndex ().accept(adapter); + new SQLAlterTableAddPrimaryKey ().accept(adapter); + new SQLOver ().accept(adapter); + new SQLWithSubqueryClause().accept(adapter); + new SQLAlterTableAlterColumn ().accept(adapter); + new SQLAlterTableStatement ().accept(adapter); + new SQLAlterTableDisableConstraint ().accept(adapter); + new SQLAlterTableEnableConstraint ().accept(adapter); + new SQLColumnCheck ().accept(adapter); + new SQLExprHint ().accept(adapter); + new SQLAlterTableDropConstraint ().accept(adapter); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAbsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAbsTest.java index de68ce0bcd..8490bb2219 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAbsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAbsTest.java @@ -1,5 +1,7 @@ package com.alibaba.druid.bvt.sql.eval; +import java.math.BigDecimal; + import junit.framework.TestCase; import org.junit.Assert; @@ -7,15 +9,40 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; - public class EvalMethodAbsTest extends TestCase { + public void test_abs_int() throws Exception { Assert.assertEquals(12, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "abs(-12)")); Assert.assertEquals(12, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "abs(12)")); } - + public void test_abs_long() throws Exception { Assert.assertEquals(12L, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "abs(?)", 12L)); Assert.assertEquals(12L, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "abs(?)", -12L)); } + + public void test_abs_decimal() throws Exception { + Assert.assertEquals(new BigDecimal("12"), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "abs(?)", new BigDecimal("12"))); + Assert.assertEquals(new BigDecimal("12"), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "abs(?)", new BigDecimal("-12"))); + } + + public void test_abs_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "abs()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_abs_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "abs(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAcosTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAcosTest.java index eac80aec6f..f9ef285abb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAcosTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAcosTest.java @@ -14,4 +14,24 @@ public void test_reverse() throws Exception { Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "acos(1.001)")); Assert.assertEquals(Math.acos(0), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "acos(0)")); } + + public void test_abs_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "acos()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_abs_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "acos(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAsinTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAsinTest.java index 645b7e032d..16d48b8e1a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAsinTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAsinTest.java @@ -1,8 +1,9 @@ package com.alibaba.druid.bvt.sql.eval; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; @@ -11,4 +12,24 @@ public class EvalMethodAsinTest extends TestCase { public void test_reverse() throws Exception { Assert.assertEquals(Math.asin(0.2), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "asin(0.2)")); } + + public void test_abs_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "asin()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_abs_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "asin(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAtan2Test.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAtan2Test.java index a692518318..32d1d45801 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAtan2Test.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAtan2Test.java @@ -1,8 +1,9 @@ package com.alibaba.druid.bvt.sql.eval; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; @@ -11,4 +12,24 @@ public class EvalMethodAtan2Test extends TestCase { public void test_reverse() throws Exception { Assert.assertEquals(Math.atan2(-2, 2), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "atan2(-2, 2)")); } + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "atan2()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "atan2(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAtanTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAtanTest.java index 127eada122..6bd3a77190 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAtanTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAtanTest.java @@ -1,8 +1,9 @@ package com.alibaba.druid.bvt.sql.eval; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; @@ -12,4 +13,24 @@ public void test_reverse() throws Exception { Assert.assertEquals(Math.atan(2), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "atan(2)")); Assert.assertEquals(Math.atan(-2), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "atan(-2)")); } + + public void test_abs_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "atan()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_abs_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "atan(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodCeilTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodCeilTest.java index e65e982f0e..84047ecd13 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodCeilTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodCeilTest.java @@ -1,8 +1,9 @@ package com.alibaba.druid.bvt.sql.eval; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; @@ -13,4 +14,25 @@ public void test_reverse() throws Exception { Assert.assertEquals(-1, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "ceil(-1.23)")); Assert.assertEquals(-1, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "ceiling(-1.24)")); } + + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "ceil()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "ceil(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodCosTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodCosTest.java index 91ff8bb44e..04b9a76483 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodCosTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodCosTest.java @@ -14,4 +14,24 @@ public void test_reverse() throws Exception { Assert.assertEquals(Math.cos(1.001), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "cos(1.001)")); Assert.assertEquals(Math.cos(0), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "cos(0)")); } + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "cos()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "cos(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLog10Test.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLog10Test.java index 0fa7c815e5..f842fa3aec 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLog10Test.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLog10Test.java @@ -14,4 +14,24 @@ public void test_reverse() throws Exception { Assert.assertEquals(Math.log10(1.001), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "log10(1.001)")); Assert.assertEquals(Math.log10(0), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "log10(0)")); } + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "log10()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "log10(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLogTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLogTest.java index cfc527ea48..6961960705 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLogTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLogTest.java @@ -14,4 +14,24 @@ public void test_reverse() throws Exception { Assert.assertEquals(Math.log(1.001), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "log(1.001)")); Assert.assertEquals(Math.log(0), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "log(0)")); } + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "log()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "log(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodPowerTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodPowerTest.java index 33495a3aa3..0a90eb1976 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodPowerTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodPowerTest.java @@ -7,11 +7,31 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; - public class EvalMethodPowerTest extends TestCase { + public void test_reverse() throws Exception { Assert.assertEquals(Math.pow(1, 2), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "power(1, 2)")); Assert.assertEquals(Math.pow(3, 4), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "power(3, 4)")); Assert.assertEquals(Math.pow(4, 5), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "pow(4, 5)")); } + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "pow()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "pow(a,b)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodSinTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodSinTest.java index b651586ba6..b3797794bc 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodSinTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodSinTest.java @@ -7,12 +7,32 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; - public class EvalMethodSinTest extends TestCase { + public void test_reverse() throws Exception { Assert.assertEquals(Math.sin(1), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sin(1)")); Assert.assertEquals(Math.sin(1.001), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sin(1.001)")); Assert.assertEquals(Math.sin(0), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sin(0)")); Assert.assertEquals(Math.sin(2), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sin(2)")); } + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sin()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sin(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodSqrtTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodSqrtTest.java index f9959aa9aa..82cf273f79 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodSqrtTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodSqrtTest.java @@ -7,11 +7,31 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; - public class EvalMethodSqrtTest extends TestCase { + public void test_reverse() throws Exception { Assert.assertEquals(Math.sqrt(1), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sqrt(1)")); Assert.assertEquals(Math.sqrt(1.001), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sqrt(1.001)")); Assert.assertEquals(Math.sqrt(0), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sqrt(0)")); } + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sqrt()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "sqrt(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTanTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTanTest.java index b124c8d107..79e42373d2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTanTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTanTest.java @@ -14,4 +14,24 @@ public void test_reverse() throws Exception { Assert.assertEquals(Math.tan(1.001), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "tan(1.001)")); Assert.assertEquals(Math.tan(0), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "tan(0)")); } + + public void test_error() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "tan()", 12L); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } + + public void test_error_1() throws Exception { + Exception error = null; + try { + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "tan(a)"); + } catch (Exception e) { + error = e; + } + Assert.assertNotNull(error); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add.java index b427e4a71c..dbd0c21158 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add.java @@ -7,17 +7,21 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; - public class EvalTest_add extends TestCase { + public void test_byte() throws Exception { Assert.assertEquals(3, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", (byte) 1, (byte) 2)); } - + public void test_byte_1() throws Exception { Assert.assertEquals(3, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", (byte) 1, "2")); } - + public void test_byte_2() throws Exception { Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", (byte) 1, null)); } + + public void test_byte_3() throws Exception { + Assert.assertEquals(3, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", "2", (byte) 1)); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add_long.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add_long.java index 6ed2243384..9f080806a7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add_long.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add_long.java @@ -9,15 +9,27 @@ public class EvalTest_add_long extends TestCase { - public void test_byte() throws Exception { + public void test_add() throws Exception { Assert.assertEquals(3L, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", (long) 1, (byte) 2)); } - public void test_byte_1() throws Exception { + public void test_add_1() throws Exception { Assert.assertEquals(3L, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", (long) 1, "2")); } - public void test_byte_2() throws Exception { + public void test_add_2() throws Exception { Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", (long) 1, null)); } + + public void test_add_3() throws Exception { + Assert.assertEquals(3L, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", (byte) 2, (long) 1)); + } + + public void test_add_4() throws Exception { + Assert.assertEquals(3L, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", "2", (long) 1)); + } + + public void test_add_5() throws Exception { + Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", null, (long) 1)); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add_short.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add_short.java index 13ac3947bf..f1231274fe 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add_short.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_add_short.java @@ -20,4 +20,8 @@ public void test_byte_1() throws Exception { public void test_byte_2() throws Exception { Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", (short) 1, null)); } + + public void test_byte_3() throws Exception { + Assert.assertEquals(3, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? + ?", "2", (short) 1)); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_div.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_div.java index 0748f49d87..5cbd714365 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_div.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_div.java @@ -10,37 +10,87 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; - public class EvalTest_div extends TestCase { + public void test_long() throws Exception { Assert.assertEquals(0L, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (long) 1, (byte) 2)); } - + public void test_int() throws Exception { Assert.assertEquals(0, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (int) 1, (byte) 2)); } - + public void test_short() throws Exception { Assert.assertEquals(0, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (short) 1, (byte) 2)); } - + public void test_byte() throws Exception { Assert.assertEquals(0, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (byte) 1, (byte) 2)); } - + public void test_BigInteger() throws Exception { - Assert.assertEquals(BigInteger.ZERO, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", BigInteger.ONE, (byte) 2)); + Assert.assertEquals(BigInteger.ZERO, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", BigInteger.ONE, (byte) 2)); } - + public void test_BigDecimal() throws Exception { - Assert.assertEquals(new BigDecimal("0.5"), SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", BigDecimal.ONE, (byte) 2)); + Assert.assertEquals(new BigDecimal("0.5"), + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", BigDecimal.ONE, (byte) 2)); } - + public void test_float() throws Exception { Assert.assertEquals(0.5F, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (float) 1, (byte) 2)); } - + public void test_double() throws Exception { Assert.assertEquals(0.5D, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (double) 1, (byte) 2)); } + + public void test_double_zero() throws Exception { + Assert.assertEquals(Double.POSITIVE_INFINITY, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (double) 1, 0)); + } + + public void test_double_zero_1() throws Exception { + Assert.assertEquals(Double.NEGATIVE_INFINITY, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (double) -1D, 0)); + } + + + public void test_double_zero_2() throws Exception { + Assert.assertEquals(Double.NaN, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (double) 0D, 0)); + } + + public void test_double_null() throws Exception { + Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (double) 1, null)); + } + + public void test_double_null_1() throws Exception { + Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", null, (double) 1)); + } + + // + public void test_float_zero() throws Exception { + Assert.assertEquals(Float.POSITIVE_INFINITY, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (float) 1, 0)); + } + + public void test_float_zero_1() throws Exception { + Assert.assertEquals(Float.NEGATIVE_INFINITY, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (float) -1F, 0)); + } + + public void test_float_zero_2() throws Exception { + Assert.assertEquals(Float.NaN, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (float) 0F, 0)); + } + + public void test_float_null() throws Exception { + Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", (float) 1, null)); + } + + public void test_float_null_1() throws Exception { + Assert.assertEquals(null, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?/?", null, (float) 1)); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_gt.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_gt.java index 7a50c507c2..2c7fbe7077 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_gt.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_gt.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Date; import junit.framework.TestCase; @@ -10,41 +11,48 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; - public class EvalTest_gt extends TestCase { + public void test_long() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? > ?", (long) 1, (byte) 2)); } - + public void test_int() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? > ?", (int) 1, (byte) 2)); } - + public void test_short() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? > ?", (short) 1, (byte) 2)); } - + public void test_byte() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? > ?", (byte) 1, (byte) 2)); } - + public void test_BigInteger() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", BigInteger.ONE, (byte) 2)); } - + public void test_BigDecimal() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", BigDecimal.ONE, (byte) 2)); } - + public void test_float() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", (float) 1, (byte) 2)); } - + public void test_double() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", (double) 1, (byte) 2)); } - + public void test_String() throws Exception { Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", "1", "2")); } + + public void test_Date() throws Exception { + Assert.assertEquals(false, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", + new Date(System.currentTimeMillis() - 10), + new Date(System.currentTimeMillis()))); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_gt_true.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_gt_true.java new file mode 100644 index 0000000000..f6f04afc96 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_gt_true.java @@ -0,0 +1,58 @@ +package com.alibaba.druid.bvt.sql.eval; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Date; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalTest_gt_true extends TestCase { + + public void test_long() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? > ?", (long) 10, (byte) 2)); + } + + public void test_int() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? > ?", (int) 10, (byte) 2)); + } + + public void test_short() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? > ?", (short) 10, (byte) 2)); + } + + public void test_byte() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? > ?", (byte) 10, (byte) 2)); + } + + public void test_BigInteger() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", BigInteger.TEN, (byte) 2)); + } + + public void test_BigDecimal() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", BigDecimal.TEN, (byte) 2)); + } + + public void test_float() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", (float) 3, (byte) 2)); + } + + public void test_double() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", (double) 3, (byte) 2)); + } + + public void test_String() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", "3", "2")); + } + + public void test_Date() throws Exception { + Assert.assertEquals(true, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "?>?", + new Date(System.currentTimeMillis()), + new Date(System.currentTimeMillis() - 10))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_lt.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_lt.java index ffab2615ca..0fb5c6124b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_lt.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalTest_lt.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Date; import junit.framework.TestCase; @@ -10,41 +11,48 @@ import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.util.JdbcConstants; - public class EvalTest_lt extends TestCase { + public void test_long() throws Exception { Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? < ?", (long) 1, (byte) 2)); } - + public void test_int() throws Exception { Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? < ?", (int) 1, (byte) 2)); } - + public void test_short() throws Exception { Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? < ?", (short) 1, (byte) 2)); } - + public void test_byte() throws Exception { Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? < ?", (byte) 1, (byte) 2)); } - + public void test_BigInteger() throws Exception { Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "? stmtList = parser.parseStatementList(); + + String text = output(stmtList); + + Assert.assertEquals("SHOW STATUS WHERE X LIKE 'Key%';", text); + } + + public void test_corba() throws Exception { + String sql = "SHOW COBAR_STATUS"; + + SQLStatementParser parser = new MySqlStatementParser(sql); + List stmtList = parser.parseStatementList(); + + String text = output(stmtList); + + Assert.assertEquals("SHOW COBAR_STATUS;", text); + } public void test_1() throws Exception { String sql = "SHOW GLOBAL STATUS LIKE 'Key%'"; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIntervalTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIntervalTest.java index 370ddaa7b7..b63d9e1281 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIntervalTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIntervalTest.java @@ -15,9 +15,10 @@ */ package com.alibaba.druid.bvt.sql.oracle; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.sql.test.TestUtils; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest18.java index 56aeed4649..c8bdbd0280 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest18.java @@ -17,7 +17,7 @@ import java.util.List; -import junit.framework.Assert; +import org.junit.Assert; import com.alibaba.druid.sql.OracleTest; import com.alibaba.druid.sql.ast.SQLStatement; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest42.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest42.java index f846f6001b..449d8c6d75 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest42.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest42.java @@ -23,24 +23,25 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.test.TestUtils; public class OracleSelectTest42 extends OracleTest { public void test_0() throws Exception { String sql = // - "SELECT * FROM t_department " + // + "SELECT ALL * FROM t_department " + // "WHERE name IN ('0000','4444') " + // "ORDER BY name ASC"; // OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); print(statementList); Assert.assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getColumns()); @@ -52,6 +53,14 @@ public void test_0() throws Exception { Assert.assertEquals(2, visitor.getColumns().size()); + String text = TestUtils.outputOracle(stmt); + + Assert.assertEquals("SELECT ALL *" + // + "\nFROM t_department" + // + "\nWHERE name IN ('0000', '4444')" + // + "\nORDER BY name ASC;" + // + "\n", text); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest44.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest44.java new file mode 100644 index 0000000000..d4539f3ad3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest44.java @@ -0,0 +1,68 @@ +/* + * 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.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.test.TestUtils; + +public class OracleSelectTest44 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT UNIQUE * FROM ONLY (t_department) " + // + "WHERE name IN ('0000','4444') " + // + "ORDER BY name ASC"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(2, visitor.getColumns().size()); + + String text = TestUtils.outputOracle(stmt); + + Assert.assertEquals("SELECT UNIQUE *" + // + "\nFROM ONLY (t_department)" + // + "\nWHERE name IN ('0000', '4444')" + // + "\nORDER BY name ASC;" + // + "\n", text); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest.java index d4927390c1..7332cb185b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSubqueryFactoringTest.java @@ -33,13 +33,28 @@ public void test_interval() throws Exception { + "avg_cost AS (SELECT SUM(dept_total)/COUNT(*) avg FROM dept_costs)\n" + "SELECT * FROM dept_costs WHERE dept_total > (SELECT avg FROM avg_cost) ORDER BY department_name;"; - String expected = "WITH\n" + "\tdept_costs\n" + "\tAS\n" + "\t(\n" - + "\t\tSELECT department_name, SUM(salary) AS dept_total\n" - + "\t\tFROM employees e, departments d\n" + "\t\tWHERE e.department_id = d.department_id\n" - + "\t\tGROUP BY department_name\n" + "\t), \n" + "\tavg_cost\n" + "\tAS\n" + "\t(\n" - + "\t\tSELECT SUM(dept_total) / COUNT(*) AS avg\n" + "\t\tFROM dept_costs\n" + "\t)\n" - + "SELECT *\n" + "FROM dept_costs\n" + "WHERE dept_total > (\n" + "\tSELECT avg\n" - + "\tFROM avg_cost\n" + "\t)\n" + "ORDER BY department_name;\n"; + String expected = "WITH\n" // + + "\tdept_costs\n" // + + "\tAS\n" // + + "\t(\n"// + + "\t\tSELECT department_name, SUM(salary) AS dept_total\n" // + + "\t\tFROM employees e, departments d\n"// + + "\t\tWHERE e.department_id = d.department_id\n" // + + "\t\tGROUP BY department_name\n" // + + "\t), \n" // + + "\tavg_cost\n" // + + "\tAS\n"// + + "\t(\n" // + + "\t\tSELECT SUM(dept_total) / COUNT(*) AS avg\n" // + + "\t\tFROM dept_costs\n" // + + "\t)\n" // + + "SELECT *\n" // + + "FROM dept_costs\n" // + + "WHERE dept_total > (\n" // + + "\tSELECT avg\n" // + + "\tFROM avg_cost\n" // + + "\t)\n" // + + "ORDER BY department_name;\n"; OracleStatementParser parser = new OracleStatementParser(sql); SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java new file mode 100644 index 0000000000..4dd3caf279 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java @@ -0,0 +1,230 @@ +package com.alibaba.druid.bvt.sql.oracle.visitor; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignmentItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.MainModelClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumn; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelColumnClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropDatabaseLinkStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDropSequenceStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLabelStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; + +public class OracleASTVisitorAdapterTest extends TestCase { + + public void test_adapter() throws Exception { + OracleASTVisitorAdapter adapter = new OracleASTVisitorAdapter(); + + new OracleConstraintState().accept(adapter); + new OraclePLSQLCommitStatement().accept(adapter); + new OracleAnalytic().accept(adapter); + new OracleAnalyticWindowing().accept(adapter); + new OracleDateExpr().accept(adapter); + new OracleDbLinkExpr().accept(adapter); + new OracleExtractExpr().accept(adapter); + new OracleSelectForUpdate().accept(adapter); + new OracleSelectHierachicalQueryClause().accept(adapter); + new OracleSelectPivot.Item().accept(adapter); + new OracleSelectPivot().accept(adapter); + new CheckOption().accept(adapter); + new ReadOnly().accept(adapter); + new OracleSelectUnPivot().accept(adapter); + new OracleTimestampExpr().accept(adapter); + new PartitionExtensionClause().accept(adapter); + new VersionsFlashbackQueryClause().accept(adapter); + new VersionsFlashbackQueryClause().accept(adapter); + new AsOfFlashbackQueryClause().accept(adapter); + new GroupingSetExpr().accept(adapter); + new OracleWithSubqueryEntry().accept(adapter); + new OracleFileSpecification().accept(adapter); + new OracleAlterTablespaceAddDataFile().accept(adapter); + new OracleAlterTablespaceStatement().accept(adapter); + new OracleCreateSequenceStatement().accept(adapter); + new OracleRangeValuesClause().accept(adapter); + new OraclePartitionByRangeClause().accept(adapter); + new OracleLoopStatement().accept(adapter); + new OracleIntervalExpr().accept(adapter); + new OracleDeleteStatement().accept(adapter); + new OracleUpdateStatement().accept(adapter); + new SampleClause().accept(adapter); + new OracleSelectTableReference().accept(adapter); + new SearchClause().accept(adapter); + new CycleClause().accept(adapter); + new OracleBinaryFloatExpr().accept(adapter); + new OracleBinaryDoubleExpr().accept(adapter); + new OracleCursorExpr().accept(adapter); + new OracleIsSetExpr().accept(adapter); + new ReturnRowsClause().accept(adapter); + new ModelClause().accept(adapter); + new MainModelClause().accept(adapter); + new ModelColumnClause().accept(adapter); + new QueryPartitionClause().accept(adapter); + new ModelColumn().accept(adapter); + new ModelRulesClause().accept(adapter); + new CellAssignmentItem().accept(adapter); + new CellAssignment().accept(adapter); + new OracleMergeStatement().accept(adapter); + new MergeUpdateClause().accept(adapter); + new MergeInsertClause().accept(adapter); + new OracleErrorLoggingClause().accept(adapter); + new OracleReturningClause().accept(adapter); + new OracleInsertStatement().accept(adapter); + new InsertIntoClause().accept(adapter); + new OracleMultiInsertStatement().accept(adapter); + new ConditionalInsertClause().accept(adapter); + new ConditionalInsertClauseItem().accept(adapter); + new OracleSelectQueryBlock().accept(adapter); + new OracleBlockStatement().accept(adapter); + new OracleLockTableStatement().accept(adapter); + new OracleAlterSessionStatement().accept(adapter); + new OracleExprStatement().accept(adapter); + new OracleDatetimeExpr().accept(adapter); + new OracleExceptionStatement().accept(adapter); + new OracleExceptionStatement.Item().accept(adapter); + new OracleArgumentExpr().accept(adapter); + new OracleSetTransactionStatement().accept(adapter); + new OracleGrantStatement().accept(adapter); + new OracleDropSequenceStatement().accept(adapter); + new OracleDataTypeIntervalDay().accept(adapter); + new OracleDataTypeIntervalYear().accept(adapter); + new OracleDataTypeTimestamp().accept(adapter); + new OracleDropDatabaseLinkStatement().accept(adapter); + new OracleCreateDatabaseDbLinkStatement().accept(adapter); + new OracleCreateProcedureStatement().accept(adapter); + new OracleSavePointStatement().accept(adapter); + new OracleFetchStatement().accept(adapter); + new OracleExitStatement().accept(adapter); + new OracleExplainStatement().accept(adapter); + new OracleAlterProcedureStatement().accept(adapter); + new OracleAlterTableDropPartition().accept(adapter); + new OracleAlterTableTruncatePartition().accept(adapter); + new OracleAlterTableStatement().accept(adapter); + new OracleAlterTableSplitPartition.TableSpaceItem().accept(adapter); + new OracleAlterTableSplitPartition.UpdateIndexesClause().accept(adapter); + new OracleAlterTableSplitPartition.NestedTablePartitionSpec().accept(adapter); + new OracleAlterTableSplitPartition().accept(adapter); + new OracleAlterTableModify().accept(adapter); + new OracleCreateIndexStatement().accept(adapter); + new OracleAlterIndexStatement().accept(adapter); + new OracleForStatement().accept(adapter); + new OracleAlterIndexStatement().accept(adapter); + new Else().accept(adapter); + new ElseIf().accept(adapter); + new OracleIfStatement().accept(adapter); + new OracleRangeExpr().accept(adapter); + new OracleAlterTableAddConstaint().accept(adapter); + new OraclePrimaryKey().accept(adapter); + new OracleCreateTableStatement().accept(adapter); + new OracleAlterTableRenameTo().accept(adapter); + new OracleStorageClause().accept(adapter); + new OracleGotoStatement().accept(adapter); + new OracleLabelStatement().accept(adapter); + new OracleParameter().accept(adapter); + new OracleCommitStatement().accept(adapter); + new OracleAlterTriggerStatement().accept(adapter); + new OracleAlterSynonymStatement().accept(adapter); + new AsOfSnapshotClause().accept(adapter); + new OracleAlterViewStatement().accept(adapter); + new OracleAlterTableMoveTablespace().accept(adapter); + new OracleSizeExpr().accept(adapter); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGASTVisitorAdapterTest.java new file mode 100644 index 0000000000..bca4b285e1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGASTVisitorAdapterTest.java @@ -0,0 +1,31 @@ +package com.alibaba.druid.bvt.sql.postgresql; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; +import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGParameter; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.FetchClause; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForClause; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGTruncateStatement; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitorAdapter; + +public class PGASTVisitorAdapterTest extends TestCase { + + public void test_adapter() throws Exception { + PGASTVisitorAdapter adapter = new PGASTVisitorAdapter(); + + new WindowClause().accept(adapter); + new FetchClause ().accept(adapter); + new ForClause ().accept(adapter); + new PGWithQuery ().accept(adapter); + new PGWithClause ().accept(adapter); + new PGTruncateStatement ().accept(adapter); + new PGDeleteStatement ().accept(adapter); + new PGParameter ().accept(adapter); + new PGFunctionTableSource ().accept(adapter); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/support/spring/DruidLobCreatorTest.java b/src/test/java/com/alibaba/druid/bvt/support/spring/DruidLobCreatorTest.java new file mode 100644 index 0000000000..a04ddc76fd --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/support/spring/DruidLobCreatorTest.java @@ -0,0 +1,43 @@ +package com.alibaba.druid.bvt.support.spring; + +import java.io.ByteArrayInputStream; +import java.io.StringReader; +import java.sql.Connection; +import java.sql.PreparedStatement; + +import junit.framework.TestCase; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.spring.DruidLobCreator; + +public class DruidLobCreatorTest extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setTestOnBorrow(false); + dataSource.setInitialSize(1); + + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void test_lobCreator() throws Exception { + DruidLobCreator lobCreator = new DruidLobCreator(); + + Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement("select 1"); + lobCreator.setBlobAsBytes(ps, 1, new byte[0]); + lobCreator.setBlobAsBinaryStream(ps, 2, new ByteArrayInputStream(new byte[0]), 0); + lobCreator.setClobAsAsciiStream(ps, 3, new ByteArrayInputStream(new byte[0]), 0); + lobCreator.setClobAsCharacterStream(ps, 4, new StringReader(""), 0); + lobCreator.setClobAsString(ps, 5, ""); + ps.close(); + + conn.close(); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/utils/ConcurrentIdentityHashMapTest3.java b/src/test/java/com/alibaba/druid/bvt/utils/ConcurrentIdentityHashMapTest3.java index 6ebf723770..356aecd56c 100644 --- a/src/test/java/com/alibaba/druid/bvt/utils/ConcurrentIdentityHashMapTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/utils/ConcurrentIdentityHashMapTest3.java @@ -29,11 +29,50 @@ public void test_0() throws Exception { entry.getValue(); } Assert.assertEquals(keys.length, map.size()); + + for (int i = 0; i < keys.length; ++i) { + map.replace(keys[i], "", "a"); + } + for (int i = 0; i < keys.length; ++i) { + map.replace(keys[i], "", "b"); + } + for (int i = 0; i < keys.length; ++i) { + map.replace(keys[i], ""); + } + Assert.assertEquals(keys.length, map.size()); + + map.keys(); + map.keys().hasMoreElements(); + map.keys().nextElement(); + for (int i = 0; i < keys.length; ++i) { map.remove(keys[i]); } Assert.assertEquals(0, map.size()); + map.keys(); map.entrySet(); + map.size(); + map.clear(); + map.isEmpty(); + + map.entrySet().size(); + map.entrySet().isEmpty(); + map.entrySet().remove(null); + map.entrySet().clear(); + map.entrySet().contains(""); + + map.values().size(); + map.values().isEmpty(); + map.values().remove(null); + map.values().clear(); + map.values().contains(""); + + map.keySet().size(); + map.keySet().isEmpty(); + map.keySet().remove(null); + map.keySet().clear(); + map.keySet().contains(""); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/utils/JSONWriterTest.java b/src/test/java/com/alibaba/druid/bvt/utils/JSONWriterTest.java new file mode 100644 index 0000000000..bc917eac94 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/utils/JSONWriterTest.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.bvt.utils; + +import java.io.PrintWriter; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.support.json.JSONWriter; + +public class JSONWriterTest extends TestCase { + + public void test_intArray() throws Exception { + JSONWriter writer = new JSONWriter(); + writer.writeObject(new int[] { 1, 2, 3 }); + Assert.assertEquals("[1,2,3]", writer.toString()); + } + + public void test_throwable() throws Exception { + JSONWriter writer = new JSONWriter(); + writer.writeObject(new Throwable() { + public void printStackTrace(PrintWriter s) { + + } + }); + Assert.assertEquals("{\"Class\":\"com.alibaba.druid.bvt.utils.JSONWriterTest$1\",\"Message\":null,\"StackTrace\":\"\"}", + writer.toString()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/utils/JdbcUtilsTest1.java b/src/test/java/com/alibaba/druid/bvt/utils/JdbcUtilsTest1.java new file mode 100644 index 0000000000..a04c202887 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/utils/JdbcUtilsTest1.java @@ -0,0 +1,58 @@ +package com.alibaba.druid.bvt.utils; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.util.JdbcUtils; + + +public class JdbcUtilsTest1 extends TestCase { + public void test_jdbc() throws Exception { + Assert.assertTrue(JdbcUtils.createDriver(MockDriver.class.getName()) instanceof MockDriver); + } + + public void test_jdbc_1() throws Exception { + class MyClassLoader extends ClassLoader { + + }; + + MyClassLoader classLoader = new MyClassLoader(); + Assert.assertTrue(JdbcUtils.createDriver(classLoader, MockDriver.class.getName()) instanceof MockDriver); + } + + public void test_jdbc_2() throws Exception { + class MyClassLoader extends ClassLoader { + public Class loadClass(String name) throws ClassNotFoundException { + return null; + } + }; + + MyClassLoader classLoader = new MyClassLoader(); + + ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(classLoader); + + Assert.assertTrue(JdbcUtils.createDriver(classLoader, MockDriver.class.getName()) instanceof MockDriver); + + Thread.currentThread().setContextClassLoader(contextLoader); + } + + public void test_jdbc_3() throws Exception { + class MyClassLoader extends ClassLoader { + public Class loadClass(String name) throws ClassNotFoundException { + return null; + } + }; + + MyClassLoader classLoader = new MyClassLoader(); + + ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(null); + + Assert.assertTrue(JdbcUtils.createDriver(classLoader, MockDriver.class.getName()) instanceof MockDriver); + + Thread.currentThread().setContextClassLoader(contextLoader); + } +} diff --git a/src/test/java/com/alibaba/druid/spring/User.java b/src/test/java/com/alibaba/druid/spring/User.java index 4904fdd433..da4e8ef6c0 100644 --- a/src/test/java/com/alibaba/druid/spring/User.java +++ b/src/test/java/com/alibaba/druid/spring/User.java @@ -20,6 +20,15 @@ public class User { private long id; private String name; + public User(){ + + } + + public User(long id, String name){ + this.id = id; + this.name = name; + } + public long getId() { return id; } @@ -36,5 +45,4 @@ public void setName(String name) { this.name = name; } - } diff --git a/src/test/resources/com/alibaba/druid/pool/ibatis/User.xml b/src/test/resources/com/alibaba/druid/pool/ibatis/User.xml index 38b5d2f2e1..412bcd9c8a 100644 --- a/src/test/resources/com/alibaba/druid/pool/ibatis/User.xml +++ b/src/test/resources/com/alibaba/druid/pool/ibatis/User.xml @@ -4,8 +4,23 @@ PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> - + - insert into t_User (id, name) values (#id#, #name#) + insert into t_User (id, name) + values (#id#, #name#) + + + delete from t_User where id = + #id# + + + + update t_User set name = + #name# where id = #id# + + + From 72c9665577f4f759c9758883ce4b1c1bc18a97ac Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 17 Jun 2013 23:34:35 +0800 Subject: [PATCH 2/2] 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 | 202 ++++----- .../alibaba/druid/stat/JdbcSqlStatValue.java | 206 ++++++++-- .../alibaba/druid/stat/JdbcTraceManager.java | 1 + .../druid/support/http/stat/WebURIStat.java | 220 +++++----- .../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, 2425 insertions(+), 1087 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 List getArguments() { 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 @@ protected void accept0(SQLASTVisitor visitor) { 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 @@ 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 void setOperator(SQLBinaryOperator operator) { 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 void setDataType(SQLDataType dataType) { 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 @@ protected void accept0(SQLASTVisitor visitor) { 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 @@ protected void accept0(SQLASTVisitor visitor) { } 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 @@ protected void accept0(SQLASTVisitor visitor) { 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 void setUnit(MySqlIntervalUnit unit) { 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 @@ protected void accept0(SQLASTVisitor visitor) { 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 void setFrom(SQLExpr from) { 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.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 @@ protected void accept0(SQLASTVisitor visitor) { 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 @@ protected void accept0(OracleASTVisitor visitor) { } 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 SQLExpr primary() { 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 SQLExpr primary() { 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 SQLExpr primary() { 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 SQLExpr primary() { 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 @@ /** * @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 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 void reset() { 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.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.lastSlowParameters = lastSlowParameters; + 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 = 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.setLastSlowParameters(lastSlowParameters); lastSlowParameters = null; - val.inTransactionCount = inTransactionCountUpdater.getAndSet(this, 0); - val.resultSetHoldTimeNano = resultSetHoldTimeNanoUpdater.getAndSet(this, 0); - val.executeAndResultSetHoldTime = executeAndResultSetHoldTimeUpdater.getAndSet(this, 0); - - 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.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.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.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.setInTransactionCount(get(this, inTransactionCountUpdater, reset)); + val.setResultSetHoldTimeNano(get(this, resultSetHoldTimeNanoUpdater, reset)); + val.setExecuteAndResultSetHoldTime(get(this, executeAndResultSetHoldTimeUpdater, reset)); + + 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 = 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 = 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.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 long getExecuteCount() { } 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 long[] getExecuteHistogram() { }; } - 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 long[] getExecuteAndResultHoldHistogram() { }; } - 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 long[] getFetchRowHistogram() { }; } - 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 void setDataSource(String dataSource) { 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 void setResultSetHoldTimeNano(long resultSetHoldTimeNano) { this.resultSetHoldTimeNano = resultSetHoldTimeNano; } - public long getExecuteAndResultSetHoldTime() { + public long getExecuteAndResultSetHoldTimeNano() { return executeAndResultSetHoldTime; } @@ -276,9 +293,23 @@ public void setDbType(String dbType) { 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 void setExecuteErrorLast(Throwable executeErrorLast) { this.executeErrorLast = executeErrorLast; } - public long getExecuteErrorLastTime() { + public long getExecuteErrorLastTimeMillis() { return executeErrorLastTime; } @@ -404,4 +435,131 @@ public void setReaderOpenCount(long readerOpenCount) { 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 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 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 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 jdbcResultSetOpenCount; - private volatile long jdbcResultSetCloseCount; - - private volatile long errorCount; - - private volatile long lastAccessTimeMillis = -1L; - - private volatile ProfileStat profiletat; - - 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; - - static { - profiletatUpdater = AtomicReferenceFieldUpdater.newUpdater(WebURIStat.class, ProfileStat.class, "profiletat"); - } - - private final static ThreadLocal currentLocal = new ThreadLocal(); + 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 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 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 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 errorCount; + + private volatile long lastAccessTimeMillis = -1L; + + 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 AtomicLongFieldUpdater lastAccessTimeMillisUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "lastAccessTimeMillis"); + + private final static ThreadLocal currentLocal = new ThreadLocal(); public WebURIStat(String uri){ super(); @@ -364,48 +361,49 @@ public void addJdbcResultSetCloseCount(long delta) { } public ProfileStat getProfiletat() { - if (profiletat != null) { - return profiletat; - } - - profiletatUpdater.compareAndSet(this, null, new ProfileStat()); - return profiletat; } - public Map getStatData() { - Map data = new LinkedHashMap(); + public WebURIStatValue getValue(boolean reset) { + WebURIStatValue val = new WebURIStatValue(); + + val.setUri(uri); - 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()); + val.setRunningCount(runningCount); + val.setConcurrentMax(get(this, concurrentMaxUpdater, reset)); + val.setRequestCount(get(this, requestCountUpdater, reset)); + val.setRequestTimeNano(get(this, requestTimeNanoUpdater, reset)); - data.put("JdbcCommitCount", this.getJdbcCommitCount()); - data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); + val.setJdbcFetchRowCount(get(this, jdbcFetchRowCountUpdater, reset)); + val.setJdbcFetchRowPeak(get(this, jdbcFetchRowPeakUpdater, reset)); - data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); - data.put("JdbcExecuteErrorCount", this.getJdbcExecuteErrorCount()); - data.put("JdbcExecutePeak", this.getJdbcExecutePeak()); - data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); + val.setJdbcUpdateCount(get(this, jdbcUpdateCountUpdater, reset)); + val.setJdbcUpdatePeak(get(this, jdbcUpdatePeakUpdater, reset)); - data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); - data.put("JdbcFetchRowPeak", this.getJdbcFetchRowPeak()); + val.setJdbcExecuteCount(get(this, jdbcExecuteCountUpdater, reset)); + val.setJdbcExecuteErrorCount(get(this, jdbcExecuteErrorCountUpdater, reset)); + val.setJdbcExecutePeak(get(this, jdbcExecutePeakUpdater, reset)); + val.setJdbcExecuteTimeNano(get(this, jdbcExecuteTimeNanoUpdater, reset)); - data.put("JdbcUpdateCount", this.getJdbcUpdateCount()); - data.put("JdbcUpdatePeak", this.getJdbcUpdatePeak()); + val.setJdbcCommitCount(get(this, jdbcCommitCountUpdater, reset)); + val.setJdbcRollbackCount(get(this, jdbcRollbackCountUpdater, reset)); - data.put("JdbcPoolConnectionOpenCount", this.getJdbcPoolConnectionOpenCount()); - data.put("JdbcPoolConnectionCloseCount", this.getJdbcPoolConnectionCloseCount()); + val.setJdbcPoolConnectionOpenCount(get(this, jdbcPoolConnectionOpenCountUpdater, reset)); + val.setJdbcPoolConnectionCloseCount(get(this, jdbcPoolConnectionCloseCountUpdater, reset)); - data.put("JdbcResultSetOpenCount", this.getJdbcResultSetOpenCount()); - data.put("JdbcResultSetCloseCount", this.getJdbcResultSetCloseCount()); + val.setJdbcResultSetOpenCount(get(this, jdbcResultSetOpenCountUpdater, reset)); + val.setJdbcResultSetCloseCount(get(this, jdbcResultSetCloseCountUpdater, reset)); - data.put("Profiles", this.getProfiletat().getStatData()); + val.setErrorCount(get(this, errorCountUpdater, reset)); - return data; + val.setLastAccessTimeMillis(get(this, lastAccessTimeMillisUpdater, reset)); + + val.setProfileEntryStatValueList(this.getProfiletat().getStatValue(reset)); + + return val; + } + + public Map getStatData() { + 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 @@ @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 String getName() { 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 @@ private ProfileEntryStat getProfileEntry(ProfileEntryKey entryKey) { } 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(); - - 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); + ProfileEntryStatValue entryStatValue = entry.getValue().getValue(reset); + entry.getKey().fillValue(entryStatValue); - 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 @@ 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 static Map getData(Object jdbcSqlStat) { 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 static long[] rtrim(long[] array) { 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 void statement_addBatch(FilterChain chain, StatementProxy statement, Stri 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 boolean statement_execute(FilterChain chain, StatementProxy statement, St if (!firstResult) { int updateCount = statement.getUpdateCount(); statExecuteUpdate(updateCount); + } else { + setSqlStatAttribute(statement); } return firstResult; } finally { @@ -343,6 +350,8 @@ public boolean statement_execute(FilterChain chain, StatementProxy statement, St if (!firstResult) { int updateCount = statement.getUpdateCount(); statExecuteUpdate(updateCount); + } else { + setSqlStatAttribute(statement); } return firstResult; } finally { @@ -360,6 +369,8 @@ public boolean statement_execute(FilterChain chain, StatementProxy statement, St if (!firstResult) { int updateCount = statement.getUpdateCount(); statExecuteUpdate(updateCount); + } else { + setSqlStatAttribute(statement); } return firstResult; } finally { @@ -377,6 +388,8 @@ public boolean statement_execute(FilterChain chain, StatementProxy statement, St if (!firstResult) { int updateCount = statement.getUpdateCount(); statExecuteUpdate(updateCount); + } else { + setSqlStatAttribute(statement); } return firstResult; } finally { @@ -389,10 +402,11 @@ public int[] statement_executeBatch(FilterChain chain, StatementProxy statement) 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 ResultSetProxy preparedStatement_executeQuery(FilterChain chain, Prepared @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 @@ private void statExecuteUpdate(WallSqlStat sqlStat, int updateCount) { 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 WallSQLException(String reason){ 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 long getDeleteDataCount() { 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.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 void test_loop() throws Exception { 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 @@ 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 @@ protected void tearDown() throws Exception { } 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 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 void test_exits() throws Exception { 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 void test_ipRange_0() throws Exception { 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 + + + + + + + + + + + + + + + + + + + + + + + + + +