package com.taobao.tddl.qatest.matrix.select; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized.Parameters; import com.taobao.tddl.qatest.BaseMatrixTestCase; import com.taobao.tddl.qatest.BaseTestCase; import com.taobao.tddl.qatest.ExecuteTableName; import com.taobao.tddl.qatest.util.EclipseParameterized; /** * 带条件的选择查询 * <p/> * Author By: yaolingling.pt Created Date: 2012-2-21 上午11:30:18 */ @RunWith(EclipseParameterized.class) public class SelectWithConditionTest extends BaseMatrixTestCase { @Parameters(name = "{index}:table0={0},table1={1}") public static List<String[]> prepare() { return Arrays.asList(ExecuteTableName.normaltblStudentTable(dbType)); } public SelectWithConditionTest(String normaltblTableName, String studentTableName){ BaseTestCase.normaltblTableName = normaltblTableName; BaseTestCase.studentTableName = studentTableName; } @Before public void prepareDate() throws Exception { normaltblPrepare(0, 20); studentPrepare(0, MAX_DATA_SIZE); } @Test public void inTest() throws Exception { String sql = "select * from " + normaltblTableName + " where pk in (1,2,3)"; String[] columnParam = { "PK", "NAME" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void betweenTest() throws Exception { int start = 5; int end = 15; String sql = "select * from " + normaltblTableName + " where id between ? and ?"; List<Object> param = new ArrayList<Object>(); param.add(start); param.add(end); String[] columnParam = { "PK", "NAME", "ID" }; selectContentSameAssert(sql, columnParam, param); } @Test public void constant() throws Exception { String sql = "select 1 a,2 from " + normaltblTableName; String[] columnParam = { "a", "2" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void selectFilterTest() throws Exception { String sql = "select id=id as a from " + normaltblTableName; String[] columnParam = { "a" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void selectFilterTest2() throws Exception { String sql = "select id=1 a from " + normaltblTableName; String[] columnParam = { "a" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void selectFilterTest3() throws Exception { String sql = "select id and 1 a from " + normaltblTableName; String[] columnParam = { "a" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void selectFilterTest4() throws Exception { String sql = "select 1=1 a from " + normaltblTableName; String[] columnParam = { "a" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void selectFilterTest5() throws Exception { String sql = "select id in (1,2,3) a from " + normaltblTableName; String[] columnParam = { "a" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void inWithParamTest() throws Exception { String sql = "select * from " + normaltblTableName + " where pk in (?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(Long.parseLong(1 + "")); param.add(Long.parseLong(2 + "")); param.add(Long.parseLong(3 + "")); String[] columnParam = { "PK", "NAME" }; selectContentSameAssert(sql, columnParam, param); } @Test public void NotInTest() throws Exception { String sql = "select * from " + normaltblTableName + " where pk not in (?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(Long.parseLong(1 + "")); param.add(Long.parseLong(2 + "")); param.add(Long.parseLong(3 + "")); String[] columnParam = { "ID", "NAME" }; selectContentSameAssert(sql, columnParam, param); } @Test public void isTrue() throws Exception { if (!normaltblTableName.startsWith("ob")) { String sql = "select * from " + normaltblTableName + " where pk is true"; String[] columnParam = { "ID", "NAME", "PK" }; selectContentSameAssert(sql, columnParam, null); sql = "select id is true a,name from " + normaltblTableName; String[] columnParam1 = { "a", "NAME", }; selectContentSameAssert(sql, columnParam1, null); } } @Test public void selectNot() throws Exception { String sql = "select not pk a from " + normaltblTableName; String[] columnParam = { "a" }; selectContentSameAssert(sql, columnParam, null); } @Test public void selectNotFun() throws Exception { String[] columnParam = { "a" }; String sql = "select not max(pk) a from " + normaltblTableName; selectContentSameAssert(sql, columnParam, null); } @Test public void selectNotConstant() throws Exception { String sql = "select not (1+1) a from " + normaltblTableName; String[] columnParam = { "a" }; selectContentSameAssert(sql, columnParam, null); } @Test public void selectNotWhereConstant() throws Exception { String sql = "select * from " + normaltblTableName + " where not (id=1)"; String[] columnParam = { "ID", "NAME", "PK" }; selectContentSameAssert(sql, columnParam, null); } @Test public void selectNotWhereConstantOr() throws Exception { String sql = "select * from " + normaltblTableName + " where not (id=1 or id=2)"; String[] columnParam = { "ID", "NAME", "PK" }; selectContentSameAssert(sql, columnParam, null); } @Test public void isNotTrue() throws Exception { String sql = "select * from " + normaltblTableName + " where pk is not true"; String[] columnParam = { "ID", "NAME", "PK" }; selectContentSameAssert(sql, columnParam, null); } @Test public void groupByWithCountTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); mysqlUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select count(pk),name from " + normaltblTableName + " group by name"; String[] columnParam = { "COUNT(PK)", "NAME" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void groupByWithAscTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select count(pk),name from " + normaltblTableName + " group by name asc"; selectOrderAssert(sql, new String[] {}, Collections.EMPTY_LIST); } @Ignore("ob暂时不支持desc排序,而mysql会计算desc") @Test public void groupByWithDescTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select count(pk),name from " + normaltblTableName + " group by name desc"; selectOrderAssert(sql, new String[] {}, Collections.EMPTY_LIST); } @Test public void groupByWithMinMaxTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); mysqlUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select name,min(pk) from " + normaltblTableName + " group by name"; String[] columnParam = { "name", "min(pk)" }; selectOrderAssert(sql, columnParam, Collections.EMPTY_LIST); sql = "select name,max(pk) from " + normaltblTableName + " group by name"; String[] param = { "name", "max(pk)" }; selectOrderAssert(sql, param, Collections.EMPTY_LIST); } @Test public void groupByAvgTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); mysqlUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select name,avg(pk) from " + normaltblTableName + " group by name"; String[] columnParam = { "name", "avg(pk)" }; selectOrderAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void groupBySumTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); mysqlUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select name,sum(pk) from " + normaltblTableName + " group by name"; String[] columnParam = { "name", "sum(pk)" }; selectOrderAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void havingTest() throws Exception { String sql = "select name,count(pk) from " + normaltblTableName + " group by name having count(pk)>? order by name "; List<Object> param = new ArrayList<Object>(); param.add(5L); String[] columnParam = { "NAME", "COUNT(pk)" }; selectOrderAssert(sql, columnParam, param); } /** * 查询字段没有带函数,having过滤带字段带函数,暂时只支持单机的 */ @Test public void havingFunTest() throws Exception { if (normaltblTableName.contains("oneGroup_oneAtom")) { String sql = "select name from " + normaltblTableName + " group by name having sum(pk) > ?"; List<Object> param = new ArrayList<Object>(); param.add(40l); String[] columnParam = { "name" }; selectContentSameAssert(sql, columnParam, param); } } @Test public void orderByTest() throws Exception { String sql = "select * from " + normaltblTableName + " where name= ? order by pk"; List<Object> param = new ArrayList<Object>(); param.add(name); String[] columnParam = { "PK", "ID", "NAME" }; selectOrderAssert(sql, columnParam, param); } @Test public void orderByAscTest() throws Exception { String sql = "select * from " + normaltblTableName + " where name= ? order by id asc"; List<Object> param = new ArrayList<Object>(); param.add(name); String[] columnParam = { "PK", "ID", "NAME" }; selectOrderAssertNotKeyCloumn(sql, columnParam, param, "id"); } @Test public void orderByDescTest() throws Exception { String sql = "select * from " + normaltblTableName + " where name= ? order by id desc"; List<Object> param = new ArrayList<Object>(); param.add(name); String[] columnParam = { "PK", "ID", "NAME" }; selectOrderAssertNotKeyCloumn(sql, columnParam, param, "id"); } @Test public void orderByNotAppointFieldTest() throws Exception { String sql = "select name,pk from " + normaltblTableName + " where name= ? order by id"; List<Object> param = new ArrayList<Object>(); param.add(name); String[] columnParam = { "name", "pk" }; selectContentSameAssert(sql, columnParam, param); } /** * order by 后面跟多个排序字段 */ @Test public void orderByMutilValueTest() throws Exception { String sql = "select name,pk from " + normaltblTableName + " where name= ? order by gmt_create,id"; List<Object> param = new ArrayList<Object>(); param.add(name); String[] columnParam = { "name", "pk" }; selectContentSameAssert(sql, columnParam, param); } @Test public void groupByOrderbyTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); mysqlUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select name,count(a.pk) as c from " + normaltblTableName + " as a group by name order by name"; String[] columnParam = { "name", "c" }; selectOrderAssertNotKeyCloumn(sql, columnParam, Collections.EMPTY_LIST, "name"); } @Test public void groupByOrderbyFunctionCloumTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); mysqlUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "/* ANDOR ALLOW_TEMPORARY_TABLE=True */select name,count(pk) from " + normaltblTableName + " group by name order by count(pk)"; String[] columnParam = { "name", "count(pk)" }; selectOrderAssertNotKeyCloumn(sql, columnParam, Collections.EMPTY_LIST, "count(pk)"); } @Test public void AndTest() throws Exception { int i = 2; String sql = "select * from " + normaltblTableName + " where name= ? and id= ?"; List<Object> param = new ArrayList<Object>(); param.add(name); param.add(i); String[] columnParam = { "name", "pk" }; selectContentSameAssert(sql, columnParam, param); } @Test public void orWithSameFiledTest() throws Exception { long pk = 2l; long opk = 3l; String sql = "select * from " + normaltblTableName + " where pk= ? or pk=?"; List<Object> param = new ArrayList<Object>(); param.add(pk); param.add(opk); String[] columnParam = { "name", "pk", "id" }; selectContentSameAssert(sql, columnParam, param); } @Test public void distinctTest() throws Exception { String sql = "select distinct name from " + normaltblTableName; String[] columnParam = { "name" }; selectContentSameAssert(sql, columnParam, null); } @Test public void distinctWithCountDistinctTest() throws Exception { { String sql = "select count(distinct id) from " + normaltblTableName + " as t1 where pk>1"; String[] columnParam = { "count(distinct id)" }; selectContentSameAssert(sql, columnParam, null); } { String sql = "select count(distinct id) from " + normaltblTableName + " where pk>1"; String[] columnParam = { "count(distinct id)" }; selectContentSameAssert(sql, columnParam, null); } { String sql = "select count(distinct id) k from " + normaltblTableName + " as t1 where pk>1"; String[] columnParam = { "k" }; selectContentSameAssert(sql, columnParam, null); } } @Test public void distinctOrderByTest() throws Exception { // order by和distinct不一致,只能用临时表 String sql = "/* ANDOR ALLOW_TEMPORARY_TABLE=True */select distinct name from " + normaltblTableName + " where name=? order by id"; List<Object> param = new ArrayList<Object>(); param.add(name); try { rc = andorQueryData(sql, param); Assert.assertEquals(1, resultsSize(rc)); } finally { if (rc != null) { rc.close(); } } } @Ignore("目前不支持distinctrow") @Test public void distinctrowTest() throws Exception { String sql = "select distinctrow name from " + normaltblTableName + " where name=?"; List<Object> param = new ArrayList<Object>(); param.add(name); try { rc = andorQueryData(sql, param); Assert.assertEquals(1, resultsSize(rc)); } finally { rc.close(); } } @Test public void orWithDifFiledTest() throws Exception { long pk = 2l; int id = 3; String sql = "select * from " + normaltblTableName + " where pk= ? or id=?"; List<Object> param = new ArrayList<Object>(); param.add(pk); param.add(id); String[] columnParam = { "name", "pk", "id" }; selectContentSameAssert(sql, columnParam, param); } @Test public void limitWithStart() throws Exception { int start = 5; int limit = 6; String sql = "SELECT * FROM " + normaltblTableName + " order by pk LIMIT " + start + "," + limit; String[] columnParam = { "name", "pk", "id" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void selectLimit() throws Exception { int start = 5; int limit = 1; String sql = "select * from " + studentTableName + " as nor1 ,(select pk from " + normaltblTableName + " where name=? limit ?,?) as nor2 where nor1.id=nor2.pk"; List<Object> param = new ArrayList<Object>(); param.add(name); param.add(start); param.add(limit); selectConutAssert(sql, param); } @Test public void limitWithoutStart() throws Exception { int limit = 50; String sql = "SELECT * FROM " + normaltblTableName + " LIMIT " + limit; String[] columnParam = { "name", "pk", "id" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } // 狄龙项目的 @Test public void groupByScalarFunction() throws Exception { if (!normaltblTableName.startsWith("ob")) { // ob不支持 String sql = "SELECT COUNT(1) daily_illegal,DATE_FORMAT(gmt_create, '%Y-%m-%d') d ,name FROM " + normaltblTableName + " group by DATE_FORMAT(gmt_create, '%Y-%m-%d'),name"; String[] columnParam = { "daily_illegal", "d", "name" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } } @Test public void groupByLimitTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); mysqlUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select name,count(pk) from " + normaltblTableName + " group by name limit 1"; String[] columnParam = { "name", "count(pk)" }; selectContentSameAssert(sql, columnParam, Collections.EMPTY_LIST); } @Test public void orderByLimitTest() throws Exception { andorUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); mysqlUpdateData("insert into " + normaltblTableName + " (pk,name) values(?,?)", Arrays.asList(new Object[] { RANDOM_ID, newName })); String sql = "select * from " + normaltblTableName + " where name=? order by pk limit 10 "; List<Object> param = new ArrayList<Object>(); param.add(name); String[] columnParam = { "name", "pk" }; selectOrderAssert(sql, columnParam, param); sql = "select * from " + normaltblTableName + " where name=? order by pk desc limit 10 "; selectOrderAssert(sql, columnParam, param); } @Test public void dateTypeWithLimit() throws Exception { String sql = "select * from " + normaltblTableName + " where gmt_timestamp>? and gmt_timestamp <? and name like ? order by gmt_timestamp desc limit 2,5"; List<Object> param = new ArrayList<Object>(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); sql = "select * from " + normaltblTableName + " where gmt_timestamp>=? and gmt_timestamp <=? and name like ? order by gmt_timestamp desc limit 2,5"; param.clear(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); sql = "select * from " + normaltblTableName + " where gmt_timestamp>? and gmt_timestamp <? and name like ? order by gmt_timestamp desc limit 10,5"; param.clear(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); } @Test public void timestampTypeWithLimit() throws Exception { String sql = "select * from " + normaltblTableName + " where gmt_timestamp>? and gmt_timestamp <? and name like ? order by gmt_timestamp desc limit 2,5"; List<Object> param = new ArrayList<Object>(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); sql = "select * from " + normaltblTableName + " where gmt_timestamp>=? and gmt_timestamp <=? and name like ? order by gmt_timestamp desc limit 2,5"; param.clear(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); sql = "select * from " + normaltblTableName + " where gmt_timestamp>? and gmt_timestamp <? and name like ? order by gmt_timestamp desc limit 10,5"; param.clear(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); } @Test public void datetimeTypeWithLimit() throws Exception { String sql = "select * from " + normaltblTableName + " where gmt_datetime>? and gmt_datetime <? and name like ? order by gmt_datetime desc limit 2,5"; List<Object> param = new ArrayList<Object>(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); sql = "select * from " + normaltblTableName + " where gmt_datetime>=? and gmt_datetime <=? and name like ? order by gmt_datetime desc limit 2,5"; param.clear(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); sql = "select * from " + normaltblTableName + " where gmt_datetime>? and gmt_datetime <? and name like ? order by gmt_datetime desc limit 10,5"; param.clear(); param.add(gmtBefore); param.add(gmtNext); param.add(name); selectConutAssert(sql, param); } @Test public void limitError() throws Exception { int limit = -3; List<Object> param = new ArrayList<Object>(); param.add(limit); String sql = "SELECT * FROM " + normaltblTableName + " LIMIT "; try { rc = andorQueryData(sql, param); Assert.fail(); } catch (Exception e) { Assert.assertNotNull(e.getMessage()); } } @Ignore("目前不支持union") @Test public void unionTest() throws Exception { } }