adj second param for last_row
This commit is contained in:
parent
be2c16723d
commit
b723e05535
|
@ -4051,10 +4051,10 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic
|
||||||
SNode* pNode = NULL;
|
SNode* pNode = NULL;
|
||||||
SColumnNode* pPKTsCol = NULL;
|
SColumnNode* pPKTsCol = NULL;
|
||||||
SColumnNode* pNonPKCol = NULL;
|
SColumnNode* pNonPKCol = NULL;
|
||||||
SScanLogicNode* pScan = (SScanLogicNode*)nodesListGetNode(pAgg->node.pChildren, 0);
|
SScanLogicNode* pScan = (SScanLogicNode*)nodesListGetNode(pAgg->node.pChildren, 0);
|
||||||
pScan->scanType = SCAN_TYPE_LAST_ROW;
|
pScan->scanType = SCAN_TYPE_LAST_ROW;
|
||||||
pScan->igLastNull = pAgg->hasLast ? true : false;
|
pScan->igLastNull = pAgg->hasLast ? true : false;
|
||||||
SArray* isDuplicateCol = taosArrayInit(pScan->pScanCols->length, sizeof(bool));
|
SArray* isDuplicateCol = taosArrayInit(pScan->pScanCols->length, sizeof(bool));
|
||||||
SNodeList* pLastRowCols = NULL;
|
SNodeList* pLastRowCols = NULL;
|
||||||
bool adjLastRowTsColName = false;
|
bool adjLastRowTsColName = false;
|
||||||
char tsColName[TSDB_COL_NAME_LEN] = {0};
|
char tsColName[TSDB_COL_NAME_LEN] = {0};
|
||||||
|
@ -4062,109 +4062,114 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic
|
||||||
FOREACH(pNode, pAgg->pAggFuncs) {
|
FOREACH(pNode, pAgg->pAggFuncs) {
|
||||||
SFunctionNode* pFunc = (SFunctionNode*)pNode;
|
SFunctionNode* pFunc = (SFunctionNode*)pNode;
|
||||||
int32_t funcType = pFunc->funcType;
|
int32_t funcType = pFunc->funcType;
|
||||||
SNode* pParamNode = nodesListGetNode(pFunc->pParameterList, 0);
|
SNode* pParamNode = NULL;
|
||||||
if (FUNCTION_TYPE_LAST_ROW == funcType || FUNCTION_TYPE_LAST == funcType) {
|
if (FUNCTION_TYPE_LAST == funcType) {
|
||||||
int32_t len = snprintf(pFunc->functionName, sizeof(pFunc->functionName),
|
nodesListErase(pFunc->pParameterList, nodesListGetCell(pFunc->pParameterList, 1));
|
||||||
FUNCTION_TYPE_LAST_ROW == funcType ? "_cache_last_row" : "_cache_last");
|
nodesWalkExpr(nodesListGetNode(pFunc->pParameterList, 0), lastRowScanOptSetColDataType, &cxt);
|
||||||
pFunc->functionName[len] = '\0';
|
}
|
||||||
int32_t code = fmGetFuncInfo(pFunc, NULL, 0);
|
FOREACH(pParamNode, pFunc->pParameterList) {
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (FUNCTION_TYPE_LAST_ROW == funcType || FUNCTION_TYPE_LAST == funcType) {
|
||||||
nodesClearList(cxt.pLastCols);
|
int32_t len = snprintf(pFunc->functionName, sizeof(pFunc->functionName),
|
||||||
return code;
|
FUNCTION_TYPE_LAST_ROW == funcType ? "_cache_last_row" : "_cache_last");
|
||||||
}
|
pFunc->functionName[len] = '\0';
|
||||||
cxt.funcType = pFunc->funcType;
|
int32_t code = fmGetFuncInfo(pFunc, NULL, 0);
|
||||||
cxt.pkBytes = (pFunc->hasPk) ? pFunc->pkBytes : 0;
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
// add duplicate cols which be removed for both last_row, last
|
nodesClearList(cxt.pLastCols);
|
||||||
if (pAgg->hasLast && pAgg->hasLastRow) {
|
return code;
|
||||||
if (QUERY_NODE_COLUMN == nodeType(pParamNode)) {
|
}
|
||||||
SNode* pColNode = NULL;
|
cxt.funcType = pFunc->funcType;
|
||||||
int i = 0;
|
cxt.pkBytes = (pFunc->hasPk) ? pFunc->pkBytes : 0;
|
||||||
FOREACH(pColNode, pScan->pScanCols) {
|
// add duplicate cols which be removed for both last_row, last
|
||||||
bool isDup = false;
|
if (pAgg->hasLast && pAgg->hasLastRow) {
|
||||||
bool* isDuplicate = taosArrayGet(isDuplicateCol, i);
|
if (QUERY_NODE_COLUMN == nodeType(pParamNode)) {
|
||||||
if (NULL == isDuplicate) {
|
SNode* pColNode = NULL;
|
||||||
taosArrayInsert(isDuplicateCol, i, &isDup);
|
int i = 0;
|
||||||
isDuplicate = taosArrayGet(isDuplicateCol, i);
|
FOREACH(pColNode, pScan->pScanCols) {
|
||||||
|
bool isDup = false;
|
||||||
|
bool* isDuplicate = taosArrayGet(isDuplicateCol, i);
|
||||||
|
if (NULL == isDuplicate) {
|
||||||
|
taosArrayInsert(isDuplicateCol, i, &isDup);
|
||||||
|
isDuplicate = taosArrayGet(isDuplicateCol, i);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
if (nodesEqualNode(pParamNode, pColNode)) {
|
||||||
|
if (*isDuplicate) {
|
||||||
|
if (0 == strncmp(((SColumnNode*)pColNode)->colName, "#dup_col.", 9)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SNode* newColNode = nodesCloneNode(pColNode);
|
||||||
|
sprintf(((SColumnNode*)newColNode)->colName, "#dup_col.%p", newColNode);
|
||||||
|
sprintf(((SColumnNode*)pParamNode)->colName, "#dup_col.%p", newColNode);
|
||||||
|
if (FUNCTION_TYPE_LAST_ROW == funcType &&
|
||||||
|
((SColumnNode*)pParamNode)->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
|
if (!adjLastRowTsColName) {
|
||||||
|
adjLastRowTsColName = true;
|
||||||
|
strncpy(tsColName, ((SColumnNode*)pParamNode)->colName, TSDB_COL_NAME_LEN);
|
||||||
|
} else {
|
||||||
|
strncpy(((SColumnNode*)pParamNode)->colName, tsColName, TSDB_COL_NAME_LEN);
|
||||||
|
nodesDestroyNode(newColNode);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nodesListAppend(pScan->pScanCols, newColNode);
|
||||||
|
isDup = true;
|
||||||
|
taosArrayInsert(isDuplicateCol, pScan->pScanCols->length, &isDup);
|
||||||
|
nodesListAppend(pScan->node.pTargets, nodesCloneNode(newColNode));
|
||||||
|
if (funcType != FUNCTION_TYPE_LAST) {
|
||||||
|
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(newColNode));
|
||||||
|
}
|
||||||
|
|
||||||
|
lastRowScanBuildFuncTypes(pScan, (SColumnNode*)newColNode, pFunc->funcType);
|
||||||
|
} else {
|
||||||
|
isDup = true;
|
||||||
|
*isDuplicate = isDup;
|
||||||
|
if (funcType != FUNCTION_TYPE_LAST && !nodeListNodeEqual(cxt.pLastCols, pColNode)) {
|
||||||
|
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode));
|
||||||
|
}
|
||||||
|
lastRowScanBuildFuncTypes(pScan, (SColumnNode*)pColNode, pFunc->funcType);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}else if (nodeListNodeEqual(pFunc->pParameterList, pColNode)) {
|
||||||
|
if (funcType != FUNCTION_TYPE_LAST && ((SColumnNode*)pColNode)->colId == PRIMARYKEY_TIMESTAMP_COL_ID &&
|
||||||
|
!nodeListNodeEqual(pLastRowCols, pColNode)) {
|
||||||
|
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode));
|
||||||
|
|
||||||
|
lastRowScanBuildFuncTypes(pScan, (SColumnNode*)pColNode, pFunc->funcType);
|
||||||
|
isDup = true;
|
||||||
|
*isDuplicate = isDup;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
i++;
|
FOREACH(pColNode, pScan->pScanPseudoCols) {
|
||||||
if (nodesEqualNode(pParamNode, pColNode)) {
|
if (nodesEqualNode(pParamNode, pColNode)) {
|
||||||
if (*isDuplicate) {
|
|
||||||
if (0 == strncmp(((SColumnNode*)pColNode)->colName, "#dup_col.", 9)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
SNode* newColNode = nodesCloneNode(pColNode);
|
|
||||||
sprintf(((SColumnNode*)newColNode)->colName, "#dup_col.%p", newColNode);
|
|
||||||
sprintf(((SColumnNode*)pParamNode)->colName, "#dup_col.%p", newColNode);
|
|
||||||
|
|
||||||
if (FUNCTION_TYPE_LAST_ROW == funcType && ((SColumnNode*)pParamNode)->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
|
||||||
adjLastRowTsColName = true;
|
|
||||||
strncpy(tsColName, ((SColumnNode*)pParamNode)->colName, TSDB_COL_NAME_LEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
nodesListAppend(pScan->pScanCols, newColNode);
|
|
||||||
isDup = true;
|
|
||||||
taosArrayInsert(isDuplicateCol, pScan->pScanCols->length, &isDup);
|
|
||||||
nodesListAppend(pScan->node.pTargets, nodesCloneNode(newColNode));
|
|
||||||
if (funcType != FUNCTION_TYPE_LAST) {
|
if (funcType != FUNCTION_TYPE_LAST) {
|
||||||
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(newColNode));
|
|
||||||
}
|
|
||||||
|
|
||||||
lastRowScanBuildFuncTypes(pScan, (SColumnNode*)newColNode, pFunc->funcType);
|
|
||||||
} else {
|
|
||||||
isDup = true;
|
|
||||||
*isDuplicate = isDup;
|
|
||||||
if (funcType != FUNCTION_TYPE_LAST && !nodeListNodeEqual(cxt.pLastCols, pColNode)) {
|
|
||||||
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode));
|
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode));
|
||||||
}
|
}
|
||||||
lastRowScanBuildFuncTypes(pScan, (SColumnNode*)pColNode, pFunc->funcType);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
} else if (nodeListNodeEqual(pFunc->pParameterList, pColNode)) {
|
|
||||||
if (funcType != FUNCTION_TYPE_LAST && ((SColumnNode*)pColNode)->colId == PRIMARYKEY_TIMESTAMP_COL_ID &&
|
|
||||||
!nodeListNodeEqual(pLastRowCols, pColNode)) {
|
|
||||||
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode));
|
|
||||||
|
|
||||||
lastRowScanBuildFuncTypes(pScan, (SColumnNode*)pColNode, pFunc->funcType);
|
|
||||||
isDup = true;
|
|
||||||
*isDuplicate = isDup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FOREACH(pColNode, pScan->pScanPseudoCols) {
|
|
||||||
if (nodesEqualNode(pParamNode, pColNode)) {
|
|
||||||
if (funcType != FUNCTION_TYPE_LAST) {
|
|
||||||
nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (FUNCTION_TYPE_LAST == funcType) {
|
if (pFunc->hasPk) {
|
||||||
nodesWalkExpr(nodesListGetNode(pFunc->pParameterList, 0), lastRowScanOptSetColDataType, &cxt);
|
nodesListMakeAppend(&cxt.pOtherCols, nodesListGetNode(pFunc->pParameterList, LIST_LENGTH(pFunc->pParameterList) - 1));
|
||||||
nodesListErase(pFunc->pParameterList, nodesListGetCell(pFunc->pParameterList, 1));
|
}
|
||||||
}
|
} else {
|
||||||
if (pFunc->hasPk) {
|
pNode = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
nodesListMakeAppend(&cxt.pOtherCols, nodesListGetNode(pFunc->pParameterList, LIST_LENGTH(pFunc->pParameterList) - 1));
|
nodesListMakeAppend(&cxt.pOtherCols, pNode);
|
||||||
}
|
|
||||||
if (FUNCTION_TYPE_LAST_ROW == funcType && adjLastRowTsColName) {
|
|
||||||
SNode* pParamNodeTs = nodesListGetNode(pFunc->pParameterList, 1);
|
|
||||||
strncpy(((SColumnNode*)pParamNodeTs)->colName, tsColName, TSDB_COL_NAME_LEN);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pNode = nodesListGetNode(pFunc->pParameterList, 0);
|
|
||||||
nodesListMakeAppend(&cxt.pOtherCols, pNode);
|
|
||||||
|
|
||||||
if (FUNCTION_TYPE_SELECT_VALUE == funcType) {
|
if (FUNCTION_TYPE_SELECT_VALUE == funcType) {
|
||||||
if (nodeType(pNode) == QUERY_NODE_COLUMN) {
|
if (nodeType(pNode) == QUERY_NODE_COLUMN) {
|
||||||
SColumnNode* pCol = (SColumnNode*)pNode;
|
SColumnNode* pCol = (SColumnNode*)pNode;
|
||||||
if (pCol->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
if (pCol->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
pPKTsCol = pCol;
|
pPKTsCol = pCol;
|
||||||
} else {
|
} else {
|
||||||
pNonPKCol = pCol;
|
pNonPKCol = pCol;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
WHERE_NEXT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue