diff --git a/include/common/tdatablock.h b/include/common/tdatablock.h index 58fb3a6f4c..722f18c52d 100644 --- a/include/common/tdatablock.h +++ b/include/common/tdatablock.h @@ -256,7 +256,6 @@ SSDataBlock* createDataBlock(); void* blockDataDestroy(SSDataBlock* pBlock); void blockDataFreeRes(SSDataBlock* pBlock); SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData); -SSDataBlock* createBlockDataNotLoaded(SSDataBlock* pDataBlock); SSDataBlock* createSpecialDataBlock(EStreamType type); SSDataBlock* blockCopyOneRow(const SSDataBlock* pDataBlock, int32_t rowIdx); @@ -283,6 +282,8 @@ int32_t buildCtbNameByGroupIdImpl(const char* stbName, uint64_t groupId, char* p void trimDataBlock(SSDataBlock* pBlock, int32_t totalRows, const bool* pBoolList); +void copyPkVal(SDataBlockInfo* pDst, const SDataBlockInfo* pSrc); + #ifdef __cplusplus } #endif diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 7b4d20238c..7b0de5adcf 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -21,7 +21,7 @@ #define MALLOC_ALIGN_BYTES 32 -static void copyPkVal(SDataBlockInfo* pDst, const SDataBlockInfo* pSrc); + int32_t colDataGetLength(const SColumnInfoData* pColumnInfoData, int32_t numOfRows) { if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) { @@ -1733,62 +1733,6 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData) { return pDstBlock; } -SSDataBlock* createBlockDataNotLoaded(SSDataBlock* pDataBlock) { - if (pDataBlock == NULL) { - return NULL; - } - - SSDataBlock* pDstBlock = createDataBlock(); - pDstBlock->info = pDataBlock->info; - - pDstBlock->info.rows = 0; - pDstBlock->info.capacity = 0; - pDstBlock->info.rowSize = 0; - pDstBlock->info.id = pDataBlock->info.id; - pDstBlock->info.blankFill = pDataBlock->info.blankFill; - - size_t numOfCols = taosArrayGetSize(pDataBlock->pDataBlock); - for (int32_t i = 0; i < numOfCols; ++i) { - SColumnInfoData* p = taosArrayGet(pDataBlock->pDataBlock, i); - SColumnInfoData colInfo = {.hasNull = true, .info = p->info}; - blockDataAppendColInfo(pDstBlock, &colInfo); - } - - copyPkVal(&pDstBlock->info, &pDataBlock->info); - - int32_t code = blockDataEnsureCapacity(pDstBlock, pDataBlock->info.rows); - if (code != TSDB_CODE_SUCCESS) { - terrno = code; - blockDataDestroy(pDstBlock); - return NULL; - } - - for (int32_t i = 0; i < numOfCols; ++i) { - SColumnInfoData* pDst = taosArrayGet(pDstBlock->pDataBlock, i); - SColumnInfoData* pSrc = taosArrayGet(pDataBlock->pDataBlock, i); - colDataAssign(pDst, pSrc, pDataBlock->info.rows, &pDataBlock->info); - } - - pDstBlock->info.rows = pDataBlock->info.rows; - pDstBlock->info.capacity = pDataBlock->info.rows; - - pDstBlock->pBlockAgg = pDataBlock->pBlockAgg; - pDataBlock->pBlockAgg = NULL; - // int numOfSlots = sizeof(pDataBlock->pBlockAgg)/POINTER_BYTES; - // if (pDataBlock->pBlockAgg != NULL) { - // pDstBlock->pBlockAgg = taosMemoryCalloc(numOfSlots, POINTER_BYTES); - // if (pDstBlock->pBlockAgg == NULL) { - // terrno = TSDB_CODE_OUT_OF_MEMORY; - // return NULL; - // } - // for (int j = 0; j < numOfSlots; ++j) { - // pDstBlock->pBlockAgg[j] = &(*pDataBlock->pBlockAgg)[j]; - // } - // } - - return pDstBlock; -} - SSDataBlock* createDataBlock() { SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock)); if (pBlock == NULL) { diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 714c25aa3f..c44ba4eecb 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -565,6 +565,67 @@ _error: return NULL; } +SSDataBlock* createBlockDataNotLoaded(const SOperatorInfo* pOperator, SSDataBlock* pDataBlock) { + if (pDataBlock == NULL) { + return NULL; + } + + SSDataBlock* pDstBlock = createDataBlock(); + pDstBlock->info = pDataBlock->info; + + pDstBlock->info.rows = 0; + pDstBlock->info.capacity = 0; + pDstBlock->info.rowSize = 0; + pDstBlock->info.id = pDataBlock->info.id; + pDstBlock->info.blankFill = pDataBlock->info.blankFill; + + size_t numOfCols = taosArrayGetSize(pDataBlock->pDataBlock); + + pDstBlock->pBlockAgg = taosMemoryCalloc(numOfCols, sizeof(SColumnDataAgg)); + if (pDstBlock->pBlockAgg == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } + copyPkVal(&pDstBlock->info, &pDataBlock->info); + + for (int32_t i = 0; i < pOperator->exprSupp.numOfExprs; ++i) { + SExprInfo* pExpr = &pOperator->exprSupp.pExprInfo[i]; + int32_t slotId = pExpr->base.pParam[0].pCol->slotId; + SColumnInfoData* pSrc = taosArrayGet(pDataBlock->pDataBlock, slotId); + if (pSrc) { + SColumnInfoData colInfo = {.hasNull = true, .info = pSrc->info}; + blockDataAppendColInfo(pDstBlock, &colInfo); + } + } + + int32_t code = blockDataEnsureCapacity(pDstBlock, pDataBlock->info.rows); + if (code != TSDB_CODE_SUCCESS) { + terrno = code; + blockDataDestroy(pDstBlock); + return NULL; + } + + for (int32_t i = 0; i < pOperator->exprSupp.numOfExprs; ++i) { + SExprInfo* pExpr = &pOperator->exprSupp.pExprInfo[i]; + int32_t slotId = pExpr->base.pParam[0].pCol->slotId; + if (slotId < numOfCols) { + pDstBlock->pBlockAgg[slotId] = pDataBlock->pBlockAgg[i]; + pDstBlock->pBlockAgg[slotId].colId = i; + } + + // SColumnInfoData* pSrc = taosArrayGet(pDataBlock->pDataBlock, slotId); + // if (pSrc) { + // SColumnInfoData* pDst = taosArrayGet(pDstBlock->pDataBlock, i); + // colDataAssign(pDst, pSrc, pDataBlock->info.rows, &pDataBlock->info); + // } + } + + pDstBlock->info.rows = pDataBlock->info.rows; + pDstBlock->info.capacity = pDataBlock->info.rows; + + return pDstBlock; +} + static void doHashPartition(SOperatorInfo* pOperator, SSDataBlock* pBlock) { SPartitionOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -653,7 +714,7 @@ static void doHashPartition(SOperatorInfo* pOperator, SSDataBlock* pBlock) { setBufPageDirty(pPage, true); releaseBufPage(pInfo->pBuf, pPage); } else { - SSDataBlock* dataNotLoadBlock = createBlockDataNotLoaded(pBlock); + SSDataBlock* dataNotLoadBlock = createBlockDataNotLoaded(pOperator, pBlock); if (dataNotLoadBlock == NULL) { T_LONG_JMP(pTaskInfo->env, terrno); }