From 63269c19de77c016adbf5d36f71b8e6d3724f0bb Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 10 Jun 2022 16:45:26 +0800 Subject: [PATCH 1/8] fix(query): fix invalid write. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 5 +++++ source/libs/executor/src/executorimpl.c | 25 ++++++------------------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 4a433a557b..d2c60047d7 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -3163,6 +3163,11 @@ bool tsdbNextDataBlock(tsdbReaderT pHandle) { size_t numOfCols = taosArrayGetSize(pTsdbReadHandle->pColumns); for (int32_t i = 0; i < numOfCols; ++i) { SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i); + int32_t code = colInfoDataEnsureCapacity(pColInfo, 0, pTsdbReadHandle->outputCapacity); + if (code != TSDB_CODE_SUCCESS) { + // todo handle error + ASSERT(0); + } colInfoDataCleanup(pColInfo, pTsdbReadHandle->outputCapacity); } diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 13f1b976dc..9a002d2d2f 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1819,7 +1819,7 @@ void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numO } } -static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowRes, bool keep, bool needFree); +static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowRes, bool keep); void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, bool needFree) { if (pFilterNode == NULL) { @@ -1840,11 +1840,11 @@ void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, bool needFree) { bool keep = filterExecute(filter, pBlock, &rowRes, NULL, param1.numOfCols); filterFreeInfo(filter); - extractQualifiedTupleByFilterResult(pBlock, rowRes, keep, needFree); + extractQualifiedTupleByFilterResult(pBlock, rowRes, keep); blockDataUpdateTsWindow(pBlock, 0); } -void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowRes, bool keep, bool needFree) { +void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowRes, bool keep) { if (keep) { return; } @@ -1884,17 +1884,9 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR ASSERT(pBlock->info.rows == numOfRows); } - SColumnInfoData tmp = *pSrc; - *pSrc = *pDst; - *pDst = tmp; - - if (!needFree) { - if (IS_VAR_DATA_TYPE(pDst->info.type)) { // this elements do not need free - pDst->varmeta.offset = NULL; - } else { - pDst->nullbitmap = NULL; - } - pDst->pData = NULL; + // write back + if (pBlock->info.rows > 0) { + colDataAssign(pSrc, pDst, pBlock->info.rows); } } blockDataDestroy(px); // fix memory leak @@ -2086,11 +2078,6 @@ static int32_t compressQueryColData(SColumnInfoData* pColRes, int32_t numOfRows, } int32_t doFillTimeIntervalGapsInResults(struct SFillInfo* pFillInfo, SSDataBlock* pBlock, int32_t capacity) { - // for(int32_t i = 0; i < pFillInfo->numOfCols; ++i) { - // SColumnInfoData* pColInfoData = taosArrayGet(pOutput->pDataBlock, i); - // p[i] = pColInfoData->pData + (pColInfoData->info.bytes * pOutput->info.rows); - // } - int32_t numOfRows = (int32_t)taosFillResultDataBlock(pFillInfo, pBlock, capacity - pBlock->info.rows); pBlock->info.rows += numOfRows; From 516750bd42c4b374fbdd4b8f35905adf784560d4 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 10 Jun 2022 23:58:17 +0800 Subject: [PATCH 2/8] refactor: remove unnecessary check. --- source/libs/executor/src/executorimpl.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 9a002d2d2f..368f6c3aba 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1885,9 +1885,7 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR } // write back - if (pBlock->info.rows > 0) { - colDataAssign(pSrc, pDst, pBlock->info.rows); - } + colDataAssign(pSrc, pDst, pBlock->info.rows); } blockDataDestroy(px); // fix memory leak } else { From afe612e369a2f6fd9544a1d34b23d4d10ab8322c Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 11 Jun 2022 00:51:59 +0800 Subject: [PATCH 3/8] refactor: remove unnecessary check. --- source/common/src/tdatablock.c | 3 ++- source/dnode/vnode/src/tsdb/tsdbRead.c | 5 ----- source/libs/executor/src/executorimpl.c | 10 ++++------ 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 66b12678ab..38be0b8f0a 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -294,7 +294,7 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, in int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* pSource, int32_t numOfRows) { ASSERT(pColumnInfoData != NULL && pSource != NULL && pColumnInfoData->info.type == pSource->info.type); - if (numOfRows == 0) { + if (numOfRows <= 0) { return numOfRows; } @@ -322,6 +322,7 @@ int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* p pColumnInfoData->varmeta.length = pSource->varmeta.length; } else { char* tmp = taosMemoryRealloc(pColumnInfoData->nullbitmap, BitmapLen(numOfRows)); + printf("----------------%d\n", BitmapLen(numOfRows)); if (tmp == NULL) { return TSDB_CODE_OUT_OF_MEMORY; } diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index d2c60047d7..4a433a557b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -3163,11 +3163,6 @@ bool tsdbNextDataBlock(tsdbReaderT pHandle) { size_t numOfCols = taosArrayGetSize(pTsdbReadHandle->pColumns); for (int32_t i = 0; i < numOfCols; ++i) { SColumnInfoData* pColInfo = taosArrayGet(pTsdbReadHandle->pColumns, i); - int32_t code = colInfoDataEnsureCapacity(pColInfo, 0, pTsdbReadHandle->outputCapacity); - if (code != TSDB_CODE_SUCCESS) { - // todo handle error - ASSERT(0); - } colInfoDataCleanup(pColInfo, pTsdbReadHandle->outputCapacity); } diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 368f6c3aba..69a61b413d 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1850,14 +1850,12 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR } if (rowRes != NULL) { - SSDataBlock* px = createOneDataBlock(pBlock, false); - blockDataEnsureCapacity(px, pBlock->info.rows); + SSDataBlock* px = createOneDataBlock(pBlock, true); int32_t totalRows = pBlock->info.rows; - for (int32_t i = 0; i < pBlock->info.numOfCols; ++i) { - SColumnInfoData* pDst = taosArrayGet(px->pDataBlock, i); - SColumnInfoData* pSrc = taosArrayGet(pBlock->pDataBlock, i); + SColumnInfoData* pSrc = taosArrayGet(px->pDataBlock, i); + SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, i); // it is a reserved column for scalar function, and no data in this column yet. if (pSrc->pData == NULL) { @@ -1885,7 +1883,7 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR } // write back - colDataAssign(pSrc, pDst, pBlock->info.rows); +// colDataAssign(pSrc, pDst, pBlock->info.rows); } blockDataDestroy(px); // fix memory leak } else { From 514e86ff26dde68298747e3d49f79d6829f3397a Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 11 Jun 2022 11:28:59 +0800 Subject: [PATCH 4/8] fix(query): clear flag before assign data. --- source/libs/executor/src/executorimpl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 69a61b413d..eda24cb0d6 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1856,12 +1856,13 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR for (int32_t i = 0; i < pBlock->info.numOfCols; ++i) { SColumnInfoData* pSrc = taosArrayGet(px->pDataBlock, i); SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, i); - // it is a reserved column for scalar function, and no data in this column yet. if (pSrc->pData == NULL) { continue; } + colInfoDataCleanup(pDst, pBlock->info.rows); + int32_t numOfRows = 0; for (int32_t j = 0; j < totalRows; ++j) { if (rowRes[j] == 0) { From 79552ed65d0d7533c48f37ac6312733fc65f11e8 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 11 Jun 2022 11:35:42 +0800 Subject: [PATCH 5/8] fix(query): add null pointer check. --- source/common/src/tdatablock.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 38be0b8f0a..61b79bb1df 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -1233,6 +1233,10 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData) { SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, i); SColumnInfoData* pSrc = taosArrayGet(pDataBlock->pDataBlock, i); + if (pSrc->pData== NULL) { + continue; + } + int32_t code = colInfoDataEnsureCapacity(pDst, 0, pDataBlock->info.rows); if (code != TSDB_CODE_SUCCESS) { return NULL; From f30ae95b9dcf1f8a6da1618e03424f95792e9326 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 11 Jun 2022 11:36:13 +0800 Subject: [PATCH 6/8] fix(query): add null pointer check. --- source/common/src/tdatablock.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 61b79bb1df..04de2738e1 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -1233,15 +1233,14 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData) { SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, i); SColumnInfoData* pSrc = taosArrayGet(pDataBlock->pDataBlock, i); - if (pSrc->pData== NULL) { - continue; - } - int32_t code = colInfoDataEnsureCapacity(pDst, 0, pDataBlock->info.rows); if (code != TSDB_CODE_SUCCESS) { return NULL; } + if (pSrc->pData== NULL) { + continue; + } colDataAssign(pDst, pSrc, pDataBlock->info.rows); } From 80b7ba902ced89ecfca85dcffd38793e55040d47 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 11 Jun 2022 13:48:18 +0800 Subject: [PATCH 7/8] fix(query): add null pointer check. --- source/common/src/tdatablock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 04de2738e1..c1f2726629 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -1238,7 +1238,7 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData) { return NULL; } - if (pSrc->pData== NULL) { + if (pSrc->pData== NULL || pDst->pData == NULL) { continue; } colDataAssign(pDst, pSrc, pDataBlock->info.rows); From 94c8ca1e068bc8aa26baa70dce61c29be35fa15b Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 11 Jun 2022 14:10:00 +0800 Subject: [PATCH 8/8] fix(query): add null pointer check. --- source/common/src/tdatablock.c | 2 +- source/libs/executor/src/executorimpl.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index c1f2726629..5b71578190 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -1238,7 +1238,7 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData) { return NULL; } - if (pSrc->pData== NULL || pDst->pData == NULL) { + if (pSrc->pData == NULL) { continue; } colDataAssign(pDst, pSrc, pDataBlock->info.rows); diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index eda24cb0d6..516824a446 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1857,7 +1857,7 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR SColumnInfoData* pSrc = taosArrayGet(px->pDataBlock, i); SColumnInfoData* pDst = taosArrayGet(pBlock->pDataBlock, i); // it is a reserved column for scalar function, and no data in this column yet. - if (pSrc->pData == NULL) { + if (pDst->pData == NULL) { continue; } @@ -1882,10 +1882,8 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR } else { ASSERT(pBlock->info.rows == numOfRows); } - - // write back -// colDataAssign(pSrc, pDst, pBlock->info.rows); } + blockDataDestroy(px); // fix memory leak } else { // do nothing