diff --git a/src/client/src/tscFunctionImpl.c b/src/client/src/tscFunctionImpl.c index 6892e1a6a790ce47c188644c77946e62613ca49f..de5ebecc6baf9056199c126ec8a111e83b7b3b3c 100644 --- a/src/client/src/tscFunctionImpl.c +++ b/src/client/src/tscFunctionImpl.c @@ -4567,7 +4567,7 @@ static void rate_function(SQLFunctionCtx *pCtx) { if (-DBL_MAX == pRateInfo->firstValue) { pRateInfo->firstValue = v; } else if (v > pRateInfo->firstValue) { - pRateInfo->CorrectionValue += pRateInfo->firstValue; + pRateInfo->CorrectionValue += v; pTrace("CorrectionValue:%f", pRateInfo->CorrectionValue); } @@ -4582,7 +4582,7 @@ static void rate_function(SQLFunctionCtx *pCtx) { if (pCtx->prev.key != -1) { if (pCtx->prev.data > pRateInfo->firstValue) { - pRateInfo->CorrectionValue += pRateInfo->firstValue; + pRateInfo->CorrectionValue += pCtx->prev.data; pTrace("CorrectionValue:%f", pRateInfo->CorrectionValue); } @@ -4758,6 +4758,14 @@ static void irate_function(SQLFunctionCtx *pCtx) { return; } + // next interpolation exists + if (pCtx->next.key != -1) { + pRateInfo->lastValue = pCtx->next.data; + pRateInfo->lastKey = pCtx->next.key; + pCtx->next.key = -1; // clear the flag + pTrace("%p irate_function() get next interpolation for lastValue:%f lastKey:%" PRId64, pCtx, pRateInfo->lastValue, pRateInfo->lastKey); + } + for (int32_t i = pCtx->size - 1; i >= 0; --i) { char *pData = GET_INPUT_CHAR_INDEX(pCtx, i); if (pCtx->hasNull && isNull(pData, pCtx->inputType)) { @@ -4800,7 +4808,7 @@ static void irate_function(SQLFunctionCtx *pCtx) { continue; } - if ((INT64_MIN == pRateInfo->firstKey) || (-DBL_MAX == pRateInfo->firstValue)){ + if ((INT64_MIN == pRateInfo->firstKey) || (-DBL_MAX == pRateInfo->firstValue)) { pRateInfo->firstValue = v; pRateInfo->firstKey = primaryKey[i]; @@ -4809,6 +4817,15 @@ static void irate_function(SQLFunctionCtx *pCtx) { } } + if (pCtx->prev.key != -1) { + if ((INT64_MIN == pRateInfo->firstKey) || (-DBL_MAX == pRateInfo->firstValue)) { + pRateInfo->firstValue = pCtx->prev.data; + pRateInfo->firstKey = pCtx->prev.key; + pCtx->prev.key = -1; + pTrace("%p irate_function() get prev interpolation for firstValue:%f firstKey:%" PRId64, pCtx, pRateInfo->firstValue, pRateInfo->firstKey); + } + } + SET_VAL(pCtx, notNullElems, 1); if (notNullElems > 0) { diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 05e1f16957687bb1236c3b23b4397be8f118b336..cee3998017523b09cba96bc86b70a057321b5261 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -1645,9 +1645,9 @@ int32_t addExprAndResultField(SQueryInfo* pQueryInfo, int32_t colIdx, tSQLExprIt SColumnList ids = getColumnList(1, 0, 0); insertResultField(pQueryInfo, 0, &ids, TSDB_KEYSIZE, TSDB_DATA_TYPE_TIMESTAMP, aAggs[TSDB_FUNC_TS_DUMMY].aName, pExpr); - } else if (optr == TK_RATE) { + } else if ((optr >= TK_RATE) && (optr <= TK_AVG_IRATE)) { SColumnIndex index1 = {.tableIndex = index.tableIndex, .columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX}; - tscColumnBaseInfoInsert(pQueryInfo, &index1); + tscColumnBaseInfoInsert(pQueryInfo, &index1); } // functions can not be applied to tags diff --git a/src/system/detail/src/vnodeQueryImpl.c b/src/system/detail/src/vnodeQueryImpl.c index 3c1dde7ced23489e5b4ec33f603b1c8b22479119..7998d4f3a22f5859d926a00f9e693f957d036b7e 100644 --- a/src/system/detail/src/vnodeQueryImpl.c +++ b/src/system/detail/src/vnodeQueryImpl.c @@ -83,7 +83,7 @@ static int32_t getGroupResultId(int32_t groupIndex) { static bool needsBoundaryTS(SQuery *pQuery) { for(int32_t i = 0; i < pQuery->numOfOutputCols; ++i) { int32_t functionId = pQuery->pSelectExpr[i].pBase.functionId; - if (functionId == TSDB_FUNC_RATE) { + if (functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_AVG_IRATE) { return true; } } @@ -1749,7 +1749,8 @@ static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SWindowStat pCtx[k].size = forwardStep; pCtx[k].startOffset = (QUERY_IS_ASC_QUERY(pQuery)) ? startPos : startPos - (forwardStep - 1); - if ((aAggs[functionId].nStatus & TSDB_FUNCSTATE_SELECTIVITY) != 0 || functionId == TSDB_FUNC_RATE) { + if ((aAggs[functionId].nStatus & TSDB_FUNCSTATE_SELECTIVITY) != 0 + || ((functionId >= TSDB_FUNC_RATE) && (functionId <= TSDB_FUNC_AVG_IRATE))) { pCtx[k].ptsList = (TSKEY *)((char*)pRuntimeEnv->primaryColBuffer->data + pCtx[k].startOffset * TSDB_KEYSIZE); } @@ -2062,7 +2063,8 @@ static void doSetInterpolationDataForTimeWindow(SQueryRuntimeEnv* pRuntimeEnv, S // interpolate for skey value for(int32_t i = 0; i < pQuery->numOfOutputCols; ++i) { - if (pQuery->pSelectExpr[i].pBase.functionId != TSDB_FUNC_RATE) { + if ((pQuery->pSelectExpr[i].pBase.functionId < TSDB_FUNC_RATE) + || (pQuery->pSelectExpr[i].pBase.functionId > TSDB_FUNC_AVG_IRATE)) { continue; } @@ -2072,7 +2074,8 @@ static void doSetInterpolationDataForTimeWindow(SQueryRuntimeEnv* pRuntimeEnv, S // interpolate for ekey value for(int32_t i = 0; i < pQuery->numOfOutputCols; ++i) { - if (pQuery->pSelectExpr[i].pBase.functionId != TSDB_FUNC_RATE) { + if ((pQuery->pSelectExpr[i].pBase.functionId < TSDB_FUNC_RATE) + || (pQuery->pSelectExpr[i].pBase.functionId > TSDB_FUNC_AVG_IRATE)) { continue; }