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 @@ + + + + + + + + + + + + + +