diff --git a/source/dnode/vnode/src/tsdb/tsdbRead2.c b/source/dnode/vnode/src/tsdb/tsdbRead2.c index 047ee66b8f..b7f97771da 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead2.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead2.c @@ -119,7 +119,7 @@ int32_t pkCompEx(__compar_fn_t comparFn, SRowKey* p1, SRowKey* p2) { return ret > 0 ? 1 : -1; } } else { - return comparFn(&p1->pks[0].val, &p2->pks[0].val); + return p1->pks[0].val - p2->pks[0].val; } } } @@ -396,7 +396,7 @@ _err: } bool shouldFreePkBuf(SBlockLoadSuppInfo *pSupp) { - return pSupp->numOfPks > 0 && IS_VAR_DATA_TYPE(pSupp->pk.type); + return (pSupp->numOfPks > 0) && IS_VAR_DATA_TYPE(pSupp->pk.type); } void resetDataBlockIterator(SDataBlockIter* pIter, int32_t order, bool needFree) { @@ -824,18 +824,13 @@ static int32_t loadFileBlockBrinInfo(STsdbReader* pReader, SArray* pIndexList, S return TSDB_CODE_SUCCESS; } -// todo keep the the last returned key static void setBlockAllDumped(SFileBlockDumpInfo* pDumpInfo, int64_t maxKey, int32_t order) { -// int32_t step = ASCENDING_TRAVERSE(order) ? 1 : -1; pDumpInfo->allDumped = true; -// ASSERT(0); -// pDumpInfo->lastKey.key.ts = maxKey + step; } static void updateLastKeyInfo(SRowKey* pKey, SFileDataBlockInfo* pBlockInfo, SDataBlockInfo* pInfo, int32_t numOfPks, bool asc) { pKey->ts = asc ? pInfo->window.ekey : pInfo->window.skey; - pKey->numOfPKs = numOfPks; if (pKey->numOfPKs <= 0) { return; @@ -845,7 +840,7 @@ static void updateLastKeyInfo(SRowKey* pKey, SFileDataBlockInfo* pBlockInfo, SDa pKey->pks[0].val = asc ? pBlockInfo->lastPk.val : pBlockInfo->firstPk.val; } else { uint8_t* p = asc ? pBlockInfo->lastPk.pData : pBlockInfo->firstPk.pData; - pKey->pks[0].nData = asc ? pBlockInfo->lastPKLen : pBlockInfo->firstPKLen; + pKey->pks[0].nData = asc ? varDataLen(pBlockInfo->lastPk.pData) : varDataLen(pBlockInfo->firstPk.pData); memcpy(pKey->pks[0].pData, p, pKey->pks[0].nData); } } @@ -2841,11 +2836,11 @@ static void buildCleanBlockFromDataFiles(STsdbReader* pReader, STableBlockScanIn pInfo->pks[0].val = pBlockInfo->firstPk.val; pInfo->pks[1].val = pBlockInfo->lastPk.val; } else { - memcpy(pInfo->pks[0].pData, pBlockInfo->firstPk.pData, pBlockInfo->firstPKLen); - memcpy(pInfo->pks[1].pData, pBlockInfo->lastPk.pData, pBlockInfo->lastPKLen); + memcpy(pInfo->pks[0].pData, varDataVal(pBlockInfo->firstPk.pData), varDataLen(pBlockInfo->firstPk.pData)); + memcpy(pInfo->pks[1].pData, varDataVal(pBlockInfo->lastPk.pData), varDataLen(pBlockInfo->lastPk.pData)); - pInfo->pks[0].nData = pBlockInfo->firstPKLen; - pInfo->pks[1].nData = pBlockInfo->lastPKLen; + pInfo->pks[0].nData = varDataLen(pBlockInfo->firstPk.pData); + pInfo->pks[1].nData = varDataLen(pBlockInfo->lastPk.pData); } } diff --git a/source/dnode/vnode/src/tsdb/tsdbReadUtil.c b/source/dnode/vnode/src/tsdb/tsdbReadUtil.c index d049aed496..ae8a6466ae 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReadUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbReadUtil.c @@ -446,17 +446,17 @@ void recordToBlockInfo(SFileDataBlockInfo* pBlockInfo, SBrinRecord* record) { if (IS_NUMERIC_TYPE(pFirstKey->pks[0].type)) { pBlockInfo->firstPk.val = pFirstKey->pks[0].val; pBlockInfo->lastPk.val = record->lastKey.key.pks[0].val; + } else { + char* p = taosMemoryCalloc(1, pFirstKey->pks[0].nData + VARSTR_HEADER_SIZE); + memcpy(varDataVal(p), pFirstKey->pks[0].pData, pFirstKey->pks[0].nData); + varDataSetLen(p, pFirstKey->pks[0].nData); + pBlockInfo->firstPk.pData = (uint8_t*)p; - pBlockInfo->firstPKLen = 0; - pBlockInfo->lastPKLen = 0; - } else { // todo handle memory alloc error, opt memory alloc perf - pBlockInfo->firstPKLen = pFirstKey->pks[0].nData; - pBlockInfo->firstPk.pData = taosMemoryCalloc(1, pBlockInfo->firstPKLen); - memcpy(pBlockInfo->firstPk.pData, pFirstKey->pks[0].pData, pBlockInfo->firstPKLen); - - pBlockInfo->lastPKLen = record->lastKey.key.pks[0].nData; - pBlockInfo->lastPk.pData = taosMemoryCalloc(1, pBlockInfo->lastPKLen); - memcpy(pBlockInfo->lastPk.pData, record->lastKey.key.pks[0].pData, pBlockInfo->lastPKLen); + int32_t keyLen = record->lastKey.key.pks[0].nData; + p = taosMemoryCalloc(1, keyLen + VARSTR_HEADER_SIZE); + memcpy(varDataVal(p), record->lastKey.key.pks[0].pData, keyLen); + varDataSetLen(p, keyLen); + pBlockInfo->lastPk.pData = (uint8_t*)p; } } } diff --git a/source/dnode/vnode/src/tsdb/tsdbReadUtil.h b/source/dnode/vnode/src/tsdb/tsdbReadUtil.h index 49bb92c7ce..581696c94a 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReadUtil.h +++ b/source/dnode/vnode/src/tsdb/tsdbReadUtil.h @@ -212,8 +212,6 @@ typedef struct SFileDataBlockInfo { uint8_t* pData; } lastPk; - int32_t firstPKLen; - int32_t lastPKLen; int64_t minVer; int64_t maxVer; int64_t blockOffset; diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index d152baf502..be6fb2983c 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -261,6 +261,7 @@ int32_t prepareDataBlockBuf(SSDataBlock* pDataBlock, SColMatchInfo* pMatchInfo) pBlockInfo->pks[0].type = pInfoData->info.type; pBlockInfo->pks[1].type = pInfoData->info.type; + // allocate enough buffer size, which is pInfoData->info.bytes if (IS_VAR_DATA_TYPE(pItem->dataType.type)) { pBlockInfo->pks[0].pData = taosMemoryCalloc(1, pInfoData->info.bytes); if (pBlockInfo->pks[0].pData == NULL) {