diff --git a/include/util/tarray.h b/include/util/tarray.h index 7c1bc34d71..99f09dc769 100644 --- a/include/util/tarray.h +++ b/include/util/tarray.h @@ -288,6 +288,13 @@ void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_ char* taosShowStrArray(const SArray* pArray); +/** + * swap array + * @param a + * @param b + * @return + */ +void taosArraySwap(SArray* a, SArray* b); #ifdef __cplusplus } #endif diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index e4e99316c1..07e917931b 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -1172,8 +1172,6 @@ int32_t metaGetTableTagsByUids(SMeta *pMeta, int64_t suid, SArray *uidList, SHas } else { metaError("vgId:%d, failed to table IDs, suid: %" PRId64 ", uid: %" PRId64 "", TD_VID(pMeta->pVnode), suid, *id); - if (isLock) metaULock(pMeta); - return TSDB_CODE_TDB_IVLD_TAG_VAL; } } } diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index ed5ea9545c..e6b1948026 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -26,7 +26,8 @@ #include "executorimpl.h" #include "tcompression.h" -static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond); +static int32_t removeInvalidTable(SArray* list, SHashObj* tags); +static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond, SHashObj* tags); static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond); void initResultRowInfo(SResultRowInfo* pResultRowInfo) { @@ -411,7 +412,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray* // int64_t stt = taosGetTimestampUs(); tags = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); - int32_t filter = optimizeTbnameInCond(metaHandle, suid, uidList, pTagCond); + int32_t filter = optimizeTbnameInCond(metaHandle, suid, uidList, pTagCond, tags); if (filter == -1) { code = metaGetTableTags(metaHandle, suid, uidList, tags); if (code != TSDB_CODE_SUCCESS) { @@ -419,7 +420,8 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray* terrno = code; goto end; } - } else { + } + /*else { code = metaGetTableTagsByUids(metaHandle, suid, uidList, tags); if (code != 0) { terrno = code; @@ -428,7 +430,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray* } else { qInfo("succ to get table from meta idx, suid:%" PRId64, suid); } - } + }*/ int32_t rows = taosArrayGetSize(uidList); if (rows == 0) { @@ -766,13 +768,18 @@ static int tableUidCompare(const void* a, const void* b) { } return u1 < u2 ? -1 : 1; } -static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* cond) { +static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* cond, SHashObj* tags) { + int32_t ret = -1; if (nodeType(cond) == QUERY_NODE_OPERATOR) { - return optimizeTbnameInCondImpl(metaHandle, suid, list, cond); + ret = optimizeTbnameInCondImpl(metaHandle, suid, list, cond); + if (ret != -1) { + metaGetTableTagsByUids(metaHandle, suid, list, tags); + removeInvalidTable(list, tags); + } } if (nodeType(cond) != QUERY_NODE_LOGIC_CONDITION || ((SLogicConditionNode*)cond)->condType != LOGIC_COND_TYPE_AND) { - return -1; + return ret; } bool hasTbnameCond = false; @@ -780,20 +787,44 @@ static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list SNodeList* pList = (SNodeList*)pNode->pParameterList; int32_t len = LIST_LENGTH(pList); - if (len <= 0) return -1; + if (len <= 0) return ret; SListCell* cell = pList->pHead; for (int i = 0; i < len; i++) { if (cell == NULL) break; if (optimizeTbnameInCondImpl(metaHandle, suid, list, cell->pNode) == 0) { hasTbnameCond = true; + break; } cell = cell->pNext; } taosArraySort(list, tableUidCompare); taosArrayRemoveDuplicate(list, tableUidCompare, NULL); - return hasTbnameCond == true ? 0 : -1; + if (hasTbnameCond) { + ret = metaGetTableTagsByUids(metaHandle, suid, list, tags); + removeInvalidTable(list, tags); + } + return ret; +} + +/* + * handle invalid uid + */ +static int32_t removeInvalidTable(SArray* uids, SHashObj* tags) { + if (taosArrayGetSize(uids) <= 0) return 0; + + SArray* validUid = taosArrayInit(taosArrayGetSize(uids), sizeof(int64_t)); + + for (int32_t i = 0; i < taosArrayGetSize(uids); i++) { + int64_t* uid = taosArrayGet(uids, i); + if (taosHashGet(tags, uid, sizeof(int64_t)) != NULL) { + taosArrayPush(validUid, uid); + } + } + taosArraySwap(uids, validUid); + taosArrayDestroy(validUid); + return 0; } static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond) { if (nodeType(pTagCond) != QUERY_NODE_OPERATOR) { diff --git a/source/util/src/tarray.c b/source/util/src/tarray.c index 4f170c203c..067a73d971 100644 --- a/source/util/src/tarray.c +++ b/source/util/src/tarray.c @@ -564,3 +564,21 @@ char* taosShowStrArray(const SArray* pArray) { } return res; } +void taosArraySwap(SArray* a, SArray* b) { + if (a == NULL || b == NULL) return; + size_t t = a->size; + a->size = b->size; + b->size = t; + + uint32_t cap = a->capacity; + a->capacity = b->capacity; + b->capacity = cap; + + uint32_t elem = a->elemSize; + a->elemSize = b->elemSize; + b->elemSize = elem; + + void* data = a->pData; + a->pData = b->pData; + b->pData = data; +}