fix invalid tag value
This commit is contained in:
parent
c62b1985d7
commit
27003dfaa5
|
@ -288,6 +288,13 @@ void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_
|
||||||
|
|
||||||
char* taosShowStrArray(const SArray* pArray);
|
char* taosShowStrArray(const SArray* pArray);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* swap array
|
||||||
|
* @param a
|
||||||
|
* @param b
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
void taosArraySwap(SArray* a, SArray* b);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1172,8 +1172,6 @@ int32_t metaGetTableTagsByUids(SMeta *pMeta, int64_t suid, SArray *uidList, SHas
|
||||||
} else {
|
} else {
|
||||||
metaError("vgId:%d, failed to table IDs, suid: %" PRId64 ", uid: %" PRId64 "", TD_VID(pMeta->pVnode), suid,
|
metaError("vgId:%d, failed to table IDs, suid: %" PRId64 ", uid: %" PRId64 "", TD_VID(pMeta->pVnode), suid,
|
||||||
*id);
|
*id);
|
||||||
if (isLock) metaULock(pMeta);
|
|
||||||
return TSDB_CODE_TDB_IVLD_TAG_VAL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,8 @@
|
||||||
#include "executorimpl.h"
|
#include "executorimpl.h"
|
||||||
#include "tcompression.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);
|
static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond);
|
||||||
|
|
||||||
void initResultRowInfo(SResultRowInfo* pResultRowInfo) {
|
void initResultRowInfo(SResultRowInfo* pResultRowInfo) {
|
||||||
|
@ -411,7 +412,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray*
|
||||||
// int64_t stt = taosGetTimestampUs();
|
// int64_t stt = taosGetTimestampUs();
|
||||||
tags = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
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) {
|
if (filter == -1) {
|
||||||
code = metaGetTableTags(metaHandle, suid, uidList, tags);
|
code = metaGetTableTags(metaHandle, suid, uidList, tags);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -419,7 +420,8 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray*
|
||||||
terrno = code;
|
terrno = code;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
/*else {
|
||||||
code = metaGetTableTagsByUids(metaHandle, suid, uidList, tags);
|
code = metaGetTableTagsByUids(metaHandle, suid, uidList, tags);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
|
@ -428,7 +430,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, int64_t suid, SArray*
|
||||||
} else {
|
} else {
|
||||||
qInfo("succ to get table from meta idx, suid:%" PRId64, suid);
|
qInfo("succ to get table from meta idx, suid:%" PRId64, suid);
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
int32_t rows = taosArrayGetSize(uidList);
|
int32_t rows = taosArrayGetSize(uidList);
|
||||||
if (rows == 0) {
|
if (rows == 0) {
|
||||||
|
@ -766,13 +768,18 @@ static int tableUidCompare(const void* a, const void* b) {
|
||||||
}
|
}
|
||||||
return u1 < u2 ? -1 : 1;
|
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) {
|
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) {
|
if (nodeType(cond) != QUERY_NODE_LOGIC_CONDITION || ((SLogicConditionNode*)cond)->condType != LOGIC_COND_TYPE_AND) {
|
||||||
return -1;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasTbnameCond = false;
|
bool hasTbnameCond = false;
|
||||||
|
@ -780,20 +787,44 @@ static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list
|
||||||
SNodeList* pList = (SNodeList*)pNode->pParameterList;
|
SNodeList* pList = (SNodeList*)pNode->pParameterList;
|
||||||
|
|
||||||
int32_t len = LIST_LENGTH(pList);
|
int32_t len = LIST_LENGTH(pList);
|
||||||
if (len <= 0) return -1;
|
if (len <= 0) return ret;
|
||||||
|
|
||||||
SListCell* cell = pList->pHead;
|
SListCell* cell = pList->pHead;
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
if (cell == NULL) break;
|
if (cell == NULL) break;
|
||||||
if (optimizeTbnameInCondImpl(metaHandle, suid, list, cell->pNode) == 0) {
|
if (optimizeTbnameInCondImpl(metaHandle, suid, list, cell->pNode) == 0) {
|
||||||
hasTbnameCond = true;
|
hasTbnameCond = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
cell = cell->pNext;
|
cell = cell->pNext;
|
||||||
}
|
}
|
||||||
taosArraySort(list, tableUidCompare);
|
taosArraySort(list, tableUidCompare);
|
||||||
taosArrayRemoveDuplicate(list, tableUidCompare, NULL);
|
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) {
|
static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond) {
|
||||||
if (nodeType(pTagCond) != QUERY_NODE_OPERATOR) {
|
if (nodeType(pTagCond) != QUERY_NODE_OPERATOR) {
|
||||||
|
|
|
@ -564,3 +564,21 @@ char* taosShowStrArray(const SArray* pArray) {
|
||||||
}
|
}
|
||||||
return res;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue