fix project list rewrite with keeping projidxs

This commit is contained in:
wangjiaming0909 2024-08-28 19:33:15 +08:00
parent 9713094bb2
commit 6adb8edb93
7 changed files with 29 additions and 10 deletions

View File

@ -93,6 +93,7 @@ typedef struct SColumnNode {
bool tableHasPk;
bool isPk;
int32_t projRefIdx;
int32_t resIdx;
} SColumnNode;
typedef struct SColumnRefNode {
@ -450,6 +451,7 @@ typedef struct SSelectStmt {
bool groupSort;
bool tagScan;
bool joinContains;
bool expandStar;
} SSelectStmt;
typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType;

View File

@ -126,6 +126,7 @@ static int32_t columnNodeCopy(const SColumnNode* pSrc, SColumnNode* pDst) {
COPY_SCALAR_FIELD(isPk);
COPY_SCALAR_FIELD(numOfPKs);
COPY_SCALAR_FIELD(projRefIdx);
COPY_SCALAR_FIELD(resIdx);
return TSDB_CODE_SUCCESS;
}

View File

@ -2266,6 +2266,7 @@ static EDealRes doCollect(SCollectColumnsCxt* pCxt, SColumnNode* pCol, SNode* pN
SNode* pNew = NULL;
pCxt->errCode = nodesCloneNode(pNode, &pNew);
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
//((SColumnNode*)pNew)->projRefIdx = pCol->node.projIdx;
pCxt->errCode = nodesListStrictAppend(pCxt->pCols, pNew);
}
}

View File

@ -1270,7 +1270,7 @@ static void setColumnPrimTs(STranslateContext* pCxt, SColumnNode* pCol, const ST
}
}
static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* pTable, bool igTags, SNodeList* pList) {
static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* pTable, bool igTags, SNodeList* pList, bool skipProjRef) {
int32_t code = 0;
if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
const STableMeta* pMeta = ((SRealTableNode*)pTable)->pMeta;
@ -1306,7 +1306,7 @@ static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* p
code = setColumnInfoByExpr(pTempTable, (SExprNode*)pNode, (SColumnNode**)&pCell->pNode);
}
if (TSDB_CODE_SUCCESS == code) {
pCol->projRefIdx = ((SExprNode*)pNode)->projIdx;
if (!skipProjRef) pCol->projRefIdx = ((SExprNode*)pNode)->projIdx; // only set proj ref when select * from (select ...)
} else {
break;
}
@ -4773,7 +4773,7 @@ static int32_t createAllColumns(STranslateContext* pCxt, bool igTags, SNodeList*
size_t nums = taosArrayGetSize(pTables);
for (size_t i = 0; i < nums; ++i) {
STableNode* pTable = taosArrayGetP(pTables, i);
int32_t code = createColumnsByTable(pCxt, pTable, igTags, *pCols);
int32_t code = createColumnsByTable(pCxt, pTable, igTags, *pCols, nums > 1);
if (TSDB_CODE_SUCCESS != code) {
return code;
}
@ -4836,7 +4836,7 @@ static int32_t createTableAllCols(STranslateContext* pCxt, SColumnNode* pCol, bo
}
}
if (TSDB_CODE_SUCCESS == code) {
code = createColumnsByTable(pCxt, pTable, igTags, *pOutput);
code = createColumnsByTable(pCxt, pTable, igTags, *pOutput, false);
}
return code;
}

View File

@ -122,6 +122,7 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) {
strcpy(pCol->node.aliasName, pToBeRewrittenExpr->aliasName);
strcpy(pCol->node.userAlias, ((SExprNode*)pExpr)->userAlias);
strcpy(pCol->colName, ((SExprNode*)pExpr)->aliasName);
pCol->node.projIdx = ((SExprNode*)(*pNode))->projIdx;
if (QUERY_NODE_FUNCTION == nodeType(pExpr)) {
setColumnInfo((SFunctionNode*)pExpr, pCol, pCxt->isPartitionBy);
}
@ -1397,7 +1398,7 @@ static int32_t createColumnByProjections(SLogicPlanContext* pCxt, const char* pS
nodesDestroyList(pList);
return code;
}
pCol->projRefIdx = ((SExprNode*)pNode)->projIdx;
pCol->resIdx = ((SExprNode*)pNode)->projIdx;
}
*pCols = pList;

View File

@ -3475,6 +3475,20 @@ static EDealRes eliminateProjOptRewriteScanTableAlias(SNode* pNode, void* pConte
}
static void eliminateProjPushdownProjIdx(SNodeList* pParentProjects, SNodeList* pChildTargets) {
SNode* pChildTarget = NULL, *pParentProject = NULL;
FOREACH(pChildTarget, pChildTargets) {
SColumnNode* pTargetCol = (SColumnNode*)pChildTarget;
FOREACH(pParentProject, pParentProjects) {
SExprNode* pProject = (SExprNode*)pParentProject;
if (0 == strcmp(pTargetCol->colName, pProject->aliasName)) {
pTargetCol->resIdx = pProject->projIdx;
break;
}
}
}
}
static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan,
SProjectLogicNode* pProjectNode) {
SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pProjectNode->node.pChildren, 0);
@ -3546,6 +3560,7 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan*
nodesWalkExprs(pScan->pScanPseudoCols, eliminateProjOptRewriteScanTableAlias, &cxt);
nodesWalkExpr(pScan->node.pConditions, eliminateProjOptRewriteScanTableAlias, &cxt);
nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, &cxt);
eliminateProjPushdownProjIdx(pProjectNode->pProjections, pChild->pTargets);
}
if (TSDB_CODE_SUCCESS == code) {

View File

@ -166,7 +166,6 @@ static int32_t createTarget(SNode* pNode, int16_t dataBlockId, int16_t slotId, S
}
static int32_t putSlotToHashImpl(int16_t dataBlockId, int16_t slotId, const char* pName, int32_t len, SHashObj* pHash) {
qInfo("wjm put slot into hash: %p, name: %s, slotId: %d", pHash, pName, slotId);
SSlotIndex* pIndex = taosHashGet(pHash, pName, len);
if (NULL != pIndex) {
SSlotIdInfo info = {.slotId = slotId, .set = false};
@ -228,11 +227,11 @@ static int32_t buildDataBlockSlots(SPhysiPlanContext* pCxt, SNodeList* pList, SD
code = putSlotToHash(name, len, pDataBlockDesc->dataBlockId, slotId, pNode, pHash);
}
if (TSDB_CODE_SUCCESS == code) {
if (nodeType(pNode) == QUERY_NODE_COLUMN && ((SColumnNode*)pNode)->projRefIdx > 0) {
sprintf(name + strlen(name), "%d", ((SColumnNode*)pNode)->projRefIdx);
if (nodeType(pNode) == QUERY_NODE_COLUMN && ((SColumnNode*)pNode)->resIdx > 0) {
sprintf(name + strlen(name), "%d", ((SColumnNode*)pNode)->resIdx);
qInfo("wjm append slot name: %s, slotId: %d, aliasName: %s", name, slotId, ((SExprNode*)pNode)->aliasName);
code = putSlotToHash(name, strlen(name), pDataBlockDesc->dataBlockId, slotId, pNode, pHash);
}
qInfo("wjm append slot name: %s, slotId: %d, aliasName: %s", name, slotId, ((SExprNode*)pNode)->aliasName);
code = putSlotToHash(name, strlen(name), pDataBlockDesc->dataBlockId, slotId, pNode, pHash);
}
taosMemoryFree(name);
if (TSDB_CODE_SUCCESS == code) {