diff --git a/documentation20/cn/02.getting-started/docs.md b/documentation20/cn/02.getting-started/docs.md index 5f887df914ef06d40f3b3b8bf6ef8dfe18fe6ecf..f38522b5c257fdb3f72e833e72f14f4c9acdefb0 100644 --- a/documentation20/cn/02.getting-started/docs.md +++ b/documentation20/cn/02.getting-started/docs.md @@ -30,7 +30,7 @@ wget -qO - http://repos.taosdata.com/tdengine.key | sudo apt-key add - echo "deb [arch=amd64] http://repos.taosdata.com/tdengine-stable stable main" | sudo tee /etc/apt/sources.list.d/tdengine-stable.list [ beta 版安装包仓库为可选安装项 ] echo "deb [arch=amd64] http://repos.taosdata.com/tdengine-beta beta main" | sudo tee /etc/apt/sources.list.d/tdengine-beta.list sudo apt-get update -apt-get policy tdengine +apt-cache policy tdengine sudo apt-get install tdengine ``` diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 7651e175d335c38fd094b7227db88b70db77d246..89cf7edd2ed9411009032fc1e7314c210683d89f 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -191,7 +191,7 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType, } if (colType == TSDB_DATA_TYPE_BOOL && (var->i64 > 1 ||var->i64 < 0)) { break; - } + } tbufWriteInt64(&bw, var->i64); } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) { if (IS_SIGNED_NUMERIC_TYPE(var->nType) || IS_UNSIGNED_NUMERIC_TYPE(var->nType)) { @@ -603,11 +603,11 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { char buf[TSDB_TABLE_FNAME_LEN]; SStrToken sTblToken; sTblToken.z = buf; - + if (pInfo->type != TSDB_SQL_DROP_DNODE) { if ((escapeEnabled && (validateTableName(pzName->z, pzName->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS)) || ((!escapeEnabled) && (tscValidateName(pzName, escapeEnabled, &dbIncluded) != TSDB_CODE_SUCCESS))){ - return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); } } @@ -623,7 +623,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { code = tscSetTableFullName(&pTableMetaInfo->name, &sTblToken, pSql, dbIncluded); if(code != TSDB_CODE_SUCCESS) { - return code; + return code; } } else if (pInfo->type == TSDB_SQL_DROP_DNODE) { if (pzName->type == TK_STRING) { @@ -765,7 +765,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { char buf[TSDB_TABLE_FNAME_LEN]; SStrToken sTblToken; sTblToken.z = buf; - + if (validateTableName(pToken->z, pToken->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); } @@ -788,7 +788,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { char buf[TSDB_TABLE_FNAME_LEN]; SStrToken sTblToken; sTblToken.z = buf; - + if (validateTableName(pToken->z, pToken->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); } @@ -804,7 +804,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { const char* msg1 = "invalid database name"; SStrToken* pToken = taosArrayGet(pInfo->pMiscInfo->a, 0); - + if (tscValidateName(pToken, false, NULL) != TSDB_CODE_SUCCESS) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); } @@ -2175,16 +2175,16 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS pQueryInfo->colList = taosArrayInit(4, POINTER_BYTES); } - + bool hasDistinct = false; - bool hasAgg = false; + bool hasAgg = false; size_t numOfExpr = taosArrayGetSize(pSelNodeList); - int32_t distIdx = -1; + int32_t distIdx = -1; for (int32_t i = 0; i < numOfExpr; ++i) { int32_t outputIndex = (int32_t)tscNumOfExprs(pQueryInfo); tSqlExprItem* pItem = taosArrayGet(pSelNodeList, i); if (hasDistinct == false) { - hasDistinct = (pItem->distinct == true); + hasDistinct = (pItem->distinct == true); distIdx = hasDistinct ? i : -1; } if(pItem->aliasName != NULL && validateColumnName(pItem->aliasName) != TSDB_CODE_SUCCESS){ @@ -2202,7 +2202,7 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS return code; } } else if (type == SQL_NODE_SQLFUNCTION) { - hasAgg = true; + hasAgg = true; if (hasDistinct) break; pItem->pNode->functionId = isValidFunction(pItem->pNode->Expr.operand.z, pItem->pNode->Expr.operand.n); @@ -2252,12 +2252,12 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS } } - //TODO(dengyihao), refactor as function - //handle distinct func mixed with other func + //TODO(dengyihao), refactor as function + //handle distinct func mixed with other func if (hasDistinct == true) { if (distIdx != 0 || hasAgg) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4); - } + } if (joinQuery) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg6); } @@ -2267,11 +2267,11 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS if (pQueryInfo->pDownstream != NULL) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg8); } - + pQueryInfo->distinct = true; } - - + + // there is only one user-defined column in the final result field, add the timestamp column. size_t numOfSrcCols = taosArrayGetSize(pQueryInfo->colList); if ((numOfSrcCols <= 0 || !hasNoneUserDefineExpr(pQueryInfo)) && !tscQueryTags(pQueryInfo) && !tscQueryBlockInfo(pQueryInfo)) { @@ -2490,6 +2490,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t /*SExprInfo* pExpr = */ tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, &colSchema, TSDB_COL_TAG, getNewResColId(pCmd)); } + pQueryInfo->type |= TSDB_QUERY_TYPE_PROJECTION_QUERY; } else { STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex); STableMeta* pTableMeta = pTableMetaInfo->pTableMeta; @@ -2759,7 +2760,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col if (pItem->pNode->Expr.paramList == NULL || (functionId != TSDB_FUNC_LEASTSQR && functionId != TSDB_FUNC_DERIVATIVE && functionId != TSDB_FUNC_ELAPSED && numOfParams != 1) || ((functionId == TSDB_FUNC_LEASTSQR || functionId == TSDB_FUNC_DERIVATIVE) && numOfParams != 3) || - (functionId == TSDB_FUNC_ELAPSED && numOfParams > 2)) { + (functionId == TSDB_FUNC_ELAPSED && numOfParams != 1 && numOfParams != 2)) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); } @@ -4693,7 +4694,12 @@ static int32_t validateSQLExprItem(SSqlCmd* pCmd, tSqlExpr* pExpr, if (pExpr->value.nType == (uint32_t)-1) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3); } - + + //now allowing now +/- value in select expr + if (pExpr->tokenId == TK_TIMESTAMP) { + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3); + } + if (pExpr->type == SQL_NODE_VALUE) { *type = SQLEXPR_TYPE_VALUE; } diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c index 5f8964bb34b5939ab768877cb8ae701e20443f75..bcec2ffc57ba46aea9ffd222aa3bf3d3415ab0de 100644 --- a/src/client/src/tscSubquery.c +++ b/src/client/src/tscSubquery.c @@ -3783,7 +3783,7 @@ void tscSetQuerySort(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAttr) { size_t size = taosArrayGetSize(pQueryInfo->pUpstream); for(int32_t i = 0; i < size; ++i) { SQueryInfo* pq = taosArrayGetP(pQueryInfo->pUpstream, i); - if (pq->groupbyTag && pq->interval.interval > 0) { + if (pq->groupbyTag) { pQueryAttr->needSort = true; return; } diff --git a/src/client/src/tscSystem.c b/src/client/src/tscSystem.c index bbd448e2d8b5069fae438d7adb9de14a31446d1b..7041c922d9b8ff32d6c1340fe313769cf4cf9729 100644 --- a/src/client/src/tscSystem.c +++ b/src/client/src/tscSystem.c @@ -113,7 +113,7 @@ int32_t tscAcquireRpc(const char *key, const char *user, const char *secretEncry SRpcObj rpcObj; memset(&rpcObj, 0, sizeof(rpcObj)); - strncpy(rpcObj.key, key, strlen(key)); + tstrncpy(rpcObj.key, key, sizeof(rpcObj.key)); rpcObj.pDnodeConn = rpcOpen(&rpcInit); if (rpcObj.pDnodeConn == NULL) { pthread_mutex_unlock(&rpcObjMutex); diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index e2263f696a885e885091e86c6b1210bc817996c2..874a022a7104860fce8f6389bcc933b36a2fef22 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -4928,7 +4928,11 @@ int32_t createProjectionExpr(SQueryInfo* pQueryInfo, STableMetaInfo* pTableMetaI } } - pse->colInfo.flag = pSource->base.colInfo.flag; //TSDB_COL_NORMAL; + if (!pQueryInfo->stableQuery && TSDB_COL_IS_TAG(pSource->base.colInfo.flag)) { + pse->colInfo.flag = (pSource->base.colInfo.flag) & (~TSDB_COL_TAG); + } else { + pse->colInfo.flag = pSource->base.colInfo.flag; + } pse->resType = pSource->base.resType; pse->resBytes = pSource->base.resBytes; strncpy(pse->colInfo.name, pSource->base.aliasName, tListLen(pse->colInfo.name)); @@ -5558,7 +5562,7 @@ end: int8_t jsonType2DbType(double data, int jsonType){ switch(jsonType){ case cJSON_Number: - if (data - (int64_t)data > 0) return TSDB_DATA_TYPE_DOUBLE; else return TSDB_DATA_TYPE_BIGINT; + if (data - (int64_t)data == 0) return TSDB_DATA_TYPE_BIGINT; else return TSDB_DATA_TYPE_DOUBLE; case cJSON_String: return TSDB_DATA_TYPE_NCHAR; case cJSON_NULL: diff --git a/src/connector/go b/src/connector/go index 25f8683ece07897fea12c347d369602b2235665f..7da3cc9e4ad1030c2eec250b869a8fa215b4a4b4 160000 --- a/src/connector/go +++ b/src/connector/go @@ -1 +1 @@ -Subproject commit 25f8683ece07897fea12c347d369602b2235665f +Subproject commit 7da3cc9e4ad1030c2eec250b869a8fa215b4a4b4 diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/JsonTagTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/JsonTagTest.java index afba0398752f1fd6c23dd7874301be27616fdab2..501c7e17c837ce311ec0f7b43f63122e53b8a0d9 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/JsonTagTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/JsonTagTest.java @@ -1,19 +1,19 @@ package com.taosdata.jdbc; -import com.google.common.collect.Lists; -import org.checkerframework.checker.units.qual.A; +import com.taosdata.jdbc.annotation.CatalogRunner; +import com.taosdata.jdbc.annotation.Description; +import com.taosdata.jdbc.annotation.TestTarget; import org.junit.*; +import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; import java.sql.*; -import java.util.List; -/** - * test json tag - */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) +@RunWith(CatalogRunner.class) +@TestTarget(alias = "JsonTag", author = "huolibo", version = "2.0.36") public class JsonTagTest { - private static String dbname = "json_tag_test"; + private static final String dbName = "json_tag_test"; private static Connection connection; private static Statement statement; private static final String superSql = "create table if not exists jsons1(ts timestamp, dataInt int, dataBool bool, dataStr nchar(50), dataStrBin binary(150)) tags(jtag json)"; @@ -74,6 +74,7 @@ public class JsonTagTest { }; @Test + @Description("insert json tag") public void case01_InsertTest() throws SQLException { for (String sql : sql) { statement.execute(sql); @@ -87,7 +88,8 @@ public class JsonTagTest { } @Test - public void case02_InvalidJsonInsertTest() { + @Description("error json tag insert") + public void case02_ErrorJsonInsertTest() { int count = 0; for (String sql : errorJsonInsertSql) { try { @@ -99,59 +101,62 @@ public class JsonTagTest { Assert.assertEquals(errorJsonInsertSql.length, count); } - // test invalidate json key, key must can be printed assic char @Test(expected = SQLException.class) + @Description("exception will throw when json value is array") public void case02_ArrayErrorTest() throws SQLException { statement.execute("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"tag1\":[1,true]}')"); } @Test(expected = SQLException.class) - public void case02_EmptyKeyErrorTest() throws SQLException { - statement.execute("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"\":\"fff\"}')"); - } - - @Test(expected = SQLException.class) + @Description("exception will throw when json value is empty") public void case02_EmptyValueErrorTest() throws SQLException { statement.execute("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"tag1\":{}}')"); } @Test(expected = SQLException.class) + @Description("exception will throw when json key is not ASCII") public void case02_AbnormalKeyErrorTest1() throws SQLException { statement.execute("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"。loc\":\"fff\"}')"); } @Test(expected = SQLException.class) + @Description("exception will throw when json key is '\\t'") public void case02_AbnormalKeyErrorTest2() throws SQLException { statement.execute("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"\t\":\"fff\"}')"); } @Test(expected = SQLException.class) + @Description("exception will throw when json key is chinese") public void case02_AbnormalKeyErrorTest3() throws SQLException { statement.execute("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"试试\":\"fff\"}')"); } @Test + @Description("alter json tag") public void case03_AlterTag() throws SQLException { statement.execute("ALTER TABLE jsons1_1 SET TAG jtag='{\"tag1\":\"femail\",\"tag2\":35,\"tag3\":true}'"); } @Test(expected = SQLException.class) + @Description("exception will throw when add json tag") public void case03_AddTagErrorTest() throws SQLException { statement.execute("ALTER STABLE jsons1 add tag tag2 nchar(20)"); } @Test(expected = SQLException.class) + @Description("exception will throw when delete json tag") public void case03_dropTagErrorTest() throws SQLException { statement.execute("ALTER STABLE jsons1 drop tag jtag"); } @Test(expected = SQLException.class) + @Description("exception will throw when set some json tag value") public void case03_AlterTagErrorTest() throws SQLException { statement.execute("ALTER TABLE jsons1_1 SET TAG jtag=4"); } - // test error syntax @Test + @Description("exception will throw when select syntax error") public void case04_SelectErrorTest() { int count = 0; for (String sql : errorSelectSql) { @@ -164,8 +169,8 @@ public class JsonTagTest { Assert.assertEquals(errorSelectSql.length, count); } - // test select normal column @Test + @Description("normal select stable") public void case04_select01() throws SQLException { ResultSet resultSet = statement.executeQuery("select dataint from jsons1"); int count = 0; @@ -176,8 +181,8 @@ public class JsonTagTest { close(resultSet); } - // test select json tag @Test + @Description("select all column from stable") public void case04_select02() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1"); int count = 0; @@ -189,6 +194,7 @@ public class JsonTagTest { } @Test + @Description("select json tag from stable") public void case04_select03() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag from jsons1"); int count = 0; @@ -200,6 +206,7 @@ public class JsonTagTest { } @Test + @Description("where condition tag is null") public void case04_select04() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag from jsons1 where jtag is null"); int count = 0; @@ -211,6 +218,7 @@ public class JsonTagTest { } @Test + @Description("where condition tag is not null") public void case04_select05() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag from jsons1 where jtag is not null"); int count = 0; @@ -222,6 +230,7 @@ public class JsonTagTest { } @Test + @Description("select json tag") public void case04_select06() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag from jsons1_8"); resultSet.next(); @@ -231,6 +240,7 @@ public class JsonTagTest { } @Test + @Description("select json tag") public void case04_select07() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag from jsons1_1"); resultSet.next(); @@ -239,8 +249,8 @@ public class JsonTagTest { close(resultSet); } - // test jtag is NULL @Test + @Description("select not exist json tag") public void case04_select08() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag from jsons1_9"); resultSet.next(); @@ -249,8 +259,8 @@ public class JsonTagTest { close(resultSet); } - // test select json tag->'key', value is string @Test + @Description("select a json tag") public void case04_select09() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag1' from jsons1_1"); resultSet.next(); @@ -260,6 +270,7 @@ public class JsonTagTest { } @Test + @Description("select a json tag, the value is empty") public void case04_select10() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag2' from jsons1_6"); resultSet.next(); @@ -268,8 +279,8 @@ public class JsonTagTest { close(resultSet); } - // test select json tag->'key', value is int @Test + @Description("select a json tag, the value is int") public void case04_select11() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag2' from jsons1_1"); resultSet.next(); @@ -278,8 +289,8 @@ public class JsonTagTest { close(resultSet); } - // test select json tag->'key', value is bool @Test + @Description("select a json tag, the value is boolean") public void case04_select12() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag3' from jsons1_1"); resultSet.next(); @@ -288,8 +299,8 @@ public class JsonTagTest { close(resultSet); } - // test select json tag->'key', value is null @Test + @Description("select a json tag, the value is null") public void case04_select13() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag1' from jsons1_4"); resultSet.next(); @@ -298,8 +309,8 @@ public class JsonTagTest { close(resultSet); } - // test select json tag->'key', value is double @Test + @Description("select a json tag, the value is double") public void case04_select14() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag1' from jsons1_5"); resultSet.next(); @@ -308,8 +319,8 @@ public class JsonTagTest { close(resultSet); } - // test select json tag->'key', key is not exist @Test + @Description("select a json tag, the key is not exist") public void case04_select15() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag10' from jsons1_4"); resultSet.next(); @@ -319,6 +330,7 @@ public class JsonTagTest { } @Test + @Description("select a json tag, the result number equals tables number") public void case04_select16() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag1' from jsons1"); int count = 0; @@ -330,18 +342,7 @@ public class JsonTagTest { } @Test - public void case04_select17() throws SQLException { - ResultSet resultSet = statement.executeQuery("select jtag->'tag1' from jsons1"); - int count = 0; - while (resultSet.next()) { - count++; - } - Assert.assertEquals(sql.length + invalidJsonCreateSql.length + invalidJsonInsertSql.length, count); - close(resultSet); - } - - // where json value is string - @Test + @Description("where condition '=' for string") public void case04_select19() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag2'='beijing'"); int count = 0; @@ -353,6 +354,7 @@ public class JsonTagTest { } @Test + @Description("select and where conditon '=' for string") public void case04_select20() throws SQLException { ResultSet resultSet = statement.executeQuery("select dataint,tbname,jtag->'tag1',jtag from jsons1 where jtag->'tag2'='beijing'"); int count = 0; @@ -364,6 +366,7 @@ public class JsonTagTest { } @Test + @Description("where condition result is null") public void case04_select21() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'='beijing'"); int count = 0; @@ -375,6 +378,7 @@ public class JsonTagTest { } @Test + @Description("where condition equation has chinese") public void case04_select23() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'='收到货'"); int count = 0; @@ -386,6 +390,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '>' for character") public void case05_symbolOperation01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag2'>'beijing'"); int count = 0; @@ -397,6 +402,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '>=' for character") public void case05_symbolOperation02() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag2'>='beijing'"); int count = 0; @@ -408,6 +414,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '<' for character") public void case05_symbolOperation03() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag2'<'beijing'"); int count = 0; @@ -419,6 +426,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '<=' in character") public void case05_symbolOperation04() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag2'<='beijing'"); int count = 0; @@ -430,6 +438,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '!=' in character") public void case05_symbolOperation05() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag2'!='beijing'"); int count = 0; @@ -441,6 +450,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '=' empty") public void case05_symbolOperation06() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag2'=''"); int count = 0; @@ -453,11 +463,11 @@ public class JsonTagTest { // where json value is int @Test + @Description("where condition support '=' for int") public void case06_selectValue01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=5"); int count = 0; while (resultSet.next()) { - System.out.println(resultSet.getString(1)); count++; } Assert.assertEquals(1, count); @@ -465,6 +475,7 @@ public class JsonTagTest { } @Test + @Description("where conditional support '<' for int") public void case06_selectValue02() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'<54"); int count = 0; @@ -476,6 +487,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '<=' for int") public void case06_selectValue03() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'<=11"); int count = 0; @@ -487,6 +499,7 @@ public class JsonTagTest { } @Test + @Description("where conditional support '>' for int") public void case06_selectValue04() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'>4"); int count = 0; @@ -498,6 +511,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '>=' for int") public void case06_selectValue05() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'>=5"); int count = 0; @@ -509,6 +523,7 @@ public class JsonTagTest { } @Test + @Description("where conditional support '!=' for int") public void case06_selectValue06() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'!=5"); int count = 0; @@ -520,6 +535,7 @@ public class JsonTagTest { } @Test + @Description("where conditional support '!=' for int") public void case06_selectValue07() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'!=55"); int count = 0; @@ -531,6 +547,7 @@ public class JsonTagTest { } @Test + @Description("where conditional support '!=' for int and result is nothing") public void case06_selectValue08() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=10"); int count = 0; @@ -541,8 +558,8 @@ public class JsonTagTest { close(resultSet); } - // where json value is double @Test + @Description("where condition support '=' for double") public void case07_selectValue01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=1.232"); int count = 0; @@ -554,6 +571,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '<' for double") public void case07_doubleOperation01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'<1.232"); int count = 0; @@ -565,6 +583,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '<=' for double") public void case07_doubleOperation02() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'<=1.232"); int count = 0; @@ -576,6 +595,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '>' for double") public void case07_doubleOperation03() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'>1.23"); int count = 0; @@ -587,6 +607,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '>=' for double") public void case07_doubleOperation04() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'>=1.232"); int count = 0; @@ -598,6 +619,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '!=' for double") public void case07_doubleOperation05() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'!=1.232"); int count = 0; @@ -609,6 +631,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '!=' for double") public void case07_doubleOperation06() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'!=3.232"); int count = 0; @@ -620,16 +643,19 @@ public class JsonTagTest { } @Test(expected = SQLException.class) + @Description("exception will throw when denominator is zero") public void case07_doubleOperation07() throws SQLException { statement.executeQuery("select * from jsons1 where jtag->'tag1'/0=3"); } @Test(expected = SQLException.class) + @Description("exception will throw when invalid operation") public void case07_doubleOperation08() throws SQLException { statement.executeQuery("select * from jsons1 where jtag->'tag1'/5=1"); } @Test + @Description("where condition support '=' for boolean") public void case08_boolOperation01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=true"); int count = 0; @@ -641,6 +667,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '=' for boolean") public void case08_boolOperation02() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=false"); int count = 0; @@ -652,6 +679,7 @@ public class JsonTagTest { } @Test + @Description("where condition support '!=' for boolean") public void case08_boolOperation03() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'!=false"); int count = 0; @@ -663,12 +691,13 @@ public class JsonTagTest { } @Test(expected = SQLException.class) + @Description("exception will throw when '>' operation for boolean") public void case08_boolOperation04() throws SQLException { statement.executeQuery("select * from jsons1 where jtag->'tag1'>false"); } - // where json value is null @Test + @Description("where conditional support '=null'") public void case09_select01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=null"); int count = 0; @@ -680,6 +709,7 @@ public class JsonTagTest { } @Test + @Description("where conditional support 'is null'") public void case09_select02() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag is null"); int count = 0; @@ -691,6 +721,7 @@ public class JsonTagTest { } @Test + @Description("where condition support 'is not null'") public void case09_select03() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag is not null"); int count = 0; @@ -702,6 +733,7 @@ public class JsonTagTest { } @Test + @Description("where condition support one tag '='") public void case09_select04() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag_no_exist'=3"); int count = 0; @@ -713,6 +745,7 @@ public class JsonTagTest { } @Test + @Description("where condition support one tag 'is null'") public void case09_select05() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1' is null"); int count = 0; @@ -724,6 +757,7 @@ public class JsonTagTest { } @Test + @Description("where condition support one tag 'is null'") public void case09_select06() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag4' is null"); int count = 0; @@ -735,6 +769,7 @@ public class JsonTagTest { } @Test + @Description("where condition support one tag 'is not null'") public void case09_select07() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag3' is not null"); int count = 0; @@ -745,8 +780,8 @@ public class JsonTagTest { close(resultSet); } - // test ? @Test + @Description("contains") public void case09_select10() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag contains 'tag1'"); int count = 0; @@ -758,6 +793,7 @@ public class JsonTagTest { } @Test + @Description("contains") public void case09_select11() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag contains 'tag3'"); int count = 0; @@ -769,6 +805,7 @@ public class JsonTagTest { } @Test + @Description("contains with no exist tag") public void case09_select12() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag contains 'tag_no_exist'"); int count = 0; @@ -779,8 +816,8 @@ public class JsonTagTest { close(resultSet); } - // test json tag in where condition with and/or @Test + @Description("where condition with and") public void case10_selectAndOr01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=false and jtag->'tag2'='beijing'"); int count = 0; @@ -792,6 +829,7 @@ public class JsonTagTest { } @Test + @Description("where condition with 'or'") public void case10_selectAndOr02() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=false or jtag->'tag2'='beijing'"); int count = 0; @@ -803,6 +841,7 @@ public class JsonTagTest { } @Test + @Description("where condition with 'and'") public void case10_selectAndOr03() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=false and jtag->'tag2'='shanghai'"); int count = 0; @@ -814,6 +853,7 @@ public class JsonTagTest { } @Test + @Description("where condition with 'or'") public void case10_selectAndOr04() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'=13 or jtag->'tag2'>35"); int count = 0; @@ -825,6 +865,7 @@ public class JsonTagTest { } @Test + @Description("where condition with 'or' and contains") public void case10_selectAndOr05() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1' is not null and jtag contains 'tag3'"); int count = 0; @@ -836,6 +877,7 @@ public class JsonTagTest { } @Test + @Description("where condition with 'and' and contains") public void case10_selectAndOr06() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1'='femail' and jtag contains 'tag3'"); int count = 0; @@ -846,8 +888,8 @@ public class JsonTagTest { close(resultSet); } - // test with tbname/normal column @Test + @Description("test with tbname/normal column") public void case11_selectTbName01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where tbname = 'jsons1_1'"); int count = 0; @@ -859,6 +901,7 @@ public class JsonTagTest { } @Test + @Description("test with tbname/normal column") public void case11_selectTbName02() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where tbname = 'jsons1_1' and jtag contains 'tag3'"); int count = 0; @@ -870,6 +913,7 @@ public class JsonTagTest { } @Test + @Description("test with tbname/normal column") public void case11_selectTbName03() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where tbname = 'jsons1_1' and jtag contains 'tag3' and dataint=3"); int count = 0; @@ -881,6 +925,7 @@ public class JsonTagTest { } @Test + @Description("test with tbname/normal column") public void case11_selectTbName04() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where tbname = 'jsons1_1' and jtag contains 'tag3' and dataint=23"); int count = 0; @@ -891,8 +936,8 @@ public class JsonTagTest { close(resultSet); } - // test where condition like @Test + @Description("where condition like") public void case12_selectWhere01() throws SQLException { ResultSet resultSet = statement.executeQuery("select *,tbname from jsons1 where jtag->'tag2' like 'bei%'"); int count = 0; @@ -904,6 +949,7 @@ public class JsonTagTest { } @Test + @Description("where condition like") public void case12_selectWhere02() throws SQLException { ResultSet resultSet = statement.executeQuery("select *,tbname from jsons1 where jtag->'tag1' like 'fe%' and jtag->'tag2' is not null"); int count = 0; @@ -914,14 +960,14 @@ public class JsonTagTest { close(resultSet); } - // test where condition in no support in @Test(expected = SQLException.class) + @Description("where condition in no support in") public void case12_selectWhere03() throws SQLException { statement.executeQuery("select * from jsons1 where jtag->'tag1' in ('beijing')"); } - // test where condition match @Test + @Description("where condition match") public void case12_selectWhere04() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1' match 'ma'"); int count = 0; @@ -933,6 +979,7 @@ public class JsonTagTest { } @Test + @Description("where condition match") public void case12_selectWhere05() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1' match 'ma$'"); int count = 0; @@ -944,6 +991,7 @@ public class JsonTagTest { } @Test + @Description("where condition match") public void case12_selectWhere06() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag2' match 'jing$'"); int count = 0; @@ -955,6 +1003,7 @@ public class JsonTagTest { } @Test + @Description("where condition match") public void case12_selectWhere07() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from jsons1 where jtag->'tag1' match '收到'"); int count = 0; @@ -965,13 +1014,14 @@ public class JsonTagTest { close(resultSet); } - // test distinct @Test + @Description("insert distinct") public void case13_selectDistinct01() throws SQLException { statement.execute("insert into jsons1_14 using jsons1 tags('{\"tag1\":\"收到货\",\"tag2\":\"\",\"tag3\":null}') values(1591062628000, 2, NULL, '你就会', 'dws')"); } @Test + @Description("distinct json tag") public void case13_selectDistinct02() throws SQLException { ResultSet resultSet = statement.executeQuery("select distinct jtag->'tag1' from jsons1"); int count = 0; @@ -983,6 +1033,7 @@ public class JsonTagTest { } @Test + @Description("distinct json tag") public void case13_selectDistinct03() throws SQLException { ResultSet resultSet = statement.executeQuery("select distinct jtag from jsons1"); int count = 0; @@ -993,13 +1044,14 @@ public class JsonTagTest { close(resultSet); } - // test dumplicate key with normal colomn @Test + @Description("insert json tag") public void case14_selectDump01() throws SQLException { statement.execute("INSERT INTO jsons1_15 using jsons1 tags('{\"tbname\":\"tt\",\"databool\":true,\"datastr\":\"是是是\"}') values(1591060828000, 4, false, 'jjsf', \"你就会\")"); } @Test + @Description("test duplicate key with normal column") public void case14_selectDump02() throws SQLException { ResultSet resultSet = statement.executeQuery("select *,tbname,jtag from jsons1 where jtag->'datastr' match '是' and datastr match 'js'"); int count = 0; @@ -1011,6 +1063,7 @@ public class JsonTagTest { } @Test + @Description("test duplicate key with normal column") public void case14_selectDump03() throws SQLException { ResultSet resultSet = statement.executeQuery("select tbname,jtag->'tbname' from jsons1 where jtag->'tbname'='tt' and tbname='jsons1_14'"); int count = 0; @@ -1021,8 +1074,8 @@ public class JsonTagTest { close(resultSet); } - // test join @Test + @Description("insert json tag for join test") public void case15_selectJoin01() throws SQLException { statement.execute("create table if not exists jsons2(ts timestamp, dataInt int, dataBool bool, dataStr nchar(50), dataStrBin binary(150)) tags(jtag json)"); statement.execute("insert into jsons2_1 using jsons2 tags('{\"tag1\":\"fff\",\"tag2\":5, \"tag3\":true}') values(1591060618000, 2, false, 'json2', '你是2')"); @@ -1033,17 +1086,17 @@ public class JsonTagTest { statement.execute("insert into jsons3_2 using jsons3 tags('{\"tag1\":5,\"tag2\":\"beijing\"}') values (1591060638000, 2, true, 'json3', 'sss')"); } - // TODO check result @Test + @Description("select json tag from join") public void case15_selectJoin02() throws SQLException { ResultSet resultSet = statement.executeQuery("select 'sss',33,a.jtag->'tag3' from jsons2 a,jsons3 b where a.ts=b.ts and a.jtag->'tag1'=b.jtag->'tag1'"); - + resultSet.next(); + Assert.assertEquals("sss", resultSet.getString(1)); close(resultSet); } - // test group by & order by json tag - // TODO check other result @Test + @Description("group by and order by json tag desc") public void case16_selectGroupOrder01() throws SQLException { ResultSet resultSet = statement.executeQuery("select count(*) from jsons1 group by jtag->'tag1' order by jtag->'tag1' desc"); int count = 0; @@ -1055,6 +1108,7 @@ public class JsonTagTest { } @Test + @Description("group by and order by json tag asc") public void case16_selectGroupOrder02() throws SQLException { ResultSet resultSet = statement.executeQuery("select count(*) from jsons1 group by jtag->'tag1' order by jtag->'tag1' asc"); int count = 0; @@ -1065,9 +1119,8 @@ public class JsonTagTest { close(resultSet); } - // test stddev with group by json tag - // TODO check result @Test + @Description("stddev with group by json tag") public void case17_selectStddev01() throws SQLException { ResultSet resultSet = statement.executeQuery("select stddev(dataint) from jsons1 group by jtag->'tag1'"); String s = ""; @@ -1082,8 +1135,8 @@ public class JsonTagTest { close(resultSet); } - // subquery with json tag @Test + @Description("subquery json tag") public void case18_selectSubquery01() throws SQLException { ResultSet resultSet = statement.executeQuery("select * from (select jtag, dataint from jsons1)"); int count = 0; @@ -1095,8 +1148,14 @@ public class JsonTagTest { } @Test + @Description("subquery some json tags") public void case18_selectSubquery02() throws SQLException { ResultSet resultSet = statement.executeQuery("select jtag->'tag1' from (select jtag->'tag1', dataint from jsons1)"); + + ResultSetMetaData metaData = resultSet.getMetaData(); + String columnName = metaData.getColumnName(1); + Assert.assertEquals("jtag->'tag1'", columnName); + int count = 0; while (resultSet.next()) { count++; @@ -1106,15 +1165,7 @@ public class JsonTagTest { } @Test - public void case18_selectSubquery03() throws SQLException { - ResultSet resultSet = statement.executeQuery("select jtag->'tag1' from (select jtag->'tag1', dataint from jsons1)"); - ResultSetMetaData metaData = resultSet.getMetaData(); - String columnName = metaData.getColumnName(1); - Assert.assertEquals("jtag->'tag1'", columnName); - close(resultSet); - } - - @Test + @Description("query some json tags from subquery") public void case18_selectSubquery04() throws SQLException { ResultSet resultSet = statement.executeQuery("select ts,tbname,jtag->'tag1' from (select jtag->'tag1',tbname,ts from jsons1 order by ts)"); int count = 0; @@ -1142,9 +1193,9 @@ public class JsonTagTest { try { connection = DriverManager.getConnection(url); statement = connection.createStatement(); - statement.execute("drop database if exists " + dbname); - statement.execute("create database if not exists " + dbname); - statement.execute("use " + dbname); + statement.execute("drop database if exists " + dbName); + statement.execute("create database if not exists " + dbName); + statement.execute("use " + dbName); statement.execute(superSql); } catch (SQLException e) { e.printStackTrace(); @@ -1155,7 +1206,7 @@ public class JsonTagTest { public static void afterClass() { try { if (null != statement) { - statement.execute("drop database " + dbname); + statement.execute("drop database " + dbName); statement.close(); } if (null != connection) { diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SchemalessInsertTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SchemalessInsertTest.java index a090dd10e3564d498ab807909f97aefb3b2f3466..712cc0c8c1b0b094a20db0fe36d33f553878d71d 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SchemalessInsertTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SchemalessInsertTest.java @@ -2,17 +2,23 @@ package com.taosdata.jdbc; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.taosdata.jdbc.annotation.CatalogRunner; +import com.taosdata.jdbc.annotation.Description; +import com.taosdata.jdbc.annotation.TestTarget; import com.taosdata.jdbc.enums.SchemalessProtocolType; import com.taosdata.jdbc.enums.SchemalessTimestampType; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import java.sql.*; import java.util.ArrayList; import java.util.List; +@RunWith(CatalogRunner.class) +@TestTarget(alias = "Schemaless",author = "huolibo", version = "2.0.36") public class SchemalessInsertTest { private final String dbname = "test_schemaless_insert"; private Connection conn; @@ -23,6 +29,7 @@ public class SchemalessInsertTest { * @throws SQLException execute error */ @Test + @Description("line insert") public void schemalessInsert() throws SQLException { // given String[] lines = new String[]{ @@ -53,6 +60,7 @@ public class SchemalessInsertTest { * @throws SQLException execute error */ @Test + @Description("telnet insert") public void telnetInsert() throws SQLException { // given String[] lines = new String[]{ @@ -87,6 +95,7 @@ public class SchemalessInsertTest { * @throws SQLException execute error */ @Test + @Description("json insert") public void jsonInsert() throws SQLException { // given String json = "[\n" + diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogClass.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogClass.java new file mode 100644 index 0000000000000000000000000000000000000000..490346e401dba956c8743abb452bcc943df67904 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogClass.java @@ -0,0 +1,86 @@ +package com.taosdata.jdbc.annotation; + +import java.util.ArrayList; +import java.util.List; + +/** + * Test class + */ +public class CatalogClass { + + private String name; + private String alias; + private String author; + private String version; + private List methods = new ArrayList<>(); + private int total; + private int failure; + + public void setTotal(int total) { + this.total = total; + } + + public void setFailure(int failure) { + this.failure = failure; + } + + public void setAuthor(String author) { + this.author = author; + } + + public void setVersion(String version) { + this.version = version; + } + + public void setName(String name) { + this.name = name; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public void setMethods(List methods) { + this.methods = methods; + } + + @Override + public String toString() { + if (methods.size() < 1) + return null; + StringBuilder sb = new StringBuilder(); + sb.append("ClassName: ").append(name); + String msg = trim(alias); + if (null != msg) + sb.append("\tAlias:").append(alias); + sb.append("\tTotal:").append(total) + .append("\tFailure:").append(failure).append("\n"); + for (CatalogMethod method : methods) { + sb.append("\t").append(method.getName()); + sb.append("\t").append(method.isSuccess()); + sb.append("\t").append(method.getMessage()); + String mAuthor = trim(method.getAuthor()); + if (null == mAuthor) { + sb.append("\t").append(author); + } else { + sb.append("\t").append(method.getAuthor()); + } + String mVersion = trim(method.getVersion()); + if (null == mVersion) { + sb.append("\t").append(version); + } else { + sb.append("\t").append(mVersion); + } + sb.append("\n"); + } + return sb.toString(); + } + + private String trim(String s) { + if (null == s || s.trim().equals("")) { + return null; + } else { + return s.trim(); + } + } +} diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogListener.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogListener.java new file mode 100644 index 0000000000000000000000000000000000000000..2d22302d02f531eca055fa76dea18d8de9f7371f --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogListener.java @@ -0,0 +1,104 @@ +package com.taosdata.jdbc.annotation; + +import org.junit.runner.Description; +import org.junit.runner.Result; +import org.junit.runner.notification.Failure; +import org.junit.runner.notification.RunListener; + +import java.io.File; +import java.io.FileWriter; +import java.util.LinkedList; + +public class CatalogListener extends RunListener { + public static final String CATALOG_FILE = "target/TestCaseCatalog.txt"; + CatalogClass catalogClass = null; + private final LinkedList methods = new LinkedList<>(); + + @Override + public void testRunStarted(Description description) throws Exception { + catalogClass = new CatalogClass(); + TestTarget target = description.getAnnotation(TestTarget.class); + if (target != null) { + catalogClass.setAlias(target.alias()); + catalogClass.setAuthor(target.author()); + catalogClass.setVersion(target.version()); + } + catalogClass.setName(getClassName(description.getClassName())); + } + + private String getClassName(String name) { + if (null == name || name.trim().equals("")) { + return null; + } + name = name.trim(); + int pos = name.lastIndexOf("."); + if (-1 == pos) { + return name; + } + return name.substring(pos + 1); + } + + @Override + public void testRunFinished(Result result) throws Exception { + catalogClass.setMethods(methods); + catalogClass.setTotal(result.getRunCount()); + catalogClass.setFailure(result.getFailureCount()); + File file = new File(CATALOG_FILE); + if (!file.exists()) { + synchronized (CatalogListener.class) { + if (!file.exists()) { + file.createNewFile(); + try (FileWriter writer = new FileWriter(file, true)) { + writer.write("\tName\tPass\tMessage\tAuthor\tVersion\n"); + writer.write(catalogClass.toString()); + } + } + } + } else { + try (FileWriter writer = new FileWriter(file, true)) { + writer.write(catalogClass.toString()); + } + } + } + + @Override + public void testStarted(Description description) throws Exception { + } + + @Override + public void testFinished(Description description) throws Exception { + com.taosdata.jdbc.annotation.Description annotation + = description.getAnnotation(com.taosdata.jdbc.annotation.Description.class); + if (annotation != null) { + CatalogMethod method = new CatalogMethod(); + method.setMessage(annotation.value()); + method.setAuthor(annotation.author()); + method.setVersion(annotation.version()); + method.setSuccess(true); + method.setName(description.getMethodName()); + methods.addLast(method); + } + } + + @Override + public void testFailure(Failure failure) throws Exception { + com.taosdata.jdbc.annotation.Description annotation + = failure.getDescription().getAnnotation(com.taosdata.jdbc.annotation.Description.class); + CatalogMethod method = new CatalogMethod(); + method.setMessage(annotation.value()); + method.setAuthor(annotation.author()); + method.setVersion(annotation.version()); + method.setSuccess(false); + method.setName(failure.getDescription().getMethodName()); + methods.addFirst(method); + } + + @Override + public void testAssumptionFailure(Failure failure) { + } + + @Override + public void testIgnored(Description description) throws Exception { + super.testIgnored(description); + } +} \ No newline at end of file diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogMethod.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogMethod.java new file mode 100644 index 0000000000000000000000000000000000000000..1dd074df2d1298781bbbfa7e7709113db2c6ca01 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogMethod.java @@ -0,0 +1,52 @@ +package com.taosdata.jdbc.annotation; + +/** + * Test method + */ +public class CatalogMethod { + private String name; + private boolean success; + private String message; + private String author; + private String version; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogRunner.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..08e5f9212287d517838448d0122ab0876812cc1d --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/CatalogRunner.java @@ -0,0 +1,36 @@ +package com.taosdata.jdbc.annotation; + +import org.junit.internal.AssumptionViolatedException; +import org.junit.internal.runners.model.EachTestNotifier; +import org.junit.runner.notification.RunNotifier; +import org.junit.runner.notification.StoppedByUserException; +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.model.InitializationError; +import org.junit.runners.model.Statement; + +public class CatalogRunner extends BlockJUnit4ClassRunner { + + public CatalogRunner(Class testClass) throws InitializationError { + super(testClass); + } + + @Override + public void run(RunNotifier notifier) { + //add user-defined listener + notifier.addListener(new CatalogListener()); + EachTestNotifier testNotifier = new EachTestNotifier(notifier, getDescription()); + + notifier.fireTestRunStarted(getDescription()); + + try { + Statement statement = classBlock(notifier); + statement.evaluate(); + } catch (AssumptionViolatedException av) { + testNotifier.addFailedAssumption(av); + } catch (StoppedByUserException exception) { + throw exception; + } catch (Throwable e) { + testNotifier.addFailure(e); + } + } +} \ No newline at end of file diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/Description.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/Description.java new file mode 100644 index 0000000000000000000000000000000000000000..669b0a088656c030281e82620117469b3a375c75 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/Description.java @@ -0,0 +1,19 @@ +package com.taosdata.jdbc.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Description { + + String value(); + + // git blame author + String author() default ""; + + // since which version; + String version() default ""; +} diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/TestTarget.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/TestTarget.java new file mode 100644 index 0000000000000000000000000000000000000000..3d1db681647d3b23818143156ffd513c46a6e495 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/annotation/TestTarget.java @@ -0,0 +1,18 @@ +package com.taosdata.jdbc.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface TestTarget { + + String alias() default ""; + + String author(); + + String version() default ""; + +} diff --git a/src/kit/taos-tools b/src/kit/taos-tools index 0b4a16e96b5cc9cb6e4f8cacf6a1f3028c91adb0..7eae58a0fbf7c7321dd1bdc96e375d4c832cf373 160000 --- a/src/kit/taos-tools +++ b/src/kit/taos-tools @@ -1 +1 @@ -Subproject commit 0b4a16e96b5cc9cb6e4f8cacf6a1f3028c91adb0 +Subproject commit 7eae58a0fbf7c7321dd1bdc96e375d4c832cf373 diff --git a/src/query/inc/tdigest.h b/src/query/inc/tdigest.h index 625311eaabebec1f3d3b8303f34a361ba0129094..f9b615318f5c33f0cf386653367ddfe36ae759f8 100644 --- a/src/query/inc/tdigest.h +++ b/src/query/inc/tdigest.h @@ -29,7 +29,7 @@ #define DOUBLE_MAX 1.79e+308 #define ADDITION_CENTROID_NUM 2 -#define COMPRESSION 400 +#define COMPRESSION 300 #define GET_CENTROID(compression) (ceil(compression * M_PI / 2) + 1 + ADDITION_CENTROID_NUM) #define GET_THRESHOLD(compression) (7.5 + 0.37 * compression - 2e-4 * pow(compression, 2)) #define TDIGEST_SIZE(compression) (sizeof(TDigest) + sizeof(SCentroid)*GET_CENTROID(compression) + sizeof(SPt)*GET_THRESHOLD(compression)) diff --git a/src/query/src/qPlan.c b/src/query/src/qPlan.c index 4c61cbb0f730780c6c7106a02c765974b2d21706..6a19ca5c8d1e0c7f30da30c37c24c008ea34b2ee 100644 --- a/src/query/src/qPlan.c +++ b/src/query/src/qPlan.c @@ -588,6 +588,12 @@ SArray* createExecOperatorPlan(SQueryAttr* pQueryAttr) { op = OP_Fill; taosArrayPush(plan, &op); } + // outer query order by support + int32_t orderColId = pQueryAttr->order.orderColId; + if (pQueryAttr->vgId == 0 && orderColId != PRIMARYKEY_TIMESTAMP_COL_INDEX && orderColId != INT32_MIN) { + op = OP_Order; + taosArrayPush(plan, &op); + } } } else if (pQueryAttr->groupbyColumn) { diff --git a/src/query/src/queryMain.c b/src/query/src/queryMain.c index 2a2ccf9cae0f9e2aab60bddca7c27a8ceb719239..9bdb0efc4d3ed7769aa99ded02e460fe0624ae27 100644 --- a/src/query/src/queryMain.c +++ b/src/query/src/queryMain.c @@ -279,6 +279,7 @@ bool qTableQuery(qinfo_t qinfo, uint64_t *qId) { if (isQueryKilled(pQInfo)) { qDebug("QInfo:0x%"PRIx64" it is already killed, abort", pQInfo->qId); + setQueryKilled(pQInfo); pQInfo->runtimeEnv.outputBuf = NULL; return doBuildResCheck(pQInfo); } diff --git a/src/util/src/tlog.c b/src/util/src/tlog.c index 232d10a7d07594c9c62cd13767c320da27af2a73..7b5dafcc8e771ba7d6e7b5691226bbc84a556ef8 100644 --- a/src/util/src/tlog.c +++ b/src/util/src/tlog.c @@ -131,7 +131,7 @@ void taosCloseLog() { taosStopLog(); //tsem_post(&(tsLogObj.logHandle->buffNotEmpty)); taosMsleep(MAX_LOG_INTERVAL/1000); - if (taosCheckPthreadValid(tsLogObj.logHandle->asyncThread)) { + if (tsLogObj.logHandle && taosCheckPthreadValid(tsLogObj.logHandle->asyncThread)) { pthread_join(tsLogObj.logHandle->asyncThread, NULL); } // In case that other threads still use log resources causing invalid write in valgrind diff --git a/src/util/src/tnettest.c b/src/util/src/tnettest.c index 8dc2d4c993e001c95f63d72c60db8b8fe3ac3df8..7d1076abbf1eb0c35385b769bfc6a88cfd8a21a7 100644 --- a/src/util/src/tnettest.c +++ b/src/util/src/tnettest.c @@ -356,7 +356,7 @@ static int32_t taosNetCheckRpc(const char* serverFqdn, uint16_t port, uint16_t p epSet.inUse = 0; epSet.numOfEps = 1; epSet.port[0] = port; - strcpy(epSet.fqdn[0], serverFqdn); + tstrncpy(epSet.fqdn[0], serverFqdn, sizeof(epSet.fqdn[0])); reqMsg.msgType = TSDB_MSG_TYPE_NETWORK_TEST; reqMsg.pCont = rpcMallocCont(pktLen); @@ -364,7 +364,7 @@ static int32_t taosNetCheckRpc(const char* serverFqdn, uint16_t port, uint16_t p reqMsg.code = 0; reqMsg.handle = NULL; // rpc handle returned to app reqMsg.ahandle = NULL; // app handle set by client - strcpy(reqMsg.pCont, "nettest"); + tstrncpy((char*)reqMsg.pCont, "nettest", pktLen); rpcSendRecv(pRpcConn, &epSet, &reqMsg, &rspMsg); @@ -606,7 +606,7 @@ static void taosNetCheckSpeed(char *host, int32_t port, int32_t pkgLen, epSet.inUse = 0; epSet.numOfEps = 1; epSet.port[0] = port; - strcpy(epSet.fqdn[0], host); + tstrncpy(epSet.fqdn[0], host, sizeof(epSet.fqdn[0])); reqMsg.msgType = TSDB_MSG_TYPE_NETWORK_TEST; reqMsg.pCont = rpcMallocCont(pkgLen); @@ -614,8 +614,8 @@ static void taosNetCheckSpeed(char *host, int32_t port, int32_t pkgLen, reqMsg.code = 0; reqMsg.handle = NULL; // rpc handle returned to app reqMsg.ahandle = NULL; // app handle set by client - strcpy(reqMsg.pCont, "nettest speed"); - + tstrncpy((char*)reqMsg.pCont, "nettest speed", pkgLen); + rpcSendRecv(pRpcConn, &epSet, &reqMsg, &rspMsg); int code = 0; diff --git a/tests/develop-test/0-management/3-tag/json_tag.py b/tests/develop-test/0-management/3-tag/json_tag.py index 4810ec8b4e2437f5aecbb67a10c8d2ce4e5c55c5..dc7affe870f4462526aa1095311278d280abe77f 100644 --- a/tests/develop-test/0-management/3-tag/json_tag.py +++ b/tests/develop-test/0-management/3-tag/json_tag.py @@ -16,6 +16,7 @@ import taos from util.log import tdLog from util.cases import tdCases from util.sql import tdSql +import json class TDTestCase: @@ -505,6 +506,11 @@ class TDTestCase: tdSql.query("select round(dataint) from jsons1 where jtag->'tag1'>1") tdSql.checkRows(3) + #test TD-12077 + tdSql.execute("insert into jsons1_16 using jsons1 tags('{\"tag1\":\"收到货\",\"tag2\":\"\",\"tag3\":-2.111}') values(1591062628000, 2, NULL, '你就会', 'dws')") + tdSql.query("select jtag->'tag3' from jsons1_16") + tdSql.checkData(0, 0, '-2.111000000') + def stop(self): tdSql.close() tdLog.success("%s successfully executed" % __file__) diff --git a/tests/examples/C#/taosdemo/taosdemo.cs b/tests/examples/C#/taosdemo/taosdemo.cs index 2c77285488830323ed03a04a1d1c89c048ad2ea8..e62a502d1508c1339e559160b50da39e622a021f 100644 --- a/tests/examples/C#/taosdemo/taosdemo.cs +++ b/tests/examples/C#/taosdemo/taosdemo.cs @@ -361,7 +361,10 @@ namespace TDengineDriver threadArr[i] = new Thread(createTableThread.ThreadMain); threadArr[i].Start(); - threadArr[i].Join(); + } + for (int j = 0; j < numOfThreads; j++) + { + threadArr[j].Join(); } } @@ -482,7 +485,10 @@ namespace TDengineDriver threadArr[i] = new Thread(insertThread.ThreadMain); threadArr[i].Start(); - threadArr[i].Join(); + } + for (int j = 0; j < numOfThreads; j++) + { + threadArr[j].Join(); } } diff --git a/tests/examples/JDBC/taosdemo/pom.xml b/tests/examples/JDBC/taosdemo/pom.xml index c6e61f5d22ca83c5d56deef7db9354913a3321b1..4969ac707daca541c2a06f3298599d38fe0e6515 100644 --- a/tests/examples/JDBC/taosdemo/pom.xml +++ b/tests/examples/JDBC/taosdemo/pom.xml @@ -88,7 +88,7 @@ org.apache.logging.log4j log4j-core - 2.15.0 + 2.16.0 diff --git a/tests/pytest/fulltest-connector.sh b/tests/pytest/fulltest-connector.sh new file mode 100755 index 0000000000000000000000000000000000000000..eb685bd2146508a55d470c45bd3b4780997de64c --- /dev/null +++ b/tests/pytest/fulltest-connector.sh @@ -0,0 +1,9 @@ +#!/bin/bash +ulimit -c unlimited +#======================p1-start=============== +#======================p1-end=============== + +# restful test for python +# python3 test.py -f restful/restful_bind_db1.py +# python3 test.py -f restful/restful_bind_db2.py +python3 ./test.py -f client/nettest.py \ No newline at end of file diff --git a/tests/pytest/fulltest-insert.sh b/tests/pytest/fulltest-insert.sh new file mode 100755 index 0000000000000000000000000000000000000000..6a2a027c818ecc018829436b63e86a9d96629e5b --- /dev/null +++ b/tests/pytest/fulltest-insert.sh @@ -0,0 +1,154 @@ +#!/bin/bash +ulimit -c unlimited +#======================p1-start=============== +#======================p1-end=============== + +python3 testCompress.py +python3 testNoCompress.py + +python3 ./test.py -f import_merge/importBlock1HO.py +python3 ./test.py -f import_merge/importBlock1HPO.py +python3 ./test.py -f import_merge/importBlock1H.py +python3 ./test.py -f import_merge/importBlock1S.py +python3 ./test.py -f import_merge/importBlock1Sub.py +python3 ./test.py -f import_merge/importBlock1TO.py +python3 ./test.py -f import_merge/importBlock1TPO.py +python3 ./test.py -f import_merge/importBlock1T.py +python3 ./test.py -f import_merge/importBlock2HO.py +python3 ./test.py -f import_merge/importBlock2HPO.py +python3 ./test.py -f import_merge/importBlock2H.py +python3 ./test.py -f import_merge/importBlock2S.py +python3 ./test.py -f import_merge/importBlock2Sub.py +python3 ./test.py -f import_merge/importBlock2TO.py +python3 ./test.py -f import_merge/importBlock2TPO.py +python3 ./test.py -f import_merge/importBlock2T.py +python3 ./test.py -f import_merge/importBlockbetween.py +python3 ./test.py -f import_merge/importCacheFileHO.py +python3 ./test.py -f import_merge/importCacheFileHPO.py +python3 ./test.py -f import_merge/importCacheFileH.py +python3 ./test.py -f import_merge/importCacheFileS.py +python3 ./test.py -f import_merge/importCacheFileSub.py +python3 ./test.py -f import_merge/importCacheFileTO.py +python3 ./test.py -f import_merge/importCacheFileTPO.py +python3 ./test.py -f import_merge/importCacheFileT.py +python3 ./test.py -f import_merge/importDataH2.py +python3 ./test.py -f import_merge/importDataHO2.py +python3 ./test.py -f import_merge/importDataHO.py +python3 ./test.py -f import_merge/importDataHPO.py +python3 ./test.py -f import_merge/importDataLastHO.py +python3 ./test.py -f import_merge/importDataLastHPO.py +python3 ./test.py -f import_merge/importDataLastH.py +python3 ./test.py -f import_merge/importDataLastS.py +python3 ./test.py -f import_merge/importDataLastSub.py +python3 ./test.py -f import_merge/importDataLastTO.py +python3 ./test.py -f import_merge/importDataLastTPO.py +python3 ./test.py -f import_merge/importDataLastT.py +python3 ./test.py -f import_merge/importDataS.py +python3 ./test.py -f import_merge/importDataSub.py +python3 ./test.py -f import_merge/importDataTO.py +python3 ./test.py -f import_merge/importDataTPO.py +python3 ./test.py -f import_merge/importDataT.py +python3 ./test.py -f import_merge/importHeadOverlap.py +python3 ./test.py -f import_merge/importHeadPartOverlap.py +python3 ./test.py -f import_merge/importHead.py +python3 ./test.py -f import_merge/importHORestart.py +python3 ./test.py -f import_merge/importHPORestart.py +python3 ./test.py -f import_merge/importHRestart.py +python3 ./test.py -f import_merge/importLastHO.py +python3 ./test.py -f import_merge/importLastHPO.py +python3 ./test.py -f import_merge/importLastH.py +python3 ./test.py -f import_merge/importLastS.py +python3 ./test.py -f import_merge/importLastSub.py +python3 ./test.py -f import_merge/importLastTO.py +python3 ./test.py -f import_merge/importLastTPO.py +python3 ./test.py -f import_merge/importLastT.py +python3 ./test.py -f import_merge/importSpan.py +python3 ./test.py -f import_merge/importSRestart.py +python3 ./test.py -f import_merge/importSubRestart.py +python3 ./test.py -f import_merge/importTailOverlap.py +python3 ./test.py -f import_merge/importTailPartOverlap.py +python3 ./test.py -f import_merge/importTail.py +python3 ./test.py -f import_merge/importToCommit.py +python3 ./test.py -f import_merge/importTORestart.py +python3 ./test.py -f import_merge/importTPORestart.py +python3 ./test.py -f import_merge/importTRestart.py +python3 ./test.py -f import_merge/importInsertThenImport.py +python3 ./test.py -f import_merge/importCSV.py +python3 ./test.py -f import_merge/import_update_0.py +python3 ./test.py -f import_merge/import_update_1.py +python3 ./test.py -f import_merge/import_update_2.py + +python3 ./test.py -f insert/basic.py +python3 ./test.py -f insert/int.py +python3 ./test.py -f insert/float.py +python3 ./test.py -f insert/bigint.py +python3 ./test.py -f insert/bool.py +python3 ./test.py -f insert/double.py +python3 ./test.py -f insert/smallint.py +python3 ./test.py -f insert/tinyint.py +python3 ./test.py -f insert/date.py +python3 ./test.py -f insert/binary.py +python3 ./test.py -f insert/nchar.py +#python3 ./test.py -f insert/nchar-boundary.py +python3 ./test.py -f insert/nchar-unicode.py +python3 ./test.py -f insert/multi.py +python3 ./test.py -f insert/randomNullCommit.py +python3 insert/retentionpolicy.py +python3 ./test.py -f insert/alterTableAndInsert.py +python3 ./test.py -f insert/insertIntoTwoTables.py +python3 ./test.py -f insert/before_1970.py +python3 ./test.py -f insert/special_character_show.py +python3 bug2265.py +python3 ./test.py -f insert/bug3654.py +python3 ./test.py -f insert/insertDynamicColBeforeVal.py +python3 ./test.py -f insert/in_function.py +python3 ./test.py -f insert/modify_column.py +#python3 ./test.py -f insert/line_insert.py +python3 ./test.py -f insert/specialSql.py +python3 ./test.py -f insert/timestamp.py +python3 ./test.py -f insert/metadataUpdate.py +python3 ./test.py -f insert/unsignedInt.py +python3 ./test.py -f insert/unsignedBigint.py +python3 ./test.py -f insert/unsignedSmallint.py +python3 ./test.py -f insert/unsignedTinyint.py +python3 ./test.py -f insert/insertFromCSV.py +python3 ./test.py -f insert/boundary2.py +python3 ./test.py -f insert/insert_locking.py +python3 test.py -f insert/insert_before_use_db.py +python3 ./test.py -f insert/flushwhiledrop.py +python3 ./test.py -f insert/verifyMemToDiskCrash.py +#python3 ./test.py -f insert/schemalessInsert.py +#python3 ./test.py -f insert/openTsdbJsonInsert.py +python3 ./test.py -f insert/openTsdbTelnetLinesInsert.py + + +# update +python3 ./test.py -f update/merge_commit_data.py +python3 ./test.py -f update/allow_update.py +python3 ./test.py -f update/allow_update-0.py +python3 ./test.py -f update/append_commit_data.py +python3 ./test.py -f update/append_commit_last-0.py +python3 ./test.py -f update/append_commit_last.py + + +python3 ./test.py -f update/merge_commit_data2.py +python3 ./test.py -f update/merge_commit_data2_update0.py +python3 ./test.py -f update/merge_commit_last-0.py +python3 ./test.py -f update/merge_commit_last.py +python3 ./test.py -f update/update_options.py +python3 ./test.py -f update/merge_commit_data-0.py + +# wal +python3 ./test.py -f wal/addOldWalTest.py +python3 ./test.py -f wal/sdbComp.py + + + + + + + + + + + diff --git a/tests/pytest/fulltest-others.sh b/tests/pytest/fulltest-others.sh new file mode 100755 index 0000000000000000000000000000000000000000..e0b0851a22de16dbc3e6aea17937121573eb9997 --- /dev/null +++ b/tests/pytest/fulltest-others.sh @@ -0,0 +1,48 @@ +#!/bin/bash +ulimit -c unlimited +#======================p1-start=============== +#======================p1-end=============== + +#python3 ./test.py -f dbmgmt/database-name-boundary.py +python3 test.py -f dbmgmt/nanoSecondCheck.py + +# +python3 ./test.py -f tsdb/tsdbComp.py + +# user +python3 ./test.py -f user/user_create.py +python3 ./test.py -f user/pass_len.py + +# perfbenchmark +python3 ./test.py -f perfbenchmark/bug3433.py +#python3 ./test.py -f perfbenchmark/bug3589.py +#python3 ./test.py -f perfbenchmark/taosdemoInsert.py + +#alter table +python3 ./test.py -f alter/alter_table_crash.py +python3 ./test.py -f alter/alterTabAddTagWithNULL.py +python3 ./test.py -f alter/alterTimestampColDataProcess.py +python3 ./test.py -f alter/alter_table.py +python3 ./test.py -f alter/alter_debugFlag.py +python3 ./test.py -f alter/alter_keep.py +python3 ./test.py -f alter/alter_cacheLastRow.py +python3 ./test.py -f alter/alter_create_exception.py +python3 ./test.py -f alter/alterColMultiTimes.py + +python3 ./test.py -f account/account_create.py + +# client +python3 ./test.py -f client/client.py +python3 ./test.py -f client/version.py +python3 ./test.py -f client/alterDatabase.py +python3 ./test.py -f client/noConnectionErrorTest.py +python3 ./test.py -f client/taoshellCheckCase.py +# python3 ./test.py -f client/change_time_1_1.py +# python3 ./test.py -f client/change_time_1_2.py +python3 client/twoClients.py + +python3 testMinTablesPerVnode.py + +# topic +python3 ./test.py -f topic/topicQuery.py + diff --git a/tests/pytest/fulltest-query.sh b/tests/pytest/fulltest-query.sh new file mode 100755 index 0000000000000000000000000000000000000000..04e1eb7c527a69fdadf78985062ee2ba02d41517 --- /dev/null +++ b/tests/pytest/fulltest-query.sh @@ -0,0 +1,200 @@ +#!/bin/bash +ulimit -c unlimited +#======================p1-start=============== +#======================p1-end=============== + + +# timezone +python3 ./test.py -f TimeZone/TestCaseTimeZone.py + +#stable +python3 ./test.py -f stable/insert.py +python3 ./test.py -f stable/query_after_reset.py + +#table +python3 ./test.py -f table/alter_wal0.py +python3 ./test.py -f table/column_name.py +python3 ./test.py -f table/column_num.py +python3 ./test.py -f table/db_table.py +python3 ./test.py -f table/create_sensitive.py +python3 ./test.py -f table/tablename-boundary.py +python3 ./test.py -f table/max_table_length.py +python3 ./test.py -f table/alter_column.py +python3 ./test.py -f table/boundary.py +#python3 ./test.py -f table/create.py +python3 ./test.py -f table/del_stable.py +python3 ./test.py -f table/create_db_from_normal_db.py + +# tag +python3 ./test.py -f tag_lite/filter.py +python3 ./test.py -f tag_lite/create-tags-boundary.py +python3 ./test.py -f tag_lite/3.py +python3 ./test.py -f tag_lite/4.py +python3 ./test.py -f tag_lite/5.py +python3 ./test.py -f tag_lite/6.py +python3 ./test.py -f tag_lite/add.py +python3 ./test.py -f tag_lite/bigint.py +python3 ./test.py -f tag_lite/binary_binary.py +python3 ./test.py -f tag_lite/binary.py +python3 ./test.py -f tag_lite/bool_binary.py +python3 ./test.py -f tag_lite/bool_int.py +python3 ./test.py -f tag_lite/bool.py +python3 ./test.py -f tag_lite/change.py +python3 ./test.py -f tag_lite/column.py +python3 ./test.py -f tag_lite/commit.py +python3 ./test.py -f tag_lite/create.py +python3 ./test.py -f tag_lite/datatype.py +python3 ./test.py -f tag_lite/datatype-without-alter.py +python3 ./test.py -f tag_lite/delete.py +python3 ./test.py -f tag_lite/double.py +python3 ./test.py -f tag_lite/float.py +python3 ./test.py -f tag_lite/int_binary.py +python3 ./test.py -f tag_lite/int_float.py +python3 ./test.py -f tag_lite/int.py +python3 ./test.py -f tag_lite/set.py +python3 ./test.py -f tag_lite/smallint.py +python3 ./test.py -f tag_lite/tinyint.py +python3 ./test.py -f tag_lite/timestamp.py +python3 ./test.py -f tag_lite/TestModifyTag.py +python3 ./test.py -f tag_lite/unsignedInt.py +python3 ./test.py -f tag_lite/unsignedBigint.py +python3 ./test.py -f tag_lite/unsignedSmallint.py +python3 ./test.py -f tag_lite/unsignedTinyint.py +python3 ./test.py -f tag_lite/alter_tag.py +python3 ./test.py -f tag_lite/drop_auto_create.py +python3 ./test.py -f tag_lite/json_tag_extra.py + +#query +python3 ./test.py -f query/distinctOneColTb.py +python3 ./test.py -f query/filter.py +python3 ./test.py -f query/filterCombo.py +python3 ./test.py -f query/queryNormal.py +python3 ./test.py -f query/queryError.py +python3 ./test.py -f query/filterAllIntTypes.py +python3 ./test.py -f query/filterFloatAndDouble.py +python3 ./test.py -f query/filterOtherTypes.py +python3 ./test.py -f query/querySort.py +python3 ./test.py -f query/queryJoin.py +python3 ./test.py -f query/select_last_crash.py +python3 ./test.py -f query/queryNullValueTest.py +python3 ./test.py -f query/queryInsertValue.py +python3 ./test.py -f query/queryConnection.py +python3 ./test.py -f query/queryCountCSVData.py +python3 ./test.py -f query/natualInterval.py +python3 ./test.py -f query/bug1471.py +#python3 ./test.py -f query/dataLossTest.py +python3 ./test.py -f query/bug1874.py +python3 ./test.py -f query/bug1875.py +python3 ./test.py -f query/bug1876.py +python3 ./test.py -f query/bug2218.py +python3 ./test.py -f query/bug2117.py +python3 ./test.py -f query/bug2118.py +python3 ./test.py -f query/bug2143.py +python3 ./test.py -f query/sliding.py +python3 ./test.py -f query/unionAllTest.py +python3 ./test.py -f query/bug2281.py +python3 ./test.py -f query/udf.py +python3 ./test.py -f query/bug2119.py +python3 ./test.py -f query/isNullTest.py +python3 ./test.py -f query/queryWithTaosdKilled.py +python3 ./test.py -f query/floatCompare.py +python3 ./test.py -f query/query1970YearsAf.py +python3 ./test.py -f query/bug3351.py +python3 ./test.py -f query/bug3375.py +python3 ./test.py -f query/queryJoin10tables.py +python3 ./test.py -f query/queryStddevWithGroupby.py +python3 ./test.py -f query/querySecondtscolumnTowherenow.py +python3 ./test.py -f query/queryFilterTswithDateUnit.py +python3 ./test.py -f query/queryTscomputWithNow.py +python3 ./test.py -f query/queryStableJoin.py +python3 ./test.py -f query/computeErrorinWhere.py +python3 ./test.py -f query/queryTsisNull.py +python3 ./test.py -f query/subqueryFilter.py +python3 ./test.py -f query/nestedQuery/queryInterval.py +python3 ./test.py -f query/queryStateWindow.py +# python3 ./test.py -f query/nestedQuery/queryWithOrderLimit.py +python3 ./test.py -f query/nestquery_last_row.py +python3 ./test.py -f query/nestedQuery/nestedQuery.py +python3 ./test.py -f query/nestedQuery/nestedQuery_datacheck.py +python3 ./test.py -f query/queryCnameDisplay.py +# python3 ./test.py -f query/operator_cost.py +# python3 ./test.py -f query/long_where_query.py +python3 test.py -f query/nestedQuery/queryWithSpread.py +python3 ./test.py -f query/bug6586.py +# python3 ./test.py -f query/bug5903.py +python3 test.py -f query/queryInterval.py +python3 test.py -f query/queryFillTest.py +python3 ./test.py -f query/last_cache.py +python3 ./test.py -f query/last_row_cache.py +python3 ./test.py -f query/queryGroupbySort.py +python3 ./test.py -f query/filterAllUnsignedIntTypes.py +python3 ./test.py -f query/queryBetweenAnd.py +python3 ./test.py -f query/querySession.py +python3 ./test.py -f query/queryWildcardLength.py +python3 ./test.py -f query/queryTbnameUpperLower.py +python3 ./test.py -f query/query.py +python3 ./test.py -f query/queryDiffColsTagsAndOr.py +python3 ./test.py -f query/queryGroupTbname.py +python3 ./test.py -f query/queryRegex.py + +#stream +python3 ./test.py -f stream/metric_1.py +python3 ./test.py -f stream/metric_n.py +python3 ./test.py -f stream/new.py +python3 ./test.py -f stream/stream1.py +python3 ./test.py -f stream/stream2.py +#python3 ./test.py -f stream/parser.py +python3 ./test.py -f stream/history.py +python3 ./test.py -f stream/sys.py +python3 ./test.py -f stream/table_1.py +python3 ./test.py -f stream/table_n.py +python3 ./test.py -f stream/showStreamExecTimeisNull.py +python3 ./test.py -f stream/cqSupportBefore1970.py + +python3 ./test.py -f query/queryGroupbyWithInterval.py +python3 queryCount.py + +# subscribe +python3 test.py -f subscribe/singlemeter.py +#python3 test.py -f subscribe/stability.py +python3 test.py -f subscribe/supertable.py + +# functions +python3 ./test.py -f functions/all_null_value.py +python3 ./test.py -f functions/function_avg.py -r 1 +python3 ./test.py -f functions/function_bottom.py -r 1 +python3 ./test.py -f functions/function_count.py -r 1 +python3 ./test.py -f functions/function_count_last_stab.py +python3 ./test.py -f functions/function_diff.py -r 1 +python3 ./test.py -f functions/function_first.py -r 1 +python3 ./test.py -f functions/function_last.py -r 1 +python3 ./test.py -f functions/function_last_row.py -r 1 +python3 ./test.py -f functions/function_leastsquares.py -r 1 +python3 ./test.py -f functions/function_max.py -r 1 +python3 ./test.py -f functions/function_min.py -r 1 +python3 ./test.py -f functions/function_operations.py -r 1 +python3 ./test.py -f functions/function_percentile.py -r 1 +python3 ./test.py -f functions/function_spread.py -r 1 +python3 ./test.py -f functions/function_stddev.py -r 1 +python3 ./test.py -f functions/function_sum.py -r 1 +python3 ./test.py -f functions/function_top.py -r 1 +python3 ./test.py -f functions/function_sample.py -r 1 +python3 ./test.py -f functions/function_twa.py -r 1 +python3 ./test.py -f functions/function_twa_test2.py +python3 ./test.py -f functions/function_stddev_td2555.py +python3 ./test.py -f functions/showOfflineThresholdIs864000.py +python3 ./test.py -f functions/function_interp.py +#python3 ./test.py -f functions/queryTestCases.py +python3 ./test.py -f functions/function_stateWindow.py +python3 ./test.py -f functions/function_derivative.py +python3 ./test.py -f functions/function_irate.py +python3 ./test.py -f functions/function_ceil.py +python3 ./test.py -f functions/function_floor.py +python3 ./test.py -f functions/function_round.py +python3 ./test.py -f functions/function_elapsed.py +python3 ./test.py -f functions/function_mavg.py +python3 ./test.py -f functions/function_csum.py +python3 ./test.py -f functions/function_percentile2.py +python3 ./test.py -f functions/variable_httpDbNameMandatory.py + + diff --git a/tests/pytest/fulltest-tools.sh b/tests/pytest/fulltest-tools.sh new file mode 100755 index 0000000000000000000000000000000000000000..cac445501229f0b54f1464a07583d05cbf4c88a4 --- /dev/null +++ b/tests/pytest/fulltest-tools.sh @@ -0,0 +1,47 @@ +#!/bin/bash +ulimit -c unlimited +#======================p1-start=============== +#======================p1-end=============== + +# tools +python3 test.py -f tools/taosdumpTest.py +python3 test.py -f tools/taosdumpTest2.py + +python3 test.py -f tools/taosdemoTest.py +python3 test.py -f tools/taosdemoTestWithoutMetric.py +python3 test.py -f tools/taosdemoTestWithJson.py +python3 test.py -f tools/taosdemoTestLimitOffset.py +python3 test.py -f tools/taosdemoTestTblAlt.py +python3 test.py -f tools/taosdemoTestSampleData.py +python3 test.py -f tools/taosdemoTestInterlace.py +# python3 test.py -f tools/taosdemoTestQuery.py +python3 ./test.py -f tools/taosdemoTestdatatype.py + +# nano support +python3 test.py -f tools/taosdemoAllTest/NanoTestCase/taosdemoTestSupportNanoInsert.py +python3 test.py -f tools/taosdemoAllTest/NanoTestCase/taosdemoTestSupportNanoQuery.py +python3 test.py -f tools/taosdemoAllTest/NanoTestCase/taosdemoTestSupportNanosubscribe.py +python3 test.py -f tools/taosdemoAllTest/NanoTestCase/taosdemoTestInsertTime_step.py +python3 test.py -f tools/taosdumpTestNanoSupport.py +python3 test.py -f tools/taosdemoAllTest/taosdemoTestInsertWithJson.py +python3 test.py -f tools/taosdemoAllTest/taosdemoTestQueryWithJson.py +python3 test.py -f tools/taosdemoAllTest/taosdemoTestInsertAllType.py +python3 test.py -f tools/taosdemoAllTest/TD-4985/query-limit-offset.py +python3 test.py -f tools/taosdemoAllTest/TD-5213/insert4096columns_not_use_taosdemo.py +python3 test.py -f tools/taosdemoAllTest/TD-5213/insertSigcolumnsNum4096.py +#python3 test.py -f tools/taosdemoAllTest/TD-10539/create_taosdemo.py +python3 test.py -f tools/taosdemoAllTest/taosdemoTestInsertWithJsonStmt.py +python3 test.py -f tools/taosdemoAllTest/taosdemoTestInsertWithJsonSml.py +python3 test.py -f tools/taosdemoAllTest/taosdemoTestInsertShell.py + + + + + + + + + + + + diff --git a/tests/pytest/functions/function_elapsed_case.py b/tests/pytest/functions/function_elapsed_case.py index 56610a9347c3ab90a9addc64dd62a6ed60758abf..6b279d7f63de0cdbd854457350b670520ea455ec 100644 --- a/tests/pytest/functions/function_elapsed_case.py +++ b/tests/pytest/functions/function_elapsed_case.py @@ -320,6 +320,8 @@ class ElapsedCase: def selectIllegalTest(self): tdSql.execute("use wxy_db") + tdSql.error("select elapsed() from t1") + tdSql.error("select elapsed(,) from t1") tdSql.error("select elapsed(1) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'") tdSql.error("select elapsed('2021-11-18 00:00:10') from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'") tdSql.error("select elapsed(now) from t1 where ts > '2021-11-22 00:00:00' and ts < '2021-11-23 00:00:00'") diff --git a/tests/pytest/tools/taosdemoTestTblAlt.py b/tests/pytest/tools/taosdemoTestTblAlt.py index 7587ab9eb3e89275451864d28ccf985bcaac949a..444aab519bf7089b792125ffa3caa6de5ad4eb8d 100644 --- a/tests/pytest/tools/taosdemoTestTblAlt.py +++ b/tests/pytest/tools/taosdemoTestTblAlt.py @@ -30,6 +30,7 @@ class TDTestCase: self.numberOfRecords = 1000000 def getBuildPath(self): + buildPath="" selfPath = os.path.dirname(os.path.realpath(__file__)) if ("community" in selfPath): @@ -38,7 +39,7 @@ class TDTestCase: projPath = selfPath[:selfPath.find("tests")] for root, dirs, files in os.walk(projPath): - if ("taosd" in files): + if ("taosd" in files and "taosBenchmark" in files): rootRealPath = os.path.dirname(os.path.realpath(root)) if ("packaging" not in rootRealPath): buildPath = root[:len(root) - len("/build/bin")] @@ -48,7 +49,7 @@ class TDTestCase: def insertDataAndAlterTable(self, threadID): buildPath = self.getBuildPath() if (buildPath == ""): - tdLog.exit("taosd not found!") + tdLog.exit("taosd or staosBenchmark not found!") else: tdLog.info("taosd found in %s" % buildPath) binPath = buildPath + "/build/bin/" diff --git a/tests/pytest/tools/taosdumpTest2.py b/tests/pytest/tools/taosdumpTest2.py index 839988375b652b0cfad09d8a6de7697de19609ea..c60fb42266c6d23ad9aeabc9bf9f48ac5feec17b 100644 --- a/tests/pytest/tools/taosdumpTest2.py +++ b/tests/pytest/tools/taosdumpTest2.py @@ -69,7 +69,7 @@ class TDTestCase: os.system("rm /tmp/*.sql") os.system( - "%staosdump --databases db -o /tmp -B 32766 -L 1048576" % + "%staosdump --databases db -o /tmp -B 16384 -L 1048576" % binPath) tdSql.execute("drop database db") diff --git a/tests/pytest/tools/taosdumpTest3.py b/tests/pytest/tools/taosdumpTest3.py index d13c502fd5887d47b5094ef5bd08691372f9648b..ed83fe1ffb39f24f6eb7073d91bcaf62437527c3 100644 --- a/tests/pytest/tools/taosdumpTest3.py +++ b/tests/pytest/tools/taosdumpTest3.py @@ -137,7 +137,6 @@ class TDTestCase: # verify ns os.system("%staosdump -o ./taosdumptest/tmp6 dp3 st0_0" % binPath) - assert os.system("%staosdump -o ./taosdumptest/tmp6 dp3 st0_0 -C ns " % binPath) != 0 # verify -D:--database os.system("%staosdump -o ./taosdumptest/tmp5 --databases dp1,dp2 " % binPath) diff --git a/tests/script/general/parser/col_arithmetic_query.sim b/tests/script/general/parser/col_arithmetic_query.sim index 9b0dc8e964cf39909b803fe5ea20a7bdff8ceb59..fa1bf5e54fc1570f21160161371833b1e701f846 100644 --- a/tests/script/general/parser/col_arithmetic_query.sim +++ b/tests/script/general/parser/col_arithmetic_query.sim @@ -660,6 +660,19 @@ sql select c2-c2 from $tb sql select first(c1)-last(c1), spread(c2), max(c3) - min(c3), avg(c4)*count(c4) from $tb +# arithmetic operation with now [d.21]=============================================================== +sql_error select now from $tb +sql_error select now + 123 from $tb +sql_error select 123 + now from $tb +sql_error select now - 123 from $tb +sql_error select 123 - now from $tb +sql_error select now * 123 from $tb +sql_error select 123 * now from $tb +sql_error select now / 123 from $tb +sql_error select 123 / now from $tb +sql_error select now % 123 from $tb +sql_error select 123 % now from $tb +sql_error select 12 * now / 12 + 12 - 12 * 12 from $tb #====================================================super table query================================================== diff --git a/tests/script/general/parser/nestquery.sim b/tests/script/general/parser/nestquery.sim index 16803ea0965a66107a90aaf7ad37d715314a8258..3653efe0be35340c3aa68b678f63de7f0a0dda10 100644 --- a/tests/script/general/parser/nestquery.sim +++ b/tests/script/general/parser/nestquery.sim @@ -941,4 +941,219 @@ if $data02 != 0 then return -1 endi +print ==============> TD-11969 +sql create database test11969; +sql use test11969; +sql create stable st (ts timestamp , id int ) tags (ind int ); +sql insert into sub1 using st tags(1) values(now ,1); +sql insert into sub1 using st tags(1) values(now ,2); +sql insert into sub2 using st tags(2) values(now ,3); +sql insert into sub2 using st tags(2) values(now ,4); +sql_error select max(ts_inter) ,tbname from (select elapsed(ts) ts_inter ,tbname from st interval (1s) group by tbname) order by ts +sql drop database test11969 + +print ==========================================> TD-11097 +sql create database td11097 +sql use td11097 +sql create table meters2 (ts timestamp, voltage bigint,num int) tags (location binary(30), groupid int); +sql create table D001 using meters2 tags ("Beijing.Chaoyang", 1); +sql create table D002 using meters2 tags ("Beijing.haidian", 2); +sql create table D003 using meters2 tags ('"Beijing.Tongzhou"', 3); +$ts = 1639556426000 +sql insert into d001 values ( $ts ,1,2); +sql insert into d001 values ( $ts +1m,2,3); +sql insert into d001 values ( $ts +2m,4,3); +sql insert into d001 values ( $ts +4m,8,3); +sql insert into d002 values ( $ts ,4,3); +sql insert into d002 values ( $ts +3m,40,3); +sql insert into d002 values ( $ts +1m,46,3); +sql insert into d001 values ( $ts +20m,1,2); +sql insert into d002 values ( $ts +21m,4,3); +sql select diff(voltage) value from meters2 group by tbname; +sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) ; +sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) order by ts; +sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) order by ts desc; + +$emptyString = @@ +print execute sql select diff(voltage) value from meters2 group by tbname; +sql select diff(voltage) value from meters2 group by tbname; +if $data00 != @21-12-15 16:21:26.000@ then + return -1 +endi +if $data01 != @1@ then + return -1 +endi +if $data02 != @d001@ then + return -1 +endi +if $data10 != @21-12-15 16:22:26.000@ then + return -1 +endi +if $data11 != @2@ then + return -1 +endi +if $data12 != @d001@ then + return -1 +endi +if $data20 != @21-12-15 16:24:26.000@ then + return -1 +endi +if $data21 != @4@ then + return -1 +endi +if $data22 != @d001@ then + return -1 +endi +if $data30 != @21-12-15 16:40:26.000@ then + return -1 +endi +if $data31 != @-7@ then + return -1 +endi +if $data32 != @d001@ then + return -1 +endi +if $data40 != @21-12-15 16:21:26.000@ then + return -1 +endi +if $data41 != @42@ then + return -1 +endi +if $data42 != @d002@ then + return -1 +endi +if $data50 != @21-12-15 16:23:26.000@ then + return -1 +endi +if $data51 != @-6@ then + return -1 +endi +if $data52 != @d002@ then + return -1 +endi +if $data60 != @21-12-15 16:41:26.000@ then + return -1 +endi +if $data61 != @-36@ then + return -1 +endi +if $data62 != @d002@ then + return -1 +endi +print execute sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) ; +sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) ; +if $data00 != @21-12-15 16:21:00.000@ then + return -1 +endi +if $data01 != @43@ then + return -1 +endi +if $data10 != @21-12-15 16:22:00.000@ then + return -1 +endi +if $data11 != @2@ then + return -1 +endi +if $data20 != @21-12-15 16:23:00.000@ then + return -1 +endi +if $data21 != @-6@ then + return -1 +endi +if $data30 != @21-12-15 16:24:00.000@ then + return -1 +endi +if $data31 != @4@ then + return -1 +endi +if $data40 != @21-12-15 16:40:00.000@ then + return -1 +endi +if $data41 != @-7@ then + return -1 +endi +if $data50 != @21-12-15 16:41:00.000@ then + return -1 +endi +if $data51 != @-36@ then + return -1 +endi +print execute sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) order by ts; +sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) order by ts; +if $data00 != @21-12-15 16:21:00.000@ then + return -1 +endi +if $data01 != @43@ then + return -1 +endi +if $data10 != @21-12-15 16:22:00.000@ then + return -1 +endi +if $data11 != @2@ then + return -1 +endi +if $data20 != @21-12-15 16:23:00.000@ then + return -1 +endi +if $data21 != @-6@ then + return -1 +endi +if $data30 != @21-12-15 16:24:00.000@ then + return -1 +endi +if $data31 != @4@ then + return -1 +endi +if $data40 != @21-12-15 16:40:00.000@ then + return -1 +endi +if $data41 != @-7@ then + return -1 +endi +if $data50 != @21-12-15 16:41:00.000@ then + return -1 +endi +if $data51 != @-36@ then + return -1 +endi +print execute sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) order by ts desc; +sql select sum(value) from (select diff(voltage) value from meters2 group by tbname) interval(1m) order by ts desc; +if $data00 != @21-12-15 16:41:00.000@ then + return -1 +endi +if $data01 != @-36@ then + return -1 +endi +if $data10 != @21-12-15 16:40:00.000@ then + return -1 +endi +if $data11 != @-7@ then + return -1 +endi +if $data20 != @21-12-15 16:24:00.000@ then + return -1 +endi +if $data21 != @4@ then + return -1 +endi +if $data30 != @21-12-15 16:23:00.000@ then + return -1 +endi +if $data31 != @-6@ then + return -1 +endi +if $data40 != @21-12-15 16:22:00.000@ then + return -1 +endi +if $data41 != @2@ then + return -1 +endi +if $data50 != @21-12-15 16:21:00.000@ then + return -1 +endi +if $data51 != @43@ then + return -1 +endi +sql drop database td11097 + system sh/exec.sh -n dnode1 -s stop -x SIGINT diff --git a/tests/script/general/parser/select_with_tags.sim b/tests/script/general/parser/select_with_tags.sim index 195eca928fa4ddbf3795ae3e40f973ea0a5e8def..258b59f4ae5ffd75878bca469efc226a6d2d0825 100644 --- a/tests/script/general/parser/select_with_tags.sim +++ b/tests/script/general/parser/select_with_tags.sim @@ -956,4 +956,39 @@ sql_error select first(c1), count(*), t2, t1, tbname from select_tags_mt0 group #sql select count(c1) from select_tags_mt0 where c1=99 group by tbname; #sql select count(*),tbname from select_tags_mt0 group by tbname +print ==================================> TD-11943 +sql create database test11943; +sql use test11943; +sql create stable st (ts timestamp , id int ) tags (ind int ); +sql insert into sub1 using st tags(1) values(now ,1); +sql insert into sub1 using st tags(1) values(now ,2); +sql insert into sub2 using st tags(2) values(now ,3); +sql insert into sub2 using st tags(2) values(now ,4); +sql select tbname ,max(id)+5 from sub1; +if $data00 != @sub1@ then + return -1 +endi +if $data01 != @7.000000000@ then + return -1 +endi +sql select ind, max(id)+5 from st group by tbname +if $data00 != @1@ then + return -1 +endi +if $data01 != @7.000000000@ then + return -1 +endi +if $data02 != @sub1@ then + return -1 +endi +if $data10 != @2@ then + return -1 +endi +if $data11 != @9.000000000@ then + return -1 +endi +if $data12 != @sub2@ then + return -1 +endi +sql drop database test11943 system sh/exec.sh -n dnode1 -s stop -x SIGINT