未验证 提交 e2e67764 编写于 作者: weixin_48148422's avatar weixin_48148422 提交者: GitHub

Merge pull request #1554 from taosdata/feature/lihui

[TD-113]
...@@ -4567,7 +4567,7 @@ static void rate_function(SQLFunctionCtx *pCtx) { ...@@ -4567,7 +4567,7 @@ static void rate_function(SQLFunctionCtx *pCtx) {
if (-DBL_MAX == pRateInfo->firstValue) { if (-DBL_MAX == pRateInfo->firstValue) {
pRateInfo->firstValue = v; pRateInfo->firstValue = v;
} else if (v > pRateInfo->firstValue) { } else if (v > pRateInfo->firstValue) {
pRateInfo->CorrectionValue += pRateInfo->firstValue; pRateInfo->CorrectionValue += v;
pTrace("CorrectionValue:%f", pRateInfo->CorrectionValue); pTrace("CorrectionValue:%f", pRateInfo->CorrectionValue);
} }
...@@ -4582,7 +4582,7 @@ static void rate_function(SQLFunctionCtx *pCtx) { ...@@ -4582,7 +4582,7 @@ static void rate_function(SQLFunctionCtx *pCtx) {
if (pCtx->prev.key != -1) { if (pCtx->prev.key != -1) {
if (pCtx->prev.data > pRateInfo->firstValue) { if (pCtx->prev.data > pRateInfo->firstValue) {
pRateInfo->CorrectionValue += pRateInfo->firstValue; pRateInfo->CorrectionValue += pCtx->prev.data;
pTrace("CorrectionValue:%f", pRateInfo->CorrectionValue); pTrace("CorrectionValue:%f", pRateInfo->CorrectionValue);
} }
...@@ -4758,6 +4758,14 @@ static void irate_function(SQLFunctionCtx *pCtx) { ...@@ -4758,6 +4758,14 @@ static void irate_function(SQLFunctionCtx *pCtx) {
return; 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) { for (int32_t i = pCtx->size - 1; i >= 0; --i) {
char *pData = GET_INPUT_CHAR_INDEX(pCtx, i); char *pData = GET_INPUT_CHAR_INDEX(pCtx, i);
if (pCtx->hasNull && isNull(pData, pCtx->inputType)) { if (pCtx->hasNull && isNull(pData, pCtx->inputType)) {
...@@ -4800,7 +4808,7 @@ static void irate_function(SQLFunctionCtx *pCtx) { ...@@ -4800,7 +4808,7 @@ static void irate_function(SQLFunctionCtx *pCtx) {
continue; continue;
} }
if ((INT64_MIN == pRateInfo->firstKey) || (-DBL_MAX == pRateInfo->firstValue)){ if ((INT64_MIN == pRateInfo->firstKey) || (-DBL_MAX == pRateInfo->firstValue)) {
pRateInfo->firstValue = v; pRateInfo->firstValue = v;
pRateInfo->firstKey = primaryKey[i]; pRateInfo->firstKey = primaryKey[i];
...@@ -4809,6 +4817,15 @@ static void irate_function(SQLFunctionCtx *pCtx) { ...@@ -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); SET_VAL(pCtx, notNullElems, 1);
if (notNullElems > 0) { if (notNullElems > 0) {
......
...@@ -1645,9 +1645,9 @@ int32_t addExprAndResultField(SQueryInfo* pQueryInfo, int32_t colIdx, tSQLExprIt ...@@ -1645,9 +1645,9 @@ int32_t addExprAndResultField(SQueryInfo* pQueryInfo, int32_t colIdx, tSQLExprIt
SColumnList ids = getColumnList(1, 0, 0); SColumnList ids = getColumnList(1, 0, 0);
insertResultField(pQueryInfo, 0, &ids, TSDB_KEYSIZE, TSDB_DATA_TYPE_TIMESTAMP, aAggs[TSDB_FUNC_TS_DUMMY].aName, insertResultField(pQueryInfo, 0, &ids, TSDB_KEYSIZE, TSDB_DATA_TYPE_TIMESTAMP, aAggs[TSDB_FUNC_TS_DUMMY].aName,
pExpr); 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}; SColumnIndex index1 = {.tableIndex = index.tableIndex, .columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX};
tscColumnBaseInfoInsert(pQueryInfo, &index1); tscColumnBaseInfoInsert(pQueryInfo, &index1);
} }
// functions can not be applied to tags // functions can not be applied to tags
......
...@@ -83,7 +83,7 @@ static int32_t getGroupResultId(int32_t groupIndex) { ...@@ -83,7 +83,7 @@ static int32_t getGroupResultId(int32_t groupIndex) {
static bool needsBoundaryTS(SQuery *pQuery) { static bool needsBoundaryTS(SQuery *pQuery) {
for(int32_t i = 0; i < pQuery->numOfOutputCols; ++i) { for(int32_t i = 0; i < pQuery->numOfOutputCols; ++i) {
int32_t functionId = pQuery->pSelectExpr[i].pBase.functionId; 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; return true;
} }
} }
...@@ -1749,7 +1749,8 @@ static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SWindowStat ...@@ -1749,7 +1749,8 @@ static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SWindowStat
pCtx[k].size = forwardStep; pCtx[k].size = forwardStep;
pCtx[k].startOffset = (QUERY_IS_ASC_QUERY(pQuery)) ? startPos : startPos - (forwardStep - 1); 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); pCtx[k].ptsList = (TSKEY *)((char*)pRuntimeEnv->primaryColBuffer->data + pCtx[k].startOffset * TSDB_KEYSIZE);
} }
...@@ -2062,7 +2063,8 @@ static void doSetInterpolationDataForTimeWindow(SQueryRuntimeEnv* pRuntimeEnv, S ...@@ -2062,7 +2063,8 @@ static void doSetInterpolationDataForTimeWindow(SQueryRuntimeEnv* pRuntimeEnv, S
// interpolate for skey value // interpolate for skey value
for(int32_t i = 0; i < pQuery->numOfOutputCols; ++i) { 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; continue;
} }
...@@ -2072,7 +2074,8 @@ static void doSetInterpolationDataForTimeWindow(SQueryRuntimeEnv* pRuntimeEnv, S ...@@ -2072,7 +2074,8 @@ static void doSetInterpolationDataForTimeWindow(SQueryRuntimeEnv* pRuntimeEnv, S
// interpolate for ekey value // interpolate for ekey value
for(int32_t i = 0; i < pQuery->numOfOutputCols; ++i) { 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; continue;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册