Merge pull request #5825 from taosdata/hotfix/TD-3750
[TD-3750]rebuild topbottom struct
This commit is contained in:
commit
e56077bb0a
|
@ -2482,6 +2482,29 @@ static STopBotInfo *getTopBotOutputInfo(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* keep the intermediate results during scan data blocks in the format of:
|
||||||
|
* +-----------------------------------+-------------one value pair-----------+------------next value pair-----------+
|
||||||
|
* |-------------pointer area----------|----ts---+-----+-----n tags-----------|----ts---+-----+-----n tags-----------|
|
||||||
|
* +..[Value Pointer1][Value Pointer2].|timestamp|value|tags1|tags2|....|tagsn|timestamp|value|tags1|tags2|....|tagsn+
|
||||||
|
*/
|
||||||
|
static void buildTopBotStruct(STopBotInfo *pTopBotInfo, SQLFunctionCtx *pCtx) {
|
||||||
|
char *tmp = (char *)pTopBotInfo + sizeof(STopBotInfo);
|
||||||
|
pTopBotInfo->res = (tValuePair**) tmp;
|
||||||
|
tmp += POINTER_BYTES * pCtx->param[0].i64;
|
||||||
|
|
||||||
|
size_t size = sizeof(tValuePair) + pCtx->tagInfo.tagsLen;
|
||||||
|
// assert(pCtx->param[0].i64 > 0);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pCtx->param[0].i64; ++i) {
|
||||||
|
pTopBotInfo->res[i] = (tValuePair*) tmp;
|
||||||
|
pTopBotInfo->res[i]->pTags = tmp + sizeof(tValuePair);
|
||||||
|
tmp += size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const char *maxval) {
|
bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const char *maxval) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
if (pResInfo == NULL) {
|
if (pResInfo == NULL) {
|
||||||
|
@ -2495,6 +2518,10 @@ bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const cha
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((void *)pTopBotInfo->res[0] != (void *)((char *)pTopBotInfo + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].i64)) {
|
||||||
|
buildTopBotStruct(pTopBotInfo, pCtx);
|
||||||
|
}
|
||||||
|
|
||||||
tValuePair **pRes = (tValuePair**) pTopBotInfo->res;
|
tValuePair **pRes = (tValuePair**) pTopBotInfo->res;
|
||||||
|
|
||||||
if (pCtx->functionId == TSDB_FUNC_TOP) {
|
if (pCtx->functionId == TSDB_FUNC_TOP) {
|
||||||
|
@ -2534,27 +2561,6 @@ bool topbot_datablock_filter(SQLFunctionCtx *pCtx, const char *minval, const cha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* keep the intermediate results during scan data blocks in the format of:
|
|
||||||
* +-----------------------------------+-------------one value pair-----------+------------next value pair-----------+
|
|
||||||
* |-------------pointer area----------|----ts---+-----+-----n tags-----------|----ts---+-----+-----n tags-----------|
|
|
||||||
* +..[Value Pointer1][Value Pointer2].|timestamp|value|tags1|tags2|....|tagsn|timestamp|value|tags1|tags2|....|tagsn+
|
|
||||||
*/
|
|
||||||
static void buildTopBotStruct(STopBotInfo *pTopBotInfo, SQLFunctionCtx *pCtx) {
|
|
||||||
char *tmp = (char *)pTopBotInfo + sizeof(STopBotInfo);
|
|
||||||
pTopBotInfo->res = (tValuePair**) tmp;
|
|
||||||
tmp += POINTER_BYTES * pCtx->param[0].i64;
|
|
||||||
|
|
||||||
size_t size = sizeof(tValuePair) + pCtx->tagInfo.tagsLen;
|
|
||||||
// assert(pCtx->param[0].i64 > 0);
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCtx->param[0].i64; ++i) {
|
|
||||||
pTopBotInfo->res[i] = (tValuePair*) tmp;
|
|
||||||
pTopBotInfo->res[i]->pTags = tmp + sizeof(tValuePair);
|
|
||||||
tmp += size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool top_bottom_function_setup(SQLFunctionCtx *pCtx) {
|
static bool top_bottom_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
if (!function_setup(pCtx)) {
|
if (!function_setup(pCtx)) {
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue