From 595ae2c5b811bf3526ea8c975290c8a41dab582b Mon Sep 17 00:00:00 2001 From: slzhou Date: Tue, 26 Mar 2024 17:05:40 +0800 Subject: [PATCH] fix: irate on super table merge phase and translate --- source/libs/function/src/builtins.c | 2 +- source/libs/function/src/builtinsimpl.c | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index 0f88572dbc..2476449383 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -1632,7 +1632,7 @@ static int32_t translateIrate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) static int32_t translateIrateImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, bool isPartial) { uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type; if (isPartial) { - if (3 != LIST_LENGTH(pFunc->pParameterList)) { + if (3 != LIST_LENGTH(pFunc->pParameterList) && 4 != LIST_LENGTH(pFunc->pParameterList)) { return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName); } if (!IS_NUMERIC_TYPE(colType)) { diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index b63fa6a167..c029a809eb 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -6223,12 +6223,17 @@ static void doSaveRateInfo(SRateInfo* pRateInfo, bool isFirst, int64_t ts, char* } } -static void initializeRateInfo(SqlFunctionCtx* pCtx, SRateInfo* pRateInfo) { +static void initializeRateInfo(SqlFunctionCtx* pCtx, SRateInfo* pRateInfo, bool isMerge) { if (pCtx->hasPrimaryKey) { - pRateInfo->pkType = pCtx->input.pPrimaryKey->info.type; - pRateInfo->pkBytes = pCtx->input.pPrimaryKey->info.bytes; - pRateInfo->firstPk = pRateInfo->pkData; - pRateInfo->lastPk = pRateInfo->pkData + pRateInfo->pkBytes; + if (!isMerge) { + pRateInfo->pkType = pCtx->input.pPrimaryKey->info.type; + pRateInfo->pkBytes = pCtx->input.pPrimaryKey->info.bytes; + pRateInfo->firstPk = pRateInfo->pkData; + pRateInfo->lastPk = pRateInfo->pkData + pRateInfo->pkBytes; + } else { + pRateInfo->firstPk = pRateInfo->pkData; + pRateInfo->lastPk = pRateInfo->pkData + pRateInfo->pkBytes; + } } else { pRateInfo->firstPk = NULL; pRateInfo->lastPk = NULL; @@ -6246,7 +6251,7 @@ int32_t irateFunction(SqlFunctionCtx* pCtx) { funcInputUpdate(pCtx); - initializeRateInfo(pCtx, pRateInfo); + initializeRateInfo(pCtx, pRateInfo, false); int32_t numOfElems = 0; int32_t type = pInputCol->info.type; @@ -6368,13 +6373,13 @@ int32_t irateFunctionMerge(SqlFunctionCtx* pCtx) { } SRateInfo* pInfo = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx)); - initializeRateInfo(pCtx, pInfo); + initializeRateInfo(pCtx, pInfo, true); int32_t start = pInput->startRowIndex; for (int32_t i = start; i < start + pInput->numOfRows; ++i) { char* data = colDataGetData(pCol, i); SRateInfo* pInputInfo = (SRateInfo*)varDataVal(data); - initializeRateInfo(pCtx, pInfo); + initializeRateInfo(pCtx, pInfo, true); if (pInputInfo->hasResult) { int32_t code = irateTransferInfo(pInputInfo, pInfo); if (code != TSDB_CODE_SUCCESS) {