diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c index 115a61f647..421d153230 100644 --- a/source/libs/executor/src/cachescanoperator.c +++ b/source/libs/executor/src/cachescanoperator.c @@ -87,8 +87,11 @@ static void setColIdForCacheReadBlock(SSDataBlock* pBlock, SLastRowScanPhysiNode SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SReadHandle* readHandle, STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo) { int32_t code = TSDB_CODE_SUCCESS; + int32_t numOfCols = 0; + SNodeList* pScanCols = pScanNode->scan.pScanCols; SCacheRowsScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SCacheRowsScanInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); + if (pInfo == NULL || pOperator == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; tableListDestroy(pTableListInfo); @@ -101,22 +104,32 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe SDataBlockDescNode* pDescNode = pScanNode->scan.node.pOutputDataBlockDesc; pInfo->pRes = createDataBlockFromDescNode(pDescNode); - int32_t numOfCols = 0; - code = - extractColMatchInfo(pScanNode->scan.pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo); + code = extractColMatchInfo(pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo); if (code != TSDB_CODE_SUCCESS) { goto _error; } - // todd: the pk information should comes from the physical plan - for(int32_t i = 0; i < taosArrayGetSize(pInfo->matchInfo.pList); ++i) { - SColMatchItem* pItem = taosArrayGet(pInfo->matchInfo.pList, i); - if (pItem->isPk) { - pInfo->numOfPks += 1; - pInfo->pkCol.type = pItem->dataType.type; // only record one primary key - pInfo->pkCol.bytes = pItem->dataType.bytes; // only record one primary key + // todo: the pk information should comes from the physical plan + // pk info may not in pScanCols, so extract primary key from pInfo->matchInfo may failed + SSchemaInfo* pSchemaInfo = taosArrayGet(pTaskInfo->schemaInfos, 0); + if (pSchemaInfo != NULL) { + if (pSchemaInfo->sw->pSchema[1].flags & COL_IS_KEY) { // is primary key + SSchema* pColSchema = &pSchemaInfo->sw->pSchema[1]; + pInfo->numOfPks = 1; + pInfo->pkCol.type = pColSchema->type; + pInfo->pkCol.bytes = pColSchema->bytes; pInfo->pkCol.pk = 1; } + } else { + for(int32_t i = 0; i < taosArrayGetSize(pInfo->matchInfo.pList); ++i) { + SColMatchItem* pItem = taosArrayGet(pInfo->matchInfo.pList, i); + if (pItem->isPk) { + pInfo->numOfPks += 1; + pInfo->pkCol.type = pItem->dataType.type; // only record one primary key + pInfo->pkCol.bytes = pItem->dataType.bytes; // only record one primary key + pInfo->pkCol.pk = 1; + } + } } SArray* pCidList = taosArrayInit(numOfCols, sizeof(int16_t));