fix mem leak
This commit is contained in:
parent
82a7d7b9e3
commit
56177e1849
|
@ -3424,8 +3424,8 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
|
||||||
retVal = tVariantDump(&pRight->value, (char*)pColumnFilter->pz, colType, false);
|
retVal = tVariantDump(&pRight->value, (char*)pColumnFilter->pz, colType, false);
|
||||||
|
|
||||||
} else if (colType == TSDB_DATA_TYPE_NCHAR) {
|
} else if (colType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
// pRight->value.nLen + 1 is larger than the actual nchar string length
|
// bufLen + 1 is larger than the actual nchar string length
|
||||||
pColumnFilter->pz = (int64_t)calloc(1, bufLen * TSDB_NCHAR_SIZE);
|
pColumnFilter->pz = (int64_t)calloc(1, (bufLen + 1) * TSDB_NCHAR_SIZE);
|
||||||
retVal = tVariantDump(&pRight->value, (char*)pColumnFilter->pz, colType, false);
|
retVal = tVariantDump(&pRight->value, (char*)pColumnFilter->pz, colType, false);
|
||||||
size_t len = twcslen((wchar_t*)pColumnFilter->pz);
|
size_t len = twcslen((wchar_t*)pColumnFilter->pz);
|
||||||
pColumnFilter->len = len * TSDB_NCHAR_SIZE;
|
pColumnFilter->len = len * TSDB_NCHAR_SIZE;
|
||||||
|
@ -3652,14 +3652,10 @@ static int32_t getColQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlEx
|
||||||
}
|
}
|
||||||
|
|
||||||
tExprNode* p = NULL;
|
tExprNode* p = NULL;
|
||||||
//SFilterInfo colFilter = {0};
|
|
||||||
|
|
||||||
SArray* colList = taosArrayInit(10, sizeof(SColIndex));
|
SArray* colList = taosArrayInit(10, sizeof(SColIndex));
|
||||||
ret = exprTreeFromSqlExpr(pCmd, &p, p1, pQueryInfo, colList, NULL);
|
ret = exprTreeFromSqlExpr(pCmd, &p, p1, pQueryInfo, colList, NULL);
|
||||||
//if (ret == TSDB_CODE_SUCCESS) {
|
taosArrayDestroy(colList);
|
||||||
// ret = filterInitFromTree(p, &colFilter, (int32_t)taosArrayGetSize(colList));
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
SBufferWriter bw = tbufInitWriter(NULL, false);
|
SBufferWriter bw = tbufInitWriter(NULL, false);
|
||||||
|
|
||||||
|
@ -5047,6 +5043,8 @@ static int32_t getQueryTimeRange(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr
|
||||||
|
|
||||||
SArray* colList = taosArrayInit(10, sizeof(SColIndex));
|
SArray* colList = taosArrayInit(10, sizeof(SColIndex));
|
||||||
ret = exprTreeFromSqlExpr(pCmd, &p, *pExpr, pQueryInfo, colList, NULL);
|
ret = exprTreeFromSqlExpr(pCmd, &p, *pExpr, pQueryInfo, colList, NULL);
|
||||||
|
taosArrayDestroy(colList);
|
||||||
|
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
goto _ret;
|
goto _ret;
|
||||||
}
|
}
|
||||||
|
@ -5058,6 +5056,8 @@ static int32_t getQueryTimeRange(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr
|
||||||
|
|
||||||
ret = filterGetTimeRange(filter, &pQueryInfo->window);
|
ret = filterGetTimeRange(filter, &pQueryInfo->window);
|
||||||
|
|
||||||
|
filterFreeInfo(filter);
|
||||||
|
|
||||||
_ret:
|
_ret:
|
||||||
tExprTreeDestroy(p, NULL);
|
tExprTreeDestroy(p, NULL);
|
||||||
|
|
||||||
|
@ -5100,7 +5100,7 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((ret = getQueryCondExpr(&pSql->cmd, pQueryInfo, pExpr, &condExpr, etype, &tbIdx, (*pExpr)->tokenId, &condExpr.pColumnCond, &condExpr.pTimewindow)) != TSDB_CODE_SUCCESS) {
|
if ((ret = getQueryCondExpr(&pSql->cmd, pQueryInfo, pExpr, &condExpr, etype, &tbIdx, (*pExpr)->tokenId, &condExpr.pColumnCond, &condExpr.pTimewindow)) != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
goto PARSE_WHERE_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosArrayGetSize(pQueryInfo->pUpstream) > 0 && condExpr.pTimewindow != NULL) {
|
if (taosArrayGetSize(pQueryInfo->pUpstream) > 0 && condExpr.pTimewindow != NULL) {
|
||||||
|
@ -5115,21 +5115,21 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
|
||||||
|
|
||||||
// 1. check if it is a join query
|
// 1. check if it is a join query
|
||||||
if ((ret = validateJoinExpr(&pSql->cmd, pQueryInfo, &condExpr)) != TSDB_CODE_SUCCESS) {
|
if ((ret = validateJoinExpr(&pSql->cmd, pQueryInfo, &condExpr)) != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
goto PARSE_WHERE_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. get the query time range
|
// 2. get the query time range
|
||||||
if ((ret = convertTimeRangeFromExpr(&pSql->cmd, pQueryInfo, condExpr.pTimewindow)) != TSDB_CODE_SUCCESS) {
|
if ((ret = convertTimeRangeFromExpr(&pSql->cmd, pQueryInfo, condExpr.pTimewindow)) != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
goto PARSE_WHERE_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = getQueryTimeRange(&pSql->cmd, pQueryInfo, &condExpr.pTimewindow)) != TSDB_CODE_SUCCESS) {
|
if ((ret = getQueryTimeRange(&pSql->cmd, pQueryInfo, &condExpr.pTimewindow)) != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
goto PARSE_WHERE_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. get the tag query condition
|
// 3. get the tag query condition
|
||||||
if ((ret = getTagQueryCondExpr(&pSql->cmd, pQueryInfo, &condExpr, pExpr)) != TSDB_CODE_SUCCESS) {
|
if ((ret = getTagQueryCondExpr(&pSql->cmd, pQueryInfo, &condExpr, pExpr)) != TSDB_CODE_SUCCESS) {
|
||||||
return ret;
|
goto PARSE_WHERE_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. get the table name query condition
|
// 4. get the table name query condition
|
||||||
|
@ -8613,12 +8613,15 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
|
||||||
} else if (pSqlExpr->tokenId == TK_SET) {
|
} else if (pSqlExpr->tokenId == TK_SET) {
|
||||||
int32_t colType = -1;
|
int32_t colType = -1;
|
||||||
STableMeta* pTableMeta = tscGetMetaInfo(pQueryInfo, pQueryInfo->curTableIdx)->pTableMeta;
|
STableMeta* pTableMeta = tscGetMetaInfo(pQueryInfo, pQueryInfo->curTableIdx)->pTableMeta;
|
||||||
size_t colSize = taosArrayGetSize(pCols);
|
if (pCols != NULL) {
|
||||||
if (pCols != NULL && colSize > 0) {
|
size_t colSize = taosArrayGetSize(pCols);
|
||||||
SColIndex* idx = taosArrayGet(pCols, colSize - 1);
|
|
||||||
SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, idx->colIndex);
|
if (colSize > 0) {
|
||||||
if (pSchema != NULL) {
|
SColIndex* idx = taosArrayGet(pCols, colSize - 1);
|
||||||
colType = pSchema->type;
|
SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, idx->colIndex);
|
||||||
|
if (pSchema != NULL) {
|
||||||
|
colType = pSchema->type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tVariant *pVal;
|
tVariant *pVal;
|
||||||
|
|
|
@ -514,6 +514,7 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
size_t t = 0;
|
size_t t = 0;
|
||||||
int32_t sz = tbufReadInt32(&br);
|
int32_t sz = tbufReadInt32(&br);
|
||||||
void *pvar = NULL;
|
void *pvar = NULL;
|
||||||
|
int64_t val = 0;
|
||||||
int32_t bufLen = 0;
|
int32_t bufLen = 0;
|
||||||
if (IS_NUMERIC_TYPE(sType)) {
|
if (IS_NUMERIC_TYPE(sType)) {
|
||||||
bufLen = 60; // The maximum length of string that a number is converted to.
|
bufLen = 60; // The maximum length of string that a number is converted to.
|
||||||
|
@ -528,21 +529,21 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
uint8_t val = (uint8_t)tbufReadInt64(&br);
|
*(uint8_t *)&val = (uint8_t)tbufReadInt64(&br);
|
||||||
t = sizeof(val);
|
t = sizeof(val);
|
||||||
pvar = &val;
|
pvar = &val;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_USMALLINT:
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
uint16_t val = (uint16_t)tbufReadInt64(&br);
|
*(uint16_t *)&val = (uint16_t)tbufReadInt64(&br);
|
||||||
t = sizeof(val);
|
t = sizeof(val);
|
||||||
pvar = &val;
|
pvar = &val;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UINT:
|
case TSDB_DATA_TYPE_UINT:
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
uint32_t val = (uint32_t)tbufReadInt64(&br);
|
*(uint32_t *)&val = (uint32_t)tbufReadInt64(&br);
|
||||||
t = sizeof(val);
|
t = sizeof(val);
|
||||||
pvar = &val;
|
pvar = &val;
|
||||||
break;
|
break;
|
||||||
|
@ -550,31 +551,29 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
uint64_t val = (uint64_t)tbufReadInt64(&br);
|
*(uint64_t *)&val = (uint64_t)tbufReadInt64(&br);
|
||||||
t = sizeof(val);
|
t = sizeof(val);
|
||||||
pvar = &val;
|
pvar = &val;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
double val = tbufReadDouble(&br);
|
*(double *)&val = tbufReadDouble(&br);
|
||||||
t = sizeof(val);
|
t = sizeof(val);
|
||||||
pvar = &val;
|
pvar = &val;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float val = (float)tbufReadDouble(&br);
|
*(float *)&val = (float)tbufReadDouble(&br);
|
||||||
t = sizeof(val);
|
t = sizeof(val);
|
||||||
pvar = &val;
|
pvar = &val;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_BINARY: {
|
case TSDB_DATA_TYPE_BINARY: {
|
||||||
char *val = (char *)tbufReadBinary(&br, &t);
|
pvar = (char *)tbufReadBinary(&br, &t);
|
||||||
pvar = val;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
char *val = (char *)tbufReadBinary(&br, &t);
|
pvar = (char *)tbufReadBinary(&br, &t);
|
||||||
pvar = val;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -594,7 +593,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
int8_t val = 0;
|
|
||||||
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
}
|
}
|
||||||
|
@ -604,7 +602,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_USMALLINT:
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
int16_t val = 0;
|
|
||||||
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
}
|
}
|
||||||
|
@ -614,7 +611,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UINT:
|
case TSDB_DATA_TYPE_UINT:
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
int32_t val = 0;
|
|
||||||
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
}
|
}
|
||||||
|
@ -625,7 +621,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
int64_t val = 0;
|
|
||||||
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
}
|
}
|
||||||
|
@ -634,7 +629,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
double val = 0;
|
|
||||||
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
}
|
}
|
||||||
|
@ -643,7 +637,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float val = 0;
|
|
||||||
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
if (tVariantDump(&tmpVar, (char *)&val, tType, false)) {
|
||||||
goto err_ret;
|
goto err_ret;
|
||||||
}
|
}
|
||||||
|
@ -672,12 +665,15 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashPut(pObj, (char *)pvar, t, &dummy, sizeof(dummy));
|
taosHashPut(pObj, (char *)pvar, t, &dummy, sizeof(dummy));
|
||||||
|
tVariantDestroy(&tmpVar);
|
||||||
|
memset(&tmpVar, 0, sizeof(tmpVar));
|
||||||
}
|
}
|
||||||
|
|
||||||
*q = (void *)pObj;
|
*q = (void *)pObj;
|
||||||
pObj = NULL;
|
pObj = NULL;
|
||||||
|
|
||||||
err_ret:
|
err_ret:
|
||||||
|
tVariantDestroy(&tmpVar);
|
||||||
taosHashCleanup(pObj);
|
taosHashCleanup(pObj);
|
||||||
tfree(tmp);
|
tfree(tmp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ enum {
|
||||||
FLD_TYPE_MAX = 3,
|
FLD_TYPE_MAX = 3,
|
||||||
FLD_DESC_NO_FREE = 4,
|
FLD_DESC_NO_FREE = 4,
|
||||||
FLD_DATA_NO_FREE = 8,
|
FLD_DATA_NO_FREE = 8,
|
||||||
|
FLD_DATA_IS_HASH = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -64,6 +65,7 @@ enum {
|
||||||
FI_STATUS_ALL = 1,
|
FI_STATUS_ALL = 1,
|
||||||
FI_STATUS_EMPTY = 2,
|
FI_STATUS_EMPTY = 2,
|
||||||
FI_STATUS_REWRITE = 4,
|
FI_STATUS_REWRITE = 4,
|
||||||
|
FI_STATUS_CLONED = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -187,7 +189,6 @@ typedef struct SFilterUnit {
|
||||||
} SFilterUnit;
|
} SFilterUnit;
|
||||||
|
|
||||||
typedef struct SFilterPCtx {
|
typedef struct SFilterPCtx {
|
||||||
SHashObj *colHash;
|
|
||||||
SHashObj *valHash;
|
SHashObj *valHash;
|
||||||
SHashObj *unitHash;
|
SHashObj *unitHash;
|
||||||
} SFilterPCtx;
|
} SFilterPCtx;
|
||||||
|
@ -232,7 +233,7 @@ typedef struct SFilterInfo {
|
||||||
|
|
||||||
#define RESET_RANGE(ctx, r) do { (r)->next = (ctx)->rf; (ctx)->rf = r; } while (0)
|
#define RESET_RANGE(ctx, r) do { (r)->next = (ctx)->rf; (ctx)->rf = r; } while (0)
|
||||||
#define FREE_RANGE(ctx, r) do { if ((r)->prev) { (r)->prev->next = (r)->next; } else { (ctx)->rs = (r)->next;} if ((r)->next) { (r)->next->prev = (r)->prev; } RESET_RANGE(ctx, r); } while (0)
|
#define FREE_RANGE(ctx, r) do { if ((r)->prev) { (r)->prev->next = (r)->next; } else { (ctx)->rs = (r)->next;} if ((r)->next) { (r)->next->prev = (r)->prev; } RESET_RANGE(ctx, r); } while (0)
|
||||||
#define FREE_FROM_RANGE(ctx, r) do { if ((r)->prev) { (r)->prev->next = NULL; } else { (ctx)->rs = NULL;} while (r) {SFilterRangeNode *n = (r)->next; RESET_RANGE(ctx, r); r = n; } } while (0)
|
#define FREE_FROM_RANGE(ctx, r) do { SFilterRangeNode *_r = r; if ((_r)->prev) { (_r)->prev->next = NULL; } else { (ctx)->rs = NULL;} while (_r) {SFilterRangeNode *n = (_r)->next; RESET_RANGE(ctx, _r); _r = n; } } while (0)
|
||||||
#define INSERT_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r)->prev; if ((r)->prev) { (r)->prev->next = n; } else { (ctx)->rs = n; } (r)->prev = n; n->next = r; } while (0)
|
#define INSERT_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r)->prev; if ((r)->prev) { (r)->prev->next = n; } else { (ctx)->rs = n; } (r)->prev = n; n->next = r; } while (0)
|
||||||
#define APPEND_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r); if (r) { (r)->next = n; } else { (ctx)->rs = n; } } while (0)
|
#define APPEND_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r); if (r) { (r)->next = n; } else { (ctx)->rs = n; } } while (0)
|
||||||
|
|
||||||
|
|
|
@ -2847,7 +2847,10 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
doSetFilterColInfo(pQueryAttr->pFilters, pBlock);
|
if (pQueryAttr->pFilters != NULL) {
|
||||||
|
doSetFilterColInfo(pQueryAttr->pFilters, pBlock);
|
||||||
|
}
|
||||||
|
|
||||||
if (pQueryAttr->pFilters != NULL || pRuntimeEnv->pTsBuf != NULL) {
|
if (pQueryAttr->pFilters != NULL || pRuntimeEnv->pTsBuf != NULL) {
|
||||||
filterColRowsInDataBlock(pRuntimeEnv, pBlock, ascQuery);
|
filterColRowsInDataBlock(pRuntimeEnv, pBlock, ascQuery);
|
||||||
}
|
}
|
||||||
|
@ -7575,6 +7578,8 @@ _cleanup_qinfo:
|
||||||
|
|
||||||
tfree(pExprs);
|
tfree(pExprs);
|
||||||
|
|
||||||
|
filterFreeInfo(pFilters);
|
||||||
|
|
||||||
_cleanup:
|
_cleanup:
|
||||||
freeQInfo(pQInfo);
|
freeQInfo(pQInfo);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -7930,6 +7935,8 @@ void freeQueryAttr(SQueryAttr* pQueryAttr) {
|
||||||
taosArrayDestroy(pQueryAttr->pGroupbyExpr->columnInfo);
|
taosArrayDestroy(pQueryAttr->pGroupbyExpr->columnInfo);
|
||||||
tfree(pQueryAttr->pGroupbyExpr);
|
tfree(pQueryAttr->pGroupbyExpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filterFreeInfo(pQueryAttr->pFilters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -581,6 +581,13 @@ int32_t filterFreeRangeCtx(void* h) {
|
||||||
r = rn;
|
r = rn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r = ctx->rf;
|
||||||
|
while (r) {
|
||||||
|
rn = r->next;
|
||||||
|
free(r);
|
||||||
|
r = rn;
|
||||||
|
}
|
||||||
|
|
||||||
free(ctx);
|
free(ctx);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -654,7 +661,7 @@ int32_t filterGetFiledByData(SFilterInfo *info, int32_t type, void *v, int32_t d
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type, SFilterFieldId *fid, int32_t dataLen) {
|
int32_t filterAddField(SFilterInfo *info, void *desc, void **data, int32_t type, SFilterFieldId *fid, int32_t dataLen, bool freeIfExists) {
|
||||||
int32_t idx = -1;
|
int32_t idx = -1;
|
||||||
uint16_t *num;
|
uint16_t *num;
|
||||||
|
|
||||||
|
@ -663,8 +670,8 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
|
||||||
if (*num > 0) {
|
if (*num > 0) {
|
||||||
if (type == FLD_TYPE_COLUMN) {
|
if (type == FLD_TYPE_COLUMN) {
|
||||||
idx = filterGetFiledByDesc(&info->fields[type], type, desc);
|
idx = filterGetFiledByDesc(&info->fields[type], type, desc);
|
||||||
} else if (dataLen > 0 && FILTER_GET_FLAG(info->options, FI_OPTION_NEED_UNIQE)) {
|
} else if (data && (*data) && dataLen > 0 && FILTER_GET_FLAG(info->options, FI_OPTION_NEED_UNIQE)) {
|
||||||
idx = filterGetFiledByData(info, type, data, dataLen);
|
idx = filterGetFiledByData(info, type, *data, dataLen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -677,15 +684,28 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
|
||||||
|
|
||||||
info->fields[type].fields[idx].flag = type;
|
info->fields[type].fields[idx].flag = type;
|
||||||
info->fields[type].fields[idx].desc = desc;
|
info->fields[type].fields[idx].desc = desc;
|
||||||
info->fields[type].fields[idx].data = data;
|
info->fields[type].fields[idx].data = data ? *data : NULL;
|
||||||
|
|
||||||
|
if (type == FLD_TYPE_COLUMN) {
|
||||||
|
FILTER_SET_FLAG(info->fields[type].fields[idx].flag, FLD_DATA_NO_FREE);
|
||||||
|
}
|
||||||
|
|
||||||
++(*num);
|
++(*num);
|
||||||
|
|
||||||
if (data && dataLen > 0 && FILTER_GET_FLAG(info->options, FI_OPTION_NEED_UNIQE)) {
|
if (data && (*data) && dataLen > 0 && FILTER_GET_FLAG(info->options, FI_OPTION_NEED_UNIQE)) {
|
||||||
if (info->pctx.valHash == NULL) {
|
if (info->pctx.valHash == NULL) {
|
||||||
info->pctx.valHash = taosHashInit(FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_VALUE_SIZE, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, false);
|
info->pctx.valHash = taosHashInit(FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_VALUE_SIZE, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashPut(info->pctx.valHash, data, dataLen, &idx, sizeof(idx));
|
taosHashPut(info->pctx.valHash, *data, dataLen, &idx, sizeof(idx));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (freeIfExists) {
|
||||||
|
tfree(desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data && freeIfExists) {
|
||||||
|
tfree(*data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -696,7 +716,7 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t filterAddColFieldFromField(SFilterInfo *info, SFilterField *field, SFilterFieldId *fid) {
|
static FORCE_INLINE int32_t filterAddColFieldFromField(SFilterInfo *info, SFilterField *field, SFilterFieldId *fid) {
|
||||||
filterAddField(info, field->desc, field->data, FILTER_GET_TYPE(field->flag), fid, 0);
|
filterAddField(info, field->desc, &field->data, FILTER_GET_TYPE(field->flag), fid, 0, false);
|
||||||
|
|
||||||
FILTER_SET_FLAG(field->flag, FLD_DESC_NO_FREE);
|
FILTER_SET_FLAG(field->flag, FLD_DESC_NO_FREE);
|
||||||
FILTER_SET_FLAG(field->flag, FLD_DATA_NO_FREE);
|
FILTER_SET_FLAG(field->flag, FLD_DATA_NO_FREE);
|
||||||
|
@ -722,7 +742,7 @@ int32_t filterAddFieldFromNode(SFilterInfo *info, tExprNode *node, SFilterFieldI
|
||||||
node->pVal = NULL;
|
node->pVal = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
filterAddField(info, v, NULL, type, fid, 0);
|
filterAddField(info, v, NULL, type, fid, 0, true);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -829,7 +849,7 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
|
||||||
len = tDataTypes[type].bytes;
|
len = tDataTypes[type].bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
filterAddField(info, NULL, fdata, FLD_TYPE_VALUE, &right, len);
|
filterAddField(info, NULL, &fdata, FLD_TYPE_VALUE, &right, len, true);
|
||||||
|
|
||||||
filterAddUnit(info, TSDB_RELATION_EQUAL, &left, &right, &uidx);
|
filterAddUnit(info, TSDB_RELATION_EQUAL, &left, &right, &uidx);
|
||||||
|
|
||||||
|
@ -840,6 +860,8 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
|
||||||
|
|
||||||
p = taosHashIterate((SHashObj *)data, p);
|
p = taosHashIterate((SHashObj *)data, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosHashCleanup(data);
|
||||||
} else {
|
} else {
|
||||||
filterAddFieldFromNode(info, tree->_node.pRight, &right);
|
filterAddFieldFromNode(info, tree->_node.pRight, &right);
|
||||||
|
|
||||||
|
@ -858,29 +880,35 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
|
||||||
int32_t filterAddUnitFromUnit(SFilterInfo *dst, SFilterInfo *src, SFilterUnit* u, uint16_t *uidx) {
|
int32_t filterAddUnitFromUnit(SFilterInfo *dst, SFilterInfo *src, SFilterUnit* u, uint16_t *uidx) {
|
||||||
SFilterFieldId left, right, *pright = &right;
|
SFilterFieldId left, right, *pright = &right;
|
||||||
int32_t type = FILTER_UNIT_DATA_TYPE(u);
|
int32_t type = FILTER_UNIT_DATA_TYPE(u);
|
||||||
|
uint16_t flag = FLD_DESC_NO_FREE;
|
||||||
|
|
||||||
filterAddField(dst, FILTER_UNIT_COL_DESC(src, u), NULL, FLD_TYPE_COLUMN, &left, 0);
|
filterAddField(dst, FILTER_UNIT_COL_DESC(src, u), NULL, FLD_TYPE_COLUMN, &left, 0, false);
|
||||||
SFilterField *t = FILTER_UNIT_LEFT_FIELD(src, u);
|
SFilterField *t = FILTER_UNIT_LEFT_FIELD(src, u);
|
||||||
FILTER_SET_FLAG(t->flag, FLD_DESC_NO_FREE);
|
FILTER_SET_FLAG(t->flag, flag);
|
||||||
|
|
||||||
if (u->right.type == FLD_TYPE_VALUE) {
|
if (u->right.type == FLD_TYPE_VALUE) {
|
||||||
void *data = FILTER_UNIT_VAL_DATA(src, u);
|
void *data = FILTER_UNIT_VAL_DATA(src, u);
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
if (FILTER_UNIT_OPTR(u) == TSDB_RELATION_IN) {
|
if (FILTER_UNIT_OPTR(u) == TSDB_RELATION_IN) {
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, 0);
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, 0, false);
|
||||||
|
|
||||||
|
t = FILTER_GET_FIELD(dst, right);
|
||||||
|
|
||||||
|
FILTER_SET_FLAG(t->flag, FLD_DATA_IS_HASH);
|
||||||
} else {
|
} else {
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, varDataTLen(data));
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, varDataTLen(data), false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes);
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flag = FLD_DATA_NO_FREE;
|
||||||
t = FILTER_UNIT_RIGHT_FIELD(src, u);
|
t = FILTER_UNIT_RIGHT_FIELD(src, u);
|
||||||
FILTER_SET_FLAG(t->flag, FLD_DATA_NO_FREE);
|
FILTER_SET_FLAG(t->flag, flag);
|
||||||
} else {
|
} else {
|
||||||
pright = NULL;
|
pright = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return filterAddUnit(dst, FILTER_UNIT_OPTR(u), &left, pright, uidx);
|
return filterAddUnit(dst, FILTER_UNIT_OPTR(u), &left, pright, uidx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -926,7 +954,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
|
||||||
if (func(&ra->s, &ra->e) == 0) {
|
if (func(&ra->s, &ra->e) == 0) {
|
||||||
void *data = malloc(sizeof(int64_t));
|
void *data = malloc(sizeof(int64_t));
|
||||||
SIMPLE_COPY_VALUES(data, &ra->s);
|
SIMPLE_COPY_VALUES(data, &ra->s);
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes);
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true);
|
||||||
filterAddUnit(dst, TSDB_RELATION_EQUAL, &left, &right, &uidx);
|
filterAddUnit(dst, TSDB_RELATION_EQUAL, &left, &right, &uidx);
|
||||||
filterAddUnitToGroup(g, uidx);
|
filterAddUnitToGroup(g, uidx);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -936,7 +964,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
|
||||||
if (!FILTER_GET_FLAG(ra->sflag, RA_NULL)) {
|
if (!FILTER_GET_FLAG(ra->sflag, RA_NULL)) {
|
||||||
void *data = malloc(sizeof(int64_t));
|
void *data = malloc(sizeof(int64_t));
|
||||||
SIMPLE_COPY_VALUES(data, &ra->s);
|
SIMPLE_COPY_VALUES(data, &ra->s);
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes);
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true);
|
||||||
filterAddUnit(dst, FILTER_GET_FLAG(ra->sflag, RA_EXCLUDE) ? TSDB_RELATION_GREATER : TSDB_RELATION_GREATER_EQUAL, &left, &right, &uidx);
|
filterAddUnit(dst, FILTER_GET_FLAG(ra->sflag, RA_EXCLUDE) ? TSDB_RELATION_GREATER : TSDB_RELATION_GREATER_EQUAL, &left, &right, &uidx);
|
||||||
filterAddUnitToGroup(g, uidx);
|
filterAddUnitToGroup(g, uidx);
|
||||||
}
|
}
|
||||||
|
@ -944,7 +972,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
|
||||||
if (!FILTER_GET_FLAG(ra->eflag, RA_NULL)) {
|
if (!FILTER_GET_FLAG(ra->eflag, RA_NULL)) {
|
||||||
void *data = malloc(sizeof(int64_t));
|
void *data = malloc(sizeof(int64_t));
|
||||||
SIMPLE_COPY_VALUES(data, &ra->e);
|
SIMPLE_COPY_VALUES(data, &ra->e);
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes);
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true);
|
||||||
filterAddUnit(dst, FILTER_GET_FLAG(ra->eflag, RA_EXCLUDE) ? TSDB_RELATION_LESS : TSDB_RELATION_LESS_EQUAL, &left, &right, &uidx);
|
filterAddUnit(dst, FILTER_GET_FLAG(ra->eflag, RA_EXCLUDE) ? TSDB_RELATION_LESS : TSDB_RELATION_LESS_EQUAL, &left, &right, &uidx);
|
||||||
filterAddUnitToGroup(g, uidx);
|
filterAddUnitToGroup(g, uidx);
|
||||||
}
|
}
|
||||||
|
@ -990,7 +1018,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
|
||||||
if (func(&r->ra.s, &r->ra.e) == 0) {
|
if (func(&r->ra.s, &r->ra.e) == 0) {
|
||||||
void *data = malloc(sizeof(int64_t));
|
void *data = malloc(sizeof(int64_t));
|
||||||
SIMPLE_COPY_VALUES(data, &r->ra.s);
|
SIMPLE_COPY_VALUES(data, &r->ra.s);
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes);
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true);
|
||||||
filterAddUnit(dst, TSDB_RELATION_EQUAL, &left, &right, &uidx);
|
filterAddUnit(dst, TSDB_RELATION_EQUAL, &left, &right, &uidx);
|
||||||
filterAddUnitToGroup(g, uidx);
|
filterAddUnitToGroup(g, uidx);
|
||||||
|
|
||||||
|
@ -1004,7 +1032,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
|
||||||
if (!FILTER_GET_FLAG(r->ra.sflag, RA_NULL)) {
|
if (!FILTER_GET_FLAG(r->ra.sflag, RA_NULL)) {
|
||||||
void *data = malloc(sizeof(int64_t));
|
void *data = malloc(sizeof(int64_t));
|
||||||
SIMPLE_COPY_VALUES(data, &r->ra.s);
|
SIMPLE_COPY_VALUES(data, &r->ra.s);
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes);
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true);
|
||||||
filterAddUnit(dst, FILTER_GET_FLAG(r->ra.sflag, RA_EXCLUDE) ? TSDB_RELATION_GREATER : TSDB_RELATION_GREATER_EQUAL, &left, &right, &uidx);
|
filterAddUnit(dst, FILTER_GET_FLAG(r->ra.sflag, RA_EXCLUDE) ? TSDB_RELATION_GREATER : TSDB_RELATION_GREATER_EQUAL, &left, &right, &uidx);
|
||||||
filterAddUnitToGroup(g, uidx);
|
filterAddUnitToGroup(g, uidx);
|
||||||
}
|
}
|
||||||
|
@ -1012,7 +1040,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
|
||||||
if (!FILTER_GET_FLAG(r->ra.eflag, RA_NULL)) {
|
if (!FILTER_GET_FLAG(r->ra.eflag, RA_NULL)) {
|
||||||
void *data = malloc(sizeof(int64_t));
|
void *data = malloc(sizeof(int64_t));
|
||||||
SIMPLE_COPY_VALUES(data, &r->ra.e);
|
SIMPLE_COPY_VALUES(data, &r->ra.e);
|
||||||
filterAddField(dst, NULL, data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes);
|
filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true);
|
||||||
filterAddUnit(dst, FILTER_GET_FLAG(r->ra.eflag, RA_EXCLUDE) ? TSDB_RELATION_LESS : TSDB_RELATION_LESS_EQUAL, &left, &right, &uidx);
|
filterAddUnit(dst, FILTER_GET_FLAG(r->ra.eflag, RA_EXCLUDE) ? TSDB_RELATION_LESS : TSDB_RELATION_LESS_EQUAL, &left, &right, &uidx);
|
||||||
filterAddUnitToGroup(g, uidx);
|
filterAddUnitToGroup(g, uidx);
|
||||||
}
|
}
|
||||||
|
@ -1031,11 +1059,13 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
|
||||||
|
|
||||||
|
|
||||||
static void filterFreeGroup(void *pItem) {
|
static void filterFreeGroup(void *pItem) {
|
||||||
SFilterGroup* p = (SFilterGroup*) pItem;
|
if (pItem == NULL) {
|
||||||
if (p) {
|
return;
|
||||||
tfree(p->unitIdxs);
|
|
||||||
tfree(p->unitFlags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SFilterGroup* p = (SFilterGroup*) pItem;
|
||||||
|
tfree(p->unitIdxs);
|
||||||
|
tfree(p->unitFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1113,10 +1143,10 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
|
||||||
if (var->nType == TSDB_DATA_TYPE_VALUE_ARRAY) {
|
if (var->nType == TSDB_DATA_TYPE_VALUE_ARRAY) {
|
||||||
qDebug("VAL%d => [type:TS][val:[%" PRIi64"] - [%" PRId64 "]]", i, *(int64_t *)field->data, *(((int64_t *)field->data) + 1));
|
qDebug("VAL%d => [type:TS][val:[%" PRIi64"] - [%" PRId64 "]]", i, *(int64_t *)field->data, *(((int64_t *)field->data) + 1));
|
||||||
} else {
|
} else {
|
||||||
qDebug("VAL%d => [type:%d][val:%" PRIi64"]", i, var->nType, var->i64); //TODO
|
qDebug("VAL%d => [type:%d][val:%" PRIx64"]", i, var->nType, var->i64); //TODO
|
||||||
}
|
}
|
||||||
} else {
|
} else if (field->data) {
|
||||||
qDebug("VAL%d => [type:NIL][val:0x%" PRIx64"]", i, *(int64_t *)field->data); //TODO
|
qDebug("VAL%d => [type:NIL][val:NIL]", i); //TODO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1248,10 +1278,67 @@ void filterFreeGroupCtx(SFilterGroupCtx* gRes) {
|
||||||
tfree(gRes);
|
tfree(gRes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void filterFreeField(SFilterField* field, int32_t type) {
|
||||||
|
if (field == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FILTER_GET_FLAG(field->flag, FLD_DESC_NO_FREE)) {
|
||||||
|
if (type == FLD_TYPE_VALUE) {
|
||||||
|
tVariantDestroy(field->desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(field->desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FILTER_GET_FLAG(field->flag, FLD_DATA_NO_FREE)) {
|
||||||
|
if (FILTER_GET_FLAG(field->flag, FLD_DATA_IS_HASH)) {
|
||||||
|
taosHashCleanup(field->data);
|
||||||
|
} else {
|
||||||
|
tfree(field->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void filterFreePCtx(SFilterPCtx *pctx) {
|
||||||
|
taosHashCleanup(pctx->valHash);
|
||||||
|
taosHashCleanup(pctx->unitHash);
|
||||||
|
}
|
||||||
|
|
||||||
void filterFreeInfo(SFilterInfo *info) {
|
void filterFreeInfo(SFilterInfo *info) {
|
||||||
CHK_RETV(info == NULL);
|
CHK_RETV(info == NULL);
|
||||||
|
|
||||||
//TODO
|
for (int32_t i = 0; i < FLD_TYPE_MAX; ++i) {
|
||||||
|
for (uint16_t f = 0; f < info->fields[i].num; ++f) {
|
||||||
|
filterFreeField(&info->fields[i].fields[f], i);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(info->fields[i].fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < info->groupNum; ++i) {
|
||||||
|
filterFreeGroup(&info->groups[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(info->groups);
|
||||||
|
|
||||||
|
tfree(info->units);
|
||||||
|
|
||||||
|
tfree(info->unitRes);
|
||||||
|
|
||||||
|
tfree(info->unitFlags);
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < info->colRangeNum; ++i) {
|
||||||
|
filterFreeRangeCtx(info->colRange[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(info->colRange);
|
||||||
|
|
||||||
|
filterFreePCtx(&info->pctx);
|
||||||
|
|
||||||
|
if (!FILTER_GET_FLAG(info->status, FI_STATUS_CLONED)) {
|
||||||
|
tfree(info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1282,13 +1369,15 @@ int32_t filterInitValFieldData(SFilterInfo *info) {
|
||||||
convertFilterSetFromBinary((void **)&fi->data, var->pz, var->nLen, type);
|
convertFilterSetFromBinary((void **)&fi->data, var->pz, var->nLen, type);
|
||||||
CHK_LRET(fi->data == NULL, TSDB_CODE_QRY_APP_ERROR, "failed to convert in param");
|
CHK_LRET(fi->data == NULL, TSDB_CODE_QRY_APP_ERROR, "failed to convert in param");
|
||||||
|
|
||||||
|
FILTER_SET_FLAG(fi->flag, FLD_DATA_IS_HASH);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == TSDB_DATA_TYPE_BINARY) {
|
if (type == TSDB_DATA_TYPE_BINARY) {
|
||||||
fi->data = calloc(1, (var->nLen + 1) * TSDB_NCHAR_SIZE);
|
fi->data = calloc(1, var->nLen + VARSTR_HEADER_SIZE);
|
||||||
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
fi->data = calloc(1, (var->nLen + 1) * TSDB_NCHAR_SIZE);
|
fi->data = calloc(1, (var->nLen + VARSTR_HEADER_SIZE) * TSDB_NCHAR_SIZE);
|
||||||
} else {
|
} else {
|
||||||
if (var->nType == TSDB_DATA_TYPE_VALUE_ARRAY) { //TIME RANGE
|
if (var->nType == TSDB_DATA_TYPE_VALUE_ARRAY) { //TIME RANGE
|
||||||
fi->data = calloc(var->nLen, tDataTypes[type].bytes);
|
fi->data = calloc(var->nLen, tDataTypes[type].bytes);
|
||||||
|
@ -1488,7 +1577,9 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t
|
||||||
colIdx[colIdxi++] = cidx;
|
colIdx[colIdxi++] = cidx;
|
||||||
++gRes[gResIdx]->colNum;
|
++gRes[gResIdx]->colNum;
|
||||||
} else {
|
} else {
|
||||||
FILTER_SET_FLAG(info->status, FI_STATUS_REWRITE);
|
if (!FILTER_NO_MERGE_DATA_TYPE(FILTER_UNIT_DATA_TYPE(u))) {
|
||||||
|
FILTER_SET_FLAG(info->status, FI_STATUS_REWRITE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FILTER_PUSH_UNIT(gRes[gResIdx]->colInfo[cidx], u);
|
FILTER_PUSH_UNIT(gRes[gResIdx]->colInfo[cidx], u);
|
||||||
|
@ -1701,8 +1792,12 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
|
||||||
|
|
||||||
_err_return:
|
_err_return:
|
||||||
|
|
||||||
if (colCtxs && taosArrayGetSize(colCtxs) > 0) {
|
if (colCtxs) {
|
||||||
taosArrayDestroyEx(colCtxs, filterFreeColCtx);
|
if (taosArrayGetSize(colCtxs) > 0) {
|
||||||
|
taosArrayDestroyEx(colCtxs, filterFreeColCtx);
|
||||||
|
} else {
|
||||||
|
taosArrayDestroy(colCtxs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
filterFreeRangeCtx(ctx);
|
filterFreeRangeCtx(ctx);
|
||||||
|
@ -1824,6 +1919,8 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
|
||||||
|
|
||||||
SFilterInfo oinfo = *info;
|
SFilterInfo oinfo = *info;
|
||||||
|
|
||||||
|
FILTER_SET_FLAG(oinfo.status, FI_STATUS_CLONED);
|
||||||
|
|
||||||
SArray* group = taosArrayInit(FILTER_DEFAULT_GROUP_SIZE, sizeof(SFilterGroup));
|
SArray* group = taosArrayInit(FILTER_DEFAULT_GROUP_SIZE, sizeof(SFilterGroup));
|
||||||
SFilterGroupCtx *res = NULL;
|
SFilterGroupCtx *res = NULL;
|
||||||
SFilterColInfo *colInfo = NULL;
|
SFilterColInfo *colInfo = NULL;
|
||||||
|
@ -1831,6 +1928,7 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
|
||||||
uint16_t uidx = 0;
|
uint16_t uidx = 0;
|
||||||
|
|
||||||
memset(info, 0, sizeof(*info));
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
||||||
info->colRangeNum = oinfo.colRangeNum;
|
info->colRangeNum = oinfo.colRangeNum;
|
||||||
info->colRange = oinfo.colRange;
|
info->colRange = oinfo.colRange;
|
||||||
oinfo.colRangeNum = 0;
|
oinfo.colRangeNum = 0;
|
||||||
|
@ -1877,6 +1975,8 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
|
||||||
|
|
||||||
taosArrayDestroy(group);
|
taosArrayDestroy(group);
|
||||||
|
|
||||||
|
filterFreeInfo(&oinfo);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1961,6 +2061,7 @@ int32_t filterGenerateColRange(SFilterInfo *info, SFilterGroupCtx** gRes, int32_
|
||||||
}
|
}
|
||||||
|
|
||||||
_err_return:
|
_err_return:
|
||||||
|
tfree(idxNum);
|
||||||
tfree(idxs);
|
tfree(idxs);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1990,12 +2091,13 @@ int32_t filterPreprocess(SFilterInfo *info) {
|
||||||
|
|
||||||
if (FILTER_GET_FLAG(info->status, FI_STATUS_ALL)) {
|
if (FILTER_GET_FLAG(info->status, FI_STATUS_ALL)) {
|
||||||
qInfo("Final - FilterInfo: [ALL]");
|
qInfo("Final - FilterInfo: [ALL]");
|
||||||
return TSDB_CODE_SUCCESS;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (FILTER_GET_FLAG(info->status, FI_STATUS_EMPTY)) {
|
if (FILTER_GET_FLAG(info->status, FI_STATUS_EMPTY)) {
|
||||||
qInfo("Final - FilterInfo: [EMPTY]");
|
qInfo("Final - FilterInfo: [EMPTY]");
|
||||||
return TSDB_CODE_SUCCESS;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
filterGenerateColRange(info, gRes, gResNum);
|
filterGenerateColRange(info, gRes, gResNum);
|
||||||
|
@ -2006,6 +2108,14 @@ int32_t filterPreprocess(SFilterInfo *info) {
|
||||||
|
|
||||||
filterRewrite(info, gRes, gResNum);
|
filterRewrite(info, gRes, gResNum);
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < gResNum; ++i) {
|
||||||
|
filterFreeGroupCtx(gRes[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(gRes);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -459,9 +459,7 @@ static void doDestroySqlExprNode(tSqlExpr *pExpr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pExpr->tokenId == TK_STRING) {
|
tVariantDestroy(&pExpr->value);
|
||||||
tVariantDestroy(&pExpr->value);
|
|
||||||
}
|
|
||||||
|
|
||||||
tSqlExprListDestroy(pExpr->Expr.paramList);
|
tSqlExprListDestroy(pExpr->Expr.paramList);
|
||||||
free(pExpr);
|
free(pExpr);
|
||||||
|
|
|
@ -175,6 +175,7 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qi
|
||||||
param.pSecExprs = NULL;
|
param.pSecExprs = NULL;
|
||||||
param.pGroupbyExpr = NULL;
|
param.pGroupbyExpr = NULL;
|
||||||
param.pTagColumnInfo = NULL;
|
param.pTagColumnInfo = NULL;
|
||||||
|
param.pFilters = NULL;
|
||||||
|
|
||||||
if ((*pQInfo) == NULL) {
|
if ((*pQInfo) == NULL) {
|
||||||
code = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
code = TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
|
@ -200,6 +201,8 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qi
|
||||||
freeColumnFilterInfo(column->flist.filterInfo, column->flist.numOfFilters);
|
freeColumnFilterInfo(column->flist.filterInfo, column->flist.numOfFilters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filterFreeInfo(param.pFilters);
|
||||||
|
|
||||||
//pQInfo already freed in initQInfo, but *pQInfo may not pointer to null;
|
//pQInfo already freed in initQInfo, but *pQInfo may not pointer to null;
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
*pQInfo = NULL;
|
*pQInfo = NULL;
|
||||||
|
|
|
@ -713,7 +713,8 @@ size_t taosHashGetMemSize(const SHashObj *pHashObj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE void *taosHashGetDataKey(SHashObj *pHashObj, void *data) {
|
FORCE_INLINE void *taosHashGetDataKey(SHashObj *pHashObj, void *data) {
|
||||||
return GET_HASH_NODE_KEY(GET_HASH_PNODE(data));
|
SHashNode * node = GET_HASH_PNODE(data);
|
||||||
|
return GET_HASH_NODE_KEY(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE uint32_t taosHashGetDataKeyLen(SHashObj *pHashObj, void *data) {
|
FORCE_INLINE uint32_t taosHashGetDataKeyLen(SHashObj *pHashObj, void *data) {
|
||||||
|
|
Loading…
Reference in New Issue