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 tableHasPk;
|
||||||
bool isPk;
|
bool isPk;
|
||||||
int32_t projRefIdx;
|
int32_t projRefIdx;
|
||||||
|
int32_t resIdx;
|
||||||
} SColumnNode;
|
} SColumnNode;
|
||||||
|
|
||||||
typedef struct SColumnRefNode {
|
typedef struct SColumnRefNode {
|
||||||
|
@ -450,6 +451,7 @@ typedef struct SSelectStmt {
|
||||||
bool groupSort;
|
bool groupSort;
|
||||||
bool tagScan;
|
bool tagScan;
|
||||||
bool joinContains;
|
bool joinContains;
|
||||||
|
bool expandStar;
|
||||||
} SSelectStmt;
|
} SSelectStmt;
|
||||||
|
|
||||||
typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType;
|
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(isPk);
|
||||||
COPY_SCALAR_FIELD(numOfPKs);
|
COPY_SCALAR_FIELD(numOfPKs);
|
||||||
COPY_SCALAR_FIELD(projRefIdx);
|
COPY_SCALAR_FIELD(projRefIdx);
|
||||||
|
COPY_SCALAR_FIELD(resIdx);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2266,6 +2266,7 @@ static EDealRes doCollect(SCollectColumnsCxt* pCxt, SColumnNode* pCol, SNode* pN
|
||||||
SNode* pNew = NULL;
|
SNode* pNew = NULL;
|
||||||
pCxt->errCode = nodesCloneNode(pNode, &pNew);
|
pCxt->errCode = nodesCloneNode(pNode, &pNew);
|
||||||
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
|
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
|
||||||
|
//((SColumnNode*)pNew)->projRefIdx = pCol->node.projIdx;
|
||||||
pCxt->errCode = nodesListStrictAppend(pCxt->pCols, pNew);
|
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;
|
int32_t code = 0;
|
||||||
if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
if (QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
||||||
const STableMeta* pMeta = ((SRealTableNode*)pTable)->pMeta;
|
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);
|
code = setColumnInfoByExpr(pTempTable, (SExprNode*)pNode, (SColumnNode**)&pCell->pNode);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
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 {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4773,7 +4773,7 @@ static int32_t createAllColumns(STranslateContext* pCxt, bool igTags, SNodeList*
|
||||||
size_t nums = taosArrayGetSize(pTables);
|
size_t nums = taosArrayGetSize(pTables);
|
||||||
for (size_t i = 0; i < nums; ++i) {
|
for (size_t i = 0; i < nums; ++i) {
|
||||||
STableNode* pTable = taosArrayGetP(pTables, 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) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -4836,7 +4836,7 @@ static int32_t createTableAllCols(STranslateContext* pCxt, SColumnNode* pCol, bo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = createColumnsByTable(pCxt, pTable, igTags, *pOutput);
|
code = createColumnsByTable(pCxt, pTable, igTags, *pOutput, false);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,6 +122,7 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) {
|
||||||
strcpy(pCol->node.aliasName, pToBeRewrittenExpr->aliasName);
|
strcpy(pCol->node.aliasName, pToBeRewrittenExpr->aliasName);
|
||||||
strcpy(pCol->node.userAlias, ((SExprNode*)pExpr)->userAlias);
|
strcpy(pCol->node.userAlias, ((SExprNode*)pExpr)->userAlias);
|
||||||
strcpy(pCol->colName, ((SExprNode*)pExpr)->aliasName);
|
strcpy(pCol->colName, ((SExprNode*)pExpr)->aliasName);
|
||||||
|
pCol->node.projIdx = ((SExprNode*)(*pNode))->projIdx;
|
||||||
if (QUERY_NODE_FUNCTION == nodeType(pExpr)) {
|
if (QUERY_NODE_FUNCTION == nodeType(pExpr)) {
|
||||||
setColumnInfo((SFunctionNode*)pExpr, pCol, pCxt->isPartitionBy);
|
setColumnInfo((SFunctionNode*)pExpr, pCol, pCxt->isPartitionBy);
|
||||||
}
|
}
|
||||||
|
@ -1397,7 +1398,7 @@ static int32_t createColumnByProjections(SLogicPlanContext* pCxt, const char* pS
|
||||||
nodesDestroyList(pList);
|
nodesDestroyList(pList);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
pCol->projRefIdx = ((SExprNode*)pNode)->projIdx;
|
pCol->resIdx = ((SExprNode*)pNode)->projIdx;
|
||||||
}
|
}
|
||||||
|
|
||||||
*pCols = pList;
|
*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,
|
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);
|
||||||
|
@ -3546,6 +3560,7 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan*
|
||||||
nodesWalkExprs(pScan->pScanPseudoCols, eliminateProjOptRewriteScanTableAlias, &cxt);
|
nodesWalkExprs(pScan->pScanPseudoCols, eliminateProjOptRewriteScanTableAlias, &cxt);
|
||||||
nodesWalkExpr(pScan->node.pConditions, eliminateProjOptRewriteScanTableAlias, &cxt);
|
nodesWalkExpr(pScan->node.pConditions, eliminateProjOptRewriteScanTableAlias, &cxt);
|
||||||
nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, &cxt);
|
nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, &cxt);
|
||||||
|
eliminateProjPushdownProjIdx(pProjectNode->pProjections, pChild->pTargets);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
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) {
|
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);
|
SSlotIndex* pIndex = taosHashGet(pHash, pName, len);
|
||||||
if (NULL != pIndex) {
|
if (NULL != pIndex) {
|
||||||
SSlotIdInfo info = {.slotId = slotId, .set = false};
|
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);
|
code = putSlotToHash(name, len, pDataBlockDesc->dataBlockId, slotId, pNode, pHash);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
if (nodeType(pNode) == QUERY_NODE_COLUMN && ((SColumnNode*)pNode)->projRefIdx > 0) {
|
if (nodeType(pNode) == QUERY_NODE_COLUMN && ((SColumnNode*)pNode)->resIdx > 0) {
|
||||||
sprintf(name + strlen(name), "%d", ((SColumnNode*)pNode)->projRefIdx);
|
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);
|
taosMemoryFree(name);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
|
Loading…
Reference in New Issue