[TD-6046]<fix> fix ts,derivative() output error for top/bottom/diff/derivative

This commit is contained in:
wangmm0220 2021-08-16 17:15:56 +08:00
parent 4b9c461c54
commit 7c36f3de4a
4 changed files with 26 additions and 4 deletions

View File

@ -2872,7 +2872,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
const int32_t TS_COLUMN_INDEX = PRIMARYKEY_TIMESTAMP_COL_INDEX;
SColumnList ids = createColumnList(1, index.tableIndex, TS_COLUMN_INDEX);
insertResultField(pQueryInfo, TS_COLUMN_INDEX, &ids, TSDB_KEYSIZE, TSDB_DATA_TYPE_TIMESTAMP,
insertResultField(pQueryInfo, colIndex, &ids, TSDB_KEYSIZE, TSDB_DATA_TYPE_TIMESTAMP,
aAggs[TSDB_FUNC_TS].name, pExpr);
colIndex += 1; // the first column is ts
@ -7052,7 +7052,8 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, char* msg) {
continue;
}
if(functionId == TSDB_FUNC_DERIVATIVE){ // to avoid ts function id was modufied below
if(functionId == TSDB_FUNC_DERIVATIVE || functionId == TSDB_FUNC_DIFF ||
functionId == TSDB_FUNC_TOP ||functionId == TSDB_FUNC_BOTTOM ){ // to avoid ts function id was modufied below
tagTsColExists = false;
}

View File

@ -186,6 +186,7 @@ typedef struct SQLFunctionCtx {
tVariant param[4]; // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
int64_t *ptsList; // corresponding timestamp array list
void *ptsOutputBuf; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
void *ptsOriOutputBuf;
SQLPreAggVal preAggVals;
tVariant tag;

View File

@ -2789,6 +2789,7 @@ static void deriv_function(SQLFunctionCtx *pCtx) {
int32_t i = (pCtx->order == TSDB_ORDER_ASC) ? 0 : pCtx->size - 1;
TSKEY *pTimestamp = pCtx->ptsOutputBuf;
TSKEY *pTimestampOri = pCtx->ptsOriOutputBuf;
TSKEY *tsList = GET_TS_LIST(pCtx);
double *pOutput = (double *)pCtx->pOutput;
@ -2808,6 +2809,7 @@ static void deriv_function(SQLFunctionCtx *pCtx) {
if (pDerivInfo->ignoreNegative && *pOutput < 0) {
} else {
*pTimestamp = tsList[i];
if (pTimestampOri) {*pTimestampOri = tsList[i]; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
notNullElems++;
@ -2835,6 +2837,7 @@ static void deriv_function(SQLFunctionCtx *pCtx) {
if (pDerivInfo->ignoreNegative && *pOutput < 0) {
} else {
*pTimestamp = tsList[i];
if (pTimestampOri) {*pTimestampOri = tsList[i]; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
notNullElems++;
@ -2861,6 +2864,7 @@ static void deriv_function(SQLFunctionCtx *pCtx) {
if (pDerivInfo->ignoreNegative && *pOutput < 0) {
} else {
*pTimestamp = tsList[i];
if (pTimestampOri) {*pTimestampOri = tsList[i]; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
notNullElems++;
@ -2888,6 +2892,7 @@ static void deriv_function(SQLFunctionCtx *pCtx) {
if (pDerivInfo->ignoreNegative && *pOutput < 0) {
} else {
*pTimestamp = tsList[i];
if (pTimestampOri) {*pTimestampOri = tsList[i]; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
notNullElems++;
@ -2914,6 +2919,7 @@ static void deriv_function(SQLFunctionCtx *pCtx) {
if (pDerivInfo->ignoreNegative && *pOutput < 0) {
} else {
*pTimestamp = tsList[i];
if (pTimestampOri) {*pTimestampOri = tsList[i]; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
notNullElems++;
@ -2940,6 +2946,7 @@ static void deriv_function(SQLFunctionCtx *pCtx) {
if (pDerivInfo->ignoreNegative && *pOutput < 0) {
} else {
*pTimestamp = tsList[i];
if (pTimestampOri) {*pTimestampOri = tsList[i]; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
@ -2982,6 +2989,7 @@ static void diff_function(SQLFunctionCtx *pCtx) {
int32_t i = (pCtx->order == TSDB_ORDER_ASC) ? 0 : pCtx->size - 1;
TSKEY* pTimestamp = pCtx->ptsOutputBuf;
TSKEY* pTimestampOri = pCtx->ptsOriOutputBuf;
TSKEY* tsList = GET_TS_LIST(pCtx);
switch (pCtx->inputType) {
@ -2997,6 +3005,7 @@ static void diff_function(SQLFunctionCtx *pCtx) {
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
*pOutput = (int32_t)(pData[i] - pCtx->param[1].i64); // direct previous may be null
*pTimestamp = (tsList != NULL)? tsList[i]:0;
if (pTimestampOri) {*pTimestampOri = *pTimestamp; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
}
@ -3019,6 +3028,7 @@ static void diff_function(SQLFunctionCtx *pCtx) {
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
*pOutput = pData[i] - pCtx->param[1].i64; // direct previous may be null
*pTimestamp = (tsList != NULL)? tsList[i]:0;
if (pTimestampOri) {*pTimestampOri = *pTimestamp; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
}
@ -3041,6 +3051,7 @@ static void diff_function(SQLFunctionCtx *pCtx) {
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
SET_DOUBLE_VAL(pOutput, pData[i] - pCtx->param[1].dKey); // direct previous may be null
*pTimestamp = (tsList != NULL)? tsList[i]:0;
if (pTimestampOri) {*pTimestampOri = *pTimestamp; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
}
@ -3063,6 +3074,7 @@ static void diff_function(SQLFunctionCtx *pCtx) {
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
*pOutput = (float)(pData[i] - pCtx->param[1].dKey); // direct previous may be null
*pTimestamp = (tsList != NULL)? tsList[i]:0;
if (pTimestampOri) {*pTimestampOri = *pTimestamp; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
}
@ -3085,6 +3097,7 @@ static void diff_function(SQLFunctionCtx *pCtx) {
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
*pOutput = (int16_t)(pData[i] - pCtx->param[1].i64); // direct previous may be null
*pTimestamp = (tsList != NULL)? tsList[i]:0;
if (pTimestampOri) {*pTimestampOri = *pTimestamp; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
}
@ -3108,6 +3121,7 @@ static void diff_function(SQLFunctionCtx *pCtx) {
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
*pOutput = (int8_t)(pData[i] - pCtx->param[1].i64); // direct previous may be null
*pTimestamp = (tsList != NULL)? tsList[i]:0;
if (pTimestampOri) {*pTimestampOri = *pTimestamp; pTimestampOri += 1;}
pOutput += 1;
pTimestamp += 1;
}

View File

@ -3615,14 +3615,20 @@ void updateOutputBuf(SOptrBasicInfo* pBInfo, int32_t *bufCapacity, int32_t numOf
}
}
char *tsbuf = NULL;
for (int32_t i = 0; i < pDataBlock->info.numOfCols; ++i) {
SColumnInfoData *pColInfo = taosArrayGet(pDataBlock->pDataBlock, i);
pBInfo->pCtx[i].pOutput = pColInfo->pData + pColInfo->info.bytes * pDataBlock->info.rows;
// re-estabilish output buffer pointer.
int32_t functionId = pBInfo->pCtx[i].functionId;
if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF || functionId == TSDB_FUNC_DERIVATIVE) {
if(i > 0) pBInfo->pCtx[i].ptsOutputBuf = pBInfo->pCtx[i-1].pOutput;
if (functionId == TSDB_FUNC_PRJ && pColInfo->info.type == TSDB_DATA_TYPE_TIMESTAMP){
tsbuf = pBInfo->pCtx[i].pOutput;
}
else if ((i > 0) &&
(functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF || functionId == TSDB_FUNC_DERIVATIVE)) {
pBInfo->pCtx[i].ptsOutputBuf = pBInfo->pCtx[i-1].pOutput;
pBInfo->pCtx[i].ptsOriOutputBuf = tsbuf;
}
}
}