From 4f16771de4067d9cecbeef1baafd7b530409e411 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 17 Aug 2022 14:45:31 +0800 Subject: [PATCH] fix:error in get table list by tag filter --- source/dnode/vnode/inc/vnode.h | 2 +- source/dnode/vnode/src/meta/metaQuery.c | 21 ++++----------------- source/libs/executor/src/executil.c | 9 +++++---- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 9d92a9c1e4..c224f6ce7f 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -91,7 +91,7 @@ typedef struct SMetaEntry SMetaEntry; void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags); void metaReaderClear(SMetaReader *pReader); int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid); -int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SArray *tags); +int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags); int32_t metaReadNext(SMetaReader *pReader); const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal); int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName); diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 9f2cf409be..29a4dd3e34 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -962,13 +962,13 @@ END: return ret; } -int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SArray *tags) { +int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) { SMCtbCursor *pCur = metaOpenCtbCursor(pMeta, suid); SHashObj *uHash = NULL; size_t len = taosArrayGetSize(uidList); // len > 0 means there already have uids if(len > 0){ - uHash = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); + uHash = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); for(int i = 0; i < len; i++){ int64_t *uid = taosArrayGet(uidList, i); taosHashPut(uHash, uid, sizeof(int64_t), &i, sizeof(i)); @@ -982,26 +982,13 @@ int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SArray *t if (len > 0 && taosHashGet(uHash, &id, sizeof(int64_t)) == NULL) { continue; - } - - void *tag = taosMemoryMalloc(pCur->vLen); - memcpy(tag, pCur->pVal, pCur->vLen); - - if (len == 0) { + }else if (len == 0) { taosArrayPush(uidList, &id); - taosArrayPush(tags, &tag); - }else{ - taosHashPut(uHash, &id, sizeof(int64_t), &tag, POINTER_BYTES); } - } - for(int i = 0; i < len; i++){ - int64_t *uid = taosArrayGet(uidList, i); - void **tag = taosHashGet(uHash, uid, POINTER_BYTES); - taosArrayPush(tags, tag); + taosHashPut(tags, &id, sizeof(int64_t), pCur->pVal, pCur->vLen); } - taosHashCleanup(uHash); metaCloseCtbCursor(pCur); return TSDB_CODE_SUCCESS; diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 9f8f97c4f5..2547b5e228 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -368,7 +368,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray int32_t code = TSDB_CODE_SUCCESS; SArray* pBlockList = NULL; SSDataBlock* pResBlock = NULL; - SArray* tags = NULL; + SHashObj * tags = NULL; SScalarParam output = {0}; tagFilterAssist ctx = {0}; @@ -399,7 +399,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray } // int64_t stt = taosGetTimestampUs(); - tags = taosArrayInit(8, POINTER_BYTES); + tags = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); code = metaGetTableTags(metaHandle, suid, uidList, tags); if (code != TSDB_CODE_SUCCESS) { terrno = code; @@ -421,8 +421,9 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray // int64_t st = taosGetTimestampUs(); for (int32_t i = 0; i < rows; i++) { - void* tag = taosArrayGetP(tags, i); int64_t* uid = taosArrayGet(uidList, i); + void* tag = taosHashGet(tags, uid, sizeof(int64_t)); + ASSERT(tag); for(int32_t j = 0; j < taosArrayGetSize(pResBlock->pDataBlock); j++){ SColumnInfoData* pColInfo = (SColumnInfoData*)taosArrayGet(pResBlock->pDataBlock, j); @@ -474,7 +475,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray // qDebug("calculate tag block rows:%d, cost:%ld us", rows, st2-st1); end: - taosArrayDestroyP(tags, taosMemoryFree); + taosHashCleanup(tags); taosHashCleanup(ctx.colHash); taosArrayDestroy(ctx.cInfoList); blockDataDestroy(pResBlock);