From 432230a7e868f75cad56e5d34caac772c5e88511 Mon Sep 17 00:00:00 2001 From: xywang Date: Sat, 28 May 2022 13:43:26 +0800 Subject: [PATCH] fix(query): fixed related query error caused by tag mismatch --- src/query/src/qExecutor.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 08cdd88218..0ecdd55548 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -2893,7 +2893,7 @@ static bool overlapWithTimeWindow(SQueryAttr* pQueryAttr, SDataBlockInfo* pBlock return false; } -static int32_t doTSJoinFilter(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key, bool ascQuery) { +static int32_t doTSJoinFilter(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key, tVariant *pTag, bool ascQuery) { STSElem elem = tsBufGetElem(pRuntimeEnv->pTsBuf); #if defined(_DEBUG_VIEW) @@ -2902,6 +2902,10 @@ static int32_t doTSJoinFilter(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key, bool asc pRuntimeEnv->pTsBuf->cur.order, pRuntimeEnv->pTsBuf->cur.tsIndex); #endif + if (pTag && elem.tag && tVariantCompare(pTag, elem.tag) != 0) { + return TS_JOIN_TAG_NOT_EQUALS; + } + if (ascQuery) { if (key < elem.ts) { return TS_JOIN_TS_NOT_EQUALS; @@ -3028,10 +3032,16 @@ void filterRowsInDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SSingleColumnFilterInf if (pRuntimeEnv->pTsBuf != NULL) { SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, 0); + tVariant tag = { .nType = -1 }; + TSKEY* k = (TSKEY*) pColInfoData->pData; for (int32_t i = 0; i < numOfRows; ++i) { - int32_t offset = ascQuery? i:(numOfRows - i - 1); - int32_t ret = doTSJoinFilter(pRuntimeEnv, k[offset], ascQuery); + if (tag.nType == -1) { + tVariantAssign(&tag, &pRuntimeEnv->pTsBuf->block.tag); + } + + int32_t offset = ascQuery? i : (numOfRows - i - 1); + int32_t ret = doTSJoinFilter(pRuntimeEnv, k[offset], &tag, ascQuery); if (ret == TS_JOIN_TAG_NOT_EQUALS) { break; } else if (ret == TS_JOIN_TS_NOT_EQUALS) { @@ -3042,6 +3052,8 @@ void filterRowsInDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SSingleColumnFilterInf p[offset] = true; } + tVariantAssign(&tag, &pRuntimeEnv->pTsBuf->block.tag); + if (!tsBufNextPos(pRuntimeEnv->pTsBuf)) { if (i < (numOfRows - 1)) { all = false; @@ -3073,11 +3085,17 @@ void filterColRowsInDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SSDataBlock* pBlock if (pRuntimeEnv->pTsBuf != NULL) { SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, 0); p = calloc(numOfRows, sizeof(int8_t)); + + tVariant tag = { .nType = -1 }; TSKEY* k = (TSKEY*) pColInfoData->pData; for (int32_t i = 0; i < numOfRows; ++i) { - int32_t offset = ascQuery? i:(numOfRows - i - 1); - int32_t ret = doTSJoinFilter(pRuntimeEnv, k[offset], ascQuery); + if (tag.nType == -1) { + tVariantAssign(&tag, &pRuntimeEnv->pTsBuf->block.tag); + } + + int32_t offset = ascQuery? i : (numOfRows - i - 1); + int32_t ret = doTSJoinFilter(pRuntimeEnv, k[offset], &tag, ascQuery); if (ret == TS_JOIN_TAG_NOT_EQUALS) { break; } else if (ret == TS_JOIN_TS_NOT_EQUALS) { @@ -3088,6 +3106,8 @@ void filterColRowsInDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SSDataBlock* pBlock p[offset] = true; } + tVariantAssign(&tag, &pRuntimeEnv->pTsBuf->block.tag); + if (!tsBufNextPos(pRuntimeEnv->pTsBuf)) { if (i < (numOfRows - 1)) { all = false; -- GitLab