diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index fe68182ac5..5be088f40f 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -2072,6 +2072,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat setFailContinuous(false); } catch (SQLException e) { LOG.error("create connection error, url: " + jdbcUrl, e); + System.out.println(); errorCount++; if (errorCount > connectionErrorRetryAttempts && timeBetweenConnectErrorMillis > 0) { diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java index 22fa3610f0..48e5983857 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -19,19 +19,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; -import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause; -import com.alibaba.druid.sql.ast.statement.SQLSelectItem; -import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; -import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; -import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.ast.statement.SQLUnionOperator; -import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; -import com.alibaba.druid.sql.ast.statement.SQLUnionQueryTableSource; -import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause; +import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.util.JdbcConstants; @@ -579,6 +567,26 @@ public class SQLSelectParser extends SQLParser { primaryTableSourceRest(rightTableSource); } + if (lexer.token() == Token.WITH) { + lexer.nextToken(); + accept(Token.LPAREN); + + for (;;) { + SQLExpr hintExpr = this.expr(); + SQLExprHint hint = new SQLExprHint(hintExpr); + hint.setParent(tableSource); + rightTableSource.getHints().add(hint); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } else { + break; + } + } + + accept(Token.RPAREN); + } + join.setRight(rightTableSource); if (!natural) { 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 3967237189..e6612ac90b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -784,6 +784,40 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return printName(x, name, shardingSupport); } + public String unwrapShardingTable(String name) { + char c0 = name.charAt(0); + char c_last = name.charAt(name.length() - 1); + final boolean quote = (c0 == '`' && c_last == '`') || (c0 == '"' && c_last == '"'); + + int end = name.length(); + if (quote) { + end--; + } + + int num_cnt = 0, postfixed_cnt = 0; + for (int i = end - 1; i > 0; --i, postfixed_cnt++) { + char ch = name.charAt(i); + if (ch >= '0' && ch <= '9') { + num_cnt++; + } + + if (ch != '_' && (ch < '0' || ch > '9')) { + break; + } + } + if (num_cnt < 1 || postfixed_cnt < 2) { + return name; + } + + int start = end - postfixed_cnt; + if (start < 1) { + return name; + } + + String realName = name.substring(quote ? 1 : 0, start); + return realName; + } + private boolean printName(SQLName x, String name, boolean shardingSupport) { if (shardingSupport) { @@ -796,89 +830,37 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } if (shardingSupport) { - int pos = name.lastIndexOf('_'); - if (pos != -1 && pos != name.length() - 1) { - boolean quote = name.charAt(0) == '`' && name.charAt(name.length() - 1) == '`'; - boolean isNumber = true; + final boolean quote = name.charAt(0) == '`' && name.charAt(name.length() - 1) == '`'; - int end = name.length(); - if (quote) { - end--; - } - for (int i = pos + 1; i < end; ++i) { - char ch = name.charAt(i); - if (ch < '0' || ch > '9') { - isNumber = false; + String unwrappedName = unwrapShardingTable(name); + if (unwrappedName != name) { + boolean isAlias = false; + for (SQLObject parent = x.getParent(); parent != null; parent = parent.getParent()) { + if (parent instanceof SQLSelectQueryBlock) { + SQLTableSource from = ((SQLSelectQueryBlock) parent).getFrom(); + if (quote) { + String name2 = name.substring(1, name.length() - 1); + if (isTableSourceAlias(from, name, name2)) { + isAlias = true; + } + } else { + if (isTableSourceAlias(from, name)) { + isAlias = true; + } + } break; } } - if (isNumber) { - int pos2 = name.lastIndexOf('_', pos - 1); - if (pos2 != -1) { - boolean isNumber2 = true; - for (int i = pos2 + 1; i < pos; ++i) { - char ch = name.charAt(i); - if (ch < '0' || ch > '9') { - isNumber2 = false; - break; - } - } - if (isNumber2) { - pos = pos2; - } - } - } - - if (isNumber) { - boolean isAlias = false; - for (SQLObject parent = x.getParent();parent != null; parent = parent.getParent()) { - if (parent instanceof SQLSelectQueryBlock) { - SQLTableSource from = ((SQLSelectQueryBlock) parent).getFrom(); - if (quote) { - String name2 = name.substring(1, name.length() - 1); - if (isTableSourceAlias(from, name, name2)) { - isAlias = true; - } - } else { - if (isTableSourceAlias(from, name)) { - isAlias = true; - } - } - break; - } - } - - if (!isAlias) { - int start = quote ? 1 : 0; - String realName = name.substring(start, pos); - print0(realName); - incrementReplaceCunt(); - return false; - } else { - print0(name); - return false; - } - } - } - - int numberCount = 0; - for (int i = name.length() - 1; i >= 0; --i) { - char ch = name.charAt(i); - if (ch < '0' || ch > '9') { - break; + if (!isAlias) { + print0(unwrappedName); + incrementReplaceCunt(); + return false; } else { - numberCount++; + print0(name); + return false; } } - - if (numberCount > 1) { - int numPos = name.length() - numberCount; - String realName = name.substring(0, numPos); - print0(realName); - incrementReplaceCunt(); - return false; - } } print0(name); return false; @@ -2125,7 +2107,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLUnionQuery x) { SQLUnionOperator operator = x.getOperator(); - boolean bracket = x.isBracket(); + boolean bracket = x.isBracket() && !(x.getParent() instanceof SQLUnionQueryTableSource); if (bracket) { print('('); diff --git a/src/main/java/com/alibaba/druid/support/logging/LogFactory.java b/src/main/java/com/alibaba/druid/support/logging/LogFactory.java index 7381eff8b4..026b844b8f 100644 --- a/src/main/java/com/alibaba/druid/support/logging/LogFactory.java +++ b/src/main/java/com/alibaba/druid/support/logging/LogFactory.java @@ -39,9 +39,9 @@ public class LogFactory { } } // 优先选择log4j,而非Apache Common Logging. 因为后者无法设置真实Log调用者的信息 + tryImplementation("org.slf4j.Logger", "com.alibaba.druid.support.logging.SLF4JImpl"); tryImplementation("org.apache.log4j.Logger", "com.alibaba.druid.support.logging.Log4jImpl"); tryImplementation("org.apache.logging.log4j.Logger", "com.alibaba.druid.support.logging.Log4j2Impl"); - tryImplementation("org.slf4j.Logger", "com.alibaba.druid.support.logging.SLF4JImpl"); tryImplementation("org.apache.commons.logging.LogFactory", "com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl"); tryImplementation("java.util.logging.Logger", "com.alibaba.druid.support.logging.Jdk14LoggingImpl"); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/ShardingUnwrapTest.java b/src/test/java/com/alibaba/druid/bvt/sql/ShardingUnwrapTest.java new file mode 100644 index 0000000000..2ccc72d8eb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/ShardingUnwrapTest.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql; + +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import junit.framework.TestCase; + +/** + * Created by wenshao on 13/08/2017. + */ +public class ShardingUnwrapTest extends TestCase { + SQLASTOutputVisitor visitor = new SQLASTOutputVisitor(new StringBuffer()); + + public void test_sharding_unwrap() throws Exception { + + assertEquals("t_like_count", visitor.unwrapShardingTable("t_like_count0057")); + assertEquals("t_like_count", visitor.unwrapShardingTable("`t_like_count0057`")); + assertEquals("t_like_count", visitor.unwrapShardingTable("\"t_like_count0057\"")); + } + + public void test_sharding_unwrap_2() throws Exception { + assertEquals("t_like_count", visitor.unwrapShardingTable("t_like_count_0057")); + assertEquals("t_like_count", visitor.unwrapShardingTable("`t_like_count_0057`")); + assertEquals("t_like_count", visitor.unwrapShardingTable("\"t_like_count_0057\"")); + } + + public void test_sharding_unwrap_3() throws Exception { + assertEquals("fc_sms", visitor.unwrapShardingTable("fc_sms_0011_201704")); + } + + public void test_sharding_unwrap_4() throws Exception { + assertEquals("ads_tb_sycm_eff_slr_itm_1d_s015_p", visitor.unwrapShardingTable("ads_tb_sycm_eff_slr_itm_1d_s015_p033")); + } + + public void test_sharding_unwrap_5() throws Exception { + assertEquals("t", visitor.unwrapShardingTable("t_00")); + assertEquals("t", visitor.unwrapShardingTable("t_1")); + } + // +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_45.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_45.java new file mode 100644 index 0000000000..b22359aa99 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_45.java @@ -0,0 +1,71 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.serializer.SerializerFeature; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_45 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "(SELECT `t_like_count`.`id`, `t_like_count`.`target_id`, `t_like_count`.`target_type`, `t_like_count`.`like_type`, `t_like_count`.`like_count` , `t_like_count`.`like_optimalize_count`, `t_like_count`.`create_time`, `t_like_count`.`update_time` FROM `t_like_count0062` `t_like_count` WHERE `t_like_count`.`target_type` = ? AND `t_like_count`.`target_id` IN (?)) UNION ALL (SELECT `t_like_count`.`id`, `t_like_count`.`target_id`, `t_like_count`.`target_type`, `t_like_count`.`like_type`, `t_like_count`.`like_count` , `t_like_count`.`like_optimalize_count`, `t_like_count`.`create_time`, `t_like_count`.`update_time` FROM `t_like_count0057` `t_like_count` WHERE `t_like_count`.`target_type` = ? AND `t_like_count`.`target_id` IN (?)) UNION ALL (SELECT `t_like_count`.`id`, `t_like_count`.`target_id`, `t_like_count`.`target_type`, `t_like_count`.`like_type`, `t_like_count`.`like_count` , `t_like_count`.`like_optimalize_count`, `t_like_count`.`create_time`, `t_like_count`.`update_time` FROM `t_like_count0050` `t_like_count` WHERE `t_like_count`.`target_type` = ? AND `t_like_count`.`target_id` IN (?)) UNION ALL (SELECT `t_like_count`.`id`, `t_like_count`.`target_id`, `t_like_count`.`target_type`, `t_like_count`.`like_type`, `t_like_count`.`like_count` , `t_like_count`.`like_optimalize_count`, `t_like_count`.`create_time`, `t_like_count`.`update_time` FROM `t_like_count0048` `t_like_count` WHERE `t_like_count`.`target_type` = ? AND `t_like_count`.`target_id` IN (?))"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + + System.out.println(psql); + + + assertEquals("(SELECT `t_like_count`.`id`, `t_like_count`.`target_id`, `t_like_count`.`target_type`, `t_like_count`.`like_type`, `t_like_count`.`like_count`\n" + + "\t, `t_like_count`.`like_optimalize_count`, `t_like_count`.`create_time`, `t_like_count`.`update_time`\n" + + "FROM t_like_count `t_like_count`\n" + + "WHERE `t_like_count`.`target_type` = ?\n" + + "\tAND `t_like_count`.`target_id` IN (?))\n" + + "UNION ALL\n" + + "(SELECT `t_like_count`.`id`, `t_like_count`.`target_id`, `t_like_count`.`target_type`, `t_like_count`.`like_type`, `t_like_count`.`like_count`\n" + + "\t, `t_like_count`.`like_optimalize_count`, `t_like_count`.`create_time`, `t_like_count`.`update_time`\n" + + "FROM t_like_count `t_like_count`\n" + + "WHERE `t_like_count`.`target_type` = ?\n" + + "\tAND `t_like_count`.`target_id` IN (?))\n" + + "UNION ALL\n" + + "(SELECT `t_like_count`.`id`, `t_like_count`.`target_id`, `t_like_count`.`target_type`, `t_like_count`.`like_type`, `t_like_count`.`like_count`\n" + + "\t, `t_like_count`.`like_optimalize_count`, `t_like_count`.`create_time`, `t_like_count`.`update_time`\n" + + "FROM t_like_count `t_like_count`\n" + + "WHERE `t_like_count`.`target_type` = ?\n" + + "\tAND `t_like_count`.`target_id` IN (?))\n" + + "UNION ALL\n" + + "(SELECT `t_like_count`.`id`, `t_like_count`.`target_id`, `t_like_count`.`target_type`, `t_like_count`.`like_type`, `t_like_count`.`like_count`\n" + + "\t, `t_like_count`.`like_optimalize_count`, `t_like_count`.`create_time`, `t_like_count`.`update_time`\n" + + "FROM t_like_count `t_like_count`\n" + + "WHERE `t_like_count`.`target_type` = ?\n" + + "\tAND `t_like_count`.`target_id` IN (?))", psql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_46.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_46.java new file mode 100644 index 0000000000..7412cb6aed --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_46.java @@ -0,0 +1,124 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_46 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "SELECT COUNT(*) AS count, `ipv_uv_1d_001` AS col FROM ( (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) UNION ALL (SELECT ipv_uv_1d_001 FROM `cbu_da_dihu_16`.`ads_tb_sycm_eff_slr_itm_1d_s015_p033` WHERE `auto_seq_id` > ? LIMIT ?) ) ads_tb_sycm_eff_slr_itm_1d_s015_p033 GROUP BY col ORDER BY col DESC"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + + System.out.println(psql); + + + assertEquals("SELECT COUNT(*) AS count, `ipv_uv_1d_001` AS col\n" + + "FROM (\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + "\tUNION ALL\n" + + "\t(SELECT ipv_uv_1d_001\n" + + "\tFROM `cbu_da_dihu_16`.ads_tb_sycm_eff_slr_itm_1d_s015_p\n" + + "\tWHERE `auto_seq_id` > ?\n" + + "\tLIMIT ?)\n" + + ") ads_tb_sycm_eff_slr_itm_1d_s015_p033\n" + + "GROUP BY col\n" + + "ORDER BY col DESC", psql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_48_union.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_48_union.java index d0a2a15aca..00e7382e47 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_48_union.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_48_union.java @@ -69,7 +69,7 @@ public class MySqlSelectTest_48_union extends MysqlTest { String output = SQLUtils.toMySqlString(stmt); assertEquals("SELECT SUM(hd.paid_amount)\n" + "FROM (\n" + - "\t(SELECT 'fl', CAST(a.hosted_ymd AS date) AS hosted_ymd, a.user_id, 'boss1', a.paid_amount\n" + + "\tSELECT 'fl', CAST(a.hosted_ymd AS date) AS hosted_ymd, a.user_id, 'boss1', a.paid_amount\n" + "\t\t, m.user_id, m.create_date, m.pmcode, n.type_name, n.product_name\n" + "\t\t, n.acctype_id, n.acctype_name, n.account_name, n.plan\n" + "\tFROM hive.bdc_dwd.dw_mk_copyright_order a\n" + @@ -104,7 +104,7 @@ public class MySqlSelectTest_48_union extends MysqlTest { "\t\tAND CAST(b.paid_date AS varchar(10)) >= '2016-01-01'\n" + "\t\tAND CAST(b.paid_date AS varchar(10)) <= '2017-06-30'\n" + "\t\tAND b.state = 1\n" + - "\t\tAND a.acct_day = '03')\n" + + "\t\tAND a.acct_day = '03'\n" + ") hd", // output); } @@ -112,7 +112,7 @@ public class MySqlSelectTest_48_union extends MysqlTest { String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); assertEquals("select sum(hd.paid_amount)\n" + "from (\n" + - "\t(select 'fl', cast(a.hosted_ymd as date) as hosted_ymd, a.user_id, 'boss1', a.paid_amount\n" + + "\tselect 'fl', cast(a.hosted_ymd as date) as hosted_ymd, a.user_id, 'boss1', a.paid_amount\n" + "\t\t, m.user_id, m.create_date, m.pmcode, n.type_name, n.product_name\n" + "\t\t, n.acctype_id, n.acctype_name, n.account_name, n.plan\n" + "\tfrom hive.bdc_dwd.dw_mk_copyright_order a\n" + @@ -147,7 +147,7 @@ public class MySqlSelectTest_48_union extends MysqlTest { "\t\tand cast(b.paid_date as varchar(10)) >= '2016-01-01'\n" + "\t\tand cast(b.paid_date as varchar(10)) <= '2017-06-30'\n" + "\t\tand b.state = 1\n" + - "\t\tand a.acct_day = '03')\n" + + "\t\tand a.acct_day = '03'\n" + ") hd", // output); } @@ -156,7 +156,7 @@ public class MySqlSelectTest_48_union extends MysqlTest { String output = SQLUtils.toMySqlString(stmt, new SQLUtils.FormatOption(true, true, true)); assertEquals("SELECT SUM(hd.paid_amount)\n" + "FROM (\n" + - "\t(SELECT ?, CAST(a.hosted_ymd AS date) AS hosted_ymd, a.user_id, ?, a.paid_amount\n" + + "\tSELECT ?, CAST(a.hosted_ymd AS date) AS hosted_ymd, a.user_id, ?, a.paid_amount\n" + "\t\t, m.user_id, m.create_date, m.pmcode, n.type_name, n.product_name\n" + "\t\t, n.acctype_id, n.acctype_name, n.account_name, n.plan\n" + "\tFROM hive.bdc_dwd.dw_mk_copyright_order a\n" + @@ -191,7 +191,7 @@ public class MySqlSelectTest_48_union extends MysqlTest { "\t\tAND CAST(b.paid_date AS varchar(10)) >= ?\n" + "\t\tAND CAST(b.paid_date AS varchar(10)) <= ?\n" + "\t\tAND b.state = ?\n" + - "\t\tAND a.acct_day = ?)\n" + + "\t\tAND a.acct_day = ?\n" + ") hd", // output); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_50_union.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_50_union.java new file mode 100644 index 0000000000..91434d2be8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_50_union.java @@ -0,0 +1,101 @@ +/* + * Copyright 1999-2017 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.mysql.select; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class MySqlSelectTest_50_union extends MysqlTest { + + public void test_0() throws Exception { + String sql = "select * from (\n" + + "select seller_name from a where id < 100\n" + + "UNION\n" + + "select seller_name from a where id < 100\n" + + ") as temp limit 10"; + + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL, true); + SQLStatement stmt = statementList.get(0); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); + +// assertEquals(1, visitor.getTables().size()); +// assertEquals(1, visitor.getColumns().size()); +// assertEquals(0, visitor.getConditions().size()); +// assertEquals(0, visitor.getOrderByColumns().size()); + + { + String output = SQLUtils.toMySqlString(stmt); + assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT seller_name\n" + + "\tFROM a\n" + + "\tWHERE id < 100\n" + + "\tUNION\n" + + "\tSELECT seller_name\n" + + "\tFROM a\n" + + "\tWHERE id < 100\n" + + ") temp\n" + + "LIMIT 10", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("select *\n" + + "from (\n" + + "\tselect seller_name\n" + + "\tfrom a\n" + + "\twhere id < 100\n" + + "\tunion\n" + + "\tselect seller_name\n" + + "\tfrom a\n" + + "\twhere id < 100\n" + + ") temp\n" + + "limit 10", // + output); + } + + { + String output = SQLUtils.toMySqlString(stmt, new SQLUtils.FormatOption(true, true, true)); + assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT seller_name\n" + + "\tFROM a\n" + + "\tWHERE id < ?\n" + + "\tUNION\n" + + "\tSELECT seller_name\n" + + "\tFROM a\n" + + "\tWHERE id < ?\n" + + ") temp\n" + + "LIMIT ?", // + output); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest25.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest25.java new file mode 100644 index 0000000000..e8f135f448 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest25.java @@ -0,0 +1,48 @@ +/* + * Copyright 1999-2017 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.sqlserver; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import junit.framework.TestCase; +import org.junit.Assert; + +public class SQLServerSelectTest25 extends TestCase { + + public void test_simple() throws Exception { + String sql = // + "SELECT A.value FROM A oost LEFT JOIN B oo WITH (NOLOCK) ON oost.order_id = oo.id"; // + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + + { + String text = SQLUtils.toSQLServerString(stmt); + + Assert.assertEquals("SELECT A.value\n" + + "FROM A oost\n" + + "\tLEFT JOIN B oo WITH (NOLOCK) ON oost.order_id = oo.id", text); + } + { + String text = SQLUtils.toSQLServerString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + + Assert.assertEquals("select A.value\n" + + "from A oost\n" + + "\tleft join B oo with (NOLOCK) on oost.order_id = oo.id", text); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/stat/DruidStatServiceTest.java b/src/test/java/com/alibaba/druid/bvt/stat/DruidStatServiceTest.java index 67abe1ff92..7288090234 100644 --- a/src/test/java/com/alibaba/druid/bvt/stat/DruidStatServiceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/stat/DruidStatServiceTest.java @@ -218,33 +218,33 @@ public class DruidStatServiceTest extends TestCase { conn.close(); } - public void test_statService_getActiveConnectionStackTraceId() throws Exception { - String sql = "select 1"; - dataSource.setRemoveAbandoned(true); - dataSource.setRemoveAbandonedTimeout(Integer.MAX_VALUE); - Connection conn = dataSource.getConnection(); - - PreparedStatement stmt = conn.prepareStatement(sql); - ResultSet rs = stmt.executeQuery(); - rs.next(); - rs.close(); - // get data source. - String dsResult = DruidStatService.getInstance().service("/datasource.json"); - Map dsResultMap = (Map) JSONUtils.parse(dsResult); - List> dataSourceList = (List>) dsResultMap.get("Content"); - Map dataSourceStat = dataSourceList.get(0); - assertThat(dataSourceStat, is(not(nullValue()))); - // get data source id. - int id = (Integer) dataSourceStat.get("Identity"); - - String result = DruidStatService.getInstance().service("/activeConnectionStackTrace-" + id + ".json"); - Map resultMap = (Map) JSONUtils.parse(result); - List contentList = (List) resultMap.get("Content"); - - assertThat(contentList.get(0), is(not(nullValue()))); - stmt.close(); - conn.close(); - } +// public void test_statService_getActiveConnectionStackTraceId() throws Exception { +// String sql = "select 1"; +// dataSource.setRemoveAbandoned(true); +// dataSource.setRemoveAbandonedTimeout(Integer.MAX_VALUE); +// Connection conn = dataSource.getConnection(); +// +// PreparedStatement stmt = conn.prepareStatement(sql); +// ResultSet rs = stmt.executeQuery(); +// rs.next(); +// rs.close(); +// // get data source. +// String dsResult = DruidStatService.getInstance().service("/datasource.json"); +// Map dsResultMap = (Map) JSONUtils.parse(dsResult); +// List> dataSourceList = (List>) dsResultMap.get("Content"); +// Map dataSourceStat = dataSourceList.get(0); +// assertThat(dataSourceStat, is(not(nullValue()))); +// // get data source id. +// int id = (Integer) dataSourceStat.get("Identity"); +// +// String result = DruidStatService.getInstance().service("/activeConnectionStackTrace-" + id + ".json"); +// Map resultMap = (Map) JSONUtils.parse(result); +// List contentList = (List) resultMap.get("Content"); +// +// assertThat(contentList.get(0), is(not(nullValue()))); +// stmt.close(); +// conn.close(); +// } public void test_statService_returnJSONActiveConnectionStackTrace() throws Exception { String result = DruidStatService.getInstance().service("/activeConnectionStackTrace-1.json"); diff --git a/src/test/java/com/alibaba/druid/mysql/MySqlConnectFailTest.java b/src/test/java/com/alibaba/druid/mysql/MySqlConnectFailTest.java new file mode 100644 index 0000000000..19e7207dd0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/mysql/MySqlConnectFailTest.java @@ -0,0 +1,26 @@ +package com.alibaba.druid.mysql; + +import com.alibaba.druid.pool.DruidDataSource; +import junit.framework.TestCase; + +import java.sql.Connection; +import java.util.concurrent.Executors; + +/** + * Created by wenshao on 10/08/2017. + */ +public class MySqlConnectFailTest extends TestCase { + DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mysql://rm-bp1n325y4m6h78xt3.mysql.rds.aliyuncs.com:3306/oracle_info?allowMultiQueries=true&characterEncoding=UTF8"); + dataSource.setUsername("xx"); + dataSource.setPassword("xxx"); + dataSource.setCreateScheduler(Executors.newScheduledThreadPool(10)); + } + public void test_0() throws Exception { + Connection conn = dataSource.getConnection(); + conn.close(); + } +} diff --git a/src/test/java/com/alibaba/druid/postgresql/PG_getCreateTableScriptTest.java b/src/test/java/com/alibaba/druid/postgresql/PG_getCreateTableScriptTest.java new file mode 100644 index 0000000000..6ffe893830 --- /dev/null +++ b/src/test/java/com/alibaba/druid/postgresql/PG_getCreateTableScriptTest.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.postgresql; + +import com.alibaba.druid.DbTestCase; +import com.alibaba.druid.benckmark.proxy.BenchmarkExecutor; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.druid.util.JdbcUtils; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.Collections; +import java.util.List; + +/** + * Created by wenshao on 23/07/2017. + */ +public class PG_getCreateTableScriptTest extends DbTestCase { + public PG_getCreateTableScriptTest() { + super("pool_config/pg_db.properties"); + } + + public void test_oracle() throws Exception { + Connection conn = getConnection(); + + // 从Oracle通过DBMS_METADATA.GET_DDL获取CreateTable语句列表 + //String createTableScript = JdbcUtils.getCreateTableScript(conn, JdbcConstants.ORACLE); + //System.out.println(createTableScript); + + Statement stmt = conn.createStatement();; + ResultSet rs = stmt.executeQuery("SELECT * FROM pg_catalog.pg_tables " + + "where schemaname not in ('pg_catalog', 'information_schema', 'sys')"); + JdbcUtils.printResultSet(rs); + + List tables = JdbcUtils.showTables(conn, JdbcConstants.POSTGRESQL); + for (String table : tables) { +// Object cnt = JdbcUtils.executeQuery(conn, "select count(*) CNT from " + table, Collections.emptyList()) +// .get(0) +// .get("CNT"); + System.out.println(table); + } + + conn.close(); + } +}