From 337f39191efdbaa5c2ebe93daf6928a390977f8e Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Wed, 3 Apr 2024 18:35:50 +0800 Subject: [PATCH] fix: eliminate project issue --- source/libs/executor/src/scanoperator.c | 12 ++++++++-- source/libs/function/src/builtinsimpl.c | 5 +++++ source/libs/planner/src/planOptimizer.c | 29 ++++++++++++++++++++----- source/libs/scalar/src/filter.c | 12 +++++++++- 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 5a502dfa7a..88dbf57548 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -3785,6 +3785,8 @@ SSDataBlock* doTableMergeScanParaSubTables(SOperatorInfo* pOperator) { T_LONG_JMP(pTaskInfo->env, code); } + int64_t st = taosGetTimestampUs(); + size_t tableListSize = tableListGetSize(pInfo->base.pTableListInfo); if (!pInfo->hasGroupId) { pInfo->hasGroupId = true; @@ -3813,7 +3815,7 @@ SSDataBlock* doTableMergeScanParaSubTables(SOperatorInfo* pOperator) { pBlock->info.id.groupId = pInfo->groupId; pOperator->resultInfo.totalRows += pBlock->info.rows; pInfo->bGroupProcessed = true; - return pBlock; + break; } else { // Data of this group are all dumped, let's try the next group stopSubTablesTableMergeScan(pInfo); @@ -3829,6 +3831,8 @@ SSDataBlock* doTableMergeScanParaSubTables(SOperatorInfo* pOperator) { } } + pOperator->cost.totalCost += (taosGetTimestampUs() - st) / 1000.0;; + return pBlock; } @@ -4179,6 +4183,8 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) { T_LONG_JMP(pTaskInfo->env, code); } + int64_t st = taosGetTimestampUs(); + size_t tableListSize = tableListGetSize(pInfo->base.pTableListInfo); if (!pInfo->hasGroupId) { pInfo->hasGroupId = true; @@ -4208,7 +4214,7 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) { pBlock->info.id.groupId = pInfo->groupId; pOperator->resultInfo.totalRows += pBlock->info.rows; pInfo->bGroupProcessed = true; - return pBlock; + break; } else { if (pInfo->bNewFilesetEvent) { stopDurationForGroupTableMergeScan(pOperator); @@ -4232,6 +4238,8 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) { } } + pOperator->cost.totalCost += (taosGetTimestampUs() - st) / 1000.0;; + return pBlock; } diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index 5ab6d5e075..c308d39e87 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -2876,6 +2876,11 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) { if (pDiffInfo->includeNull) { colDataSetNull_f_s(pOutput, pos); + // handle selectivity + if (pCtx->subsidiaries.num > 0) { + appendSelectivityValue(pCtx, i, pos); + } + numOfElems += 1; } continue; diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index 1d2d7f280f..d0d71d3fe8 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -26,6 +26,7 @@ #define OPTIMIZE_FLAG_SCAN_PATH OPTIMIZE_FLAG_MASK(0) #define OPTIMIZE_FLAG_PUSH_DOWN_CONDE OPTIMIZE_FLAG_MASK(1) #define OPTIMIZE_FLAG_STB_JOIN OPTIMIZE_FLAG_MASK(2) +#define OPTIMIZE_FLAG_ELIMINATE_PROJ OPTIMIZE_FLAG_MASK(3) #define OPTIMIZE_FLAG_SET_MASK(val, mask) (val) |= (mask) #define OPTIMIZE_FLAG_CLEAR_MASK(val, mask) (val) &= (~(mask)) @@ -2760,6 +2761,10 @@ static bool eliminateProjOptMayBeOptimized(SLogicNode* pNode) { return false; } + if (OPTIMIZE_FLAG_TEST_MASK(pNode->optimizedFlag, OPTIMIZE_FLAG_ELIMINATE_PROJ)) { + return false; + } + if (NULL != pNode->pParent && (QUERY_NODE_LOGIC_PLAN_PROJECT != nodeType(pNode) || 1 != LIST_LENGTH(pNode->pChildren) || QUERY_NODE_LOGIC_PLAN_SCAN != nodeType(nodesListGetNode(pNode->pChildren, 0)) || QUERY_NODE_LOGIC_PLAN_JOIN != nodeType(pNode->pParent))) { return false; @@ -2788,6 +2793,10 @@ static bool eliminateProjOptMayBeOptimized(SLogicNode* pNode) { if (QUERY_NODE_COLUMN != nodeType(pExprNode)) { return false; } + SColumnNode* pCol = (SColumnNode*)pExprNode; + if (NULL != pNode->pParent && 0 != strcmp(pCol->colName, pCol->node.aliasName)) { + return false; + } } return eliminateProjOptCheckProjColumnNames(pProjectNode); @@ -2855,14 +2864,21 @@ static void alignProjectionWithTarget(SLogicNode* pNode) { } } +typedef struct RewriteTableAliasCxt { + char* newTableAlias; + bool rewriteColName; +} RewriteTableAliasCxt; + static EDealRes eliminateProjOptRewriteScanTableAlias(SNode* pNode, void* pContext) { if (QUERY_NODE_COLUMN == nodeType(pNode)) { SColumnNode* pCol = (SColumnNode*)pNode; - strcpy(pCol->tableAlias, (char*)pContext); + RewriteTableAliasCxt* pCtx = (RewriteTableAliasCxt*)pContext; + strcpy(pCol->tableAlias, pCtx->newTableAlias); } return DEAL_RES_CONTINUE; } + static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan, SProjectLogicNode* pProjectNode) { SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pProjectNode->node.pChildren, 0); @@ -2885,14 +2901,17 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pChild->pTargets = pNewChildTargets; } else { nodesDestroyList(pNewChildTargets); + OPTIMIZE_FLAG_SET_MASK(pProjectNode->node.optimizedFlag, OPTIMIZE_FLAG_ELIMINATE_PROJ); + pCxt->optimized = true; return TSDB_CODE_SUCCESS; } } else { + RewriteTableAliasCxt cxt = {.newTableAlias = pProjectNode->stmtName, .rewriteColName = false}; SScanLogicNode* pScan = (SScanLogicNode*)pChild; - nodesWalkExprs(pScan->pScanCols, eliminateProjOptRewriteScanTableAlias, pProjectNode->stmtName); - nodesWalkExprs(pScan->pScanPseudoCols, eliminateProjOptRewriteScanTableAlias, pProjectNode->stmtName); - nodesWalkExpr(pScan->node.pConditions, eliminateProjOptRewriteScanTableAlias, pProjectNode->stmtName); - nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, pProjectNode->stmtName); + nodesWalkExprs(pScan->pScanCols, eliminateProjOptRewriteScanTableAlias, &cxt); + nodesWalkExprs(pScan->pScanPseudoCols, eliminateProjOptRewriteScanTableAlias, &cxt); + nodesWalkExpr(pScan->node.pConditions, eliminateProjOptRewriteScanTableAlias, &cxt); + nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, &cxt); } int32_t code = replaceLogicNode(pLogicSubplan, (SLogicNode*)pProjectNode, pChild); diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 6945029718..55030d0a96 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -3911,6 +3911,7 @@ int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStri int32_t optr = 0; int32_t code = 0; bool empty = false, all = false; + uint32_t emptyGroups = 0; for (uint32_t i = 0; i < info->groupNum; ++i) { SFilterGroup *group = &info->groups[i]; @@ -3922,6 +3923,7 @@ int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStri optr = LOGIC_COND_TYPE_OR; } + empty = false; for (uint32_t u = 0; u < group->unitNum; ++u) { uint32_t uidx = group->unitIdxs[u]; SFilterUnit *unit = &info->units[uidx]; @@ -3929,7 +3931,9 @@ int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStri uint8_t raOptr = FILTER_UNIT_OPTR(unit); filterAddRangeOptr(cur, raOptr, LOGIC_COND_TYPE_AND, &empty, NULL); - FLT_CHK_JMP(empty); + if (empty) { + emptyGroups++; + } if (FILTER_NO_MERGE_OPTR(raOptr)) { continue; @@ -3938,6 +3942,10 @@ int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStri filterAddUnitRange(info, unit, cur, optr); } + if (empty) { + continue; + } + if (cur->notnull) { prev->notnull = true; break; @@ -3952,6 +3960,8 @@ int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStri } } + FLT_CHK_JMP(emptyGroups == info->groupNum); + if (prev->notnull) { *win = TSWINDOW_INITIALIZER; } else {