diff --git a/include/common/tname.h b/include/common/tname.h index ffa4f8f253..ae2dc32335 100644 --- a/include/common/tname.h +++ b/include/common/tname.h @@ -17,6 +17,7 @@ #define _TD_COMMON_NAME_H_ #include "tdef.h" +#include "tarray.h" #ifdef __cplusplus extern "C" { @@ -62,6 +63,18 @@ int32_t tNameSetAcctId(SName* dst, int32_t acctId); bool tNameDBNameEqual(SName* left, SName* right); +typedef struct { + // input + SArray *tags; // element is SSmlKV + const char *sTableName; // super table name + uint8_t sTableNameLen; // the length of super table name + + // output + char *childTableName; // must have size of TSDB_TABLE_NAME_LEN; + uint64_t uid; // child table uid, may be useful +} RandTableName; + +void buildChildTableName(RandTableName *rName); #ifdef __cplusplus } diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index a7ce1a30a8..927fec35dc 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -15,6 +15,7 @@ #include "tcommon.h" #include "catalog.h" #include "clientInt.h" +#include "tname.h" //================================================================================================= #define SPACE ' ' @@ -163,19 +164,6 @@ static int32_t smlBuildInvalidDataMsg(SSmlMsgBuf* pBuf, const char *msg1, const return TSDB_CODE_SML_INVALID_DATA; } -static int smlCompareKv(const void* p1, const void* p2) { - SSmlKv* kv1 = *(SSmlKv**)p1; - SSmlKv* kv2 = *(SSmlKv**)p2; - int32_t kvLen1 = kv1->keyLen; - int32_t kvLen2 = kv2->keyLen; - int32_t res = strncasecmp(kv1->key, kv2->key, TMIN(kvLen1, kvLen2)); - if (res != 0) { - return res; - } else { - return kvLen1-kvLen2; - } -} - static void smlBuildChildTableName(SSmlTableInfo *tags) { int32_t size = taosArrayGetSize(tags->tags); ASSERT(size > 0); @@ -943,20 +931,6 @@ static bool smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) { return false; } -static bool checkDuplicateKey(char *key, SHashObj *pHash, SSmlHandle* info) { - char *val = NULL; - val = taosHashGet(pHash, key, strlen(key)); - if (val) { - uError("SML:0x%"PRIx64" Duplicate key detected:%s", info->id, key); - return true; - } - - uint8_t dummy_val = 0; - taosHashPut(pHash, key, strlen(key), &dummy_val, sizeof(uint8_t)); - - return false; -} - static int32_t smlParseString(const char* sql, SSmlLineInfo *elements, SSmlMsgBuf *msg){ if(!sql) return TSDB_CODE_SML_INVALID_DATA; while (*sql != '\0') { // jump the space at the begining @@ -1563,8 +1537,10 @@ static int32_t smlParseLine(SSmlHandle* info, const char* sql) { tinfo->sTableName = elements.measure; tinfo->sTableNameLen = elements.measureLen; - smlBuildChildTableName(tinfo); - //uDebug("SML:0x%"PRIx64" child table name: %s", info->id, tinfo->childTableName); + RandTableName rName = {.tags=tinfo->tags, .sTableName=tinfo->sTableName, .sTableNameLen=tinfo->sTableNameLen, + .childTableName=tinfo->childTableName}; + buildChildTableName(&rName); + tinfo->uid = rName.uid; SSmlSTableMeta** tableMeta = taosHashGet(info->superTables, elements.measure, elements.measureLen); if(tableMeta){ // update meta @@ -1724,17 +1700,7 @@ static int32_t smlInsertData(SSmlHandle* info) { return info->pRequest->code; } -int32_t numOfSTables; -int32_t numOfCTables; -int32_t numOfCreateSTables; - -int64_t parseTime; -int64_t schemaTime; -int64_t insertBindTime; -int64_t insertRpcTime; -int64_t endTime; - -static void printStatisticInfo(SSmlHandle *info){ +static void smlPrintStatisticInfo(SSmlHandle *info){ uError("SML:0x%"PRIx64" smlInsertLines result, code:%d,lineNum:%d,stable num:%d,ctable num:%d,create stable num:%d \ parse cost:%lld,schema cost:%lld,bind cost:%lld,rpc cost:%lld,total cost:%lld", info->id, info->cost.code, info->cost.lineNum, info->cost.numOfSTables, info->cost.numOfCTables, info->cost.numOfCreateSTables, @@ -1782,7 +1748,7 @@ static int smlInsertLines(SSmlHandle *info, char* lines[], int numLines) { cleanup: info->cost.code = code; - printStatisticInfo(info); + smlPrintStatisticInfo(info); return code; } diff --git a/source/common/src/tname.c b/source/common/src/tname.c index f4755f5b5e..62ba4bfb79 100644 --- a/source/common/src/tname.c +++ b/source/common/src/tname.c @@ -15,6 +15,8 @@ #define _DEFAULT_SOURCE #include "tname.h" +#include "tcommon.h" +#include "tstrbuild.h" #define VALID_NAME_TYPE(x) ((x) == TSDB_DB_NAME_T || (x) == TSDB_TABLE_NAME_T) @@ -294,4 +296,43 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) { return 0; } +static int compareKv(const void* p1, const void* p2) { + SSmlKv* kv1 = *(SSmlKv**)p1; + SSmlKv* kv2 = *(SSmlKv**)p2; + int32_t kvLen1 = kv1->keyLen; + int32_t kvLen2 = kv2->keyLen; + int32_t res = strncasecmp(kv1->key, kv2->key, TMIN(kvLen1, kvLen2)); + if (res != 0) { + return res; + } else { + return kvLen1-kvLen2; + } +} +/* + * use stable name and tags to grearate child table name + */ +void buildChildTableName(RandTableName *rName) { + int32_t size = taosArrayGetSize(rName->tags); + ASSERT(size > 0); + taosArraySort(rName->tags, compareKv); + + SStringBuilder sb = {0}; + taosStringBuilderAppendStringLen(&sb, rName->sTableName, rName->sTableNameLen); + for (int j = 0; j < size; ++j) { + SSmlKv *tagKv = taosArrayGetP(rName->tags, j); + taosStringBuilderAppendStringLen(&sb, tagKv->key, tagKv->keyLen); + taosStringBuilderAppendStringLen(&sb, tagKv->value, tagKv->valueLen); + } + size_t len = 0; + char* keyJoined = taosStringBuilderGetResult(&sb, &len); + T_MD5_CTX context; + tMD5Init(&context); + tMD5Update(&context, (uint8_t *)keyJoined, (uint32_t)len); + tMD5Final(&context); + uint64_t digest1 = *(uint64_t*)(context.digest); + uint64_t digest2 = *(uint64_t*)(context.digest + 8); + snprintf(rName->childTableName, TSDB_TABLE_NAME_LEN, "t_%016"PRIx64"%016"PRIx64, digest1, digest2); + taosStringBuilderDestroy(&sb); + rName->uid = digest1; +}