From 0fe77092a993d029d7c113403946aefd9678137c Mon Sep 17 00:00:00 2001 From: shenglian zhou Date: Thu, 28 Oct 2021 16:08:33 +0800 Subject: [PATCH] make tsdb_func_arithm scalar and pass test scalar_pow.sim --- src/client/src/tscSQLParser.c | 7 ++++- src/common/src/tarithoperator.c | 49 +++++++++++++++++++++++++++++++++ src/common/src/texpr.c | 16 +++++++++-- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 1264813d9b..ac47fc7f66 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -3699,7 +3699,7 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool ++prjNum; } - if (functionId == TSDB_FUNC_CEIL || functionId == TSDB_FUNC_FLOOR || functionId == TSDB_FUNC_ROUND) { + if (IS_SCALAR_FUNCTION(functionId)) { ++scalarFuncNum; } @@ -3707,6 +3707,10 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool ++scalarFuncNum; } + if (functionId == TSDB_FUNC_ARITHM) { + ++scalarFuncNum; + } + if (functionId == TSDB_FUNC_PRJ && (pExpr1->base.colInfo.colId == PRIMARYKEY_TIMESTAMP_COL_INDEX || TSDB_COL_IS_UD_COL(pExpr1->base.colInfo.flag))) { continue; } @@ -4363,6 +4367,7 @@ static int32_t validateArithmeticSQLFunc(SSqlCmd* pCmd, tSqlExpr* pExpr, *uid = id; } else { + pExpr->functionId = functionId; size_t numChilds = taosArrayGetSize(pExpr->Expr.paramList); for (int i = 0; i < numChilds; ++i) { tSqlExprItem* pParamElem= taosArrayGet(pExpr->Expr.paramList, i); diff --git a/src/common/src/tarithoperator.c b/src/common/src/tarithoperator.c index ca514e3b42..fe5088e99d 100644 --- a/src/common/src/tarithoperator.c +++ b/src/common/src/tarithoperator.c @@ -413,13 +413,62 @@ _arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr) { } void vectorPow(tExprOperandInfo* pInputs, uint8_t numInputs, tExprOperandInfo* pOutput, int32_t order) { + assert(numInputs == 2); + assert(pInputs[1].numOfRows == 1 || pInputs[0].numOfRows == 1 || pInputs[0].numOfRows == pInputs[1].numOfRows ); + int numOfRows = (pInputs[0].numOfRows > pInputs[1].numOfRows) ? pInputs[0].numOfRows : pInputs[1].numOfRows; + if (pInputs[1].numOfRows == 1) { + double base = 0; + GET_TYPED_DATA(base, double, pInputs[1].type, pInputs[1].data); + for (int i = 0; i < numOfRows; ++i) { + char* pInputData = pInputs[0].data + i * pInputs[0].bytes; + char* pOutputData = pOutput->data + i * pOutput->bytes; + if (isNull(pInputData, pInputs[0].type)) { + setNull(pOutputData, pOutput->type, pOutput->bytes); + } else { + double v1 = 0; + GET_TYPED_DATA(v1, double, pInputs[0].type, pInputData); + double result = pow(v1, base); + SET_TYPED_DATA(pOutputData, pOutput->type, result); + } + } + } else { + assert(0); + } +} + +void vectorLog(tExprOperandInfo* pInputs, uint8_t numInputs, tExprOperandInfo* pOutput, int32_t order) { + assert(numInputs == 2); + assert(pInputs[1].numOfRows == 1 || pInputs[0].numOfRows == 1 || pInputs[0].numOfRows == pInputs[1].numOfRows ); + int numOfRows = (pInputs[0].numOfRows > pInputs[1].numOfRows) ? pInputs[0].numOfRows : pInputs[1].numOfRows; + if (pInputs[1].numOfRows == 1) { + double base = 0; + GET_TYPED_DATA(base, double, pInputs[1].type, pInputs[1].data); + + for (int i = 0; i < numOfRows; ++i) { + char* pInputData = pInputs[0].data + i * pInputs[0].bytes; + char* pOutputData = pOutput->data + i * pOutput->bytes; + if (isNull(pInputData, pInputs[0].type)) { + setNull(pOutputData, pOutput->type, pOutput->bytes); + } else { + double v1 = 0; + GET_TYPED_DATA(v1, double, pInputs[0].type, pInputData); + double result = log(v1) / log(base); + SET_TYPED_DATA(pOutputData, pOutput->type, result); + } + } + } else { + assert(0); + } } + _expr_scalar_function_t getExprScalarFunction(uint16_t scalarFunc) { switch (scalarFunc) { case TSDB_FUNC_SCALAR_POW: return vectorPow; + case TSDB_FUNC_SCALAR_LOG: + return vectorLog; default: assert(0); return NULL; diff --git a/src/common/src/texpr.c b/src/common/src/texpr.c index 0fc9abfc84..b240c6c274 100644 --- a/src/common/src/texpr.c +++ b/src/common/src/texpr.c @@ -220,12 +220,24 @@ void exprTreeFunctionNodeTraverse(tExprNode *pExpr, int32_t numOfRows, char *pOu if (order == TSDB_ORDER_DESC) { pChildrenOutput[i] = malloc(sizeof(int64_t) * numOfRows); reverseCopy(pChildrenOutput[i], pInputData, pChild->pSchema->type, numOfRows); - pInputs[i].data = pInputData; + pInputs[i].data = pChildrenOutput[i]; } else { pInputs[i].data = pInputData; } + pInputs[i].type = pChild->pSchema->type; + pInputs[i].bytes = pChild->pSchema->bytes; } else if (pChild->nodeType == TSQL_NODE_VALUE) { - pInputs[i].data = (char*)&(pChild->pVal->dKey); + int32_t len = pChild->pVal->nLen; + if (IS_VAR_DATA_TYPE(pChild->pVal->nType)) { + len = len + VARSTR_HEADER_SIZE; + } else { + len = tDataTypes[pChild->pVal->nType].bytes; + } + pChildrenOutput[i] = malloc(len); + tVariantDump(pChild->pVal, pChildrenOutput[i], pChild->pVal->nType, true); + pInputs[i].data = pChildrenOutput[i]; + pInputs[i].type = pChild->pVal->nType; + pInputs[i].bytes = len; pInputs[i].numOfRows = 1; } } -- GitLab