fix(query): fix tail function NULL value handing.
This commit is contained in:
parent
4be158b391
commit
21b5f72340
|
@ -166,6 +166,7 @@ typedef struct SSampleInfo {
|
||||||
|
|
||||||
typedef struct STailItem {
|
typedef struct STailItem {
|
||||||
int64_t timestamp;
|
int64_t timestamp;
|
||||||
|
bool isNull;
|
||||||
char data[];
|
char data[];
|
||||||
} STailItem;
|
} STailItem;
|
||||||
|
|
||||||
|
@ -3124,7 +3125,7 @@ int32_t sampleFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
int32_t startOffset = pCtx->offset;
|
int32_t startOffset = pCtx->offset;
|
||||||
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
||||||
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
if (colDataIsNull_s(pInputCol, i)) {
|
||||||
//colDataAppendNULL(pOutput, i);
|
//colDataAppendNULL(pOutput, i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -3190,14 +3191,19 @@ bool tailFunctionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo *pResultInfo) {
|
||||||
size_t unitSize = sizeof(STailItem) + pInfo->colBytes;
|
size_t unitSize = sizeof(STailItem) + pInfo->colBytes;
|
||||||
for (int32_t i = 0; i < pInfo->numOfPoints; ++i) {
|
for (int32_t i = 0; i < pInfo->numOfPoints; ++i) {
|
||||||
pInfo->pItems[i] = (STailItem *)(pItem + i * unitSize);
|
pInfo->pItems[i] = (STailItem *)(pItem + i * unitSize);
|
||||||
|
pInfo->pItems[i]->isNull = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tailAssignResult(STailItem* pItem, char *data, int32_t colBytes, TSKEY ts) {
|
static void tailAssignResult(STailItem* pItem, char *data, int32_t colBytes, TSKEY ts, bool isNull) {
|
||||||
pItem->timestamp = ts;
|
pItem->timestamp = ts;
|
||||||
memcpy(pItem->data, data, colBytes);
|
if (isNull) {
|
||||||
|
pItem->isNull = true;
|
||||||
|
} else {
|
||||||
|
memcpy(pItem->data, data, colBytes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tailCompFn(const void *p1, const void *p2, const void *param) {
|
static int32_t tailCompFn(const void *p1, const void *p2, const void *param) {
|
||||||
|
@ -3206,14 +3212,14 @@ static int32_t tailCompFn(const void *p1, const void *p2, const void *param) {
|
||||||
return compareInt64Val(&d1->timestamp, &d2->timestamp);
|
return compareInt64Val(&d1->timestamp, &d2->timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doTailAdd(STailInfo* pInfo, char *data, TSKEY ts) {
|
static void doTailAdd(STailInfo* pInfo, char *data, TSKEY ts, bool isNull) {
|
||||||
STailItem **pList = pInfo->pItems;
|
STailItem **pList = pInfo->pItems;
|
||||||
if (pInfo->numAdded < pInfo->numOfPoints) {
|
if (pInfo->numAdded < pInfo->numOfPoints) {
|
||||||
tailAssignResult(pList[pInfo->numAdded], data, pInfo->colBytes, ts);
|
tailAssignResult(pList[pInfo->numAdded], data, pInfo->colBytes, ts, isNull);
|
||||||
taosheapsort((void *)pList, sizeof(STailItem **), pInfo->numAdded + 1, NULL, tailCompFn, 0);
|
taosheapsort((void *)pList, sizeof(STailItem **), pInfo->numAdded + 1, NULL, tailCompFn, 0);
|
||||||
pInfo->numAdded++;
|
pInfo->numAdded++;
|
||||||
} else if (pList[0]->timestamp < ts) {
|
} else if (pList[0]->timestamp < ts) {
|
||||||
tailAssignResult(pList[0], data, pInfo->colBytes, ts);
|
tailAssignResult(pList[0], data, pInfo->colBytes, ts, isNull);
|
||||||
taosheapadjust((void *)pList, sizeof(STailItem **), 0, pInfo->numOfPoints - 1, NULL, tailCompFn, NULL, 0);
|
taosheapadjust((void *)pList, sizeof(STailItem **), 0, pInfo->numOfPoints - 1, NULL, tailCompFn, NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3231,19 +3237,21 @@ int32_t tailFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
int32_t startOffset = pCtx->offset;
|
int32_t startOffset = pCtx->offset;
|
||||||
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
||||||
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
|
||||||
colDataAppendNULL(pOutput, i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* data = colDataGetData(pInputCol, i);
|
char* data = colDataGetData(pInputCol, i);
|
||||||
doTailAdd(pInfo, data, tsList[i]);
|
doTailAdd(pInfo, data, tsList[i], colDataIsNull_s(pInputCol, i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosqsort(pInfo->pItems, pInfo->numOfPoints, POINTER_BYTES, NULL, tailCompFn);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pInfo->numOfPoints; ++i) {
|
for (int32_t i = 0; i < pInfo->numOfPoints; ++i) {
|
||||||
int32_t pos = startOffset + i;
|
int32_t pos = startOffset + i;
|
||||||
STailItem *pItem = pInfo->pItems[i];
|
STailItem *pItem = pInfo->pItems[i];
|
||||||
colDataAppend(pOutput, pos, pItem->data, false);
|
if (pItem->isNull) {
|
||||||
|
colDataAppendNULL(pOutput, pos);
|
||||||
|
} else {
|
||||||
|
colDataAppend(pOutput, pos, pItem->data, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return pInfo->numOfPoints;
|
return pInfo->numOfPoints;
|
||||||
|
|
Loading…
Reference in New Issue