diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index 10cfe8bcc5053fa9fe44982268d9e8843d071ce6..c5e3cb727f85dafd2b51efe741cd635394908cfd 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -440,7 +440,7 @@ int tsParseSql(SSqlObj *pSql, bool initial); void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet); int tscBuildAndSendRequest(SSqlObj *pSql, SQueryInfo* pQueryInfo); -int tscRenewTableMeta(SSqlObj *pSql, int32_t tableIndex); +int tscRenewTableMeta(SSqlObj *pSql); void tscAsyncResultOnError(SSqlObj *pSql); void tscQueueAsyncError(void(*fp), void *param, int32_t code); diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 89cf7edd2ed9411009032fc1e7314c210683d89f..3032b27b9cab6005d9cde120ede7fde831df181f 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -9508,7 +9508,7 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNod char buf[TSDB_TABLE_FNAME_LEN]; SStrToken sTblToken; sTblToken.z = buf; - + if (validateTableName(oriName->z, oriName->n, &sTblToken, &dbIncluded) != TSDB_CODE_SUCCESS) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 35582973c2af7b214d3054807d31a897c7256191..4879576bc447b0f483a641b749dbc4b9fc5218e2 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -444,7 +444,7 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet) { } pSql->retryReason = rpcMsg->code; - rpcMsg->code = tscRenewTableMeta(pSql, 0); + rpcMsg->code = tscRenewTableMeta(pSql); // if there is an error occurring, proceed to the following error handling procedure. if (rpcMsg->code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) { taosReleaseRef(tscObjRef, handle); @@ -3074,28 +3074,46 @@ static void freeElem(void* p) { /** * retrieve table meta from mnode, and then update the local table meta hashmap. * @param pSql sql object - * @param tableIndex table index * @return status code */ -int tscRenewTableMeta(SSqlObj *pSql, int32_t tableIndex) { +int tscRenewTableMeta(SSqlObj *pSql) { + int32_t code = TSDB_CODE_SUCCESS; SSqlCmd* pCmd = &pSql->cmd; SQueryInfo *pQueryInfo = tscGetQueryInfo(pCmd); - STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, tableIndex); - char name[TSDB_TABLE_FNAME_LEN] = {0}; - int32_t code = tNameExtractFullName(&pTableMetaInfo->name, name); - if (code != TSDB_CODE_SUCCESS) { - tscError("0x%"PRIx64" failed to generate the table full name", pSql->self); - return TSDB_CODE_TSC_INVALID_OPERATION; - } + SArray* pNameList = taosArrayInit(1, POINTER_BYTES); + SArray* vgroupList = taosArrayInit(1, POINTER_BYTES); - STableMeta* pTableMeta = pTableMetaInfo->pTableMeta; - if (pTableMeta) { - tscDebug("0x%"PRIx64" update table meta:%s, old meta numOfTags:%d, numOfCols:%d, uid:%" PRIu64, pSql->self, name, - tscGetNumOfTags(pTableMeta), tscGetNumOfColumns(pTableMeta), pTableMeta->id.uid); + SHashObj *nameTable = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); + + while (pQueryInfo) { + STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); + + char name[TSDB_TABLE_FNAME_LEN] = {0}; + code = tNameExtractFullName(&pTableMetaInfo->name, name); + if (code != TSDB_CODE_SUCCESS) { + tscError("0x%"PRIx64" failed to generate the table full name", pSql->self); + return TSDB_CODE_TSC_INVALID_OPERATION; + } + + //do not add duplicate names + if (!taosHashGet(nameTable, name, strlen(name))) { + STableMeta* pTableMeta = pTableMetaInfo->pTableMeta; + if (pTableMeta) { + tscDebug("0x%"PRIx64" update table meta:%s, old meta numOfTags:%d, numOfCols:%d, uid:%" PRIu64, pSql->self, name, + tscGetNumOfTags(pTableMeta), tscGetNumOfColumns(pTableMeta), pTableMeta->id.uid); + } + + char* n = strdup(name); + taosArrayPush(pNameList, &n); + uint8_t dummy_val = 0; + taosHashPut(nameTable, name, strlen(name), &dummy_val, sizeof(uint8_t)); + } + pQueryInfo = pQueryInfo->sibling; } + taosHashCleanup(nameTable); // remove stored tableMeta info in hash table tscResetSqlCmd(pCmd, true, pSql->self); @@ -3103,18 +3121,13 @@ int tscRenewTableMeta(SSqlObj *pSql, int32_t tableIndex) { SSqlCmd* pCmd2 = &pSql->rootObj->cmd; pCmd2->pTableMetaMap = tscCleanupTableMetaMap(pCmd2->pTableMetaMap); pCmd2->pTableMetaMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); - + pSql->rootObj->retryReason = pSql->retryReason; SSqlObj *tmpSql = pSql->rootObj; tscFreeSubobj(pSql->rootObj); tfree(tmpSql->pSubs); - SArray* pNameList = taosArrayInit(1, POINTER_BYTES); - SArray* vgroupList = taosArrayInit(1, POINTER_BYTES); - - char* n = strdup(name); - taosArrayPush(pNameList, &n); code = getMultiTableMetaFromMnode(tmpSql, pNameList, vgroupList, NULL, tscTableMetaCallBack, true); taosArrayDestroyEx(pNameList, freeElem); taosArrayDestroyEx(vgroupList, freeElem); diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 874a022a7104860fce8f6389bcc933b36a2fef22..3c1d4f453c2f8be75b9eddfaf02f30b0b25f6ab8 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -5522,6 +5522,11 @@ int parseJsontoTagData(char* json, SKVRowBuilder* kvRowBuilder, char* errMsg, in varDataSetLen(tagData, outLen); tdAddColToKVRow(kvRowBuilder, jsonIndex++, TSDB_DATA_TYPE_NCHAR, tagVal, true); }else if(item->type == cJSON_Number){ + if(!isfinite(item->valuedouble)){ + tscError("json value is invalidate"); + retCode = tscSQLSyntaxErrMsg(errMsg, "json value number is illegal", NULL); + goto end; + } char tagVal[LONG_BYTES + CHAR_BYTES] = {0}; *tagVal = jsonType2DbType(item->valuedouble, item->type); // type char* tagData = POINTER_SHIFT(tagVal,CHAR_BYTES); diff --git a/src/kit/taos-tools b/src/kit/taos-tools index 7eae58a0fbf7c7321dd1bdc96e375d4c832cf373..dca4059d87c3f5c678a5e946978d40daec204e27 160000 --- a/src/kit/taos-tools +++ b/src/kit/taos-tools @@ -1 +1 @@ -Subproject commit 7eae58a0fbf7c7321dd1bdc96e375d4c832cf373 +Subproject commit dca4059d87c3f5c678a5e946978d40daec204e27 diff --git a/src/mnode/src/mnodeDb.c b/src/mnode/src/mnodeDb.c index 76818ac51c3a7879689f68d9af075601310fdc52..13afd1c29894fea07e5c269eee53b36a386ee442 100644 --- a/src/mnode/src/mnodeDb.c +++ b/src/mnode/src/mnodeDb.c @@ -1003,7 +1003,6 @@ static SDbCfg mnodeGetAlterDbOption(SDbObj *pDb, SAlterDbMsg *pAlter) { newCfg.daysToKeep0 = daysToKeep0; } -#ifdef _STORAGE if (daysToKeep1 > 0 && (daysToKeep1 != pDb->cfg.daysToKeep1 || newCfg.daysToKeep1 != pDb->cfg.daysToKeep1)) { mDebug("db:%s, daysToKeep1:%d change to %d", pDb->name, pDb->cfg.daysToKeep1, daysToKeep1); newCfg.daysToKeep1 = daysToKeep1; @@ -1013,7 +1012,6 @@ static SDbCfg mnodeGetAlterDbOption(SDbObj *pDb, SAlterDbMsg *pAlter) { mDebug("db:%s, daysToKeep2:%d change to %d", pDb->name, pDb->cfg.daysToKeep2, daysToKeep2); newCfg.daysToKeep2 = daysToKeep2; } -#endif if (minRows > 0 && minRows != pDb->cfg.minRowsPerFileBlock) { mError("db:%s, can't alter minRows option", pDb->name); @@ -1102,7 +1100,6 @@ static SDbCfg mnodeGetAlterDbOption(SDbObj *pDb, SAlterDbMsg *pAlter) { // community version can only change daysToKeep // but enterprise version can change all daysToKeep options - #ifndef _STORAGE newCfg.daysToKeep1 = newCfg.daysToKeep0; newCfg.daysToKeep2 = newCfg.daysToKeep0; diff --git a/src/mnode/src/mnodeVgroup.c b/src/mnode/src/mnodeVgroup.c index 838aa577ae0fe396f3e80d2fca9066de10d3bc7a..fd6d60c034c702e12a5d996f5b130e54bf3c6a4f 100644 --- a/src/mnode/src/mnodeVgroup.c +++ b/src/mnode/src/mnodeVgroup.c @@ -298,7 +298,7 @@ void mnodeCheckUnCreatedVgroup(SDnodeObj *pDnode, SVnodeLoad *pVloads, int32_t o if (have) continue; - if (pVgroup->status == TAOS_VG_STATUS_CREATING || pVgroup->status == TAOS_VG_STATUS_DROPPING) { + if (/*pVgroup->status == TAOS_VG_STATUS_CREATING ||*/ pVgroup->status == TAOS_VG_STATUS_DROPPING) { mDebug("vgId:%d, not exist in dnode:%d and status is %s, do nothing", pVgroup->vgId, pDnode->dnodeId, vgroupStatus[pVgroup->status]); } else { diff --git a/src/plugins/taosadapter b/src/plugins/taosadapter index 88346a2e4e2e9282d2ec8b8c5264ca1ec23698a1..826f3d3b7820a5c007d301854d56db003b424d0a 160000 --- a/src/plugins/taosadapter +++ b/src/plugins/taosadapter @@ -1 +1 @@ -Subproject commit 88346a2e4e2e9282d2ec8b8c5264ca1ec23698a1 +Subproject commit 826f3d3b7820a5c007d301854d56db003b424d0a diff --git a/src/util/src/tutil.c b/src/util/src/tutil.c index c15197b7537601c0f0ca72420a6711547d1ed0ed..02498e222212fada5b7a9f39fbcfe5c76494a651 100644 --- a/src/util/src/tutil.c +++ b/src/util/src/tutil.c @@ -57,36 +57,32 @@ int32_t strdequote(char *z) { return j + 1; // only one quote, do nothing } - +// delete escape character: \\, \', \" int32_t strRmquote(char *z, int32_t len){ - // delete escape character: \\, \', \" - char delim = z[0]; - if (delim != '\'' && delim != '\"') { - return len; + char delim = 0; + int32_t cnt = 0; + int32_t j = 0; + for (size_t k = 0; k < len; ++k) { + if (!delim && (z[k] == '\'' || z[k] == '"')){ // find the start ' or " + delim = z[k]; } - int32_t cnt = 0; - int32_t j = 0; - for (uint32_t k = 1; k < len - 1; ++k) { - if (z[k] == '\\' || (z[k] == delim && z[k + 1] == delim)) { - if ((z[k] == '\\' && z[k + 1] == '_') || (z[k] == '\\' && z[k + 1] == '%')) { - //match '_' self - } else { - z[j] = z[k + 1]; - cnt++; - j++; - k++; - continue; - } - } - - z[j] = z[k]; + if ((z[k] == '\\' && z[k + 1] == '_') || (z[k] == '\\' && z[k + 1] == '%')) { + //match '_' '%' self + }else if(z[k] == '\\'){ + z[j] = z[k + 1]; + cnt++; j++; + k++; + continue; + }else if(z[k] == delim){ + continue; } - - z[j] = 0; - - return len - 2 - cnt; + z[j] = z[k]; + j++; + } + z[j] = 0; + return j; } int32_t strRmquoteEscape(char *z, int32_t len) { diff --git a/src/util/tests/stringTest.cpp b/src/util/tests/stringTest.cpp index 95fba0cd3e2b62da2b2dadb0b7e592aef5893543..e304ccaec6753ed627418ea8bf2fd428ae710859 100644 --- a/src/util/tests/stringTest.cpp +++ b/src/util/tests/stringTest.cpp @@ -6,6 +6,44 @@ #include "taos.h" #include "tutil.h" +TEST(testCase, str_rmquote_test) { + char t1[] = "\"\".dd"; + int32_t len = strRmquote(t1, strlen(t1)); + printf("t1:%s, len:%d\n", t1, len); + EXPECT_EQ(3, len); + EXPECT_STRCASEEQ(t1, ".dd"); + + char t2[] = "\"fsd\\\"fs\".dd"; + len = strRmquote(t2, strlen(t2)); + printf("t2:%s, len:%d\n", t2, len); + EXPECT_EQ(9, len); + EXPECT_STRCASEEQ(t2, "fsd\"fs.dd"); + + char t3[] = "fs\\_d\\%.d\\d"; + len = strRmquote(t3, strlen(t3)); + printf("t3:%s, len:%d\n", t3, len); + EXPECT_EQ(10, len); + EXPECT_STRCASEEQ(t3, "fs\\_d\\%.dd"); + + char t4[] = "\"fs\\_d\\%\".dd"; + len = strRmquote(t4, strlen(t4)); + printf("t4:%s, len:%d\n", t4, len); + EXPECT_EQ(10, len); + EXPECT_STRCASEEQ(t4, "fs\\_d\\%.dd"); + + char t5[] = "\"fs\\_d\\%\""; + len = strRmquote(t5, strlen(t5)); + printf("t5:%s, len:%d\n", t5, len); + EXPECT_EQ(7, len); + EXPECT_STRCASEEQ(t5, "fs\\_d\\%"); + + char t6[] = "'fs\\_d\\%'"; + len = strRmquote(t6, strlen(t6)); + printf("t6:%s, len:%d\n", t6, len); + EXPECT_EQ(7, len); + EXPECT_STRCASEEQ(t6, "fs\\_d\\%"); +} + TEST(testCase, string_dequote_test) { char t1[] = "'abc'"; int32_t len = strdequote(t1); 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 dc7affe870f4462526aa1095311278d280abe77f..b6a15ca770ea7e4885973a03bfc8e3bd08c3f54d 100644 --- a/tests/develop-test/0-management/3-tag/json_tag.py +++ b/tests/develop-test/0-management/3-tag/json_tag.py @@ -75,6 +75,10 @@ class TDTestCase: tdSql.error("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"\t\":\"fff\"}')") tdSql.error("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"试试\":\"fff\"}')") + # test invalidate json value, value number can not be inf,nan TD-12166 + tdSql.error("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"k\":1.8e308}')") + tdSql.error("CREATE TABLE if not exists jsons1_14 using jsons1 tags('{\"k\":-1.8e308}')") + #test length limit char1= ''.join(['abcd']*64) char3= ''.join(['abcd']*1022) diff --git a/tests/examples/JDBC/connectionPools/pom.xml b/tests/examples/JDBC/connectionPools/pom.xml index 91f1cb36f28840b7d5eeb428aca3f940365ed59d..34fd9950d05f67e0a80a4a420ca4bdba9aba4ee7 100644 --- a/tests/examples/JDBC/connectionPools/pom.xml +++ b/tests/examples/JDBC/connectionPools/pom.xml @@ -53,7 +53,7 @@ org.apache.logging.log4j log4j-core - 2.15.0 + 2.16.0 diff --git a/tests/script/general/parser/select_with_tags.sim b/tests/script/general/parser/select_with_tags.sim index 258b59f4ae5ffd75878bca469efc226a6d2d0825..be8d691f59e1fbd00e41b5bd625e09bfc6783845 100644 --- a/tests/script/general/parser/select_with_tags.sim +++ b/tests/script/general/parser/select_with_tags.sim @@ -961,9 +961,9 @@ 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 insert into sub1 using st tags(1) values(now+1s ,2); +sql insert into sub2 using st tags(2) values(now+2s ,3); +sql insert into sub2 using st tags(2) values(now+3s ,4); sql select tbname ,max(id)+5 from sub1; if $data00 != @sub1@ then return -1