From 9e3b093d001d6150b2bb136320ac7d0007a89407 Mon Sep 17 00:00:00 2001 From: Jing Sima Date: Thu, 5 Sep 2024 14:01:18 +0800 Subject: [PATCH] fix:[TD-31921] Free memory when error occurs in filterExecute. --- source/libs/scalar/src/filter.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 382b83012d..696222784e 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -5238,22 +5238,20 @@ int32_t filterExecute(SFilterInfo *info, SSDataBlock *pSrc, SColumnInfoData **p, *pResultStatus = FILTER_RESULT_ALL_QUALIFIED; return TSDB_CODE_SUCCESS; } - + int32_t code = TSDB_CODE_SUCCESS; SScalarParam output = {0}; SDataType type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; - int32_t code = sclCreateColumnInfoData(&type, pSrc->info.rows, &output); - if (code != TSDB_CODE_SUCCESS) { - return code; - } + FLT_ERR_JRET(sclCreateColumnInfoData(&type, pSrc->info.rows, &output)); if (info->scalarMode) { SArray *pList = taosArrayInit(1, POINTER_BYTES); if (NULL == pList) { - FLT_ERR_RET(terrno); + FLT_ERR_JRET(terrno); } if (NULL == taosArrayPush(pList, &pSrc)) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + taosArrayDestroy(pList); + FLT_ERR_JRET(terrno); } code = scalarCalculate(info->sclCtx.node, pList, &output); @@ -5261,7 +5259,7 @@ int32_t filterExecute(SFilterInfo *info, SSDataBlock *pSrc, SColumnInfoData **p, *p = output.columnData; - FLT_ERR_RET(code); + FLT_ERR_JRET(code); if (output.numOfQualified == output.numOfRows) { *pResultStatus = FILTER_RESULT_ALL_QUALIFIED; @@ -5277,11 +5275,12 @@ int32_t filterExecute(SFilterInfo *info, SSDataBlock *pSrc, SColumnInfoData **p, output.numOfRows = pSrc->info.rows; if (*p == NULL) { - return TSDB_CODE_APP_ERROR; + fltError("filterExecute failed, column data is NULL"); + FLT_ERR_JRET(TSDB_CODE_APP_ERROR); } bool keepAll = false; - FLT_ERR_RET((info->func)(info, pSrc->info.rows, *p, statis, numOfCols, &output.numOfQualified, &keepAll)); + FLT_ERR_JRET((info->func)(info, pSrc->info.rows, *p, statis, numOfCols, &output.numOfQualified, &keepAll)); // todo this should be return during filter procedure if (keepAll) { @@ -5304,6 +5303,10 @@ int32_t filterExecute(SFilterInfo *info, SSDataBlock *pSrc, SColumnInfoData **p, } return TSDB_CODE_SUCCESS; +_return: + sclFreeParam(&output); + *p = NULL; + return code; } typedef struct SClassifyConditionCxt {