diff --git a/include/libs/function/function.h b/include/libs/function/function.h index 0580f3acba..094ce80106 100644 --- a/include/libs/function/function.h +++ b/include/libs/function/function.h @@ -207,7 +207,7 @@ typedef struct SqlFunctionCtx { struct SSDataBlock *pSrcBlock; int32_t curBufPage; - char* udfName[TSDB_FUNC_NAME_LEN]; + char udfName[TSDB_FUNC_NAME_LEN]; } SqlFunctionCtx; enum { diff --git a/include/libs/function/functionMgt.h b/include/libs/function/functionMgt.h index 126a2ccf99..0572262bfc 100644 --- a/include/libs/function/functionMgt.h +++ b/include/libs/function/functionMgt.h @@ -162,6 +162,7 @@ EFuncDataRequired fmFuncDataRequired(SFunctionNode* pFunc, STimeWindow* pTimeWin int32_t fmGetFuncExecFuncs(int32_t funcId, SFuncExecFuncs* pFpSet); int32_t fmGetScalarFuncExecFuncs(int32_t funcId, SScalarFuncExecFuncs* pFpSet); +int32_t fmGetUdafExecFuncs(int32_t funcId, SFuncExecFuncs* pFpSet); #ifdef __cplusplus } diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index f1995b723d..943a016c27 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1897,7 +1897,14 @@ SqlFunctionCtx* createSqlFunctionCtx(SExprInfo* pExprInfo, int32_t numOfOutput, pCtx->functionId = pExpr->pExpr->_function.pFunctNode->funcId; if (fmIsAggFunc(pCtx->functionId) || fmIsNonstandardSQLFunc(pCtx->functionId)) { - fmGetFuncExecFuncs(pCtx->functionId, &pCtx->fpSet); + bool isUdaf = fmIsUserDefinedFunc(pCtx->functionId); + if (!isUdaf) { + fmGetFuncExecFuncs(pCtx->functionId, &pCtx->fpSet); + } else { + char *udfName = pExpr->pExpr->_function.pFunctNode->functionName; + strncpy(pCtx->udfName, udfName, strlen(udfName)); + fmGetUdafExecFuncs(pCtx->functionId, &pCtx->fpSet); + } pCtx->fpSet.getEnv(pExpr->pExpr->_function.pFunctNode, &env); } else { fmGetScalarFuncExecFuncs(pCtx->functionId, &pCtx->sfp); diff --git a/source/libs/function/src/functionMgt.c b/source/libs/function/src/functionMgt.c index 585eb57a56..0113da94eb 100644 --- a/source/libs/function/src/functionMgt.c +++ b/source/libs/function/src/functionMgt.c @@ -124,7 +124,10 @@ int32_t fmGetFuncExecFuncs(int32_t funcId, SFuncExecFuncs* pFpSet) { return TSDB_CODE_SUCCESS; } -int32_t fmGetUdafExecFuncs(SFuncExecFuncs* pFpSet) { +int32_t fmGetUdafExecFuncs(int32_t funcId, SFuncExecFuncs* pFpSet) { + if (!fmIsUserDefinedFunc(funcId)) { + return TSDB_CODE_FAILED; + } pFpSet->getEnv = udfAggGetEnv; pFpSet->init = udfAggInit; pFpSet->process = udfAggProcess;