diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index 0b34e882c8..292e7f561a 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -182,7 +182,7 @@ void tColDataClear(SColData *pColData); void tColDataDeepClear(SColData *pColData); int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal); int32_t tColDataUpdateValue(SColData *pColData, SColVal *pColVal, bool forward); -void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal); +int32_t tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal); uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal); int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMalloc, void *arg); void tColDataArrGetRowKey(SColData *aColData, int32_t nColData, int32_t iRow, SRowKey *key); diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index f1aacfed15..4d231c82f3 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -2671,8 +2671,12 @@ static void (*tColDataGetValueImpl[])(SColData *pColData, int32_t iVal, SColVal tColDataGetValue6, // HAS_VALUE | HAS_NULL tColDataGetValue7 // HAS_VALUE | HAS_NULL | HAS_NONE }; -void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) { +int32_t tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) { + if (iVal < 0 && iVal >= pColData->nVal || pColData->flag <= 0){ + return TSDB_CODE_INVALID_PARA; + } tColDataGetValueImpl[pColData->flag](pColData, iVal, pColVal); + return TSDB_CODE_SUCCESS; } uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal) { @@ -3436,7 +3440,10 @@ static int32_t tColDataCopyRowAppend(SColData *aFromColData, int32_t iFromRow, S for (int32_t i = 0; i < nColData; i++) { SColVal cv = {0}; - tColDataGetValue(&aFromColData[i], iFromRow, &cv); + code = tColDataGetValue(&aFromColData[i], iFromRow, &cv); + if (code != TSDB_CODE_SUCCESS) { + return code; + } code = tColDataAppendValue(&aToColData[i], &cv); if (code != TSDB_CODE_SUCCESS) { return code; @@ -3575,7 +3582,10 @@ static int32_t tColDataMerge(SArray **colArr) { SColData *dstCol = taosArrayGet(dst, j); SColVal cv; - tColDataGetValue(srcCol, i, &cv); + code = tColDataGetValue(srcCol, i, &cv); + if (code != TSDB_CODE_SUCCESS) { + goto _exit; + } code = tColDataAppendValue(dstCol, &cv); if (code) { goto _exit; @@ -3588,7 +3598,10 @@ static int32_t tColDataMerge(SArray **colArr) { SColData *dstCol = taosArrayGet(dst, j); SColVal cv; - tColDataGetValue(srcCol, i, &cv); + code = tColDataGetValue(srcCol, i, &cv); + if (code != TSDB_CODE_SUCCESS) { + goto _exit; + } code = tColDataUpdateValue(dstCol, &cv, true); if (code) { goto _exit; diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index c0c4c4a5a3..a2b6194375 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -796,7 +796,8 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char* sourceIdx++; } else if (pCol->cid == pColData->info.colId) { for (int32_t i = 0; i < pCol->nVal; i++) { - tColDataGetValue(pCol, i, &colVal); + code = tColDataGetValue(pCol, i, &colVal); + TSDB_CHECK_CODE(code, line, END); code = doSetVal(pColData, i, &colVal); TSDB_CHECK_CODE(code, line, END); } @@ -937,7 +938,7 @@ static int32_t tqProcessColData(STqReader* pReader, SSubmitTbData* pSubmitTbData pCol = taosArrayGet(pCols, j); TQ_NULL_GO_TO_END(pCol); SColVal colVal = {0}; - tColDataGetValue(pCol, i, &colVal); + TQ_ERR_GO_TO_END(tColDataGetValue(pCol, i, &colVal)); PROCESS_VAL } @@ -961,7 +962,7 @@ static int32_t tqProcessColData(STqReader* pReader, SSubmitTbData* pSubmitTbData SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, targetIdx); TQ_NULL_GO_TO_END(pColData); SColVal colVal = {0}; - tColDataGetValue(pCol, i, &colVal); + TQ_ERR_GO_TO_END(tColDataGetValue(pCol, i, &colVal)); SET_DATA } diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 5151ea3958..4dff1d08d9 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -1715,7 +1715,7 @@ int32_t tsdbCacheColFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SBlo uint8_t colType = tColDataGetBitValue(pColData, tRow.iRow); if (colType == 2) { SColVal colVal = COL_VAL_NONE(pColData->cid, pColData->type); - tColDataGetValue(pColData, tRow.iRow, &colVal); + TAOS_CHECK_GOTO(tColDataGetValue(pColData, tRow.iRow, &colVal), &lino, _exit); SLastUpdateCtx updateCtx = {.lflag = LFLAG_LAST, .tsdbRowKey = tsdbRowKey, .colVal = colVal}; if (!taosArrayPush(ctxArray, &updateCtx)) { diff --git a/source/dnode/vnode/src/tsdb/tsdbRead2.c b/source/dnode/vnode/src/tsdb/tsdbRead2.c index 05ae4be74b..c7d0e3b7b8 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead2.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead2.c @@ -123,7 +123,8 @@ static int32_t tColRowGetPriamyKeyDeepCopy(SBlockData* pBlock, int32_t irow, int pColData = &pBlock->aColData[slotId]; - tColDataGetValue(pColData, irow, &cv); + code = tColDataGetValue(pColData, irow, &cv); + TSDB_CHECK_CODE(code, lino, _end); pKey->numOfPKs = 1; pKey->pks[0].type = cv.value.type; @@ -1603,7 +1604,8 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, SRowKey* pLastPro TSDB_CHECK_CODE(code, lino, _end); } else { // varchar/nchar type for (int32_t j = pDumpInfo->rowIndex; rowIndex < dumpedRows; j += step) { - tColDataGetValue(pData, j, &cv); + code = tColDataGetValue(pData, j, &cv); + TSDB_CHECK_CODE(code, lino, _end); code = doCopyColVal(pColData, rowIndex++, i, &cv, pSupInfo); TSDB_CHECK_CODE(code, lino, _end); } @@ -5282,7 +5284,8 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S SColumnInfoData* pCol = TARRAY_GET_ELEM(pResBlock->pDataBlock, pSupInfo->slotId[i]); if (pData->cid == pSupInfo->colId[i]) { - tColDataGetValue(pData, rowIndex, &cv); + code = tColDataGetValue(pData, rowIndex, &cv); + TSDB_CHECK_CODE(code, lino, _end); code = doCopyColVal(pCol, outputRowIndex, i, &cv, pSupInfo); TSDB_CHECK_CODE(code, lino, _end); j += 1; diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 16f6777765..88c6ac3d00 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -622,7 +622,9 @@ void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal * SColData *pColData = tBlockDataGetColData(pRow->pBlockData, pTColumn->colId); if (pColData) { - tColDataGetValue(pColData, pRow->iRow, pColVal); + if (tColDataGetValue(pColData, pRow->iRow, pColVal) != 0){ + tsdbError("failed to tColDataGetValue"); + } } else { *pColVal = COL_VAL_NONE(pTColumn->colId, pTColumn->type); } @@ -645,7 +647,9 @@ void tColRowGetPrimaryKey(SBlockData *pBlock, int32_t irow, SRowKey *key) { SColData *pColData = &pBlock->aColData[i]; if (pColData->cflag & COL_IS_KEY) { SColVal cv; - tColDataGetValue(pColData, irow, &cv); + if (tColDataGetValue(pColData, irow, &cv) != 0){ + break; + } key->pks[key->numOfPKs] = cv.value; key->numOfPKs++; } else { @@ -719,7 +723,9 @@ SColVal *tsdbRowIterNext(STSDBRowIter *pIter) { } if (pIter->iColData <= pIter->pRow->pBlockData->nColData) { - tColDataGetValue(&pIter->pRow->pBlockData->aColData[pIter->iColData - 1], pIter->pRow->iRow, &pIter->cv); + if (tColDataGetValue(&pIter->pRow->pBlockData->aColData[pIter->iColData - 1], pIter->pRow->iRow, &pIter->cv) != 0){ + return NULL; + } ++pIter->iColData; return &pIter->cv; } else { @@ -1251,7 +1257,8 @@ static int32_t tBlockDataUpsertBlockRow(SBlockData *pBlockData, SBlockData *pBlo cv = COL_VAL_NONE(pColDataTo->cid, pColDataTo->type); if (flag == 0 && (code = tColDataAppendValue(pColDataTo, &cv))) goto _exit; } else { - tColDataGetValue(pColDataFrom, iRow, &cv); + code = tColDataGetValue(pColDataFrom, iRow, &cv); + if (code) goto _exit; if (flag) { code = tColDataUpdateValue(pColDataTo, &cv, flag > 0);