fix: select failed as using table alias name

This commit is contained in:
factosea 2024-04-26 09:40:29 +08:00
parent 10d82a3acf
commit 5a72630b3d
1 changed files with 31 additions and 0 deletions

View File

@ -3155,6 +3155,31 @@ static bool fromSingleTable(SNode* table) {
return false;
}
static bool IsEqualTbNameFuncNode(SSelectStmt* pSelect, SNode* pFunc1, SNode* pFunc2) {
if (isTbnameFuction(pFunc1) && isTbnameFuction(pFunc2)) {
SValueNode* pVal1 = (SValueNode*)nodesListGetNode(((SFunctionNode*)pFunc1)->pParameterList, 0);
SValueNode* pVal2 = (SValueNode*)nodesListGetNode(((SFunctionNode*)pFunc1)->pParameterList, 0);
if (!pVal1 && !pVal2) {
return true;
} else if (pVal1 && pVal2) {
return strcmp(pVal1->literal, pVal2->literal) == 0;
}
if (pSelect->pFromTable &&
(pSelect->pFromTable->type == QUERY_NODE_REAL_TABLE || pSelect->pFromTable->type == QUERY_NODE_TEMP_TABLE)) {
STableNode* pTable = (STableNode*)pSelect->pFromTable;
if (pVal1) {
return strcmp(pTable->tableAlias, pVal1->literal) == 0;
} else if (!pVal1) {
return strcmp(pTable->tableAlias, pVal2->literal) == 0;
}
} else {
return false;
}
}
return false;
}
static EDealRes doCheckExprForGroupBy(SNode** pNode, void* pContext) {
STranslateContext* pCxt = (STranslateContext*)pContext;
SSelectStmt* pSelect = (SSelectStmt*)pCxt->pCurrStmt;
@ -3174,6 +3199,9 @@ static EDealRes doCheckExprForGroupBy(SNode** pNode, void* pContext) {
((SColumnNode*)*pNode)->colType == COLUMN_TYPE_TAG) {
return rewriteExprToGroupKeyFunc(pCxt, pNode);
}
if (IsEqualTbNameFuncNode(pSelect, pActualNode, *pNode)) {
return rewriteExprToGroupKeyFunc(pCxt, pNode);
}
}
SNode* pPartKey = NULL;
bool partionByTbname = hasTbnameFunction(pSelect->pPartitionByList);
@ -3185,6 +3213,9 @@ static EDealRes doCheckExprForGroupBy(SNode** pNode, void* pContext) {
((SColumnNode*)*pNode)->colType == COLUMN_TYPE_TAG) {
return rewriteExprToGroupKeyFunc(pCxt, pNode);
}
if (IsEqualTbNameFuncNode(pSelect, pPartKey, *pNode)) {
return rewriteExprToGroupKeyFunc(pCxt, pNode);
}
}
if (NULL != pSelect->pWindow && QUERY_NODE_STATE_WINDOW == nodeType(pSelect->pWindow)) {
if (nodesEqualNode(((SStateWindowNode*)pSelect->pWindow)->pExpr, *pNode)) {