From e0b4bb2442f114b9d6a71e12d0be5dc90e1a8f90 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Tue, 1 Jun 2021 22:30:12 +0800 Subject: [PATCH 01/11] [td-255]fix memory leak in test cases. --- tests/examples/c/apitest.c | 39 +++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/tests/examples/c/apitest.c b/tests/examples/c/apitest.c index b2411d1212..2961750efc 100644 --- a/tests/examples/c/apitest.c +++ b/tests/examples/c/apitest.c @@ -402,10 +402,6 @@ void verify_prepare(TAOS* taos) { taos_stmt_close(stmt); } - - - - void verify_prepare2(TAOS* taos) { TAOS_RES* result = taos_query(taos, "drop database if exists test;"); taos_free_result(result); @@ -531,10 +527,9 @@ void verify_prepare2(TAOS* taos) { params[9].is_null = is_null; params[9].num = 10; - - sql = "insert into ? values(?,?,?,?,?,?,?,?,?,?)"; + sql = "insert into ? (ts, b, v1, v2, v4, v8, f4, f8, bin, blob) values(?,?,?,?,?,?,?,?,?,?)"; code = taos_stmt_prepare(stmt, sql, 0); - if (code != 0){ + if (code != 0) { printf("\033[31mfailed to execute taos_stmt_prepare. code:0x%x\033[0m\n", code); } @@ -577,10 +572,9 @@ void verify_prepare2(TAOS* taos) { printf("\033[31mfailed to execute insert statement.\033[0m\n"); return; } + taos_stmt_close(stmt); - - // query the records stmt = taos_stmt_init(taos); taos_stmt_prepare(stmt, "SELECT * FROM m1 WHERE v1 > ? AND v2 < ?", 0); @@ -623,10 +617,17 @@ void verify_prepare2(TAOS* taos) { taos_free_result(result); taos_stmt_close(stmt); + + free(t8_len); + free(t16_len); + free(t32_len); + free(t64_len); + free(float_len); + free(double_len); + free(bin_len); + free(blob_len); } - - void verify_prepare3(TAOS* taos) { TAOS_RES* result = taos_query(taos, "drop database if exists test;"); taos_free_result(result); @@ -810,7 +811,6 @@ void verify_prepare3(TAOS* taos) { blob_len[i] = (int32_t)strlen(v.blob[i]); } - taos_stmt_bind_param_batch(stmt, params); taos_stmt_add_batch(stmt); @@ -852,10 +852,12 @@ void verify_prepare3(TAOS* taos) { int rows = 0; int num_fields = taos_num_fields(result); TAOS_FIELD *fields = taos_fetch_fields(result); - char temp[256]; + char temp[256] = {0}; // fetch the records row by row while ((row = taos_fetch_row(result))) { + memset(temp, 0, sizeof(temp)/sizeof(temp[0])); + rows++; taos_print_row(temp, row, fields, num_fields); printf("%s\n", temp); @@ -863,10 +865,17 @@ void verify_prepare3(TAOS* taos) { taos_free_result(result); taos_stmt_close(stmt); + + free(t8_len); + free(t16_len); + free(t32_len); + free(t64_len); + free(float_len); + free(double_len); + free(bin_len); + free(blob_len); } - - void retrieve_callback(void *param, TAOS_RES *tres, int numOfRows) { if (numOfRows > 0) { From cdf2d3f4378f3c94664e9cf17f96aa885c3a0959 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 2 Jun 2021 15:20:44 +0800 Subject: [PATCH 02/11] [td-4111]: fix bug for irate function. --- src/client/src/tscSQLParser.c | 14 +-- src/query/inc/qAggMain.h | 28 ++--- src/query/src/qAggMain.c | 218 +++++++--------------------------- src/query/src/qExecutor.c | 17 --- 4 files changed, 59 insertions(+), 218 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index b28ff5e3e9..c3a7c7c89c 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -2144,10 +2144,6 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col case TSDB_FUNC_AVG: case TSDB_FUNC_RATE: case TSDB_FUNC_IRATE: - case TSDB_FUNC_SUM_RATE: - case TSDB_FUNC_SUM_IRATE: - case TSDB_FUNC_AVG_RATE: - case TSDB_FUNC_AVG_IRATE: case TSDB_FUNC_TWA: case TSDB_FUNC_MIN: case TSDB_FUNC_MAX: @@ -2212,8 +2208,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col SExprInfo* pExpr = tscExprAppend(pQueryInfo, functionId, &index, resultType, resultSize, getNewResColId(pCmd), resultSize, false); - if (functionId == TSDB_FUNC_LEASTSQR) { - /* set the leastsquares parameters */ + if (functionId == TSDB_FUNC_LEASTSQR) { // set the leastsquares parameters char val[8] = {0}; if (tVariantDump(&pParamElem[1].pNode->value, val, TSDB_DATA_TYPE_DOUBLE, true) < 0) { return TSDB_CODE_TSC_INVALID_OPERATION; @@ -2227,6 +2222,11 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col } tscExprAddParams(&pExpr->base, val, TSDB_DATA_TYPE_DOUBLE, sizeof(double)); + } else if (functionId == TSDB_FUNC_IRATE) { + STableComInfo info = tscGetTableInfo(pTableMetaInfo->pTableMeta); + int64_t prec = info.precision; + + tscExprAddParams(&pExpr->base, (char*)&prec, TSDB_DATA_TYPE_BIGINT, LONG_BYTES); } SColumnList ids = createColumnList(1, index.tableIndex, index.columnIndex); @@ -2875,7 +2875,7 @@ int32_t tscTansformFuncForSTableQuery(SQueryInfo* pQueryInfo) { if ((functionId >= TSDB_FUNC_SUM && functionId <= TSDB_FUNC_TWA) || (functionId >= TSDB_FUNC_FIRST_DST && functionId <= TSDB_FUNC_STDDEV_DST) || - (functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_AVG_IRATE)) { + (functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_IRATE)) { if (getResultDataInfo(pSrcSchema->type, pSrcSchema->bytes, functionId, (int32_t)pExpr->base.param[0].i64, &type, &bytes, &interBytes, 0, true) != TSDB_CODE_SUCCESS) { return TSDB_CODE_TSC_INVALID_OPERATION; diff --git a/src/query/inc/qAggMain.h b/src/query/inc/qAggMain.h index bdccd4eb3c..47c61fc444 100644 --- a/src/query/inc/qAggMain.h +++ b/src/query/inc/qAggMain.h @@ -65,24 +65,18 @@ extern "C" { #define TSDB_FUNC_RATE 29 #define TSDB_FUNC_IRATE 30 -#define TSDB_FUNC_SUM_RATE 31 -#define TSDB_FUNC_SUM_IRATE 32 -#define TSDB_FUNC_AVG_RATE 33 -#define TSDB_FUNC_AVG_IRATE 34 - -#define TSDB_FUNC_TID_TAG 35 -#define TSDB_FUNC_BLKINFO 36 - -#define TSDB_FUNC_HISTOGRAM 37 -#define TSDB_FUNC_HLL 38 -#define TSDB_FUNC_MODE 39 -#define TSDB_FUNC_SAMPLE 40 -#define TSDB_FUNC_CEIL 41 -#define TSDB_FUNC_FLOOR 42 -#define TSDB_FUNC_ROUND 43 -#define TSDB_FUNC_MAVG 44 -#define TSDB_FUNC_CSUM 45 +#define TSDB_FUNC_TID_TAG 31 +#define TSDB_FUNC_BLKINFO 32 +#define TSDB_FUNC_HISTOGRAM 33 +#define TSDB_FUNC_HLL 34 +#define TSDB_FUNC_MODE 35 +#define TSDB_FUNC_SAMPLE 36 +#define TSDB_FUNC_CEIL 37 +#define TSDB_FUNC_FLOOR 38 +#define TSDB_FUNC_ROUND 39 +#define TSDB_FUNC_MAVG 40 +#define TSDB_FUNC_CSUM 41 #define TSDB_FUNCSTATE_SO 0x1u // single output #define TSDB_FUNCSTATE_MO 0x2u // dynamic number of output, not multinumber of output e.g., TOP/BOTTOM diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index be0716ce99..de8ffea06a 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -159,8 +159,6 @@ typedef struct SRateInfo { TSKEY lastKey; int8_t hasResult; // flag to denote has value bool isIRate; // true for IRate functions, false for Rate functions - int64_t num; // for sum/avg - double sum; // for sum/avg } SRateInfo; int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionId, int32_t param, int16_t *type, @@ -238,7 +236,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI *interBytes = *bytes; return TSDB_CODE_SUCCESS; - } else if (functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_AVG_IRATE) { + } else if (functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_IRATE) { *type = TSDB_DATA_TYPE_DOUBLE; *bytes = sizeof(SRateInfo); *interBytes = sizeof(SRateInfo); @@ -304,7 +302,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI *type = TSDB_DATA_TYPE_DOUBLE; *bytes = sizeof(double); *interBytes = sizeof(SAvgInfo); - } else if (functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_AVG_IRATE) { + } else if (functionId >= TSDB_FUNC_RATE && functionId <= TSDB_FUNC_IRATE) { *type = TSDB_DATA_TYPE_DOUBLE; *bytes = sizeof(double); *interBytes = sizeof(SRateInfo); @@ -4479,16 +4477,18 @@ static void ts_comp_finalize(SQLFunctionCtx *pCtx) { } ////////////////////////////////////////////////////////////////////////////////////////////// -// RATE functions - -static double do_calc_rate(const SRateInfo* pRateInfo) { - if ((INT64_MIN == pRateInfo->lastKey) || (INT64_MIN == pRateInfo->firstKey) || (pRateInfo->firstKey >= pRateInfo->lastKey)) { +// rate functions +static double do_calc_rate(const SRateInfo* pRateInfo, int64_t tickPerSec) { + if ((INT64_MIN == pRateInfo->lastKey) || (INT64_MIN == pRateInfo->firstKey) || + (pRateInfo->firstKey >= pRateInfo->lastKey)) { return 0; } - + int64_t diff = 0; if (pRateInfo->isIRate) { + // If the previous value of the last is greater than the last value, only keep the last point instead of the delta + // value between two values. diff = pRateInfo->lastValue; if (diff >= pRateInfo->firstValue) { diff -= pRateInfo->firstValue; @@ -4501,14 +4501,11 @@ static double do_calc_rate(const SRateInfo* pRateInfo) { } int64_t duration = pRateInfo->lastKey - pRateInfo->firstKey; - duration = (duration + 500) / 1000; - - double resultVal = ((double)diff) / duration; - - qDebug("do_calc_rate() isIRate:%d firstKey:%" PRId64 " lastKey:%" PRId64 " firstValue:%" PRId64 " lastValue:%" PRId64 " CorrectionValue:%" PRId64 " resultVal:%f", - pRateInfo->isIRate, pRateInfo->firstKey, pRateInfo->lastKey, pRateInfo->firstValue, pRateInfo->lastValue, pRateInfo->CorrectionValue, resultVal); - - return resultVal; + if (duration == 0) { + return 0; + } + + return (duration > 0)? ((double)diff) / (duration/((double) tickPerSec)):0; } static bool rate_function_setup(SQLFunctionCtx *pCtx) { @@ -4516,19 +4513,17 @@ static bool rate_function_setup(SQLFunctionCtx *pCtx) { return false; } - SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); //->pOutput + pCtx->outputBytes; - SRateInfo * pInfo = GET_ROWCELL_INTERBUF(pResInfo); - + SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); + + SRateInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo); pInfo->CorrectionValue = 0; pInfo->firstKey = INT64_MIN; pInfo->lastKey = INT64_MIN; pInfo->firstValue = INT64_MIN; pInfo->lastValue = INT64_MIN; - pInfo->num = 0; - pInfo->sum = 0; - + pInfo->hasResult = 0; - pInfo->isIRate = ((pCtx->functionId == TSDB_FUNC_IRATE) || (pCtx->functionId == TSDB_FUNC_SUM_IRATE) || (pCtx->functionId == TSDB_FUNC_AVG_IRATE)); + pInfo->isIRate = (pCtx->functionId == TSDB_FUNC_IRATE); return true; } @@ -4647,18 +4642,13 @@ static void rate_finalizer(SQLFunctionCtx *pCtx) { SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo); - qDebug("%p isIRate:%d firstKey:%" PRId64 " lastKey:%" PRId64 " firstValue:%" PRId64 " lastValue:%" PRId64 " CorrectionValue:%" PRId64 " hasResult:%d", - pCtx, pRateInfo->isIRate, pRateInfo->firstKey, pRateInfo->lastKey, pRateInfo->firstValue, pRateInfo->lastValue, pRateInfo->CorrectionValue, pRateInfo->hasResult); - if (pRateInfo->hasResult != DATA_SET_FLAG) { setNull(pCtx->pOutput, TSDB_DATA_TYPE_DOUBLE, sizeof(double)); return; } - *(double*)pCtx->pOutput = do_calc_rate(pRateInfo); - - qDebug("rate_finalizer() output result:%f", *(double *)pCtx->pOutput); - + *(double*)pCtx->pOutput = do_calc_rate(pRateInfo, TSDB_TICK_PER_SECOND(pCtx->param[0].i64)); + // cannot set the numOfIteratedElems again since it is set during previous iteration pResInfo->numOfRes = 1; pResInfo->hasResult = DATA_SET_FLAG; @@ -4667,22 +4657,15 @@ static void rate_finalizer(SQLFunctionCtx *pCtx) { } static void irate_function(SQLFunctionCtx *pCtx) { - - int32_t notNullElems = 0; - SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); - SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo); - TSKEY *primaryKey = GET_TS_LIST(pCtx); + SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); - qDebug("%p irate_function() size:%d, hasNull:%d", pCtx, pCtx->size, pCtx->hasNull); - - if (pCtx->size < 1) { - return; - } + int32_t notNullElems = 0; + SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo); + TSKEY *primaryKey = GET_TS_LIST(pCtx); for (int32_t i = pCtx->size - 1; i >= 0; --i) { char *pData = GET_INPUT_DATA(pCtx, i); if (pCtx->hasNull && isNull(pData, pCtx->inputType)) { - qDebug("%p irate_function() index of null data:%d", pCtx, i); continue; } @@ -4690,21 +4673,16 @@ static void irate_function(SQLFunctionCtx *pCtx) { int64_t v = 0; GET_TYPED_DATA(v, int64_t, pCtx->inputType, pData); - - // TODO: calc once if only call this function once ???? - if ((INT64_MIN == pRateInfo->lastKey) || (INT64_MIN == pRateInfo->lastValue)) { + + if ((INT64_MIN == pRateInfo->lastKey) || primaryKey[i] > pRateInfo->lastKey) { pRateInfo->lastValue = v; pRateInfo->lastKey = primaryKey[i]; - - qDebug("%p irate_function() lastValue:%" PRId64 " lastKey:%" PRId64, pCtx, pRateInfo->lastValue, pRateInfo->lastKey); continue; } - if ((INT64_MIN == pRateInfo->firstKey) || (INT64_MIN == pRateInfo->firstValue)){ + if ((INT64_MIN == pRateInfo->firstKey) || primaryKey[i] > pRateInfo->firstKey) { pRateInfo->firstValue = v; pRateInfo->firstKey = primaryKey[i]; - - qDebug("%p irate_function() firstValue:%" PRId64 " firstKey:%" PRId64, pCtx, pRateInfo->firstValue, pRateInfo->firstKey); break; } } @@ -4756,68 +4734,6 @@ static void irate_function_f(SQLFunctionCtx *pCtx, int32_t index) { } } -static void do_sumrate_merge(SQLFunctionCtx *pCtx) { - SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); - assert(pCtx->stableQuery); - - SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo); - char * input = GET_INPUT_DATA_LIST(pCtx); - - for (int32_t i = 0; i < pCtx->size; ++i, input += pCtx->inputBytes) { - SRateInfo *pInput = (SRateInfo *)input; - - qDebug("%p do_sumrate_merge() hasResult:%d input num:%" PRId64 " input sum:%f total num:%" PRId64 " total sum:%f", pCtx, pInput->hasResult, pInput->num, pInput->sum, pRateInfo->num, pRateInfo->sum); - - if (pInput->hasResult != DATA_SET_FLAG) { - continue; - } else if (pInput->num == 0) { - pRateInfo->sum += do_calc_rate(pInput); - pRateInfo->num++; - } else { - pRateInfo->sum += pInput->sum; - pRateInfo->num += pInput->num; - } - pRateInfo->hasResult = DATA_SET_FLAG; - } - - // if the data set hasResult is not set, the result is null - if (DATA_SET_FLAG == pRateInfo->hasResult) { - pResInfo->hasResult = DATA_SET_FLAG; - SET_VAL(pCtx, pRateInfo->num, 1); - memcpy(pCtx->pOutput, GET_ROWCELL_INTERBUF(pResInfo), sizeof(SRateInfo)); - } -} - -static void sumrate_func_merge(SQLFunctionCtx *pCtx) { - qDebug("%p sumrate_func_merge() process ...", pCtx); - do_sumrate_merge(pCtx); -} - -static void sumrate_finalizer(SQLFunctionCtx *pCtx) { - SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); - SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo); - - qDebug("%p sumrate_finalizer() superTableQ:%d num:%" PRId64 " sum:%f hasResult:%d", pCtx, pCtx->stableQuery, pRateInfo->num, pRateInfo->sum, pRateInfo->hasResult); - - if (pRateInfo->hasResult != DATA_SET_FLAG) { - setNull(pCtx->pOutput, TSDB_DATA_TYPE_DOUBLE, sizeof(double)); - return; - } - - if (pRateInfo->num == 0) { - // from meter - *(double*)pCtx->pOutput = do_calc_rate(pRateInfo); - } else if (pCtx->functionId == TSDB_FUNC_SUM_RATE || pCtx->functionId == TSDB_FUNC_SUM_IRATE) { - *(double*)pCtx->pOutput = pRateInfo->sum; - } else { - *(double*)pCtx->pOutput = pRateInfo->sum / pRateInfo->num; - } - - pResInfo->numOfRes = 1; - pResInfo->hasResult = DATA_SET_FLAG; - doFinalizer(pCtx); -} - void blockInfo_func(SQLFunctionCtx* pCtx) { SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); STableBlockDist* pDist = (STableBlockDist*) GET_ROWCELL_INTERBUF(pResInfo); @@ -4987,8 +4903,8 @@ int32_t functionCompatList[] = { 4, -1, -1, 1, 1, 1, 1, 1, 1, -1, // tag, colprj, tagprj, arithmetic, diff, first_dist, last_dist, interp rate irate 1, 1, 1, 1, -1, 1, 1, 5, 1, 1, - // sum_rate, sum_irate, avg_rate, avg_irate, tid_tag, blk_info - 1, 1, 1, 1, 6, 7 + // tid_tag, blk_info + 6, 7 }; SAggFunctionInfo aAggs[] = {{ @@ -5400,58 +5316,6 @@ SAggFunctionInfo aAggs[] = {{ }, { // 31 - "sum_rate", - TSDB_FUNC_SUM_RATE, - TSDB_FUNC_SUM_RATE, - TSDB_BASE_FUNC_SO | TSDB_FUNCSTATE_NEED_TS, - rate_function_setup, - rate_function, - rate_function_f, - sumrate_finalizer, - sumrate_func_merge, - dataBlockRequired, - }, - { - // 32 - "sum_irate", - TSDB_FUNC_SUM_IRATE, - TSDB_FUNC_SUM_IRATE, - TSDB_BASE_FUNC_SO | TSDB_FUNCSTATE_NEED_TS, - rate_function_setup, - irate_function, - irate_function_f, - sumrate_finalizer, - sumrate_func_merge, - dataBlockRequired, - }, - { - // 33 - "avg_rate", - TSDB_FUNC_AVG_RATE, - TSDB_FUNC_AVG_RATE, - TSDB_BASE_FUNC_SO | TSDB_FUNCSTATE_NEED_TS, - rate_function_setup, - rate_function, - rate_function_f, - sumrate_finalizer, - sumrate_func_merge, - dataBlockRequired, - }, - { - // 34 - "avg_irate", - TSDB_FUNC_AVG_IRATE, - TSDB_FUNC_AVG_IRATE, - TSDB_BASE_FUNC_SO | TSDB_FUNCSTATE_NEED_TS, - rate_function_setup, - irate_function, - irate_function_f, - sumrate_finalizer, - sumrate_func_merge, - dataBlockRequired, - }, - { - // 35 "tbid", // return table id and the corresponding tags for join match and subscribe TSDB_FUNC_TID_TAG, TSDB_FUNC_TID_TAG, @@ -5464,15 +5328,15 @@ SAggFunctionInfo aAggs[] = {{ dataBlockRequired, }, { - // 35 - "_block_dist", // return table id and the corresponding tags for join match and subscribe - TSDB_FUNC_BLKINFO, - TSDB_FUNC_BLKINFO, - TSDB_FUNCSTATE_SO | TSDB_FUNCSTATE_STABLE, - function_setup, - blockInfo_func, - noop2, - blockinfo_func_finalizer, - block_func_merge, - dataBlockRequired, + // 32 + "_block_dist", // return table id and the corresponding tags for join match and subscribe + TSDB_FUNC_BLKINFO, + TSDB_FUNC_BLKINFO, + TSDB_FUNCSTATE_SO | TSDB_FUNCSTATE_STABLE, + function_setup, + blockInfo_func, + noop2, + blockinfo_func_finalizer, + block_func_merge, + dataBlockRequired, }}; diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 25e7e446bd..c1087db8b7 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -1990,23 +1990,6 @@ void setQueryKilled(SQInfo *pQInfo) { pQInfo->code = TSDB_CODE_TSC_QUERY_CANCELL // return false; //} -// TODO REFACTOR:MERGE WITH CLIENT-SIDE FUNCTION -static UNUSED_FUNC bool isSumAvgRateQuery(SQueryAttr *pQueryAttr) { - for (int32_t i = 0; i < pQueryAttr->numOfOutput; ++i) { - int32_t functionId = pQueryAttr->pExpr1[i].base.functionId; - if (functionId == TSDB_FUNC_TS) { - continue; - } - - if (functionId == TSDB_FUNC_SUM_RATE || functionId == TSDB_FUNC_SUM_IRATE || functionId == TSDB_FUNC_AVG_RATE || - functionId == TSDB_FUNC_AVG_IRATE) { - return true; - } - } - - return false; -} - static bool isFirstLastRowQuery(SQueryAttr *pQueryAttr) { for (int32_t i = 0; i < pQueryAttr->numOfOutput; ++i) { int32_t functionID = pQueryAttr->pExpr1[i].base.functionId; From 41befca45de4dffb697bc6b070ef068728a90746 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 2 Jun 2021 16:12:26 +0800 Subject: [PATCH 03/11] [td-255]fix bug in session window. --- src/query/src/qExecutor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index c1087db8b7..9e1534eb24 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -1347,8 +1347,8 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSWindowOperatorInf pInfo->start = j; } else if (tsList[j] - pInfo->prevTs <= gap) { pInfo->curWindow.ekey = tsList[j]; - //pInfo->prevTs = tsList[j]; pInfo->numOfRows += 1; + pInfo->prevTs = tsList[j]; if (j == 0 && pInfo->start != 0) { pInfo->numOfRows = 1; pInfo->start = 0; From 0d7a58f0ca8d1d820c2590508cfa30bedf44d4d3 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 2 Jun 2021 17:52:16 +0800 Subject: [PATCH 04/11] [td-255] add test cases, fix compiler error. --- src/query/src/qAggMain.c | 29 ++---- tests/script/general/parser/function.sim | 118 +++++++++++++++++++++++ 2 files changed, 127 insertions(+), 20 deletions(-) diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index de8ffea06a..08c057ecc6 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -153,9 +153,9 @@ typedef struct STSCompInfo { typedef struct SRateInfo { int64_t CorrectionValue; - int64_t firstValue; + double firstValue; TSKEY firstKey; - int64_t lastValue; + double lastValue; TSKEY lastKey; int8_t hasResult; // flag to denote has value bool isIRate; // true for IRate functions, false for Rate functions @@ -4484,8 +4484,7 @@ static double do_calc_rate(const SRateInfo* pRateInfo, int64_t tickPerSec) { return 0; } - int64_t diff = 0; - + double diff = 0; if (pRateInfo->isIRate) { // If the previous value of the last is greater than the last value, only keep the last point instead of the delta // value between two values. @@ -4551,8 +4550,6 @@ static void rate_function(SQLFunctionCtx *pCtx) { if ((INT64_MIN == pRateInfo->firstValue) || (INT64_MIN == pRateInfo->firstKey)) { pRateInfo->firstValue = v; pRateInfo->firstKey = primaryKey[i]; - - qDebug("firstValue:%" PRId64 " firstKey:%" PRId64, pRateInfo->firstValue, pRateInfo->firstKey); } if (INT64_MIN == pRateInfo->lastValue) { @@ -4564,7 +4561,6 @@ static void rate_function(SQLFunctionCtx *pCtx) { pRateInfo->lastValue = v; pRateInfo->lastKey = primaryKey[i]; - qDebug("lastValue:%" PRId64 " lastKey:%" PRId64, pRateInfo->lastValue, pRateInfo->lastKey); } if (!pCtx->hasNull) { @@ -4612,8 +4608,6 @@ static void rate_function_f(SQLFunctionCtx *pCtx, int32_t index) { pRateInfo->lastValue = v; pRateInfo->lastKey = primaryKey[index]; - qDebug("====%p rate_function_f() index:%d lastValue:%" PRId64 " lastKey:%" PRId64 " CorrectionValue:%" PRId64, pCtx, index, pRateInfo->lastValue, pRateInfo->lastKey, pRateInfo->CorrectionValue); - SET_VAL(pCtx, 1, 1); // set has result flag @@ -4632,10 +4626,6 @@ static void rate_func_copy(SQLFunctionCtx *pCtx) { SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); memcpy(GET_ROWCELL_INTERBUF(pResInfo), pCtx->pInput, (size_t)pCtx->inputBytes); pResInfo->hasResult = ((SRateInfo*)pCtx->pInput)->hasResult; - - SRateInfo* pRateInfo = (SRateInfo*)pCtx->pInput; - qDebug("%p rate_func_merge() firstKey:%" PRId64 " lastKey:%" PRId64 " firstValue:%" PRId64 " lastValue:%" PRId64 " CorrectionValue:%" PRId64 " hasResult:%d", - pCtx, pRateInfo->firstKey, pRateInfo->lastKey, pRateInfo->firstValue, pRateInfo->lastValue, pRateInfo->CorrectionValue, pRateInfo->hasResult); } static void rate_finalizer(SQLFunctionCtx *pCtx) { @@ -4671,8 +4661,8 @@ static void irate_function(SQLFunctionCtx *pCtx) { notNullElems++; - int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pCtx->inputType, pData); + double v = 0; + GET_TYPED_DATA(v, double, pCtx->inputType, pData); if ((INT64_MIN == pRateInfo->lastKey) || primaryKey[i] > pRateInfo->lastKey) { pRateInfo->lastValue = v; @@ -4720,8 +4710,7 @@ static void irate_function_f(SQLFunctionCtx *pCtx, int32_t index) { pRateInfo->lastValue = v; pRateInfo->lastKey = primaryKey[index]; - qDebug("====%p irate_function_f() index:%d lastValue:%" PRId64 " lastKey:%" PRId64 " firstValue:%" PRId64 " firstKey:%" PRId64, pCtx, index, pRateInfo->lastValue, pRateInfo->lastKey, pRateInfo->firstValue , pRateInfo->firstKey); - +// qDebug("====%p irate_function_f() index:%d lastValue:%" PRId64 " lastKey:%" PRId64 " firstValue:%" PRId64 " firstKey:%" PRId64, pCtx, index, pRateInfo->lastValue, pRateInfo->lastKey, pRateInfo->firstValue , pRateInfo->firstKey); SET_VAL(pCtx, 1, 1); // set has result flag @@ -4899,10 +4888,10 @@ void blockinfo_func_finalizer(SQLFunctionCtx* pCtx) { int32_t functionCompatList[] = { // count, sum, avg, min, max, stddev, percentile, apercentile, first, last 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - // last_row,top, bottom, spread, twa, leastsqr, ts, ts_dummy, tag_dummy, ts_z + // last_row,top, bottom, spread, twa, leastsqr, ts, ts_dummy, tag_dummy, ts_comp 4, -1, -1, 1, 1, 1, 1, 1, 1, -1, - // tag, colprj, tagprj, arithmetic, diff, first_dist, last_dist, interp rate irate - 1, 1, 1, 1, -1, 1, 1, 5, 1, 1, + // tag, colprj, tagprj, arithmetic, diff, first_dist, last_dist, stddev_dst, interp rate irate + 1, 1, 1, 1, -1, 1, 1, 1, 5, 1, 1, // tid_tag, blk_info 6, 7 }; diff --git a/tests/script/general/parser/function.sim b/tests/script/general/parser/function.sim index ee5a750c88..591d5d1535 100644 --- a/tests/script/general/parser/function.sim +++ b/tests/script/general/parser/function.sim @@ -814,3 +814,121 @@ if $data00 != 1 then endi print ====================> TODO stddev + normal column filter + + +print ====================> irate +sql select irate(k) from t1 +if $rows != 1 then + return -1 +endi + +if $data00 != 0.000027778 then + return -1 +endi + +sql select irate(k) from t1 where ts>='2015-8-18 00:30:00.000' +if $rows != 1 then + return -1 +endi + +if $data00 != 0.000000000 then + print expect 0.000000000, actual $data00 + return -1 +endi + +sql select irate(k) from t1 where ts>='2015-8-18 00:06:00.000' and ts<='2015-8-18 00:12:000'; +if $rows != 1 then + return -1 +endi + +if $data00 != 0.005633334 then + return -1 +endi + +sql select irate(k) from t1 interval(10a) +if $rows != 6 then + return -1 +endi + +if $data01 != 0.000000000 then + return -1 +endi + +if $data11 != 0.000000000 then + return -1 +endi + +if $data51 != 0.000000000 then + return -1 +endi + +sql select count(*),irate(k) from t1 interval(10m) +if $rows != 4 then + return -1 +endi + +if $data00 != @15-08-18 00:00:00.000@ then + return -1 +endi + +if $data01 != 2 then + return -1 +endi + +if $data02 != 0.000144445 then + return -1 +endi + +if $data10 != @15-08-18 00:10:00.000@ then + return -1 +endi + +if $data11 != 2 then + return -1 +endi + +if $data12 != 0.000272222 then + return -1 +endi + +if $data20 != @15-08-18 00:20:00.000@ then + return -1 +endi + +if $data21 != 1 then + return -1 +endi + +if $data22 != 0.000000000 then + return -1 +endi + +if $data30 != @15-08-18 00:30:00.000@ then + return -1 +endi + +if $data31 != 1 then + return -1 +endi + +if $data32 != 0.000000000 then + return -1 +endi + +sql select count(*),irate(k) from t1 interval(10m) order by ts desc +if $rows != 4 then + return -1 +endi + +if $data30 != @15-08-18 00:00:00.000@ then + return -1 +endi + +if $data31 != 2 then + return -1 +endi + +if $data32 != 0.000144445 then + return -1 +endi + From d09d9a2e5687fdd01fdf8388592d5df85fd7f3e2 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 2 Jun 2021 19:43:10 +0800 Subject: [PATCH 05/11] [td-4520]: support the tbname column alias name. --- src/client/src/tscSQLParser.c | 22 ++++++++++++++++------ src/query/src/qAggMain.c | 12 ++++++------ tests/script/general/parser/nestquery.sim | 6 ++++++ 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index c3a7c7c89c..f2558086ed 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -1931,8 +1931,10 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t } if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) { - SSchema* colSchema = tGetTbnameColumnSchema(); - tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, colSchema, TSDB_COL_TAG, getNewResColId(pCmd)); + SSchema colSchema = *tGetTbnameColumnSchema(); + getColumnName(pItem, colSchema.name, colSchema.name, sizeof(colSchema.name) - 1); + + /*SExprInfo* pExpr = */tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, &colSchema, TSDB_COL_TAG, getNewResColId(pCmd)); } else { STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex); STableMeta* pTableMeta = pTableMetaInfo->pTableMeta; @@ -3887,7 +3889,8 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql return code; } - if (index.columnIndex == PRIMARYKEY_TIMESTAMP_COL_INDEX) { // query on time range + SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, index.columnIndex); + if (pSchema->colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) { // query on time range if (!validateJoinExprNode(pCmd, pQueryInfo, *pExpr, &index)) { return TSDB_CODE_TSC_INVALID_OPERATION; } @@ -6754,6 +6757,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) { const char* msg5 = "sql too long"; // todo ADD support const char* msg6 = "from missing in subclause"; const char* msg7 = "time interval is required"; + const char* msg8 = "the first column should be primary timestamp column"; SSqlCmd* pCmd = &pSql->cmd; SQueryInfo* pQueryInfo = tscGetQueryInfo(pCmd); @@ -6807,13 +6811,19 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) { return TSDB_CODE_TSC_INVALID_OPERATION; } - if (isTimeWindowQuery(pQueryInfo) && (validateFunctionsInIntervalOrGroupbyQuery(pCmd, pQueryInfo) != TSDB_CODE_SUCCESS)) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); } - if (!tscIsProjectionQuery(pQueryInfo) && pQueryInfo->interval.interval == 0) { - return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg7); + if (tscIsProjectionQuery(pQueryInfo)) { + SExprInfo* pExpr = tscExprGet(pQueryInfo, 0); + if (pExpr->base.colInfo.colId != PRIMARYKEY_TIMESTAMP_COL_INDEX) { + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg8); + } + } else { + if (pQueryInfo->interval.interval == 0) { + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg7); + } } // set the created table[stream] name diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 08c057ecc6..7cc5803f2e 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -4481,7 +4481,7 @@ static void ts_comp_finalize(SQLFunctionCtx *pCtx) { static double do_calc_rate(const SRateInfo* pRateInfo, int64_t tickPerSec) { if ((INT64_MIN == pRateInfo->lastKey) || (INT64_MIN == pRateInfo->firstKey) || (pRateInfo->firstKey >= pRateInfo->lastKey)) { - return 0; + return 0.0; } double diff = 0; @@ -4504,7 +4504,7 @@ static double do_calc_rate(const SRateInfo* pRateInfo, int64_t tickPerSec) { return 0; } - return (duration > 0)? ((double)diff) / (duration/((double) tickPerSec)):0; + return (duration > 0)? ((double)diff) / (duration/((double) tickPerSec)):0.0; } static bool rate_function_setup(SQLFunctionCtx *pCtx) { @@ -4545,7 +4545,7 @@ static void rate_function(SQLFunctionCtx *pCtx) { notNullElems++; int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pCtx->inputType, pData); + GET_TYPED_DATA(v, double, pCtx->inputType, pData); if ((INT64_MIN == pRateInfo->firstValue) || (INT64_MIN == pRateInfo->firstKey)) { pRateInfo->firstValue = v; @@ -4592,7 +4592,7 @@ static void rate_function_f(SQLFunctionCtx *pCtx, int32_t index) { TSKEY *primaryKey = GET_TS_LIST(pCtx); int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pCtx->inputType, pData); + GET_TYPED_DATA(v, double, pCtx->inputType, pData); if ((INT64_MIN == pRateInfo->firstValue) || (INT64_MIN == pRateInfo->firstKey)) { pRateInfo->firstValue = v; @@ -4637,7 +4637,7 @@ static void rate_finalizer(SQLFunctionCtx *pCtx) { return; } - *(double*)pCtx->pOutput = do_calc_rate(pRateInfo, TSDB_TICK_PER_SECOND(pCtx->param[0].i64)); + *(double*) pCtx->pOutput = do_calc_rate(pRateInfo, TSDB_TICK_PER_SECOND(pCtx->param[0].i64)); // cannot set the numOfIteratedElems again since it is set during previous iteration pResInfo->numOfRes = 1; @@ -4702,7 +4702,7 @@ static void irate_function_f(SQLFunctionCtx *pCtx, int32_t index) { TSKEY *primaryKey = GET_TS_LIST(pCtx); int64_t v = 0; - GET_TYPED_DATA(v, int64_t, pCtx->inputType, pData); + GET_TYPED_DATA(v, double, pCtx->inputType, pData); pRateInfo->firstKey = pRateInfo->lastKey; pRateInfo->firstValue = pRateInfo->lastValue; diff --git a/tests/script/general/parser/nestquery.sim b/tests/script/general/parser/nestquery.sim index 3d13ff504d..ee0f7fd0fe 100644 --- a/tests/script/general/parser/nestquery.sim +++ b/tests/script/general/parser/nestquery.sim @@ -124,6 +124,12 @@ if $rows != 2 then return -1 endi +sql select * from (select count(*) a from nest_mt0 group by tbname) t where t.a<0 +if $rows != 0 then + return -1 +endi + + print ===================> nest query interval From a69cede0ab53fd61e36e5cea999726ed5465e32c Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 2 Jun 2021 19:59:54 +0800 Subject: [PATCH 06/11] [td-255] update sim test. --- src/client/src/tscSQLParser.c | 2 +- tests/script/general/parser/nestquery.sim | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index f2558086ed..15e40d5918 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -3890,7 +3890,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql } SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, index.columnIndex); - if (pSchema->colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) { // query on time range + if (pSchema->type == TSDB_DATA_TYPE_TIMESTAMP && index.columnIndex == PRIMARYKEY_TIMESTAMP_COL_INDEX) { // query on time range if (!validateJoinExprNode(pCmd, pQueryInfo, *pExpr, &index)) { return TSDB_CODE_TSC_INVALID_OPERATION; } diff --git a/tests/script/general/parser/nestquery.sim b/tests/script/general/parser/nestquery.sim index ee0f7fd0fe..16d190d3fe 100644 --- a/tests/script/general/parser/nestquery.sim +++ b/tests/script/general/parser/nestquery.sim @@ -124,12 +124,27 @@ if $rows != 2 then return -1 endi -sql select * from (select count(*) a from nest_mt0 group by tbname) t where t.a<0 +sql select * from (select count(*) a, tbname f1 from nest_mt0 group by tbname) t where t.a<0 and f1 = 'nest_tb0'; if $rows != 0 then return -1 endi +sql select * from (select count(*) a, tbname f1 from nest_mt0 group by tbname) t where t.a>0 and f1 = 'nest_tb0'; +if $rows != 1 then + return -1 +endi +if $data00 != 10000 then + return -1 +endi + +if $data01 != @nest_tb0@ then + return -1 +endi + +if $data02 != @nest_tb0@ then + return -1 +endi print ===================> nest query interval From 35febb15191f15fc1b1bdfd5c06d0cc38b2b69b7 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 2 Jun 2021 22:18:05 +0800 Subject: [PATCH 07/11] [td-255] fix compiler error. --- src/query/src/qAggMain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 7cc5803f2e..370e9e2b79 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -4544,7 +4544,7 @@ static void rate_function(SQLFunctionCtx *pCtx) { notNullElems++; - int64_t v = 0; + double v = 0; GET_TYPED_DATA(v, double, pCtx->inputType, pData); if ((INT64_MIN == pRateInfo->firstValue) || (INT64_MIN == pRateInfo->firstKey)) { @@ -4591,7 +4591,7 @@ static void rate_function_f(SQLFunctionCtx *pCtx, int32_t index) { SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo); TSKEY *primaryKey = GET_TS_LIST(pCtx); - int64_t v = 0; + double v = 0; GET_TYPED_DATA(v, double, pCtx->inputType, pData); if ((INT64_MIN == pRateInfo->firstValue) || (INT64_MIN == pRateInfo->firstKey)) { From 60f3f7ed7106205492cc328f8cb040587a492ca6 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 2 Jun 2021 22:19:51 +0800 Subject: [PATCH 08/11] [td-255] fix compiler error. --- src/query/src/qAggMain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 370e9e2b79..c598679a91 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -4701,7 +4701,7 @@ static void irate_function_f(SQLFunctionCtx *pCtx, int32_t index) { SRateInfo *pRateInfo = (SRateInfo *)GET_ROWCELL_INTERBUF(pResInfo); TSKEY *primaryKey = GET_TS_LIST(pCtx); - int64_t v = 0; + double v = 0; GET_TYPED_DATA(v, double, pCtx->inputType, pData); pRateInfo->firstKey = pRateInfo->lastKey; From bed28fca982311d10b22beaf2340db380bbb4972 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 3 Jun 2021 10:38:18 +0800 Subject: [PATCH 09/11] [td-255] fix compiler error on windows. --- src/query/src/qAggMain.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index c598679a91..4c7c7d6970 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -152,7 +152,7 @@ typedef struct STSCompInfo { } STSCompInfo; typedef struct SRateInfo { - int64_t CorrectionValue; + double correctionValue; double firstValue; TSKEY firstKey; double lastValue; @@ -4493,7 +4493,7 @@ static double do_calc_rate(const SRateInfo* pRateInfo, int64_t tickPerSec) { diff -= pRateInfo->firstValue; } } else { - diff = pRateInfo->CorrectionValue + pRateInfo->lastValue - pRateInfo->firstValue; + diff = pRateInfo->correctionValue + pRateInfo->lastValue - pRateInfo->firstValue; if (diff <= 0) { return 0; } @@ -4515,7 +4515,7 @@ static bool rate_function_setup(SQLFunctionCtx *pCtx) { SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx); SRateInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo); - pInfo->CorrectionValue = 0; + pInfo->correctionValue = 0; pInfo->firstKey = INT64_MIN; pInfo->lastKey = INT64_MIN; pInfo->firstValue = INT64_MIN; @@ -4555,8 +4555,8 @@ static void rate_function(SQLFunctionCtx *pCtx) { if (INT64_MIN == pRateInfo->lastValue) { pRateInfo->lastValue = v; } else if (v < pRateInfo->lastValue) { - pRateInfo->CorrectionValue += pRateInfo->lastValue; - qDebug("CorrectionValue:%" PRId64, pRateInfo->CorrectionValue); + pRateInfo->correctionValue += pRateInfo->lastValue; + qDebug("correctionValue:%" PRId64, pRateInfo->correctionValue); } pRateInfo->lastValue = v; @@ -4602,7 +4602,7 @@ static void rate_function_f(SQLFunctionCtx *pCtx, int32_t index) { if (INT64_MIN == pRateInfo->lastValue) { pRateInfo->lastValue = v; } else if (v < pRateInfo->lastValue) { - pRateInfo->CorrectionValue += pRateInfo->lastValue; + pRateInfo->correctionValue += pRateInfo->lastValue; } pRateInfo->lastValue = v; @@ -4637,7 +4637,7 @@ static void rate_finalizer(SQLFunctionCtx *pCtx) { return; } - *(double*) pCtx->pOutput = do_calc_rate(pRateInfo, TSDB_TICK_PER_SECOND(pCtx->param[0].i64)); + *(double*) pCtx->pOutput = (double) do_calc_rate(pRateInfo, TSDB_TICK_PER_SECOND(pCtx->param[0].i64)); // cannot set the numOfIteratedElems again since it is set during previous iteration pResInfo->numOfRes = 1; From 9216a9f2011705c8e5d6525e768a4fe76a2a5fd6 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 3 Jun 2021 14:01:15 +0800 Subject: [PATCH 10/11] [td-255] --- src/query/src/qAggMain.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 4c7c7d6970..a533cc8255 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -4556,7 +4556,6 @@ static void rate_function(SQLFunctionCtx *pCtx) { pRateInfo->lastValue = v; } else if (v < pRateInfo->lastValue) { pRateInfo->correctionValue += pRateInfo->lastValue; - qDebug("correctionValue:%" PRId64, pRateInfo->correctionValue); } pRateInfo->lastValue = v; From 7082d8a5e05ce72c7dd693cd88e9c1d5ca5b42a3 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 3 Jun 2021 18:12:56 +0800 Subject: [PATCH 11/11] [td-255] fix compiler error on windows. --- src/query/src/qAggMain.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index a533cc8255..ba6efcabb2 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -4478,7 +4478,7 @@ static void ts_comp_finalize(SQLFunctionCtx *pCtx) { ////////////////////////////////////////////////////////////////////////////////////////////// // rate functions -static double do_calc_rate(const SRateInfo* pRateInfo, int64_t tickPerSec) { +static double do_calc_rate(const SRateInfo* pRateInfo, double tickPerSec) { if ((INT64_MIN == pRateInfo->lastKey) || (INT64_MIN == pRateInfo->firstKey) || (pRateInfo->firstKey >= pRateInfo->lastKey)) { return 0.0; @@ -4504,7 +4504,7 @@ static double do_calc_rate(const SRateInfo* pRateInfo, int64_t tickPerSec) { return 0; } - return (duration > 0)? ((double)diff) / (duration/((double) tickPerSec)):0.0; + return (duration > 0)? ((double)diff) / (duration/tickPerSec):0.0; } static bool rate_function_setup(SQLFunctionCtx *pCtx) { @@ -4636,7 +4636,7 @@ static void rate_finalizer(SQLFunctionCtx *pCtx) { return; } - *(double*) pCtx->pOutput = (double) do_calc_rate(pRateInfo, TSDB_TICK_PER_SECOND(pCtx->param[0].i64)); + *(double*) pCtx->pOutput = do_calc_rate(pRateInfo, TSDB_TICK_PER_SECOND(pCtx->param[0].i64)); // cannot set the numOfIteratedElems again since it is set during previous iteration pResInfo->numOfRes = 1;