diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index 5c5172b9cd..3ce4365adc 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -88,6 +88,7 @@ typedef struct SColumnNode { } SColumnNode; typedef struct SColumnRefNode { + SExprNode node; // QUERY_NODE_COLUMN ENodeType type; char colName[TSDB_COL_NAME_LEN]; } SColumnRefNode; diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index c9345dd00e..6ce2905143 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1094,6 +1094,7 @@ static EDealRes translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** p return DEAL_RES_ERROR; } strcpy(pColRef->colName, pExpr->aliasName); + pColRef->node = *pExpr; nodesDestroyNode(*(SNode**)pCol); *(SNode**)pCol = (SNode*)pColRef; *pFound = true; @@ -3431,6 +3432,24 @@ static int32_t getPositionValue(const SValueNode* pVal) { return -1; } +static int32_t checkOrderByAggForGroupBy(STranslateContext* pCxt, SSelectStmt* pSelect, SNodeList* pOrderByList) { + if (NULL != getGroupByList(pCxt) || NULL != pSelect->pWindow) { + return TSDB_CODE_SUCCESS; + } + SNode* pNode = NULL; + WHERE_EACH(pNode, pOrderByList) { + SNode* pExpr = ((SOrderByExprNode*)pNode)->pExpr; + if ((QUERY_NODE_FUNCTION == nodeType(pExpr))) { + SFunctionNode* pFunc = (SFunctionNode*)pExpr; + if (fmIsAggFunc(pFunc->funcId)) { + return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION); + } + } + WHERE_NEXT; + } + return TSDB_CODE_SUCCESS; +} + static int32_t translateOrderByPosition(STranslateContext* pCxt, SNodeList* pProjectionList, SNodeList* pOrderByList, bool* pOther) { *pOther = false; @@ -3482,6 +3501,9 @@ static int32_t translateOrderBy(STranslateContext* pCxt, SSelectStmt* pSelect) { if (TSDB_CODE_SUCCESS == code) { code = checkExprListForGroupBy(pCxt, pSelect, pSelect->pOrderByList); } + if (other && TSDB_CODE_SUCCESS == code) { + code = checkOrderByAggForGroupBy(pCxt, pSelect, pSelect->pOrderByList); + } return code; }