From c5d621c910f339cbc853b8a37e640d087a159bf0 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 13 Nov 2023 18:40:55 +0800 Subject: [PATCH 1/4] fix: remove usless scan columns --- source/libs/planner/src/planOptimizer.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index 4eda11a6a4..a59dc2422b 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -2784,11 +2784,24 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, pNew->hasGroup = pAgg->hasGroup; pNew->node.pChildren = nodesCloneList(pAgg->node.pChildren); - SNode* pNode = NULL; - FOREACH(pNode, pNew->node.pChildren) { - if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) { - OPTIMIZE_FLAG_CLEAR_MASK(((SScanLogicNode*)pNode)->node.optimizedFlag, OPTIMIZE_FLAG_SCAN_PATH); + int32_t code = 0; + SNode* pNode = nodesListGetNode(pNew->node.pChildren, 0); + if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) { + SScanLogicNode* pScan = (SScanLogicNode*)pNode; + nodesDestroyList(pScan->pScanCols); + nodesDestroyList(pScan->pScanPseudoCols); + nodesDestroyList(pScan->node.pTargets); + FOREACH(pNode, pFunc) { + code = nodesCollectColumnsFromNode(pNode, NULL, COLLECT_COL_TYPE_COL, &pScan->pScanCols); + if (TSDB_CODE_SUCCESS != code) { + return code; + } } + code = createColumnByRewriteExprs(pScan->pScanCols, &pScan->node.pTargets); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + OPTIMIZE_FLAG_CLEAR_MASK(pScan->node.optimizedFlag, OPTIMIZE_FLAG_SCAN_PATH); } *pNewAgg = pNew; From dbba1385b37e96dbdc50d8610d396b35e59d09bb Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 13 Nov 2023 19:51:38 +0800 Subject: [PATCH 2/4] fix: scan columns issue --- source/libs/planner/src/planOptimizer.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index a59dc2422b..e2ee3faa3d 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -2788,7 +2788,8 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, SNode* pNode = nodesListGetNode(pNew->node.pChildren, 0); if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) { SScanLogicNode* pScan = (SScanLogicNode*)pNode; - nodesDestroyList(pScan->pScanCols); + SNodeList* pOldScanCols = NULL; + TSWAP(pScan->pScanCols, pOldScanCols); nodesDestroyList(pScan->pScanPseudoCols); nodesDestroyList(pScan->node.pTargets); FOREACH(pNode, pFunc) { @@ -2797,6 +2798,22 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, return code; } } + bool found = false; + FOREACH(pNode, pScan->pScanCols) { + if (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pNode)->colId) { + found = true; + break; + } + } + if (!found) { + FOREACH(pNode, pOldScanCols) { + if (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pNode)->colId) { + nodesListStrictAppend(pScan->pScanCols, nodesCloneNode(pNode)); + break; + } + } + } + nodesDestroyList(pOldScanCols); code = createColumnByRewriteExprs(pScan->pScanCols, &pScan->node.pTargets); if (TSDB_CODE_SUCCESS != code) { return code; From 537e56c9041a7e193d7b290d41076e512d7cb976 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Tue, 14 Nov 2023 08:51:23 +0800 Subject: [PATCH 3/4] fix: scan columns duplicated issue --- source/libs/planner/src/planOptimizer.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index e2ee3faa3d..2a63936ba1 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -2792,12 +2792,13 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, TSWAP(pScan->pScanCols, pOldScanCols); nodesDestroyList(pScan->pScanPseudoCols); nodesDestroyList(pScan->node.pTargets); - FOREACH(pNode, pFunc) { - code = nodesCollectColumnsFromNode(pNode, NULL, COLLECT_COL_TYPE_COL, &pScan->pScanCols); - if (TSDB_CODE_SUCCESS != code) { - return code; - } + SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); + list->pNodeList = pFunc; + code = nodesCollectColumnsFromNode((SNode*)list, NULL, COLLECT_COL_TYPE_COL, &pScan->pScanCols); + if (TSDB_CODE_SUCCESS != code) { + return code; } + nodesFree(list); bool found = false; FOREACH(pNode, pScan->pScanCols) { if (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pNode)->colId) { From d659bbb272c4801528aabd29bd51d2c141afabff Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Tue, 14 Nov 2023 15:19:04 +0800 Subject: [PATCH 4/4] fix: memory reuse issue --- source/libs/planner/src/planOptimizer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index 2a63936ba1..e71e18d37d 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -2791,7 +2791,9 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, SNodeList* pOldScanCols = NULL; TSWAP(pScan->pScanCols, pOldScanCols); nodesDestroyList(pScan->pScanPseudoCols); + pScan->pScanPseudoCols = NULL; nodesDestroyList(pScan->node.pTargets); + pScan->node.pTargets = NULL; SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); list->pNodeList = pFunc; code = nodesCollectColumnsFromNode((SNode*)list, NULL, COLLECT_COL_TYPE_COL, &pScan->pScanCols); @@ -2809,7 +2811,7 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, if (!found) { FOREACH(pNode, pOldScanCols) { if (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pNode)->colId) { - nodesListStrictAppend(pScan->pScanCols, nodesCloneNode(pNode)); + nodesListMakeStrictAppend(&pScan->pScanCols, nodesCloneNode(pNode)); break; } }