Merge pull request #17434 from taosdata/fix/3.0_bugfix_wxy
fix: plan problem with 'partition by tag group by tag' statement
This commit is contained in:
commit
194587558b
|
@ -1520,11 +1520,15 @@ static bool partTagsHasIndefRowsSelectFunc(SNodeList* pFuncs) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t partTagsRewriteGroupTagsToFuncs(SNodeList* pGroupTags, SNodeList* pAggFuncs) {
|
static int32_t partTagsRewriteGroupTagsToFuncs(SNodeList* pGroupTags, int32_t start, SNodeList* pAggFuncs) {
|
||||||
bool hasIndefRowsSelectFunc = partTagsHasIndefRowsSelectFunc(pAggFuncs);
|
bool hasIndefRowsSelectFunc = partTagsHasIndefRowsSelectFunc(pAggFuncs);
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t index = 0;
|
||||||
SNode* pNode = NULL;
|
SNode* pNode = NULL;
|
||||||
FOREACH(pNode, pGroupTags) {
|
FOREACH(pNode, pGroupTags) {
|
||||||
|
if (index++ < start) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (hasIndefRowsSelectFunc) {
|
if (hasIndefRowsSelectFunc) {
|
||||||
code = nodesListStrictAppend(pAggFuncs, partTagsCreateWrapperFunc("_select_value", pNode));
|
code = nodesListStrictAppend(pAggFuncs, partTagsCreateWrapperFunc("_select_value", pNode));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1559,20 +1563,35 @@ static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SAggLogicNode* pAgg = (SAggLogicNode*)pNode;
|
SAggLogicNode* pAgg = (SAggLogicNode*)pNode;
|
||||||
|
int32_t start = -1;
|
||||||
SNode* pGroupKey = NULL;
|
SNode* pGroupKey = NULL;
|
||||||
FOREACH(pGroupKey, pAgg->pGroupKeys) {
|
FOREACH(pGroupKey, pAgg->pGroupKeys) {
|
||||||
code = nodesListMakeStrictAppend(
|
SNode* pGroupExpr = nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0);
|
||||||
&pScan->pGroupTags, nodesCloneNode(nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0)));
|
if (NULL != pScan->pGroupTags) {
|
||||||
|
SNode* pGroupTag = NULL;
|
||||||
|
FOREACH(pGroupTag, pScan->pGroupTags) {
|
||||||
|
if (nodesEqualNode(pGroupTag, pGroupExpr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (start < 0) {
|
||||||
|
start = LIST_LENGTH(pScan->pGroupTags);
|
||||||
|
}
|
||||||
|
code = nodesListMakeStrictAppend(&pScan->pGroupTags, nodesCloneNode(pGroupExpr));
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NODES_DESTORY_LIST(pAgg->pGroupKeys);
|
NODES_DESTORY_LIST(pAgg->pGroupKeys);
|
||||||
code = partTagsRewriteGroupTagsToFuncs(pScan->pGroupTags, pAgg->pAggFuncs);
|
if (TSDB_CODE_SUCCESS == code && start >= 0) {
|
||||||
|
code = partTagsRewriteGroupTagsToFuncs(pScan->pGroupTags, start, pAgg->pAggFuncs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = partTagsOptRebuildTbanme(pScan->pGroupTags);
|
code = partTagsOptRebuildTbanme(pScan->pGroupTags);
|
||||||
}
|
}
|
||||||
|
pCxt->optimized = true;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,8 @@ TEST_F(PlanPartitionByTest, withGroupBy) {
|
||||||
run("SELECT COUNT(*) FROM t1 PARTITION BY c1 GROUP BY c2");
|
run("SELECT COUNT(*) FROM t1 PARTITION BY c1 GROUP BY c2");
|
||||||
|
|
||||||
run("SELECT TBNAME, c1 FROM st1 PARTITION BY TBNAME GROUP BY c1");
|
run("SELECT TBNAME, c1 FROM st1 PARTITION BY TBNAME GROUP BY c1");
|
||||||
|
|
||||||
|
run("SELECT COUNT(*) FROM t1 PARTITION BY TBNAME GROUP BY TBNAME");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(PlanPartitionByTest, withTimeLineFunc) {
|
TEST_F(PlanPartitionByTest, withTimeLineFunc) {
|
||||||
|
|
Loading…
Reference in New Issue