diff --git a/src/client/src/tscGlobalmerge.c b/src/client/src/tscGlobalmerge.c index b3988bb643276d3632c074e0a8425d852fc64eaa..a784eb3eb8124215fa7aacccad900e2b43ca4ce2 100644 --- a/src/client/src/tscGlobalmerge.c +++ b/src/client/src/tscGlobalmerge.c @@ -734,7 +734,7 @@ int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_ // calculate the result from several other columns if (pSup->pExpr->pExpr != NULL) { arithSup.pExprInfo = pSup->pExpr; - exprTreeInternalNodeTraverse(arithSup.pExprInfo->pExpr, (int32_t) pOutput->num, pbuf + pOutput->num*offset, &arithSup, TSDB_ORDER_ASC, getArithmeticInputSrc); + exprTreeNodeTraverse(arithSup.pExprInfo->pExpr, (int32_t) pOutput->num, pbuf + pOutput->num*offset, &arithSup, TSDB_ORDER_ASC, getArithmeticInputSrc); } else { SExprInfo* pExpr = pSup->pExpr; memcpy(pbuf + pOutput->num * offset, pExpr->base.offset * pOutput->num + pOutput->data, (size_t)(pExpr->base.resBytes * pOutput->num)); diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 852c6fdd82e9c0ec43a6fe2ba1ecace355718d62..fc330767d3453540299d44023df5eae20f1b7017 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -4341,6 +4341,13 @@ static int32_t validateArithmeticSQLFunc(SSqlCmd* pCmd, tSqlExpr* pExpr, } } + pExpr->functionId = functionId; + size_t numChilds = taosArrayGetSize(pExpr->Expr.paramList); + for (int i = 0; i < numChilds; ++i) { + tSqlExprItem* pParamElem= taosArrayGet(pExpr->Expr.paramList, i); + validateSQLExprTerm(pCmd, pParamElem->pNode, pQueryInfo, pList, type, uid); + } + if (*type == AGG_ARIGHTMEIC) { int32_t outputIndex = (int32_t)tscNumOfExprs(pQueryInfo); @@ -4348,7 +4355,6 @@ static int32_t validateArithmeticSQLFunc(SSqlCmd* pCmd, tSqlExpr* pExpr, // sql function list in selection clause. // Append the sqlExpr into exprList of pQueryInfo structure sequentially - pExpr->functionId = functionId; if (pExpr->functionId < 0) { SUdfInfo* pUdfInfo = NULL; pUdfInfo = isValidUdf(pQueryInfo->pUdfInfo, pExpr->Expr.operand.z, pExpr->Expr.operand.n); @@ -4389,13 +4395,6 @@ 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); - validateSQLExprTerm(pCmd, pParamElem->pNode, pQueryInfo, pList, type, uid); - } } return TSDB_CODE_SUCCESS; } @@ -4426,12 +4425,6 @@ static int32_t validateSQLExprTerm(SSqlCmd* pCmd, tSqlExpr* pExpr, } else if (pExpr->type == SQL_NODE_SQLFUNCTION) { validateArithmeticSQLFunc(pCmd, pExpr, pQueryInfo, pList, type, uid); } else if (pExpr->type == SQL_NODE_TABLE_COLUMN) { - if (*type == NON_ARITHMEIC_EXPR) { - *type = NORMAL_ARITHMETIC; - } else if (*type == AGG_ARIGHTMEIC) { - return TSDB_CODE_TSC_INVALID_OPERATION; - } - SColumnIndex index = COLUMN_INDEX_INITIALIZER; if (getColumnIndexByName(&pExpr->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) { diff --git a/src/common/inc/texpr.h b/src/common/inc/texpr.h index 59c29165ac8a9998d2be7ea135291cfd3bcd990b..9eddcd0e1ab88249929c8a790dfd1efc3cd4bf8e 100644 --- a/src/common/inc/texpr.h +++ b/src/common/inc/texpr.h @@ -110,7 +110,7 @@ void exprTreeToBinary(SBufferWriter* bw, tExprNode* pExprTree); bool exprTreeApplyFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp *param); -void exprTreeInternalNodeTraverse(tExprNode *pExpr, int32_t numOfRows, char *pOutput, void *param, int32_t order, +void exprTreeNodeTraverse(tExprNode *pExpr, int32_t numOfRows, char *pOutput, void *param, int32_t order, char *(*getSourceDataBlock)(void *, const char*, int32_t)); void buildFilterSetFromBinary(void **q, const char *buf, int32_t len); diff --git a/src/common/src/texpr.c b/src/common/src/texpr.c index b240c6c2741b0c77c3f54d65aa3ee66752701f48..59ea613eabfc9e0b4ef95b10a86d4e4e37324ea7 100644 --- a/src/common/src/texpr.c +++ b/src/common/src/texpr.c @@ -188,6 +188,22 @@ void exprTreeFunctionNodeTraverse(tExprNode *pExprs, int32_t numOfRows, char *pO void exprTreeInternalNodeTraverse(tExprNode *pExpr, int32_t numOfRows, char *pOutput, void *param, int32_t order, char *(*getSourceDataBlock)(void *, const char*, int32_t)); +void exprTreeNodeTraverse(tExprNode *pExpr, int32_t numOfRows, char *pOutput, void *param, int32_t order, + char *(*getSourceDataBlock)(void*, const char*, int32_t)) { + if (pExpr->nodeType == TSQL_NODE_FUNC || pExpr->nodeType == TSQL_NODE_EXPR) { + exprTreeInternalNodeTraverse(pExpr, numOfRows, pOutput, param, order, getSourceDataBlock); + } else if (pExpr->nodeType == TSQL_NODE_COL) { + char *pInputData = getSourceDataBlock(param, pExpr->pSchema->name, pExpr->pSchema->colId); + if (order == TSDB_ORDER_DESC) { + reverseCopy(pOutput, pInputData, pExpr->pSchema->type, numOfRows); + } else { + memcpy(pOutput, pInputData, pExpr->pSchema->bytes*numOfRows); + } + } else if (pExpr->nodeType == TSQL_NODE_VALUE) { + tVariantDump(pExpr->pVal, pOutput, pExpr->pVal->nType, true); + } +} + void exprTreeInternalNodeTraverse(tExprNode *pExpr, int32_t numOfRows, char *pOutput, void *param, int32_t order, char *(*getSourceDataBlock)(void *, const char*, int32_t)) { if (pExpr->nodeType == TSQL_NODE_FUNC) { diff --git a/src/plugins/blm3 b/src/plugins/blm3 index f56aa0f485d7bb6aebbcefc2007eeecdccb767c8..4bfae86dcabea0d5a40ff81a72be7c822737269b 160000 --- a/src/plugins/blm3 +++ b/src/plugins/blm3 @@ -1 +1 @@ -Subproject commit f56aa0f485d7bb6aebbcefc2007eeecdccb767c8 +Subproject commit 4bfae86dcabea0d5a40ff81a72be7c822737269b diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 3fe9e46de10fb42a0090ce8d3a31176d1f40e647..00fb849c14139297609ed8c5ca39186b6f788434 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -3404,8 +3404,8 @@ char *getArithColumnData(void *param, const char* name, int32_t colId) { static void arithmetic_function(SQLFunctionCtx *pCtx) { GET_RES_INFO(pCtx)->numOfRes += pCtx->size; SArithmeticSupport *sas = (SArithmeticSupport *)pCtx->param[1].pz; - - exprTreeInternalNodeTraverse(sas->pExprInfo->pExpr, pCtx->size, pCtx->pOutput, sas, pCtx->order, getArithColumnData); + + exprTreeNodeTraverse(sas->pExprInfo->pExpr, pCtx->size, pCtx->pOutput, sas, pCtx->order, getArithColumnData); } #define LIST_MINMAX_N(ctx, minOutput, maxOutput, elemCnt, data, type, tsdbType, numOfNotNullElem) \ diff --git a/src/query/src/qPlan.c b/src/query/src/qPlan.c index a1182dd2b5d480df3c7fa2b39d0a0a11272b0127..2c92fc8f0bc502197d1eadc5f527c53d888b0d05 100644 --- a/src/query/src/qPlan.c +++ b/src/query/src/qPlan.c @@ -696,7 +696,6 @@ SArray* createGlobalMergePlan(SQueryAttr* pQueryAttr) { op = OP_Filter; taosArrayPush(plan, &op); } - } else { if (pQueryAttr->pExpr2 != NULL) { op = OP_Project; taosArrayPush(plan, &op);