diff --git a/source/libs/executor/inc/executil.h b/source/libs/executor/inc/executil.h index 1c70fd8bb6..55b803f6d4 100644 --- a/source/libs/executor/inc/executil.h +++ b/source/libs/executor/inc/executil.h @@ -162,6 +162,7 @@ bool hasRemainResults(SGroupResInfo* pGroupResInfo); int32_t getNumOfTotalRes(SGroupResInfo* pGroupResInfo); SSDataBlock* createDataBlockFromDescNode(SDataBlockDescNode* pNode); +int32_t prepareDataBlockBuf(SSDataBlock* pDataBlock, SColMatchInfo* pMatchInfo); EDealRes doTranslateTagExpr(SNode** pNode, void* pContext); int32_t getGroupIdFromTagsVal(void* pVnode, uint64_t uid, SNodeList* pGroupNode, char* keyBuf, uint64_t* pGroupId, SStorageAPI* pAPI); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 97b9b00efb..9749dffc13 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -250,6 +250,34 @@ SSDataBlock* createDataBlockFromDescNode(SDataBlockDescNode* pNode) { return pBlock; } +int32_t prepareDataBlockBuf(SSDataBlock* pDataBlock, SColMatchInfo* pMatchInfo) { + SDataBlockInfo* pBlockInfo = &pDataBlock->info; + + for (int32_t i = 0; i < taosArrayGetSize(pMatchInfo->pList); ++i) { + SColMatchItem* pItem = taosArrayGet(pMatchInfo->pList, i); + if (pItem->isPk) { + SColumnInfoData* pInfoData = taosArrayGet(pDataBlock->pDataBlock, pItem->dstSlotId); + pBlockInfo->pks[0].type = pInfoData->info.type; + pBlockInfo->pks[1].type = pInfoData->info.type; + + if (IS_VAR_DATA_TYPE(pItem->dataType.type)) { + pBlockInfo->pks[0].pData = taosMemoryCalloc(1, pInfoData->info.bytes); + if (pBlockInfo->pks[0].pData == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + pBlockInfo->pks[1].pData = taosMemoryCalloc(1, pInfoData->info.bytes); + if (pBlockInfo->pks[1].pData == NULL) { + taosMemoryFreeClear(pBlockInfo->pks[0].pData); + return TSDB_CODE_OUT_OF_MEMORY; + } + } + } + } + + return TSDB_CODE_SUCCESS; +} + EDealRes doTranslateTagExpr(SNode** pNode, void* pContext) { SMetaReader* mr = (SMetaReader*)pContext; if (nodeType(*pNode) == QUERY_NODE_COLUMN) { diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index a51e627272..0d4c536dec 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1196,23 +1196,8 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, pInfo->base.readerAPI = pTaskInfo->storageAPI.tsdReader; initResultSizeInfo(&pOperator->resultInfo, 4096); pInfo->pResBlock = createDataBlockFromDescNode(pDescNode); + prepareDataBlockBuf(pInfo->pResBlock, &pInfo->base.matchInfo); - { // todo :refactor: - SDataBlockInfo* pBlockInfo = &pInfo->pResBlock->info; - for(int32_t i = 0; i < taosArrayGetSize(pInfo->base.matchInfo.pList); ++i) { - SColMatchItem* pItem = taosArrayGet(pInfo->base.matchInfo.pList, i); - if (pItem->isPk) { - SColumnInfoData* pInfoData = taosArrayGet(pInfo->pResBlock->pDataBlock, pItem->dstSlotId); - pBlockInfo->pks[0].type = pInfoData->info.type; - pBlockInfo->pks[1].type = pInfoData->info.type; - - if (IS_VAR_DATA_TYPE(pItem->dataType.type)) { - pBlockInfo->pks[0].pData = taosMemoryCalloc(1, pInfoData->info.bytes); - pBlockInfo->pks[1].pData = taosMemoryCalloc(1, pInfoData->info.bytes); - } - } - } - } code = filterInitFromNode((SNode*)pTableScanNode->scan.node.pConditions, &pOperator->exprSupp.pFilterInfo, 0); if (code != TSDB_CODE_SUCCESS) { goto _error; @@ -4418,6 +4403,8 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN pInfo->bSortRowId = false; } + prepareDataBlockBuf(pInfo->pResBlock, &pInfo->base.matchInfo); + pInfo->pSortInfo = generateSortByTsPkInfo(pInfo->base.matchInfo.pList, pInfo->base.cond.order); pInfo->pReaderBlock = createOneDataBlock(pInfo->pResBlock, false);