[td-13039] fix memory leak and invlad memory operations.

This commit is contained in:
Haojun Liao 2022-03-26 22:46:12 +08:00
parent 36faa27dac
commit 66b47472f0
4 changed files with 28 additions and 22 deletions

View File

@ -43,7 +43,7 @@ typedef struct SScalarCtx {
#define SCL_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; } return _code; } while (0)
#define SCL_ERR_JRET(c) do { code = c; if (code != TSDB_CODE_SUCCESS) { terrno = code; goto _return; } } while (0)
int32_t doConvertDataType(SScalarParam* in, SScalarParam* out, SValueNode* pValueNode);
int32_t doConvertDataType(SValueNode* pValueNode, SScalarParam* out);
SColumnInfoData* createColumnInfoData(SDataType* pType, int32_t numOfRows);
//int32_t sclMoveParamListData(SScalarParam *params, int32_t listNum, int32_t idx);

View File

@ -1022,12 +1022,12 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode* tree, SArray *group) {
SNodeListNode *listNode = (SNodeListNode *)node->pRight;
SListCell *cell = listNode->pNodeList->pHead;
SScalarParam in = {.columnData = calloc(1, sizeof(SColumnInfoData))}, out = {.columnData = calloc(1, sizeof(SColumnInfoData))};
SScalarParam out = {.columnData = calloc(1, sizeof(SColumnInfoData))};
out.columnData->info.type = type;
for (int32_t i = 0; i < listNode->pNodeList->length; ++i) {
SValueNode *valueNode = (SValueNode *)cell->pNode;
code = doConvertDataType(&in, &out, valueNode);
code = doConvertDataType(valueNode, &out);
if (code) {
// fltError("convert from %d to %d failed", in.type, out.type);
FLT_ERR_RET(code);
@ -1791,12 +1791,11 @@ int32_t fltInitValFieldData(SFilterInfo *info) {
if (dType->type == type) {
assignVal(fi->data, nodesGetValueFromNode(var), dType->bytes, type);
} else {
SScalarParam in = {.columnData = calloc(1, sizeof(SColumnInfoData))};
SScalarParam out = {.columnData = calloc(1, sizeof(SColumnInfoData))};
out.columnData->info.type = type;
// todo refactor the convert
int32_t code = doConvertDataType(&in, &out, var);
int32_t code = doConvertDataType(var, &out);
if (code != TSDB_CODE_SUCCESS) {
qError("convert value to type[%d] failed", type);
return TSDB_CODE_TSC_INVALID_OPERATION;

View File

@ -38,13 +38,17 @@ SColumnInfoData* createColumnInfoData(SDataType* pType, int32_t numOfRows) {
}
}
int32_t doConvertDataType(SScalarParam* in, SScalarParam* out, SValueNode* pValueNode) {
in->columnData = createColumnInfoData(&pValueNode->node.resType, 1);
colDataAppend(in->columnData, 0, nodesGetValueFromNode(pValueNode), false);
in->numOfRows = 1;
int32_t doConvertDataType(SValueNode* pValueNode, SScalarParam* out) {
SScalarParam in = {.numOfRows = 1};
in.columnData = createColumnInfoData(&pValueNode->node.resType, 1);
colDataAppend(in.columnData, 0, nodesGetValueFromNode(pValueNode), false);
blockDataEnsureColumnCapacity(out->columnData, 1);
return vectorConvertImpl(in, out);
int32_t code = vectorConvertImpl(&in, out);
sclFreeParam(&in);
return code;
}
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
@ -60,7 +64,7 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
SNodeListNode *nodeList = (SNodeListNode *)pNode;
SListCell *cell = nodeList->pNodeList->pHead;
SScalarParam in = {.columnData = calloc(1, sizeof(SColumnInfoData))}, out = {.columnData = calloc(1, sizeof(SColumnInfoData))};
SScalarParam out = {.columnData = calloc(1, sizeof(SColumnInfoData))};
int32_t len = 0;
void *buf = NULL;
@ -72,8 +76,8 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
out.columnData->info.type = type;
out.columnData->info.bytes = tDataTypes[type].bytes;
doConvertDataType(&in, &out, valueNode);
if (code) {
code = doConvertDataType(valueNode, &out);
if (code != TSDB_CODE_SUCCESS) {
// sclError("convert data from %d to %d failed", in.type, out.type);
SCL_ERR_JRET(code);
}
@ -104,6 +108,7 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
}
*data = pObj;
return TSDB_CODE_SUCCESS;
_return:
@ -131,13 +136,15 @@ void sclFreeParamNoData(SScalarParam *param) {
void sclFreeParam(SScalarParam *param) {
sclFreeParamNoData(param);
// if (!param->dataInBlock) {
// if (SCL_DATA_TYPE_DUMMY_HASH == param->type) {
// taosHashCleanup((SHashObj *)param->orig.data);
// } else {
// tfree(param->orig.data);
// }
// }
if (param->columnData != NULL) {
colDataDestroy(param->columnData);
tfree(param->columnData);
}
if (param->pHashFilter != NULL) {
taosHashCleanup(param->pHashFilter);
}
}
int32_t sclCopyValueNodeValue(SValueNode *pNode, void **res) {
@ -413,7 +420,7 @@ int32_t sclExecOperator(SOperatorNode *node, SScalarCtx *ctx, SScalarParam *outp
_return:
for (int32_t i = 0; i < paramNum; ++i) {
sclFreeParamNoData(params + i);
// sclFreeParam(&params[i]);
}
tfree(params);

View File

@ -1270,7 +1270,7 @@ TEST(columnTest, binary_column_is_true) {
}
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 5, rowNum, leftv);
scltMakeOpNode(&opNode, OP_TYPE_IS_TRUE, TSDB_DATA_TYPE_BOOL, pLeft, NULL);