diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 7207597b84..8615f6d566 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -1110,7 +1110,7 @@ int32_t metaFilterCreateTime(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) int32_t valid = 0; int32_t count = 0; - static const int8_t TRY_ERROR_LIMIT = 4; + static const int8_t TRY_ERROR_LIMIT = 1; do { void *entryKey = NULL; int32_t nEntryKey = -1; @@ -1118,15 +1118,14 @@ int32_t metaFilterCreateTime(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) if (valid < 0) break; SCtimeIdxKey *p = entryKey; + if (count > TRY_ERROR_LIMIT) break; int32_t cmp = (*param->filterFunc)((void *)&p->ctime, (void *)&pCtimeKey->ctime, param->type); if (cmp == 0) taosArrayPush(pUids, &p->uid); else { + if (param->equal == true) break; count++; - if (count >= TRY_ERROR_LIMIT) { - break; - } } valid = param->reverse ? tdbTbcMoveToPrev(pCursor->pCur) : tdbTbcMoveToNext(pCursor->pCur); if (valid < 0) break; @@ -1168,23 +1167,23 @@ int32_t metaFilterTableName(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) { int32_t valid = 0; int32_t count = 0; - int32_t TRY_ERROR_LIMIT = 4; + int32_t TRY_ERROR_LIMIT = 1; do { void *pEntryKey = NULL, *pEntryVal = NULL; int32_t nEntryKey = -1, nEntryVal = 0; valid = tdbTbcGet(pCursor->pCur, (const void **)pEntryKey, &nEntryKey, (const void **)&pEntryVal, &nEntryVal); if (valid < 0) break; + if (count > TRY_ERROR_LIMIT) break; + char *pTableKey = (char *)pEntryKey; cmp = (*param->filterFunc)(pTableKey, pName, pCursor->type); if (cmp == 0) { tb_uid_t tuid = *(tb_uid_t *)pEntryVal; taosArrayPush(pUids, &tuid); } else { + if (param->equal == true) break; count++; - if (count >= TRY_ERROR_LIMIT) { - break; - } } valid = param->reverse ? tdbTbcMoveToPrev(pCursor->pCur) : tdbTbcMoveToNext(pCursor->pCur); if (valid < 0) { @@ -1293,7 +1292,7 @@ int32_t metaFilterTableIds(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) { int count = 0; int32_t valid = 0; - static const int8_t TRY_ERROR_LIMIT = 4; + static const int8_t TRY_ERROR_LIMIT = 1; do { void *entryKey = NULL, *entryVal = NULL; int32_t nEntryKey, nEntryVal; @@ -1302,7 +1301,7 @@ int32_t metaFilterTableIds(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) { if (valid < 0) { break; } - if (count >= TRY_ERROR_LIMIT) { + if (count > TRY_ERROR_LIMIT) { break; } @@ -1330,7 +1329,8 @@ int32_t metaFilterTableIds(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) { } taosArrayPush(pUids, &tuid); } else { - // opt later + if (param->equal == true) break; + count++; } valid = param->reverse ? tdbTbcMoveToPrev(pCursor->pCur) : tdbTbcMoveToNext(pCursor->pCur); if (valid < 0) { diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index 7b226a0391..97b76ec7c5 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -134,7 +134,7 @@ static SSDataBlock* buildInfoSchemaTableMetaBlock(char* tableName); static void destroySysScanOperator(void* param); static int32_t loadSysTableCallback(void* param, SDataBuf* pMsg, int32_t code); static SSDataBlock* doFilterResult(SSDataBlock* pDataBlock, SFilterInfo* pFilterInfo); -static __optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse); +static __optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal); static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable, SMetaReader* smrChildTable, const char* dbname, const char* tableName, @@ -164,7 +164,8 @@ int32_t sysFilte__DbName(void* arg, SNode* pNode, SArray* result) { SValueNode* pVal = (SValueNode*)pOper->pRight; bool reverse = false; - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; int ret = func(dbname, pVal->datum.p, TSDB_DATA_TYPE_VARCHAR); @@ -182,9 +183,9 @@ int32_t sysFilte__VgroupId(void* arg, SNode* pNode, SArray* result) { SOperatorNode* pOper = (SOperatorNode*)pNode; SValueNode* pVal = (SValueNode*)pOper->pRight; - bool reverse = false; - - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool reverse = false; + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; int ret = func(&vgId, &pVal->datum.i, TSDB_DATA_TYPE_BIGINT); @@ -199,8 +200,8 @@ int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result) { SOperatorNode* pOper = (SOperatorNode*)pNode; SValueNode* pVal = (SValueNode*)pOper->pRight; bool reverse = false; - - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; SMetaFltParam param = {.suid = 0, @@ -208,6 +209,7 @@ int32_t sysFilte__TableName(void* arg, SNode* pNode, SArray* result) { .type = TSDB_DATA_TYPE_VARCHAR, .val = pVal->datum.p, .reverse = reverse, + .equal = equal, .filterFunc = func}; return -1; } @@ -219,7 +221,8 @@ int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result) { SValueNode* pVal = (SValueNode*)pOper->pRight; bool reverse = false; - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; SMetaFltParam param = {.suid = 0, @@ -227,6 +230,7 @@ int32_t sysFilte__CreateTime(void* arg, SNode* pNode, SArray* result) { .type = TSDB_DATA_TYPE_BIGINT, .val = &pVal->datum.i, .reverse = reverse, + .equal = equal, .filterFunc = func}; int32_t ret = metaFilterCreateTime(pMeta, ¶m, result); @@ -239,8 +243,8 @@ int32_t sysFilte__Ncolumn(void* arg, SNode* pNode, SArray* result) { SOperatorNode* pOper = (SOperatorNode*)pNode; SValueNode* pVal = (SValueNode*)pOper->pRight; bool reverse = false; - - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; return -1; } @@ -251,8 +255,8 @@ int32_t sysFilte__Ttl(void* arg, SNode* pNode, SArray* result) { SOperatorNode* pOper = (SOperatorNode*)pNode; SValueNode* pVal = (SValueNode*)pOper->pRight; bool reverse = false; - - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; return -1; } @@ -263,8 +267,8 @@ int32_t sysFilte__STableName(void* arg, SNode* pNode, SArray* result) { SOperatorNode* pOper = (SOperatorNode*)pNode; SValueNode* pVal = (SValueNode*)pOper->pRight; bool reverse = false; - - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; return -1; } @@ -275,8 +279,8 @@ int32_t sysFilte__Uid(void* arg, SNode* pNode, SArray* result) { SOperatorNode* pOper = (SOperatorNode*)pNode; SValueNode* pVal = (SValueNode*)pOper->pRight; bool reverse = false; - - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; return -1; } @@ -287,8 +291,8 @@ int32_t sysFilte__Type(void* arg, SNode* pNode, SArray* result) { SOperatorNode* pOper = (SOperatorNode*)pNode; SValueNode* pVal = (SValueNode*)pOper->pRight; bool reverse = false; - - __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse); + bool equal = false; + __optSysFilter func = optSysGetFilterFunc(pOper->opType, &reverse, &equal); if (func == NULL) return -1; return -1; } @@ -359,10 +363,13 @@ void extractTbnameSlotId(SSysTableScanInfo* pInfo, const SScanPhy static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name, SSDataBlock* pBlock); -__optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse) { +__optSysFilter optSysGetFilterFunc(int32_t ctype, bool* reverse, bool* equal) { if (ctype == OP_TYPE_LOWER_EQUAL || ctype == OP_TYPE_LOWER_THAN) { *reverse = true; } + if (ctype == OP_TYPE_EQUAL) { + *equal = true; + } if (ctype == OP_TYPE_LOWER_THAN) return optSysFilterFuncImpl__LowerThan; else if (ctype == OP_TYPE_LOWER_EQUAL) diff --git a/source/libs/index/src/indexFilter.c b/source/libs/index/src/indexFilter.c index b6a046bf9d..b659abc6e8 100644 --- a/source/libs/index/src/indexFilter.c +++ b/source/libs/index/src/indexFilter.c @@ -390,11 +390,6 @@ static FORCE_INLINE FilterFunc sifGetFilterFunc(EIndexQueryType type, bool *reve *reverse = false; } - if (type == QUERY_LESS_EQUAL || type == QUERY_GREATER_EQUAL) { - *equal = true; - } else { - *equal = false; - } if (type == QUERY_LESS_EQUAL) return sifLessEqual; else if (type == QUERY_LESS_THAN) @@ -404,6 +399,7 @@ static FORCE_INLINE FilterFunc sifGetFilterFunc(EIndexQueryType type, bool *reve else if (type == QUERY_GREATER_THAN) return sifGreaterThan; else if (type == QUERY_TERM) { + *equal = true; return sifEqual; } return NULL;