fix project list rewrite with keeping projidxs
This commit is contained in:
parent
9713094bb2
commit
6adb8edb93
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue