rewrite aliasname

This commit is contained in:
facetosea 2025-02-18 18:01:32 +08:00
parent 00473a9c64
commit bd3a36bd12
1 changed files with 19 additions and 23 deletions

View File

@ -1577,7 +1577,7 @@ static int32_t findAndSetColumn(STranslateContext* pCxt, SColumnNode** pColRef,
SExprNode* pFoundExpr = NULL; SExprNode* pFoundExpr = NULL;
FOREACH(pNode, pProjectList) { FOREACH(pNode, pProjectList) {
SExprNode* pExpr = (SExprNode*)pNode; SExprNode* pExpr = (SExprNode*)pNode;
if (0 == strcmp(pCol->colName, pExpr->aliasName) || 0 == strcmp(pCol->colName, pExpr->userAlias)) { if (0 == strcmp(pCol->colName, pExpr->aliasName)) {
if (*pFound) { if (*pFound) {
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_AMBIGUOUS_COLUMN, pCol->colName); return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_AMBIGUOUS_COLUMN, pCol->colName);
} }
@ -3572,23 +3572,6 @@ static int32_t getGroupByErrorCode(STranslateContext* pCxt) {
return TSDB_CODE_PAR_INVALID_OPTR_USAGE; return TSDB_CODE_PAR_INVALID_OPTR_USAGE;
} }
static void rewriteAliasNameWithRelate(SFunctionNode* pFunc, SExprNode* pExpr) {
if (isRelatedToOtherExpr(pExpr)) {
int len = strlen(pExpr->aliasName);
if (len + TSDB_COL_NAME_EXLEN >= TSDB_COL_NAME_LEN) {
char buffer[TSDB_COL_NAME_EXLEN + TSDB_COL_NAME_LEN + 1] = {0};
tsnprintf(buffer, sizeof(buffer), "%s.%d", pExpr->aliasName, pExpr->relatedTo);
uint64_t hashVal = MurmurHash3_64(buffer, TSDB_COL_NAME_EXLEN + TSDB_COL_NAME_LEN + 1);
tsnprintf(pFunc->node.aliasName, TSDB_COL_NAME_EXLEN, "%" PRIu64, hashVal);
} else {
tstrncpy(pFunc->node.aliasName, pExpr->aliasName, TSDB_COL_NAME_LEN);
tsnprintf(pFunc->node.aliasName + len, TSDB_COL_NAME_EXLEN, ".%d", pExpr->relatedTo);
}
} else {
tstrncpy(pFunc->node.aliasName, pExpr->aliasName, TSDB_COL_NAME_LEN);
}
}
static EDealRes rewriteColToSelectValFunc(STranslateContext* pCxt, SNode** pNode) { static EDealRes rewriteColToSelectValFunc(STranslateContext* pCxt, SNode** pNode) {
SFunctionNode* pFunc = NULL; SFunctionNode* pFunc = NULL;
int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc);
@ -3597,8 +3580,8 @@ static EDealRes rewriteColToSelectValFunc(STranslateContext* pCxt, SNode** pNode
return DEAL_RES_ERROR; return DEAL_RES_ERROR;
} }
tstrncpy(pFunc->functionName, "_select_value", TSDB_FUNC_NAME_LEN); tstrncpy(pFunc->functionName, "_select_value", TSDB_FUNC_NAME_LEN);
tstrncpy(pFunc->node.aliasName, ((SExprNode*)*pNode)->aliasName, TSDB_COL_NAME_LEN);
tstrncpy(pFunc->node.userAlias, ((SExprNode*)*pNode)->userAlias, TSDB_COL_NAME_LEN); tstrncpy(pFunc->node.userAlias, ((SExprNode*)*pNode)->userAlias, TSDB_COL_NAME_LEN);
rewriteAliasNameWithRelate(pFunc, (SExprNode*)*pNode);
pFunc->node.relatedTo = ((SExprNode*)*pNode)->relatedTo; pFunc->node.relatedTo = ((SExprNode*)*pNode)->relatedTo;
pFunc->node.bindExprID = ((SExprNode*)*pNode)->bindExprID; pFunc->node.bindExprID = ((SExprNode*)*pNode)->bindExprID;
@ -7411,14 +7394,27 @@ static bool isMultiColsFuncNode(SNode* pNode) {
} }
typedef struct SBindTupleFuncCxt { typedef struct SBindTupleFuncCxt {
SNode* root;
int32_t bindExprID; int32_t bindExprID;
} SBindTupleFuncCxt; } SBindTupleFuncCxt;
static EDealRes pushDownBindSelectFunc(SNode** pNode, void* pContext) { static EDealRes pushDownBindSelectFunc(SNode** pNode, void* pContext) {
SBindTupleFuncCxt* pCxt = pContext; SBindTupleFuncCxt* pCxt = pContext;
if (nodesIsExprNode(*pNode)) { if (nodesIsExprNode(*pNode)) {
((SExprNode*)*pNode)->relatedTo = pCxt->bindExprID; SExprNode* pExpr = (SExprNode*)*pNode;
SFunctionNode* pFunc = (SFunctionNode*)*pNode; pExpr->relatedTo = pCxt->bindExprID;
if (isRelatedToOtherExpr(pExpr) && *pNode != pCxt->root) {
int len = strlen(pExpr->aliasName);
if (len + TSDB_COL_NAME_EXLEN >= TSDB_COL_NAME_LEN) {
char buffer[TSDB_COL_NAME_EXLEN + TSDB_COL_NAME_LEN + 1] = {0};
tsnprintf(buffer, sizeof(buffer), "%s.%d", pExpr->aliasName, pExpr->relatedTo);
uint64_t hashVal = MurmurHash3_64(buffer, TSDB_COL_NAME_EXLEN + TSDB_COL_NAME_LEN + 1);
tsnprintf(pExpr->aliasName, TSDB_COL_NAME_EXLEN, "%" PRIu64, hashVal);
} else {
tsnprintf(pExpr->aliasName + len, TSDB_COL_NAME_EXLEN, ".%d", pExpr->relatedTo);
}
}
} }
return DEAL_RES_CONTINUE; return DEAL_RES_CONTINUE;
} }
@ -7532,7 +7528,7 @@ static EDealRes rewriteSingleColsFunc(SNode** pNode, void* pContext) {
SNode* pNewNode = NULL; SNode* pNewNode = NULL;
code = nodesCloneNode(pExpr, &pNewNode); code = nodesCloneNode(pExpr, &pNewNode);
if (nodesIsExprNode(pNewNode)) { if (nodesIsExprNode(pNewNode)) {
SBindTupleFuncCxt pCxt = {selectFuncIndex}; SBindTupleFuncCxt pCxt = {pNewNode, selectFuncIndex};
nodesRewriteExpr(&pNewNode, pushDownBindSelectFunc, &pCxt); nodesRewriteExpr(&pNewNode, pushDownBindSelectFunc, &pCxt);
} else { } else {
pCxt->status = TSDB_CODE_PAR_INVALID_COLS_FUNCTION; pCxt->status = TSDB_CODE_PAR_INVALID_COLS_FUNCTION;
@ -7617,7 +7613,7 @@ static int32_t rewriteColsFunction(STranslateContext* pCxt, SNodeList** nodeList
code = nodesCloneNode(pExpr, &pNewNode); code = nodesCloneNode(pExpr, &pNewNode);
if (nodesIsExprNode(pNewNode)) { if (nodesIsExprNode(pNewNode)) {
SBindTupleFuncCxt pCxt = {selectFuncIndex}; SBindTupleFuncCxt pCxt = {pNewNode, selectFuncIndex};
nodesRewriteExpr(&pNewNode, pushDownBindSelectFunc, &pCxt); nodesRewriteExpr(&pNewNode, pushDownBindSelectFunc, &pCxt);
} else { } else {
code = TSDB_CODE_PAR_INVALID_COLS_FUNCTION; code = TSDB_CODE_PAR_INVALID_COLS_FUNCTION;