From b199d3043f9d108ebb38d294e673ac95b539688f Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 17 Jun 2013 00:34:41 +0800 Subject: [PATCH] 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 | 73 ++--- .../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 | 40 +-- .../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, 2493 insertions(+), 693 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 @@ import java.sql.SQLException; public class MockClob implements Clob { private byte[] bytes; + private ByteArrayOutputStream out = new ByteArrayOutputStream(); public MockClob(){ this(new byte[0]); @@ -81,7 +83,7 @@ public class MockClob implements Clob { @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 class DruidDataSource extends DruidAbstractDataSource implements DruidDat transactionHistogram.reset(); cachedPreparedStatementDeleteCount.set(0); recycleErrorCount.set(0); - + resetCount.incrementAndGet(); } - + public long getResetCount() { return this.resetCount.get(); } @@ -1445,19 +1445,19 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat 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 class DruidDataSource extends DruidAbstractDataSource implements DruidDat 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 @@ package com.alibaba.druid.pool; 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 class SQLBetweenExpr extends SQLExprImpl implements Serializable { 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 class SQLCaseExpr extends SQLExprImpl implements Serializable { } - 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 class SQLCaseExpr extends SQLExprImpl implements Serializable { 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 @@ public class SQLCaseExpr extends SQLExprImpl implements Serializable { } 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 class SQLExistsExpr extends SQLExprImpl implements Serializable { } 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 class SQLExistsExpr extends SQLExprImpl implements Serializable { } 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 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; 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 class SQLSelect extends SQLObjectImpl { 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 @@ public class SQLSelect extends SQLObjectImpl { 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.ArrayList; 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 @@ public class SQLSelectQueryBlock extends SQLSelectQuery { 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.groupBy != null) { - buf.append(" "); - this.groupBy.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; } + + @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 class MySqlBinlogStatement extends MySqlStatementImpl { 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 class MySqlCreateUserStatement extends MySqlStatementImpl { if (visitor.visit(this)) { acceptChild(visitor, users); } + visitor.endVisit(this); } public static class UserSpecification extends MySqlObjectImpl { @@ -82,6 +83,7 @@ public class MySqlCreateUserStatement extends MySqlStatementImpl { 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 class MySqlDropUser extends MySqlStatementImpl { 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 class MySqlKillStatement extends MySqlStatementImpl { 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 class MySqlResetStatement extends MySqlStatementImpl { 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 class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO 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 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO 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 java.util.List; 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 class MySqlTableIndex extends SQLObjectImpl implements SQLTableElement { 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 class ModelClause extends OracleSQLObjectImpl { acceptChild(visitor, referenceModelClauses); acceptChild(visitor, mainModel); } + visitor.endVisit(this); } public MainModelClause getMainModel() { @@ -104,6 +105,7 @@ public class ModelClause extends OracleSQLObjectImpl { @Override public void accept0(OracleASTVisitor visitor) { visitor.visit(this); + visitor.endVisit(this); } } @@ -179,6 +181,7 @@ public class ModelClause extends OracleSQLObjectImpl { acceptChild(visitor, dimensionByColumns); acceptChild(visitor, measuresColumns); } + visitor.endVisit(this); } } @@ -211,6 +214,7 @@ public class ModelClause extends OracleSQLObjectImpl { if (visitor.visit(this)) { acceptChild(visitor, expr); } + visitor.endVisit(this); } } @@ -281,6 +285,7 @@ public class ModelClause extends OracleSQLObjectImpl { acceptChild(visitor, modelColumnClause); acceptChild(visitor, modelRulesClause); } + visitor.endVisit(this); } } @@ -324,6 +329,7 @@ public class ModelClause extends OracleSQLObjectImpl { acceptChild(visitor, until); acceptChild(visitor, cellAssignmentItems); } + visitor.endVisit(this); } } @@ -391,6 +397,7 @@ public class ModelClause extends OracleSQLObjectImpl { acceptChild(visitor, orderBy); acceptChild(visitor, expr); } + visitor.endVisit(this); } } @@ -419,6 +426,7 @@ public class ModelClause extends OracleSQLObjectImpl { 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 class OracleCursorExpr extends SQLExprImpl implements OracleExpr { 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 class OracleIsSetExpr extends SQLExprImpl implements OracleExpr { 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 class OracleSelectParser extends SQLSelectParser { 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 class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } 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.SQLSelectQueryBlock; 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.SQLSelectQueryBlock; 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 class SQLASTVisitorAdapter implements SQLASTVisitor { 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 class SQLASTVisitorAdapter implements SQLASTVisitor { 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 class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLCreateDatabaseStatement x) { - + } @Override @@ -677,7 +661,7 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLAlterTableDropIndex x) { - + } @Override @@ -687,7 +671,7 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLAlterTableAddPrimaryKey x) { - + } @Override @@ -701,7 +685,7 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLColumnPrimaryKey x) { - + } @Override @@ -717,11 +701,11 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { 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 class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLCharactorDataType x) { - + } @Override public void endVisit(SQLAlterTableAlterColumn x) { - + } @Override @@ -754,7 +738,7 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLCheck x) { - + } @Override @@ -764,17 +748,17 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @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 class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLAlterTableDisableKeys x) { - + } @Override @@ -794,17 +778,17 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @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 class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLAlterTableAddForeignKey x) { - + } @Override @@ -824,26 +808,27 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @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 class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLExprHint x) { - + } - + @Override public boolean visit(SQLAlterTableDropConstraint x) { return true; @@ -863,6 +848,6 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @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 class SQLEvalVisitorUtils { } public static Short castToShort(Object val) { - if (val == null) { + if (val == null || val == EVAL_VALUE_NULL) { return null; } @@ -1078,7 +1078,7 @@ public class SQLEvalVisitorUtils { } public static Float castToFloat(Object val) { - if (val == null) { + if (val == null || val == EVAL_VALUE_NULL) { return null; } @@ -1090,7 +1090,7 @@ public class SQLEvalVisitorUtils { } public static Double castToDouble(Object val) { - if (val == null) { + if (val == null || val == EVAL_VALUE_NULL) { return null; } @@ -1191,11 +1191,21 @@ public class SQLEvalVisitorUtils { } 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 class SQLEvalVisitorUtils { } 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 class IPRange { 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 class IPRange { 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 class IPRange { int octet = Integer.parseInt(binary[c], 2); decimalip.append(octet); if (c < 3) { - + decimalip.append('.'); } } @@ -311,7 +234,7 @@ public class IPRange { 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 class JSONWriter { } 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 final class Resources extends Object { 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 final class Resources extends Object { 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 @@ public final class Resources extends Object { } } - 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 final class JdbcUtils implements JdbcConstants { } 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) { + // skip + } + } + + if (clazz == null) { + try { + ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + if (contextLoader != null) { + clazz = contextLoader.loadClass(driverClassName); + } + } catch (ClassNotFoundException e) { + // skip + } + } + + if (clazz == null) { + try { + clazz = Class.forName(driverClassName); } catch (ClassNotFoundException e) { throw new SQLException(e.getMessage(), e); } } try { - return (Driver) Class.forName(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) { - // skip - } - - try { - return (Driver) Thread.currentThread().getContextClassLoader().loadClass(driverClassName).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 @@ public class EncodingConvertFilterTest2 extends TestCase { dataSource.setFilters("encoding"); dataSource.setDriver(new MockDriver() { - + public ResultSet createResultSet(MockPreparedStatement stmt) { return new MyResultSet(stmt); } @@ -74,7 +83,7 @@ public class EncodingConvertFilterTest2 extends TestCase { 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 class EncodingConvertFilterTest2 extends TestCase { 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)); - + 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 class EncodingConvertFilterTest2 extends TestCase { 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 class EncodingConvertFilterTest2 extends TestCase { 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 @@ public class LogFilterTest3 extends TestCase { 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.Connection; 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 class CounterFilterTest extends TestCase { 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 @@ public class SqlMapExecutorWrapperTest extends TestCase { 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 org.junit.Assert; 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 class EvalMethodAcosTest extends TestCase { 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 class EvalMethodAtanTest extends TestCase { 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 class EvalMethodCeilTest extends TestCase { 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 class EvalMethodCosTest extends TestCase { 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 class EvalMethodLog10Test extends TestCase { 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 class EvalMethodLogTest extends TestCase { 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 org.junit.Assert; 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 org.junit.Assert; 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 org.junit.Assert; 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 class EvalMethodTanTest extends TestCase { 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 org.junit.Assert; 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 @@ import com.alibaba.druid.util.JdbcConstants; 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 class EvalTest_add_short extends TestCase { 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 org.junit.Assert; 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 @@ package com.alibaba.druid.bvt.sql.eval; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Date; import junit.framework.TestCase; @@ -10,41 +11,48 @@ import org.junit.Assert; 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 @@ package com.alibaba.druid.bvt.sql.eval; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Date; import junit.framework.TestCase; @@ -10,41 +11,48 @@ import org.junit.Assert; 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 @@ package com.alibaba.druid.bvt.sql.oracle; 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.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 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 class OracleSelectTest42 extends OracleTest { 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 class OracleSubqueryFactoringTest extends TestCase { + "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 class ConcurrentIdentityHashMapTest3 extends TestCase { 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 class User { 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# + + +