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);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
size_t tableListSize = tableListGetSize(pInfo->base.pTableListInfo);
|
size_t tableListSize = tableListGetSize(pInfo->base.pTableListInfo);
|
||||||
if (!pInfo->hasGroupId) {
|
if (!pInfo->hasGroupId) {
|
||||||
pInfo->hasGroupId = true;
|
pInfo->hasGroupId = true;
|
||||||
|
@ -3813,7 +3815,7 @@ SSDataBlock* doTableMergeScanParaSubTables(SOperatorInfo* pOperator) {
|
||||||
pBlock->info.id.groupId = pInfo->groupId;
|
pBlock->info.id.groupId = pInfo->groupId;
|
||||||
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
||||||
pInfo->bGroupProcessed = true;
|
pInfo->bGroupProcessed = true;
|
||||||
return pBlock;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// Data of this group are all dumped, let's try the next group
|
// Data of this group are all dumped, let's try the next group
|
||||||
stopSubTablesTableMergeScan(pInfo);
|
stopSubTablesTableMergeScan(pInfo);
|
||||||
|
@ -3829,6 +3831,8 @@ SSDataBlock* doTableMergeScanParaSubTables(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pOperator->cost.totalCost += (taosGetTimestampUs() - st) / 1000.0;;
|
||||||
|
|
||||||
return pBlock;
|
return pBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4179,6 +4183,8 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
size_t tableListSize = tableListGetSize(pInfo->base.pTableListInfo);
|
size_t tableListSize = tableListGetSize(pInfo->base.pTableListInfo);
|
||||||
if (!pInfo->hasGroupId) {
|
if (!pInfo->hasGroupId) {
|
||||||
pInfo->hasGroupId = true;
|
pInfo->hasGroupId = true;
|
||||||
|
@ -4208,7 +4214,7 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
|
||||||
pBlock->info.id.groupId = pInfo->groupId;
|
pBlock->info.id.groupId = pInfo->groupId;
|
||||||
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
||||||
pInfo->bGroupProcessed = true;
|
pInfo->bGroupProcessed = true;
|
||||||
return pBlock;
|
break;
|
||||||
} else {
|
} else {
|
||||||
if (pInfo->bNewFilesetEvent) {
|
if (pInfo->bNewFilesetEvent) {
|
||||||
stopDurationForGroupTableMergeScan(pOperator);
|
stopDurationForGroupTableMergeScan(pOperator);
|
||||||
|
@ -4232,6 +4238,8 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pOperator->cost.totalCost += (taosGetTimestampUs() - st) / 1000.0;;
|
||||||
|
|
||||||
return pBlock;
|
return pBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2876,6 +2876,11 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
|
||||||
if (pDiffInfo->includeNull) {
|
if (pDiffInfo->includeNull) {
|
||||||
colDataSetNull_f_s(pOutput, pos);
|
colDataSetNull_f_s(pOutput, pos);
|
||||||
|
|
||||||
|
// handle selectivity
|
||||||
|
if (pCtx->subsidiaries.num > 0) {
|
||||||
|
appendSelectivityValue(pCtx, i, pos);
|
||||||
|
}
|
||||||
|
|
||||||
numOfElems += 1;
|
numOfElems += 1;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define OPTIMIZE_FLAG_SCAN_PATH OPTIMIZE_FLAG_MASK(0)
|
#define OPTIMIZE_FLAG_SCAN_PATH OPTIMIZE_FLAG_MASK(0)
|
||||||
#define OPTIMIZE_FLAG_PUSH_DOWN_CONDE OPTIMIZE_FLAG_MASK(1)
|
#define OPTIMIZE_FLAG_PUSH_DOWN_CONDE OPTIMIZE_FLAG_MASK(1)
|
||||||
#define OPTIMIZE_FLAG_STB_JOIN OPTIMIZE_FLAG_MASK(2)
|
#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_SET_MASK(val, mask) (val) |= (mask)
|
||||||
#define OPTIMIZE_FLAG_CLEAR_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;
|
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) ||
|
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))) {
|
QUERY_NODE_LOGIC_PLAN_SCAN != nodeType(nodesListGetNode(pNode->pChildren, 0)) || QUERY_NODE_LOGIC_PLAN_JOIN != nodeType(pNode->pParent))) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -2788,6 +2793,10 @@ static bool eliminateProjOptMayBeOptimized(SLogicNode* pNode) {
|
||||||
if (QUERY_NODE_COLUMN != nodeType(pExprNode)) {
|
if (QUERY_NODE_COLUMN != nodeType(pExprNode)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
SColumnNode* pCol = (SColumnNode*)pExprNode;
|
||||||
|
if (NULL != pNode->pParent && 0 != strcmp(pCol->colName, pCol->node.aliasName)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return eliminateProjOptCheckProjColumnNames(pProjectNode);
|
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) {
|
static EDealRes eliminateProjOptRewriteScanTableAlias(SNode* pNode, void* pContext) {
|
||||||
if (QUERY_NODE_COLUMN == nodeType(pNode)) {
|
if (QUERY_NODE_COLUMN == nodeType(pNode)) {
|
||||||
SColumnNode* pCol = (SColumnNode*)pNode;
|
SColumnNode* pCol = (SColumnNode*)pNode;
|
||||||
strcpy(pCol->tableAlias, (char*)pContext);
|
RewriteTableAliasCxt* pCtx = (RewriteTableAliasCxt*)pContext;
|
||||||
|
strcpy(pCol->tableAlias, pCtx->newTableAlias);
|
||||||
}
|
}
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan,
|
static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan,
|
||||||
SProjectLogicNode* pProjectNode) {
|
SProjectLogicNode* pProjectNode) {
|
||||||
SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pProjectNode->node.pChildren, 0);
|
SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pProjectNode->node.pChildren, 0);
|
||||||
|
@ -2885,14 +2901,17 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan*
|
||||||
pChild->pTargets = pNewChildTargets;
|
pChild->pTargets = pNewChildTargets;
|
||||||
} else {
|
} else {
|
||||||
nodesDestroyList(pNewChildTargets);
|
nodesDestroyList(pNewChildTargets);
|
||||||
|
OPTIMIZE_FLAG_SET_MASK(pProjectNode->node.optimizedFlag, OPTIMIZE_FLAG_ELIMINATE_PROJ);
|
||||||
|
pCxt->optimized = true;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
RewriteTableAliasCxt cxt = {.newTableAlias = pProjectNode->stmtName, .rewriteColName = false};
|
||||||
SScanLogicNode* pScan = (SScanLogicNode*)pChild;
|
SScanLogicNode* pScan = (SScanLogicNode*)pChild;
|
||||||
nodesWalkExprs(pScan->pScanCols, eliminateProjOptRewriteScanTableAlias, pProjectNode->stmtName);
|
nodesWalkExprs(pScan->pScanCols, eliminateProjOptRewriteScanTableAlias, &cxt);
|
||||||
nodesWalkExprs(pScan->pScanPseudoCols, eliminateProjOptRewriteScanTableAlias, pProjectNode->stmtName);
|
nodesWalkExprs(pScan->pScanPseudoCols, eliminateProjOptRewriteScanTableAlias, &cxt);
|
||||||
nodesWalkExpr(pScan->node.pConditions, eliminateProjOptRewriteScanTableAlias, pProjectNode->stmtName);
|
nodesWalkExpr(pScan->node.pConditions, eliminateProjOptRewriteScanTableAlias, &cxt);
|
||||||
nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, pProjectNode->stmtName);
|
nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, &cxt);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = replaceLogicNode(pLogicSubplan, (SLogicNode*)pProjectNode, pChild);
|
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 optr = 0;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
bool empty = false, all = false;
|
bool empty = false, all = false;
|
||||||
|
uint32_t emptyGroups = 0;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < info->groupNum; ++i) {
|
for (uint32_t i = 0; i < info->groupNum; ++i) {
|
||||||
SFilterGroup *group = &info->groups[i];
|
SFilterGroup *group = &info->groups[i];
|
||||||
|
@ -3922,6 +3923,7 @@ int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStri
|
||||||
optr = LOGIC_COND_TYPE_OR;
|
optr = LOGIC_COND_TYPE_OR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
empty = false;
|
||||||
for (uint32_t u = 0; u < group->unitNum; ++u) {
|
for (uint32_t u = 0; u < group->unitNum; ++u) {
|
||||||
uint32_t uidx = group->unitIdxs[u];
|
uint32_t uidx = group->unitIdxs[u];
|
||||||
SFilterUnit *unit = &info->units[uidx];
|
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);
|
uint8_t raOptr = FILTER_UNIT_OPTR(unit);
|
||||||
|
|
||||||
filterAddRangeOptr(cur, raOptr, LOGIC_COND_TYPE_AND, &empty, NULL);
|
filterAddRangeOptr(cur, raOptr, LOGIC_COND_TYPE_AND, &empty, NULL);
|
||||||
FLT_CHK_JMP(empty);
|
if (empty) {
|
||||||
|
emptyGroups++;
|
||||||
|
}
|
||||||
|
|
||||||
if (FILTER_NO_MERGE_OPTR(raOptr)) {
|
if (FILTER_NO_MERGE_OPTR(raOptr)) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -3938,6 +3942,10 @@ int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStri
|
||||||
filterAddUnitRange(info, unit, cur, optr);
|
filterAddUnitRange(info, unit, cur, optr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (empty) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (cur->notnull) {
|
if (cur->notnull) {
|
||||||
prev->notnull = true;
|
prev->notnull = true;
|
||||||
break;
|
break;
|
||||||
|
@ -3952,6 +3960,8 @@ int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStri
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FLT_CHK_JMP(emptyGroups == info->groupNum);
|
||||||
|
|
||||||
if (prev->notnull) {
|
if (prev->notnull) {
|
||||||
*win = TSWINDOW_INITIALIZER;
|
*win = TSWINDOW_INITIALIZER;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue