fix: count(*) rewrite issue
This commit is contained in:
parent
74cef4ac6b
commit
4208557d6d
|
@ -1906,6 +1906,30 @@ static int32_t rewriteCountStarAsCount1(STranslateContext* pCxt, SFunctionNode*
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STableNode* getJoinProbeTable(STranslateContext* pCxt) {
|
||||||
|
if (QUERY_NODE_SELECT_STMT != nodeType(pCxt->pCurrStmt)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SSelectStmt* pSelect = (SSelectStmt*)pCxt->pCurrStmt;
|
||||||
|
if (NULL == pSelect->pFromTable || QUERY_NODE_JOIN_TABLE != nodeType(pSelect->pFromTable)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SJoinTableNode* pJoin = (SJoinTableNode*)pSelect->pFromTable;
|
||||||
|
switch (pJoin->joinType) {
|
||||||
|
case JOIN_TYPE_INNER:
|
||||||
|
case JOIN_TYPE_LEFT:
|
||||||
|
return (STableNode*)pJoin->pLeft;
|
||||||
|
case JOIN_TYPE_RIGHT:
|
||||||
|
return (STableNode*)pJoin->pRight;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// count(*) is rewritten as count(ts) for scannning optimization
|
// count(*) is rewritten as count(ts) for scannning optimization
|
||||||
static int32_t rewriteCountStar(STranslateContext* pCxt, SFunctionNode* pCount) {
|
static int32_t rewriteCountStar(STranslateContext* pCxt, SFunctionNode* pCount) {
|
||||||
SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pCount->pParameterList, 0);
|
SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pCount->pParameterList, 0);
|
||||||
|
@ -1914,17 +1938,19 @@ static int32_t rewriteCountStar(STranslateContext* pCxt, SFunctionNode* pCount)
|
||||||
size_t nums = taosArrayGetSize(pTables);
|
size_t nums = taosArrayGetSize(pTables);
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
if ('\0' == pCol->tableAlias[0] && nums > 1) {
|
if ('\0' == pCol->tableAlias[0] && nums > 1) {
|
||||||
code = rewriteCountStarAsCount1(pCxt, pCount);
|
pTable = getJoinProbeTable(pCxt);
|
||||||
} else {
|
} else {
|
||||||
code = findTable(pCxt, ('\0' == pCol->tableAlias[0] ? NULL : pCol->tableAlias), &pTable);
|
code = findTable(pCxt, ('\0' == pCol->tableAlias[0] ? NULL : pCol->tableAlias), &pTable);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
}
|
||||||
if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
|
||||||
setColumnInfoBySchema((SRealTableNode*)pTable, ((SRealTableNode*)pTable)->pMeta->schema, -1, pCol);
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
} else {
|
if (NULL != pTable && QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
||||||
code = rewriteCountStarAsCount1(pCxt, pCount);
|
setColumnInfoBySchema((SRealTableNode*)pTable, ((SRealTableNode*)pTable)->pMeta->schema, -1, pCol);
|
||||||
}
|
} else {
|
||||||
|
code = rewriteCountStarAsCount1(pCxt, pCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4469,7 +4469,9 @@ static int32_t stbJoinOptCreateTableScanNodes(SLogicNode* pJoin, SNodeList** ppL
|
||||||
//}
|
//}
|
||||||
|
|
||||||
nodesDestroyNode(pScan->pTagCond);
|
nodesDestroyNode(pScan->pTagCond);
|
||||||
|
pScan->pTagCond = NULL;
|
||||||
nodesDestroyNode(pScan->pTagIndexCond);
|
nodesDestroyNode(pScan->pTagIndexCond);
|
||||||
|
pScan->pTagIndexCond = NULL;
|
||||||
|
|
||||||
pScan->node.dynamicOp = true;
|
pScan->node.dynamicOp = true;
|
||||||
*(srcScan + i++) = pScan->pVgroupList->numOfVgroups <= 1;
|
*(srcScan + i++) = pScan->pVgroupList->numOfVgroups <= 1;
|
||||||
|
|
|
@ -238,3 +238,25 @@ endi
|
||||||
if $data61 != @23-11-17 16:29:04.000@ then
|
if $data61 != @23-11-17 16:29:04.000@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
sql select count(*) from tba1 a full join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select count(a.*) from tba1 a full join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select count(b.*) from tba1 a full join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
|
@ -249,3 +249,25 @@ endi
|
||||||
if $data31 != NULL then
|
if $data31 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
sql select count(*) from tba1 a left join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select count(a.*) from tba1 a left join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select count(b.*) from tba1 a left join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
|
@ -158,3 +158,24 @@ if $data31 != 4 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
sql select count(*) from tba1 a right join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select count(a.*) from tba1 a right join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select count(b.*) from tba1 a right join tba2 b on a.ts=b.ts;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
Loading…
Reference in New Issue