diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 2f927614f54500cff79790037a2375df6ff3765c..3235578ee918504d5e7f02a95f66da7d453c8db4 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -2073,6 +2073,7 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) { return code; } + bool freeMeta = false; STableMeta* pTableMeta = tscCreateTableMetaFromMsg(pMetaMsg); if (!tIsValidSchema(pTableMeta->schema, pTableMeta->tableInfo.numOfColumns, pTableMeta->tableInfo.numOfTags)) { tscError("0x%"PRIx64" invalid table meta from mnode, name:%s", pSql->self, pMetaMsg->tableFname); @@ -2092,11 +2093,13 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) { const char* tableName = tNameGetTableName(&sn); size_t keyLen = strlen(tableName); taosHashPut(pParentCmd->pTableMetaMap, tableName, keyLen, &p, sizeof(STableMetaVgroupInfo)); + } else { + freeMeta = true; } // for each super table, only update meta information once bool updateStableMeta = false; - if (pTableMeta->tableType == TSDB_CHILD_TABLE && taosHashGet(pSet, &pMetaMsg->uid, sizeof(pMetaMsg->uid)) == NULL) { + if (pTableMeta->tableType == TSDB_CHILD_TABLE && taosHashGet(pSet, &pMetaMsg->suid, sizeof(pMetaMsg->suid)) == NULL) { updateStableMeta = true; taosHashPut(pSet, &pTableMeta->suid, sizeof(pMetaMsg->suid), "", 0); } @@ -2112,6 +2115,9 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) { } pMsg += pMetaMsg->contLen; + if (freeMeta) { + tfree(pTableMeta); + } } for(int32_t i = 0; i < pMultiMeta->numOfVgroup; ++i) { diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index 5726d3937f35f7f42526654a1f177d0a1327452b..7385fef5243aefbeaf82e604f251625b70a1dd7b 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -945,21 +945,19 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) { return TSDB_CODE_TSC_DISCONNECTED; } - SSqlObj* pSql = calloc(1, sizeof(SSqlObj)); - pSql->pTscObj = taos; - pSql->signature = pSql; - int32_t length = (int32_t)strlen(tableNameList); + if (length == 0) { + return TSDB_CODE_SUCCESS; + } + if (length > MAX_TABLE_NAME_LENGTH) { - tscError("0x%"PRIx64" tableNameList too long, length:%d, maximum allowed:%d", pSql->self, length, MAX_TABLE_NAME_LENGTH); - tscFreeSqlObj(pSql); + tscError("tableNameList too long, length:%d, maximum allowed:%d", length, MAX_TABLE_NAME_LENGTH); return TSDB_CODE_TSC_INVALID_OPERATION; } char *str = calloc(1, length + 1); if (str == NULL) { - tscError("0x%"PRIx64" failed to allocate sql string buffer", pSql->self); - tscFreeSqlObj(pSql); + tscError("failed to allocate sql string buffer, size:%d", length); return TSDB_CODE_TSC_OUT_OF_MEMORY; } @@ -968,10 +966,15 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) { SArray* vgroupList = taosArrayInit(4, POINTER_BYTES); if (plist == NULL || vgroupList == NULL) { tfree(str); - tscFreeSqlObj(pSql); return TSDB_CODE_TSC_OUT_OF_MEMORY; } + SSqlObj* pSql = calloc(1, sizeof(SSqlObj)); + tscAllocPayload(&pSql->cmd, 1024); + + pSql->pTscObj = taos; + pSql->signature = pSql; + int32_t code = (uint8_t) tscTransferTableNameList(pSql, str, length, plist); free(str); diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 0f29f3c1781ab873a01b118fa805762184075a2e..fdd68d0e306064462da8bf420c0d6dac446f9925 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -4497,6 +4497,15 @@ static int32_t doAddTableName(char* nextStr, char** str, SArray* pNameArray, SSq return TSDB_CODE_SUCCESS; } +int32_t nameComparFn(const void* n1, const void* n2) { + int32_t ret = strcmp(*(char**)n1, *(char**)n2); + if (ret == 0) { + return 0; + } else { + return ret > 0? 1:-1; + } +} + int tscTransferTableNameList(SSqlObj *pSql, const char *pNameList, int32_t length, SArray* pNameArray) { SSqlCmd *pCmd = &pSql->cmd; @@ -4538,6 +4547,34 @@ int tscTransferTableNameList(SSqlObj *pSql, const char *pNameList, int32_t lengt return code; } + taosArraySort(pNameArray, nameComparFn); + size_t len = taosArrayGetSize(pNameArray); + + int32_t pos = 0; + for(int32_t i = 1; i < len; ++i) { + char** p1 = taosArrayGet(pNameArray, pos); + char** p2 = taosArrayGet(pNameArray, i); + + if (strcmp(*p1, *p2) == 0) { + // do nothing + } else { + if (pos + 1 != i) { + char* p = taosArrayGetP(pNameArray, pos + 1); + tfree(p); + taosArraySet(pNameArray, pos + 1, p2); + pos += 1; + } else { + pos += 1; + } + } + } + + for(int32_t i = pos + 1; i < pNameArray->size; ++i) { + char* p = taosArrayGetP(pNameArray, i); + tfree(p); + } + + pNameArray->size = pos + 1; return TSDB_CODE_SUCCESS; }