From 6adb8edb938326338b9551a29d8b211bf14da62f Mon Sep 17 00:00:00 2001 From: wangjiaming0909 <604227650@qq.com> Date: Wed, 28 Aug 2024 19:33:15 +0800 Subject: [PATCH] fix project list rewrite with keeping projidxs --- include/libs/nodes/querynodes.h | 2 ++ source/libs/nodes/src/nodesCloneFuncs.c | 1 + source/libs/nodes/src/nodesUtilFuncs.c | 1 + source/libs/parser/src/parTranslater.c | 8 ++++---- source/libs/planner/src/planLogicCreater.c | 3 ++- source/libs/planner/src/planOptimizer.c | 15 +++++++++++++++ source/libs/planner/src/planPhysiCreater.c | 9 ++++----- 7 files changed, 29 insertions(+), 10 deletions(-) diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index fce2aece05..8ed88ef47d 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -93,6 +93,7 @@ typedef struct SColumnNode { bool tableHasPk; bool isPk; int32_t projRefIdx; + int32_t resIdx; } SColumnNode; typedef struct SColumnRefNode { @@ -450,6 +451,7 @@ typedef struct SSelectStmt { bool groupSort; bool tagScan; bool joinContains; + bool expandStar; } SSelectStmt; typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType; diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c index 709bdff374..e2c5b42e39 100644 --- a/source/libs/nodes/src/nodesCloneFuncs.c +++ b/source/libs/nodes/src/nodesCloneFuncs.c @@ -126,6 +126,7 @@ static int32_t columnNodeCopy(const SColumnNode* pSrc, SColumnNode* pDst) { COPY_SCALAR_FIELD(isPk); COPY_SCALAR_FIELD(numOfPKs); COPY_SCALAR_FIELD(projRefIdx); + COPY_SCALAR_FIELD(resIdx); return TSDB_CODE_SUCCESS; } diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index c1afc4afb3..df9fe5570a 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -2266,6 +2266,7 @@ static EDealRes doCollect(SCollectColumnsCxt* pCxt, SColumnNode* pCol, SNode* pN SNode* pNew = NULL; pCxt->errCode = nodesCloneNode(pNode, &pNew); if (TSDB_CODE_SUCCESS == pCxt->errCode) { + //((SColumnNode*)pNew)->projRefIdx = pCol->node.projIdx; pCxt->errCode = nodesListStrictAppend(pCxt->pCols, pNew); } } diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 8a7b9a15b0..1046d52a8d 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1270,7 +1270,7 @@ static void setColumnPrimTs(STranslateContext* pCxt, SColumnNode* pCol, const ST } } -static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* pTable, bool igTags, SNodeList* pList) { +static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* pTable, bool igTags, SNodeList* pList, bool skipProjRef) { int32_t code = 0; if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) { const STableMeta* pMeta = ((SRealTableNode*)pTable)->pMeta; @@ -1306,7 +1306,7 @@ static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* p code = setColumnInfoByExpr(pTempTable, (SExprNode*)pNode, (SColumnNode**)&pCell->pNode); } if (TSDB_CODE_SUCCESS == code) { - pCol->projRefIdx = ((SExprNode*)pNode)->projIdx; + if (!skipProjRef) pCol->projRefIdx = ((SExprNode*)pNode)->projIdx; // only set proj ref when select * from (select ...) } else { break; } @@ -4773,7 +4773,7 @@ static int32_t createAllColumns(STranslateContext* pCxt, bool igTags, SNodeList* size_t nums = taosArrayGetSize(pTables); for (size_t i = 0; i < nums; ++i) { STableNode* pTable = taosArrayGetP(pTables, i); - int32_t code = createColumnsByTable(pCxt, pTable, igTags, *pCols); + int32_t code = createColumnsByTable(pCxt, pTable, igTags, *pCols, nums > 1); if (TSDB_CODE_SUCCESS != code) { return code; } @@ -4836,7 +4836,7 @@ static int32_t createTableAllCols(STranslateContext* pCxt, SColumnNode* pCol, bo } } if (TSDB_CODE_SUCCESS == code) { - code = createColumnsByTable(pCxt, pTable, igTags, *pOutput); + code = createColumnsByTable(pCxt, pTable, igTags, *pOutput, false); } return code; } diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index d1a7a67057..2fecbe212f 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -122,6 +122,7 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) { strcpy(pCol->node.aliasName, pToBeRewrittenExpr->aliasName); strcpy(pCol->node.userAlias, ((SExprNode*)pExpr)->userAlias); strcpy(pCol->colName, ((SExprNode*)pExpr)->aliasName); + pCol->node.projIdx = ((SExprNode*)(*pNode))->projIdx; if (QUERY_NODE_FUNCTION == nodeType(pExpr)) { setColumnInfo((SFunctionNode*)pExpr, pCol, pCxt->isPartitionBy); } @@ -1397,7 +1398,7 @@ static int32_t createColumnByProjections(SLogicPlanContext* pCxt, const char* pS nodesDestroyList(pList); return code; } - pCol->projRefIdx = ((SExprNode*)pNode)->projIdx; + pCol->resIdx = ((SExprNode*)pNode)->projIdx; } *pCols = pList; diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index 5d218d3aad..5743d557bf 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -3475,6 +3475,20 @@ static EDealRes eliminateProjOptRewriteScanTableAlias(SNode* pNode, void* pConte } +static void eliminateProjPushdownProjIdx(SNodeList* pParentProjects, SNodeList* pChildTargets) { + SNode* pChildTarget = NULL, *pParentProject = NULL; + FOREACH(pChildTarget, pChildTargets) { + SColumnNode* pTargetCol = (SColumnNode*)pChildTarget; + FOREACH(pParentProject, pParentProjects) { + SExprNode* pProject = (SExprNode*)pParentProject; + if (0 == strcmp(pTargetCol->colName, pProject->aliasName)) { + pTargetCol->resIdx = pProject->projIdx; + break; + } + } + } +} + static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan, SProjectLogicNode* pProjectNode) { SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pProjectNode->node.pChildren, 0); @@ -3546,6 +3560,7 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* nodesWalkExprs(pScan->pScanPseudoCols, eliminateProjOptRewriteScanTableAlias, &cxt); nodesWalkExpr(pScan->node.pConditions, eliminateProjOptRewriteScanTableAlias, &cxt); nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, &cxt); + eliminateProjPushdownProjIdx(pProjectNode->pProjections, pChild->pTargets); } if (TSDB_CODE_SUCCESS == code) { diff --git a/source/libs/planner/src/planPhysiCreater.c b/source/libs/planner/src/planPhysiCreater.c index f3a4331562..89a3376ab6 100644 --- a/source/libs/planner/src/planPhysiCreater.c +++ b/source/libs/planner/src/planPhysiCreater.c @@ -166,7 +166,6 @@ static int32_t createTarget(SNode* pNode, int16_t dataBlockId, int16_t slotId, S } static int32_t putSlotToHashImpl(int16_t dataBlockId, int16_t slotId, const char* pName, int32_t len, SHashObj* pHash) { - qInfo("wjm put slot into hash: %p, name: %s, slotId: %d", pHash, pName, slotId); SSlotIndex* pIndex = taosHashGet(pHash, pName, len); if (NULL != pIndex) { SSlotIdInfo info = {.slotId = slotId, .set = false}; @@ -228,11 +227,11 @@ static int32_t buildDataBlockSlots(SPhysiPlanContext* pCxt, SNodeList* pList, SD code = putSlotToHash(name, len, pDataBlockDesc->dataBlockId, slotId, pNode, pHash); } if (TSDB_CODE_SUCCESS == code) { - if (nodeType(pNode) == QUERY_NODE_COLUMN && ((SColumnNode*)pNode)->projRefIdx > 0) { - sprintf(name + strlen(name), "%d", ((SColumnNode*)pNode)->projRefIdx); + if (nodeType(pNode) == QUERY_NODE_COLUMN && ((SColumnNode*)pNode)->resIdx > 0) { + sprintf(name + strlen(name), "%d", ((SColumnNode*)pNode)->resIdx); + qInfo("wjm append slot name: %s, slotId: %d, aliasName: %s", name, slotId, ((SExprNode*)pNode)->aliasName); + code = putSlotToHash(name, strlen(name), pDataBlockDesc->dataBlockId, slotId, pNode, pHash); } - qInfo("wjm append slot name: %s, slotId: %d, aliasName: %s", name, slotId, ((SExprNode*)pNode)->aliasName); - code = putSlotToHash(name, strlen(name), pDataBlockDesc->dataBlockId, slotId, pNode, pHash); } taosMemoryFree(name); if (TSDB_CODE_SUCCESS == code) {