diff --git a/source/libs/parser/src/astValidate.c b/source/libs/parser/src/astValidate.c index 9c3537e261..545f2dd838 100644 --- a/source/libs/parser/src/astValidate.c +++ b/source/libs/parser/src/astValidate.c @@ -3137,7 +3137,7 @@ int32_t sqlExprToExprNode(tExprNode **pExpr, const tSqlExpr* pSqlExpr, SQuerySt } } else { - *pExpr = (tExprNode *)calloc(1, sizeof(tExprNode)); + *pExpr = (tExprNode*)calloc(1, sizeof(tExprNode)); (*pExpr)->nodeType = TEXPR_BINARYEXPR_NODE; (*pExpr)->_node.pLeft = pLeft; @@ -3158,9 +3158,16 @@ int32_t sqlExprToExprNode(tExprNode **pExpr, const tSqlExpr* pSqlExpr, SQuerySt } // scalar op aggregate check + if (pLeft->nodeType == TEXPR_FUNCTION_NODE && pRight->nodeType != TEXPR_FUNCTION_NODE) { + return buildInvalidOperationMsg(pMsgBuf, "invalid expression"); + } + if (pLeft->nodeType == TEXPR_FUNCTION_NODE && pRight->nodeType == TEXPR_FUNCTION_NODE) { + if (qIsAggregateFunction(pLeft->_function.functionName) != qIsAggregateFunction(pRight->_function.functionName)) { + return buildInvalidOperationMsg(pMsgBuf, "invalid expression"); + } + } } - return TSDB_CODE_SUCCESS; } diff --git a/source/libs/parser/test/parserTests.cpp b/source/libs/parser/test/parserTests.cpp index 00a31dc89d..45b8a3627b 100644 --- a/source/libs/parser/test/parserTests.cpp +++ b/source/libs/parser/test/parserTests.cpp @@ -406,8 +406,8 @@ TEST(testCase, function_Test10) { sqlCheck("select cov(a, b) from `t.1abc`", true); sqlCheck("select sum(length(a) + count(b)) from `t.1abc`", false); - // sqlCheck("select concat(concat(a,b), concat(a,b)) from `t.1abc`", true); - // sqlCheck("select length(length(length(a))) from `t.1abc`", true); + sqlCheck("select concat(concat(a,b), concat(a,b)) from `t.1abc`", true); + sqlCheck("select length(length(length(a))) from `t.1abc`", true); } TEST(testCase, function_Test6) {