diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 0a0502c7f5..8f780e008a 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -1478,17 +1478,17 @@ void createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId) { pExp->base.pParam[j].type = FUNC_PARAM_TYPE_VALUE; nodesValueNodeToVariant(pvn, &pExp->base.pParam[j].param); } - // else if (p1->type == QUERY_NODE_FUNCTION) { - // if (strcmp(((SFunctionNode*)p1)->functionName, "_select_value") == 0 && - // ((SFunctionNode*)p1)->pParameterList->length == 1 && - // ((SFunctionNode*)p1)->pParameterList->pHead->pNode->type == QUERY_NODE_COLUMN) { - // SColumnNode* pcn = (SColumnNode*)(((SFunctionNode*)p1)->pParameterList->pHead->pNode); - // SValueNode* pvn = (SValueNode*)p1; - // pExp->base.pParam[j].type = FUNC_PARAM_TYPE_COLUMN; - // pExp->base.pParam[j].pCol = - // createColumn(pcn->dataBlockId, pcn->slotId, pcn->colId, &pcn->node.resType, pcn->colType); - // } - // } + else if (p1->type == QUERY_NODE_FUNCTION) { + if (strcmp(((SFunctionNode*)p1)->functionName, "_select_value") == 0 && + ((SFunctionNode*)p1)->pParameterList->length == 1 && + ((SFunctionNode*)p1)->pParameterList->pHead->pNode->type == QUERY_NODE_COLUMN) { + SColumnNode* pcn = (SColumnNode*)(((SFunctionNode*)p1)->pParameterList->pHead->pNode); + SValueNode* pvn = (SValueNode*)p1; + pExp->base.pParam[j].type = FUNC_PARAM_TYPE_COLUMN; + pExp->base.pParam[j].pCol = + createColumn(pcn->dataBlockId, pcn->slotId, pcn->colId, &pcn->node.resType, pcn->colType); + } + } } } else if (type == QUERY_NODE_OPERATOR) { pExp->pExpr->nodeType = QUERY_NODE_OPERATOR; diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 1fdf2bc5fe..74f4f94cf3 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1088,18 +1088,16 @@ static EDealRes translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** p FOREACH(pNode, pProjectionList) { SExprNode* pExpr = (SExprNode*)pNode; if (0 == strcmp((*pCol)->colName, pExpr->userAlias)) { - SColumnRefNode* pColRef = (SColumnRefNode*)nodesMakeNode(QUERY_NODE_COLUMN_REF); - if (NULL == pColRef) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; - return DEAL_RES_ERROR; - } - strcpy(pColRef->colName, pExpr->aliasName); - pColRef->resType = pExpr->resType; - nodesDestroyNode(*(SNode**)pCol); - *(SNode**)pCol = (SNode*)pColRef; - *pFound = true; - return DEAL_RES_CONTINUE; - } + SNode* pNew = nodesCloneNode(pNode); + if (NULL == pNew) { + pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + return DEAL_RES_ERROR; + } + nodesDestroyNode(*(SNode**)pCol); + *(SNode**)pCol = (SNode*)pNew; + *pFound = true; + return DEAL_RES_CONTINUE; + } } *pFound = false; return DEAL_RES_CONTINUE; @@ -1316,7 +1314,7 @@ static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) { } else { bool found = false; if (SQL_CLAUSE_ORDER_BY == pCxt->currClause) { - // res = translateColumnUseAlias(pCxt, pCol, &found); + res = translateColumnUseAlias(pCxt, pCol, &found); } if (DEAL_RES_ERROR != res && !found) { if (isSetOperator(pCxt->pCurrStmt)) { diff --git a/source/libs/parser/test/parSelectTest.cpp b/source/libs/parser/test/parSelectTest.cpp index dce702f6b6..687344d56b 100644 --- a/source/libs/parser/test/parSelectTest.cpp +++ b/source/libs/parser/test/parSelectTest.cpp @@ -431,7 +431,7 @@ TEST_F(ParserSelectTest, semanticCheck) { run("SELECT ts, last(ts) FROM t1 order by last(ts)"); - run("SELECT first(ts), c2 FROM t1 order by last(c1)"); + run("SELECT first(ts), c2 FROM t1 order by last(c1)", TSDB_CODE_PAR_NOT_SINGLE_GROUP); run("SELECT c1 FROM t1 order by concat(c2, 'abc')");