diff --git a/pom.xml b/pom.xml
index 045a650bd4..ff0647eab9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.alibaba
druid
- 0.2.4
+ 0.2.5-SNAPSHOT
jar
druid
@@ -170,32 +170,56 @@
-
javax.servlet
servlet-api
2.5
provided
-
-
- org.mortbay.jetty
- jetty
- 6.1.26
- provided
+ true
commons-logging
commons-logging
1.1.1
provided
+ true
org.springframework
- spring
- 2.0
+ spring-core
+ 3.1.1.RELEASE
provided
+ true
+
+
+ org.springframework
+ spring-beans
+ 3.1.1.RELEASE
+ provided
+ true
+
+
+ org.springframework
+ spring-ibatis
+ 2.0.8
+ provided
+ true
+
+
+ org.mybatis
+ mybatis
+ 3.1.1
+ provided
+ true
+
+
+ org.mybatis
+ mybatis-spring
+ 1.1.1
+ provided
+ true
diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java
index 8abf08b232..d608cdb019 100644
--- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java
+++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java
@@ -27,16 +27,15 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable {
private static final long serialVersionUID = 1L;
protected String methodName;
- protected int option;
+ protected Option option;
protected final List arguments = new ArrayList();
public SQLAggregateExpr(String methodName){
this.methodName = methodName;
- this.option = 1;
}
- public SQLAggregateExpr(String methodName, int option){
+ public SQLAggregateExpr(String methodName, Option option){
this.methodName = methodName;
this.option = option;
}
@@ -49,11 +48,11 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable {
this.methodName = methodName;
}
- public int getOption() {
+ public Option getOption() {
return this.option;
}
- public void setOption(int option) {
+ public void setOption(Option option) {
this.option = option;
}
@@ -86,7 +85,7 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable {
int result = 1;
result = prime * result + ((arguments == null) ? 0 : arguments.hashCode());
result = prime * result + ((methodName == null) ? 0 : methodName.hashCode());
- result = prime * result + option;
+ result = prime * result + ((option == null) ? 0 : option.hashCode());
return result;
}
@@ -121,4 +120,8 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable {
}
return true;
}
+
+ public static enum Option {
+ DISTINCT, ALL, UNIQUE
+ }
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java
index f4e3c300e0..ea624747e1 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java
@@ -63,7 +63,7 @@ public class MySqlLexer extends Lexer {
public void scanVariable() {
final char first = ch;
- if (ch != '@' && ch != ':' && ch != '#') {
+ if (ch != '@' && ch != ':' && ch != '#' && ch != '$') {
throw new SQLParseException("illegal variable");
}
@@ -104,6 +104,31 @@ public class MySqlLexer extends Lexer {
stringVal = symbolTable.addSymbol(buf, np, sp, hash);
token = Token.VARIANT;
+ } else if (buf[bp + 1] == '{') {
+ ++bp;
+ ++sp;
+ char ch;
+ for (;;) {
+ ch = buf[++bp];
+
+ if (ch == '}') {
+ sp++;
+ ch = buf[++bp];
+ break;
+ } else if (ch == EOI) {
+ throw new SQLParseException("illegal identifier");
+ }
+
+ hash = 31 * hash + ch;
+
+ sp++;
+ continue;
+ }
+
+ this.ch = buf[bp];
+
+ stringVal = symbolTable.addSymbol(buf, np, sp, hash);
+ token = Token.VARIANT;
} else {
for (;;) {
ch = buf[++bp];
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java
index 94da69584b..29a75b2a98 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java
@@ -494,7 +494,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
if (x.isGlobal()) {
print("@@global.");
} else {
- if ((!x.getName().startsWith("@")) && (!x.getName().equals("?"))) {
+ String varName = x.getName();
+ if ((!varName.startsWith("@")) && (!varName.equals("?")) && (!varName.startsWith("#")) && (!varName.startsWith("$"))) {
print("@@");
}
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java
index f1619e5157..ec22e01cda 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAggregateExpr.java
@@ -24,17 +24,16 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleAggregateExpr extends SQLAggregateExpr implements Serializable, OracleExpr {
- private boolean unique = false;
private static final long serialVersionUID = 1L;
private OracleAnalytic over;
private boolean ignoreNulls = false;
public boolean isUnique() {
- return unique;
+ return Option.UNIQUE.equals(this.getOption());
}
public void setUnique(boolean unique) {
- this.unique = unique;
+ this.setOption(Option.UNIQUE);
}
public boolean isIgnoreNulls() {
@@ -49,7 +48,7 @@ public class OracleAggregateExpr extends SQLAggregateExpr implements Serializabl
super(methodName);
}
- public OracleAggregateExpr(String methodName, int option){
+ public OracleAggregateExpr(String methodName, Option option){
super(methodName, option);
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java
index bce3bfc56d..fc6d3e9d76 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLOrderingSpecification;
+import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
@@ -524,25 +525,22 @@ public class OracleExprParser extends SQLExprParser {
return null;
}
- protected OracleAggregateExpr parseAggregateExpr(String method_name) {
- boolean unique = false;
-
- if (lexer.token() == Token.UNIQUE) {
- lexer.nextToken();
- unique = true;
- }
+ protected OracleAggregateExpr parseAggregateExpr(String methodName) {
+ methodName = methodName.toUpperCase();
OracleAggregateExpr aggregateExpr;
- if (lexer.token() == (Token.ALL)) {
- aggregateExpr = new OracleAggregateExpr(method_name, 1);
+ if (lexer.token() == Token.UNIQUE) {
+ aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.UNIQUE);
+ lexer.nextToken();
+ } else if (lexer.token() == (Token.ALL)) {
+ aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.ALL);
lexer.nextToken();
} else if (lexer.token() == (Token.DISTINCT)) {
- aggregateExpr = new OracleAggregateExpr(method_name, 0);
+ aggregateExpr = new OracleAggregateExpr(methodName, SQLAggregateExpr.Option.DISTINCT);
lexer.nextToken();
} else {
- aggregateExpr = new OracleAggregateExpr(method_name, 1);
+ aggregateExpr = new OracleAggregateExpr(methodName);
}
- aggregateExpr.setUnique(unique);
exprList(aggregateExpr.getArguments());
if (lexer.stringVal().equalsIgnoreCase("IGNORE")) {
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java
index 658a20a017..1065cbcf2e 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java
@@ -87,7 +87,7 @@ public class OracleLexer extends Lexer {
return;
}
- if (ch != ':' && ch != '#') {
+ if (ch != ':' && ch != '#' && ch != '$') {
throw new SQLParseException("illegal variable");
}
@@ -98,12 +98,19 @@ public class OracleLexer extends Lexer {
char ch;
boolean quoteFlag = false;
+ boolean mybatisFlag = false;
if (buf[bp + 1] == '"') {
hash = 31 * hash + '"';
bp++;
sp++;
quoteFlag = true;
+ } else if (buf[bp + 1] == '{') {
+ hash = 31 * hash + '"';
+ bp++;
+ sp++;
+ mybatisFlag = true;
}
+
for (;;) {
ch = buf[++bp];
@@ -116,6 +123,7 @@ public class OracleLexer extends Lexer {
sp++;
continue;
}
+
if (quoteFlag) {
if (ch != '"') {
throw new SQLParseException("syntax error");
@@ -123,6 +131,13 @@ public class OracleLexer extends Lexer {
hash = 31 * hash + '"';
++bp;
sp++;
+ } else if (mybatisFlag) {
+ if (ch != '}') {
+ throw new SQLParseException("syntax error");
+ }
+ hash = 31 * hash + '"';
+ ++bp;
+ sp++;
}
this.ch = buf[bp];
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 d36d120b78..fe2c6bbafd 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
@@ -211,9 +211,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
public boolean visit(OracleAggregateExpr expr) {
print(expr.getMethodName());
print("(");
- if (expr.isUnique()) {
- print("UNIQUE ");
+
+ if (expr.getOption() != null) {
+ print(expr.getOption().toString());
+ print(' ');
}
+
printAndAccept(expr.getArguments(), ", ");
print(")");
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/PGAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/PGAggregateExpr.java
index 390aed24a9..8a6cf87318 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/PGAggregateExpr.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/PGAggregateExpr.java
@@ -20,7 +20,7 @@ public class PGAggregateExpr extends SQLAggregateExpr implements PGSQLObject {
private static final long serialVersionUID = 1L;
- public PGAggregateExpr(String methodName, int option) {
+ public PGAggregateExpr(String methodName, Option option) {
super(methodName, option);
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java
index 4d4ec91164..5ace50df14 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java
@@ -19,16 +19,18 @@ public class PGExprParser extends SQLExprParser{
super(lexer);
}
- protected SQLAggregateExpr parseAggregateExpr(String method_name) throws ParserException {
+ protected SQLAggregateExpr parseAggregateExpr(String methodName) throws ParserException {
+ methodName = methodName.toUpperCase();
+
PGAggregateExpr aggregateExpr;
if (lexer.token() == Token.ALL) {
- aggregateExpr = new PGAggregateExpr(method_name, 1);
+ aggregateExpr = new PGAggregateExpr(methodName, SQLAggregateExpr.Option.ALL);
lexer.nextToken();
} else if (lexer.token() == Token.DISTINCT) {
- aggregateExpr = new PGAggregateExpr(method_name, 0);
+ aggregateExpr = new PGAggregateExpr(methodName, SQLAggregateExpr.Option.DISTINCT);
lexer.nextToken();
} else {
- aggregateExpr = new PGAggregateExpr(method_name, 1);
+ aggregateExpr = new PGAggregateExpr(methodName);
}
exprList(aggregateExpr.getArguments());
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java
index 38ddec0c02..23784425f3 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java
@@ -433,12 +433,21 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
@Override
public boolean visit(PGAggregateExpr x) {
print(x.getMethodName());
+
print("(");
+
+ if (x.getOption() != null) {
+ print(x.getOption().toString());
+ print(' ');
+ }
+
printAndAccept(x.getArguments(), ", ");
print(")");
+
if (x.getOver() != null) {
x.getOver().accept(this);
}
+
return false;
}
diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java
index 15a58a62ee..de8fe9813d 100644
--- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java
+++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java
@@ -205,9 +205,13 @@ public class Lexer {
if (isWhitespace(ch)) {
scanChar();
continue;
- }// QS_TODO skip comment
+ }
+
+ if (ch == '$' && buf[bp + 1] == '{') {
+ scanVariable();
+ return;
+ }
- // QS_TODO id may start from digit
if (isFirstIdentifierChar(ch)) {
if (ch == 'N') {
if (buf[bp + 1] == '\'') {
@@ -571,7 +575,7 @@ public class Lexer {
public void scanVariable() {
final char first = ch;
- if (ch != '@' && ch != ':' && ch != '#') {
+ if (ch != '@' && ch != ':' && ch != '#' && ch != '$') {
throw new SQLParseException("illegal variable");
}
@@ -581,11 +585,17 @@ public class Lexer {
sp = 1;
char ch;
+ boolean mybatisFlag = false;
if (buf[bp + 1] == '@') {
ch = buf[++bp];
hash = 31 * hash + ch;
sp++;
+ } else if (buf[bp + 1] == '{') {
+ hash = 31 * hash + '"';
+ bp++;
+ sp++;
+ mybatisFlag = true;
}
for (;;) {
@@ -600,6 +610,15 @@ public class Lexer {
sp++;
continue;
}
+
+ if (mybatisFlag) {
+ if (ch != '}') {
+ throw new SQLParseException("syntax error");
+ }
+ hash = 31 * hash + '"';
+ ++bp;
+ sp++;
+ }
this.ch = buf[bp];
diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
index 3d8f089750..9c5aa476d1 100644
--- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
+++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
@@ -675,16 +675,18 @@ public class SQLExprParser extends SQLParser {
return false;
}
- protected SQLAggregateExpr parseAggregateExpr(String method_name) throws ParserException {
+ protected SQLAggregateExpr parseAggregateExpr(String methodName) throws ParserException {
+ methodName = methodName.toUpperCase();
+
SQLAggregateExpr aggregateExpr;
if (lexer.token() == Token.ALL) {
- aggregateExpr = new SQLAggregateExpr(method_name, 1);
+ aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateExpr.Option.ALL);
lexer.nextToken();
} else if (lexer.token() == Token.DISTINCT) {
- aggregateExpr = new SQLAggregateExpr(method_name, 0);
+ aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateExpr.Option.DISTINCT);
lexer.nextToken();
} else {
- aggregateExpr = new SQLAggregateExpr(method_name, 1);
+ aggregateExpr = new SQLAggregateExpr(methodName);
}
exprList(aggregateExpr.getArguments());
diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java
index 7686462365..3ea42f7244 100644
--- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java
@@ -426,6 +426,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter {
public boolean visit(SQLAggregateExpr x) {
print(x.getMethodName());
print("(");
+
+ if (x.getOption() != null) {
+ print(x.getOption().toString());
+ print(' ');
+ }
+
printAndAccept(x.getArguments(), ", ");
print(")");
return false;
diff --git a/src/main/java/com/alibaba/druid/stat/JdbcStatManagerFactoryBean.java b/src/main/java/com/alibaba/druid/stat/JdbcStatManagerFactoryBean.java
index 9bc3f85a4b..68cc92360f 100644
--- a/src/main/java/com/alibaba/druid/stat/JdbcStatManagerFactoryBean.java
+++ b/src/main/java/com/alibaba/druid/stat/JdbcStatManagerFactoryBean.java
@@ -17,10 +17,10 @@ package com.alibaba.druid.stat;
import org.springframework.beans.factory.FactoryBean;
-public class JdbcStatManagerFactoryBean implements FactoryBean {
+public class JdbcStatManagerFactoryBean implements FactoryBean {
@Override
- public Object getObject() throws Exception {
+ public JdbcStatManager getObject() throws Exception {
return JdbcStatManager.getInstance();
}
diff --git a/src/main/java/com/alibaba/druid/support/spring/MBeanServerFactoryBean.java b/src/main/java/com/alibaba/druid/support/spring/MBeanServerFactoryBean.java
index 23e117e639..5ba4e3e697 100644
--- a/src/main/java/com/alibaba/druid/support/spring/MBeanServerFactoryBean.java
+++ b/src/main/java/com/alibaba/druid/support/spring/MBeanServerFactoryBean.java
@@ -6,7 +6,7 @@ import javax.management.MBeanServer;
import org.springframework.beans.factory.FactoryBean;
-public class MBeanServerFactoryBean implements FactoryBean {
+public class MBeanServerFactoryBean implements FactoryBean {
public MBeanServer getObject() throws Exception {
return ManagementFactory.getPlatformMBeanServer();
diff --git a/src/test/java/com/alibaba/druid/benckmark/pool/Case0.java b/src/test/java/com/alibaba/druid/benckmark/pool/Case0.java
index 3302034561..999503cab0 100644
--- a/src/test/java/com/alibaba/druid/benckmark/pool/Case0.java
+++ b/src/test/java/com/alibaba/druid/benckmark/pool/Case0.java
@@ -49,14 +49,14 @@ public class Case0 extends TestCase {
public final int COUNT = 1000 * 1000 * 1;
protected void setUp() throws Exception {
-// jdbcUrl = "jdbc:fake:dragoon_v25masterdb";
-// user = "dragoon25";
-// password = "dragoon25";
-// driverClass = "com.alibaba.druid.mock.MockDriver";
+ jdbcUrl = "jdbc:fake:dragoon_v25masterdb";
+ user = "dragoon25";
+ password = "dragoon25";
+ driverClass = "com.alibaba.druid.mock.MockDriver";
- jdbcUrl = "jdbc:mysql://10.20.159.104:3306/masterdb";
- user = "dragoon";
- password = "dragoon";
+// jdbcUrl = "jdbc:mysql://10.20.159.104:3306/masterdb";
+// user = "dragoon";
+// password = "dragoon";
}
public void test_0() throws Exception {
@@ -135,8 +135,8 @@ public class Case0 extends TestCase {
for (int i = 0; i < COUNT; ++i) {
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
-// ResultSet rs = stmt.executeQuery("SELECT 1");
-// rs.close();
+ ResultSet rs = stmt.executeQuery("SELECT 1");
+ rs.close();
stmt.close();
conn.close();
}
diff --git a/src/test/java/com/alibaba/druid/bvt/jmx/JMXExporterTest.java b/src/test/java/com/alibaba/druid/bvt/jmx/JMXExporterTest.java
new file mode 100644
index 0000000000..f3b42f6880
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/jmx/JMXExporterTest.java
@@ -0,0 +1,29 @@
+package com.alibaba.druid.bvt.jmx;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.ObjectName;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class JMXExporterTest extends TestCase {
+
+ public void test_export() throws Exception {
+ String file = "com/alibaba/druid/jmx/spring_stat_export.xml";
+
+ ObjectName objectName = new ObjectName("com.alibaba.druid:type=JdbcStatManager");
+
+ Assert.assertFalse(ManagementFactory.getPlatformMBeanServer().isRegistered(objectName)); // before jmx register
+
+ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(file);
+
+ Assert.assertTrue(ManagementFactory.getPlatformMBeanServer().isRegistered(objectName)); // after jmx register
+
+ context.close();
+
+ Assert.assertFalse(ManagementFactory.getPlatformMBeanServer().isRegistered(objectName));
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/pool/Case2.java b/src/test/java/com/alibaba/druid/bvt/pool/Case2.java
index 1e52994441..3c05c545d1 100644
--- a/src/test/java/com/alibaba/druid/bvt/pool/Case2.java
+++ b/src/test/java/com/alibaba/druid/bvt/pool/Case2.java
@@ -22,6 +22,7 @@ import junit.framework.Assert;
import junit.framework.TestCase;
import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
import com.alibaba.druid.util.JMXUtils;
@@ -51,7 +52,7 @@ public class Case2 extends TestCase {
properties.put("url", "jdbc:mock:");
properties.put("filters", "stat");
properties.put("validationQuery", "SELECT 1");
- final DruidDataSource dataSource = (DruidDataSource) com.alibaba.druid.pool.DruidDataSourceFactory.createDataSource(properties);
+ DruidDataSource dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
JMXUtils.register("com.alibaba.druid:type=DruidDataSource", dataSource);
final int COUNT = 10;
diff --git a/src/test/java/com/alibaba/druid/bvt/pool/SpringFilterTest.java b/src/test/java/com/alibaba/druid/bvt/pool/SpringIbatisFilterTest.java
similarity index 81%
rename from src/test/java/com/alibaba/druid/bvt/pool/SpringFilterTest.java
rename to src/test/java/com/alibaba/druid/bvt/pool/SpringIbatisFilterTest.java
index 8c2ddf4702..745f72c785 100644
--- a/src/test/java/com/alibaba/druid/bvt/pool/SpringFilterTest.java
+++ b/src/test/java/com/alibaba/druid/bvt/pool/SpringIbatisFilterTest.java
@@ -20,7 +20,7 @@ import com.alibaba.druid.spring.IUserService;
import com.alibaba.druid.spring.User;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
-public class SpringFilterTest extends TestCase {
+public class SpringIbatisFilterTest extends TestCase {
protected void setUp() throws Exception {
Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
@@ -34,7 +34,7 @@ public class SpringFilterTest extends TestCase {
Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
- "com/alibaba/druid/pool/spring-config-1.xml");
+ "com/alibaba/druid/pool/ibatis/spring-config-ibatis.xml");
DataSource dataSource = (DataSource) context.getBean("dataSource");
@@ -71,6 +71,22 @@ public class SpringFilterTest extends TestCase {
TestFilter filter = (TestFilter) context.getBean("test-filter");
Assert.assertEquals(2, filter.getConnectCount());
+ {
+ 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();
Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
diff --git a/src/test/java/com/alibaba/druid/bvt/pool/SpringMybatisFilterTest.java b/src/test/java/com/alibaba/druid/bvt/pool/SpringMybatisFilterTest.java
new file mode 100644
index 0000000000..3b18be631c
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/pool/SpringMybatisFilterTest.java
@@ -0,0 +1,94 @@
+package com.alibaba.druid.bvt.pool;
+
+import java.sql.Connection;
+import java.sql.Statement;
+
+import javax.sql.DataSource;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import com.alibaba.druid.spring.User;
+import com.alibaba.druid.stat.DruidDataSourceStatManager;
+
+public class SpringMybatisFilterTest extends TestCase {
+
+ protected void setUp() throws Exception {
+ Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
+ }
+
+ protected void tearDown() throws Exception {
+ Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
+ }
+
+ public void test_spring() throws Exception {
+ Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
+
+ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
+ "com/alibaba/druid/pool/mybatis/spring-config-mybatis.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();
+ }
+ {
+ Connection conn = dataSource.getConnection();
+ conn.setAutoCommit(false);
+ Statement stmt = conn.createStatement();
+ stmt.execute("insert into sequence_seed (value ,name) values (0, 'druid-spring-test')");
+ stmt.close();
+ conn.commit();
+ conn.close();
+ }
+
+ UserMapper userMapper = (UserMapper) context.getBean("userMapper");
+
+ {
+ User user = new User();
+ user.setName("xx");
+
+ userMapper.addUser(user);
+ }
+
+ {
+ 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();
+
+ Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
+ }
+
+ public static interface UserMapper {
+
+ @Insert(value = "insert into t_User (id, name) values (#{user.id}, #{user.name})")
+ void addUser(@Param("user") User user);
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java b/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java
new file mode 100644
index 0000000000..8b6299dfd4
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/sql/DistinctTest.java
@@ -0,0 +1,32 @@
+package com.alibaba.druid.bvt.sql;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import com.alibaba.druid.sql.SQLUtils;
+import com.alibaba.druid.util.JdbcUtils;
+
+
+public class DistinctTest extends TestCase {
+ private String sql = "select count(distinct *) from t";
+
+ public void test_mysql() throws Exception {
+ Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.MYSQL));
+ }
+
+ public void test_oracle() throws Exception {
+ Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.ORACLE));
+ }
+
+ public void test_oracle_unique() throws Exception {
+ Assert.assertEquals("SELECT COUNT(UNIQUE *)\nFROM t", SQLUtils.format("select count(unique *) from t", JdbcUtils.ORACLE));
+ }
+
+ public void test_postgres() throws Exception {
+ Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, JdbcUtils.POSTGRESQL));
+ }
+
+ public void test_sql92() throws Exception {
+ Assert.assertEquals("SELECT COUNT(DISTINCT *)\nFROM t", SQLUtils.format(sql, null));
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest.java b/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest.java
new file mode 100644
index 0000000000..e403c518f1
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest.java
@@ -0,0 +1,28 @@
+package com.alibaba.druid.bvt.sql;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import com.alibaba.druid.sql.SQLUtils;
+import com.alibaba.druid.util.JdbcUtils;
+
+
+public class MybatisTest extends TestCase {
+ private String sql = "select * from t where id = #{id}";
+
+ public void test_mysql() throws Exception {
+ Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, JdbcUtils.MYSQL));
+ }
+
+ public void test_oracle() throws Exception {
+ Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, JdbcUtils.ORACLE));
+ }
+
+ public void test_postgres() throws Exception {
+ Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, JdbcUtils.POSTGRESQL));
+ }
+
+ public void test_sql92() throws Exception {
+ Assert.assertEquals("SELECT *\nFROM t\nWHERE id = #{id}", SQLUtils.format(sql, null));
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest2.java
new file mode 100644
index 0000000000..df44ae013b
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/sql/MybatisTest2.java
@@ -0,0 +1,28 @@
+package com.alibaba.druid.bvt.sql;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import com.alibaba.druid.sql.SQLUtils;
+import com.alibaba.druid.util.JdbcUtils;
+
+
+public class MybatisTest2 extends TestCase {
+ private String sql = "select * from t where id = ${id}";
+
+ public void test_mysql() throws Exception {
+ Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, JdbcUtils.MYSQL));
+ }
+
+ public void test_oracle() throws Exception {
+ Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, JdbcUtils.ORACLE));
+ }
+
+ public void test_postgres() throws Exception {
+ Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, JdbcUtils.POSTGRESQL));
+ }
+
+ public void test_sql92() throws Exception {
+ Assert.assertEquals("SELECT *\nFROM t\nWHERE id = ${id}", SQLUtils.format(sql, null));
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLSelectParserTest.java b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLSelectParserTest.java
index a9866aa337..4304b9dce6 100644
--- a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLSelectParserTest.java
+++ b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DMLSelectParserTest.java
@@ -152,7 +152,7 @@ public class DMLSelectParserTest extends TestCase {
SQLStatement stmt = parser.parseStatementList().get(0);
parser.match(Token.EOF);
String output = SQLUtils.toMySqlString(stmt);
- Assert.assertEquals("SELECT SQL_CACHE id1, max(id2)\nFROM tb1\nGROUP BY id1\nHAVING id1 > 10\nORDER BY id3 DESC", output);
+ Assert.assertEquals("SELECT SQL_CACHE id1, MAX(id2)\nFROM tb1\nGROUP BY id1\nHAVING id1 > 10\nORDER BY id3 DESC", output);
}
public void test_select_10() throws Exception {
diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java
index e93675d69a..feed4b884f 100644
--- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java
+++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleGroupingSetTest.java
@@ -21,7 +21,7 @@ public class OracleGroupingSetTest extends TestCase {
+ "( calendar_month_desc, co.country_id) );\n";
String expected = "SELECT channel_desc, calendar_month_desc, co.country_id, " //
- + "TO_CHAR(sum(amount_sold), '9,999,999,999') AS SALES$\n" //
+ + "TO_CHAR(SUM(amount_sold), '9,999,999,999') AS SALES$\n" //
+ "FROM sales, customers, times, channels, countries co\n" //
+ "WHERE sales.time_id = times.time_id" //
+ "\n\tAND sales.cust_id = customers.cust_id" //
diff --git a/src/test/resources/bvt/parser/mysql-5.txt b/src/test/resources/bvt/parser/mysql-5.txt
index ed0add5358..5aea645438 100644
--- a/src/test/resources/bvt/parser/mysql-5.txt
+++ b/src/test/resources/bvt/parser/mysql-5.txt
@@ -8,7 +8,7 @@ ORDER BY e.word_alias,a.createtime DESC
---------------------------
-SELECT Count(*)
+SELECT COUNT(*)
FROM q_matchrelation a, q_offerdetail b, q_keyword e, Q_ADCREATIVE f
WHERE a.offerid = b.offerid
AND a.keywordid = e.keywordid
diff --git a/src/test/resources/bvt/parser/mysql-6.txt b/src/test/resources/bvt/parser/mysql-6.txt
index 05959e231b..9045779040 100644
--- a/src/test/resources/bvt/parser/mysql-6.txt
+++ b/src/test/resources/bvt/parser/mysql-6.txt
@@ -37,7 +37,7 @@ from (
---------------------------
-SELECT count(*)
+SELECT COUNT(*)
FROM (SELECT a.activity_offer_id AS adResourceId, a.title AS adResourceName, a.b2boffer_url AS adResourceURL, a.custid, b.memberid
, c.position_name AS positionName, c.charge_setting AS feeRegulation, a.priority_weight AS priorityWeight, a.audit_state AS adResourceState, 0 AS adResourceType
, a.gmt_create, a.refuse_remark
diff --git a/src/test/resources/com/alibaba/druid/jmx/spring_stat_export.xml b/src/test/resources/com/alibaba/druid/jmx/spring_stat_export.xml
new file mode 100644
index 0000000000..1fed66031a
--- /dev/null
+++ b/src/test/resources/com/alibaba/druid/jmx/spring_stat_export.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/com/alibaba/druid/pool/spring-config-1.xml b/src/test/resources/com/alibaba/druid/pool/dataSource.xml
similarity index 66%
rename from src/test/resources/com/alibaba/druid/pool/spring-config-1.xml
rename to src/test/resources/com/alibaba/druid/pool/dataSource.xml
index 05f9399abb..976ca8a8ba 100644
--- a/src/test/resources/com/alibaba/druid/pool/spring-config-1.xml
+++ b/src/test/resources/com/alibaba/druid/pool/dataSource.xml
@@ -1,92 +1,70 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- jdbc:derby:memory:spring-test;create=true
-
-
- 1
-
-
- 20
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ jdbc:derby:memory:spring-test;create=true
+
+
+ 1
+
+
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/com/alibaba/druid/pool/Sequence.xml b/src/test/resources/com/alibaba/druid/pool/ibatis/Sequence.xml
similarity index 100%
rename from src/test/resources/com/alibaba/druid/pool/Sequence.xml
rename to src/test/resources/com/alibaba/druid/pool/ibatis/Sequence.xml
diff --git a/src/test/resources/com/alibaba/druid/pool/User.xml b/src/test/resources/com/alibaba/druid/pool/ibatis/User.xml
similarity index 100%
rename from src/test/resources/com/alibaba/druid/pool/User.xml
rename to src/test/resources/com/alibaba/druid/pool/ibatis/User.xml
diff --git a/src/test/resources/com/alibaba/druid/pool/ibatis-config-druid-test.xml b/src/test/resources/com/alibaba/druid/pool/ibatis/ibatis-config-druid-test.xml
similarity index 74%
rename from src/test/resources/com/alibaba/druid/pool/ibatis-config-druid-test.xml
rename to src/test/resources/com/alibaba/druid/pool/ibatis/ibatis-config-druid-test.xml
index 29c36cb346..dc30d76ec7 100644
--- a/src/test/resources/com/alibaba/druid/pool/ibatis-config-druid-test.xml
+++ b/src/test/resources/com/alibaba/druid/pool/ibatis/ibatis-config-druid-test.xml
@@ -4,6 +4,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/src/test/resources/com/alibaba/druid/pool/ibatis/spring-config-ibatis.xml b/src/test/resources/com/alibaba/druid/pool/ibatis/spring-config-ibatis.xml
new file mode 100644
index 0000000000..ea987687cb
--- /dev/null
+++ b/src/test/resources/com/alibaba/druid/pool/ibatis/spring-config-ibatis.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/com/alibaba/druid/pool/mybatis/spring-config-mybatis.xml b/src/test/resources/com/alibaba/druid/pool/mybatis/spring-config-mybatis.xml
new file mode 100644
index 0000000000..bc802baddd
--- /dev/null
+++ b/src/test/resources/com/alibaba/druid/pool/mybatis/spring-config-mybatis.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+