diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index 1e6f1edc4c..c843dd0a67 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -798,13 +798,13 @@ static bool needFillValue(SNode* pNode) { return hasFillCol; } -static int32_t partFillExprs(SNodeList* pProjectionList, SNodeList** pFillExprs, SNodeList** pNotFillExprs) { +static int32_t partFillExprs(SSelectStmt* pSelect, SNodeList** pFillExprs, SNodeList** pNotFillExprs) { int32_t code = TSDB_CODE_SUCCESS; SNode* pProject = NULL; - FOREACH(pProject, pProjectionList) { + FOREACH(pProject, pSelect->pProjectionList) { if (needFillValue(pProject)) { code = nodesListMakeStrictAppend(pFillExprs, nodesCloneNode(pProject)); - } else { + } else if (QUERY_NODE_VALUE != nodeType(pProject)) { code = nodesListMakeStrictAppend(pNotFillExprs, nodesCloneNode(pProject)); } if (TSDB_CODE_SUCCESS != code) { @@ -813,6 +813,22 @@ static int32_t partFillExprs(SNodeList* pProjectionList, SNodeList** pFillExprs, break; } } + if (!pSelect->isDistinct) { + SNode* pOrderExpr = NULL; + FOREACH(pOrderExpr, pSelect->pOrderByList) { + SNode* pExpr = ((SOrderByExprNode*)pOrderExpr)->pExpr; + if (needFillValue(pExpr)) { + code = nodesListMakeStrictAppend(pFillExprs, nodesCloneNode(pExpr)); + } else if (QUERY_NODE_VALUE != nodeType(pExpr)) { + code = nodesListMakeStrictAppend(pNotFillExprs, nodesCloneNode(pExpr)); + } + if (TSDB_CODE_SUCCESS != code) { + NODES_DESTORY_LIST(*pFillExprs); + NODES_DESTORY_LIST(*pNotFillExprs); + break; + } + } + } return code; } @@ -837,7 +853,7 @@ static int32_t createFillLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect pFill->node.resultDataOrder = pFill->node.requireDataOrder; pFill->inputTsOrder = ORDER_ASC; - int32_t code = partFillExprs(pSelect->pProjectionList, &pFill->pFillExprs, &pFill->pNotFillExprs); + int32_t code = partFillExprs(pSelect, &pFill->pFillExprs, &pFill->pNotFillExprs); if (TSDB_CODE_SUCCESS == code) { code = rewriteExprsForSelect(pFill->pFillExprs, pSelect, SQL_CLAUSE_FILL); } diff --git a/source/libs/planner/test/planIntervalTest.cpp b/source/libs/planner/test/planIntervalTest.cpp index 8346889734..dddd38fc95 100644 --- a/source/libs/planner/test/planIntervalTest.cpp +++ b/source/libs/planner/test/planIntervalTest.cpp @@ -51,6 +51,9 @@ TEST_F(PlanIntervalTest, fill) { run("SELECT COUNT(c1), MAX(c3), COUNT(c1) FROM t1 " "WHERE ts > '2022-04-01 00:00:00' and ts < '2022-04-30 23:59:59' INTERVAL(10s) FILL(PREV)"); + + run("SELECT COUNT(c1) FROM t1 WHERE ts > '2022-04-01 00:00:00' and ts < '2022-04-30 23:59:59' " + "PARTITION BY c2 INTERVAL(10s) FILL(PREV) ORDER BY c2"); } TEST_F(PlanIntervalTest, selectFunc) {