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