fix: eliminate project issue
This commit is contained in:
parent
4217223a6a
commit
337f39191e
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue