From a8325b09e06ac3f68dae2f05be6c794a5322644a Mon Sep 17 00:00:00 2001 From: "slzhou@taodata.com" Date: Fri, 22 Jul 2022 08:59:10 +0800 Subject: [PATCH] fix: disable tag scan when the grouping set is not column and distince would create grouping keys consisted of grouping set --- source/libs/planner/src/planLogicCreater.c | 14 +++++++++++--- source/libs/planner/src/planOptimizer.c | 11 ++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index 9ced5c1cb6..bdbd928cb6 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -884,9 +884,17 @@ static int32_t createDistinctLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSe int32_t code = TSDB_CODE_SUCCESS; // set grouyp keys, agg funcs and having conditions - pAgg->pGroupKeys = nodesCloneList(pSelect->pProjectionList); - if (NULL == pAgg->pGroupKeys) { - code = TSDB_CODE_OUT_OF_MEMORY; + SNodeList* pGroupKeys = NULL; + SNode* pProjection = NULL; + FOREACH(pProjection, pSelect->pProjectionList) { + code = nodesListMakeStrictAppend(&pGroupKeys, createGroupingSetNode(pProjection)); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pGroupKeys); + break; + } + } + if (TSDB_CODE_SUCCESS == code) { + pAgg->pGroupKeys = pGroupKeys; } // rewrite the expression in subsequent clauses diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index 36b58afb76..29db9a4918 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -2149,7 +2149,16 @@ static bool tagScanMayBeOptimized(SLogicNode* pNode) { planOptNodeListHasCol(pAgg->pGroupKeys) || !planOptNodeListHasTbname(pAgg->pGroupKeys)) { return false; } - + + SNode* pGroupKey = NULL; + FOREACH(pGroupKey, pAgg->pGroupKeys) { + SNode* pGroup = NULL; + FOREACH(pGroup, ((SGroupingSetNode*)pGroupKey)->pParameterList) { + if (QUERY_NODE_COLUMN != nodeType(pGroup)) { + return false; + } + } + } return true; }