From 44fa1636f2fd91d8bcd107dbf2b3d57ea0eb51ab Mon Sep 17 00:00:00 2001 From: Shungang Li Date: Mon, 22 Jul 2024 16:58:13 +0800 Subject: [PATCH] fix: (last cache) compare pk when merging ctb data --- source/dnode/vnode/src/tsdb/tsdbCacheRead.c | 35 ++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCacheRead.c b/source/dnode/vnode/src/tsdb/tsdbCacheRead.c index 46c3ba4785..4eec3b87a6 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCacheRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbCacheRead.c @@ -294,6 +294,14 @@ void* tsdbCacherowsReaderClose(void* pReader) { taosMemoryFree(p->pCurrSchema); + if (p->rowKey.numOfPKs > 0) { + for (int32_t i = 0; i < p->rowKey.numOfPKs; i++) { + if (IS_VAR_DATA_TYPE(p->rowKey.pks[i].type)) { + taosMemoryFree(p->rowKey.pks[i].pData); + } + } + } + if (p->pLDataIterArray) { destroySttBlockReader(p->pLDataIterArray, NULL); } @@ -327,6 +335,12 @@ void* tsdbCacherowsReaderClose(void* pReader) { static void freeItem(void* pItem) { SLastCol* pCol = (SLastCol*)pItem; + for (int i = 0; i < pCol->rowKey.numOfPKs; i++) { + if (IS_VAR_DATA_TYPE(pCol->rowKey.pks[i].type)) { + taosMemoryFree(pCol->rowKey.pks[i].pData); + } + } + if (IS_VAR_DATA_TYPE(pCol->colVal.value.type) && pCol->colVal.value.pData) { taosMemoryFree(pCol->colVal.value.pData); } @@ -407,6 +421,16 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32 struct STColumn* pCol = &pr->pSchema->columns[slotId]; SLastCol p = {.rowKey.ts = INT64_MIN, .colVal.value.type = pCol->type, .colVal.flag = CV_FLAG_NULL}; + if (pr->rowKey.numOfPKs > 0) { + p.rowKey.numOfPKs = pr->rowKey.numOfPKs; + for (int32_t j = 0; j < pr->rowKey.numOfPKs; j++) { + p.rowKey.pks[j].type = pr->pkColumn.type; + if (IS_VAR_DATA_TYPE(pr->pkColumn.type)) { + p.rowKey.pks[j].pData = taosMemoryCalloc(1, pr->pkColumn.bytes); + } + } + } + if (IS_VAR_DATA_TYPE(pCol->type)) { p.colVal.value.pData = taosMemoryCalloc(pCol->bytes, sizeof(char)); } @@ -432,7 +456,7 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32 SLastCol* p = taosArrayGet(pLastCols, k); SLastCol* pColVal = (SLastCol*)taosArrayGet(pRow, k); - if (pColVal->rowKey.ts > p->rowKey.ts) { + if (tRowKeyCompare(&pColVal->rowKey, &p->rowKey) > 0) { if (!COL_VAL_IS_VALUE(&pColVal->colVal) && HASTYPE(pr->type, CACHESCAN_RETRIEVE_LAST)) { if (!COL_VAL_IS_VALUE(&p->colVal)) { hasNotNullRow = false; @@ -445,6 +469,15 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32 hasRes = true; p->rowKey.ts = pColVal->rowKey.ts; + for (int32_t j = 0; j < p->rowKey.numOfPKs; j++) { + if (IS_VAR_DATA_TYPE(p->rowKey.pks[j].type)) { + memcpy(p->rowKey.pks[j].pData, pColVal->rowKey.pks[j].pData, pColVal->rowKey.pks[j].nData); + p->rowKey.pks[j].nData = pColVal->rowKey.pks[j].nData; + } else { + p->rowKey.pks[j].val = pColVal->rowKey.pks[j].val; + } + } + if (k == 0) { if (TARRAY_SIZE(pTableUidList) == 0) { taosArrayPush(pTableUidList, &uid);