diff --git a/source/libs/parser/inc/parTranslater.h b/source/libs/parser/inc/parTranslater.h index e06626fb00..bec4e07e1c 100644 --- a/source/libs/parser/inc/parTranslater.h +++ b/source/libs/parser/inc/parTranslater.h @@ -46,6 +46,8 @@ typedef struct STranslateContext { SNode* pPostRoot; } STranslateContext; +EDealRes biRewriteToTbnameFuncAndTranslate(STranslateContext* pCxt, SColumnNode** ppCol); +EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode** pFunc); int32_t biRewriteSelectStar(STranslateContext* pCxt, SSelectStmt* pSelect); int32_t findTable(STranslateContext* pCxt, const char* pTableAlias, STableNode** pOutput); int32_t getTargetMetaImpl(SParseContext* pParCxt, SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta, bool couldBeView); diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 1a65a29259..61ac39ffd4 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1091,6 +1091,22 @@ static EDealRes translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** p return DEAL_RES_CONTINUE; } +#ifndef TD_ENTERPRISE +EDealRes biRewriteToTbnameFuncAndTranslate(STranslateContext* pCxt, SColumnNode** ppCol) { + SFunctionNode* tbnameFuncNode = NULL; + // tbnameFuncNode = biMakeTbnameProjectAstNode(NULL, ((*ppCol)->tableAlias[0]!='\0') ? (*ppCol)->tableAlias : NULL); + tbnameFuncNode->node.resType = (*ppCol)->node.resType; + strcpy(tbnameFuncNode->node.aliasName, (*ppCol)->node.aliasName); + strcpy(tbnameFuncNode->node.userAlias, (*ppCol)->node.userAlias); + + nodesDestroyNode(*(SNode**)ppCol); + *(SNode**)ppCol = (SNode*)tbnameFuncNode; + + EDealRes res = translateFunction(pCxt, &tbnameFuncNode); + return res; +} +#endif + static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) { if (NULL == pCxt->pCurrStmt || (isSelectStmt(pCxt->pCurrStmt) && NULL == ((SSelectStmt*)pCxt->pCurrStmt)->pFromTable)) { @@ -1102,6 +1118,13 @@ static EDealRes translateColumn(STranslateContext* pCxt, SColumnNode** pCol) { return DEAL_RES_CONTINUE; } + if (pCxt->pParseCxt->biMode && (strcasecmp((*pCol)->colName, "tbname") == 0) && + ((SSelectStmt*)pCxt->pCurrStmt)->pFromTable && + QUERY_NODE_REAL_TABLE == nodeType(((SSelectStmt*)pCxt->pCurrStmt)->pFromTable)) { + EDealRes res = biRewriteToTbnameFuncAndTranslate(pCxt, pCol); + return res; + } + EDealRes res = DEAL_RES_CONTINUE; if ('\0' != (*pCol)->tableAlias[0]) { res = translateColumnWithPrefix(pCxt, pCol); @@ -2204,7 +2227,7 @@ static int32_t translateFunctionImpl(STranslateContext* pCxt, SFunctionNode** pF return translateNormalFunction(pCxt, (SNode**)pFunc); } -static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode** pFunc) { +EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode** pFunc) { SNode* pParam = NULL; FOREACH(pParam, (*pFunc)->pParameterList) { if (isMultiResFunc(pParam)) {