|
|
|
@ -199,6 +199,31 @@ int32_t qExplainGenerateResChildren(SPhysiNode *pNode, SExplainGroup *group, SNo
|
|
|
|
|
pPhysiChildren = mergePhysiNode->scan.node.pChildren;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN: {
|
|
|
|
|
SBlockDistScanPhysiNode *distPhysiNode = (SBlockDistScanPhysiNode *)pNode;
|
|
|
|
|
pPhysiChildren = distPhysiNode->node.pChildren;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: {
|
|
|
|
|
SLastRowScanPhysiNode *lastRowPhysiNode = (SLastRowScanPhysiNode *)pNode;
|
|
|
|
|
pPhysiChildren = lastRowPhysiNode->node.pChildren;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
|
|
|
|
|
SGroupSortPhysiNode *groupSortPhysiNode = (SGroupSortPhysiNode *)pNode;
|
|
|
|
|
pPhysiChildren = groupSortPhysiNode->node.pChildren;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL: {
|
|
|
|
|
SMergeIntervalPhysiNode *mergeIntPhysiNode = (SMergeIntervalPhysiNode *)pNode;
|
|
|
|
|
pPhysiChildren = mergeIntPhysiNode->window.node.pChildren;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC: {
|
|
|
|
|
SInterpFuncPhysiNode *interpPhysiNode = (SInterpFuncPhysiNode *)pNode;
|
|
|
|
|
pPhysiChildren = interpPhysiNode->node.pChildren;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
qError("not supported physical node type %d", pNode->type);
|
|
|
|
|
QRY_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
|
|
|
|
@ -378,6 +403,8 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
|
|
|
|
|
}
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pTagScanNode->pScanCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTagScanNode->pScanPseudoCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->node.pOutputDataBlockDesc->totalRowSize);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
@ -415,6 +442,8 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
|
|
|
|
|
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pTblScanNode->scan.pScanCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTblScanNode->scan.pScanPseudoCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_TABLE_SCAN_FORMAT, pTblScanNode->scanSeq[0], pTblScanNode->scanSeq[1]);
|
|
|
|
@ -516,6 +545,8 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
|
|
|
|
|
}
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pSTblScanNode->scan.pScanCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pSTblScanNode->scan.pScanPseudoCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
|
|
|
|
@ -1131,6 +1162,254 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN: {
|
|
|
|
|
SBlockDistScanPhysiNode *pDistScanNode = (SBlockDistScanPhysiNode *)pNode;
|
|
|
|
|
EXPLAIN_ROW_NEW(level, EXPLAIN_DISTBLK_SCAN_FORMAT, pDistScanNode->tableName.tname);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
|
|
|
|
|
if (pResNode->pExecInfo) {
|
|
|
|
|
QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDistScanNode->pScanCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pDistScanNode->pScanPseudoCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->totalRowSize);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
|
|
|
|
|
|
|
|
|
|
if (verbose) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
|
|
|
|
|
nodesGetOutputNumFromSlotList(pDistScanNode->node.pOutputDataBlockDesc->pSlots));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->outputRowSize);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
|
|
|
|
|
if (pDistScanNode->node.pConditions) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
|
|
|
|
|
QRY_ERR_RET(nodesNodeToSQL(pDistScanNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
|
|
|
|
|
TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: {
|
|
|
|
|
SLastRowScanPhysiNode *pLastRowNode = (SLastRowScanPhysiNode *)pNode;
|
|
|
|
|
EXPLAIN_ROW_NEW(level, EXPLAIN_LASTROW_SCAN_FORMAT, pLastRowNode->tableName.tname);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
|
|
|
|
|
if (pResNode->pExecInfo) {
|
|
|
|
|
QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pLastRowNode->pScanCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->pScanPseudoCols->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->node.pOutputDataBlockDesc->totalRowSize);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
|
|
|
|
|
|
|
|
|
|
if (verbose) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
|
|
|
|
|
nodesGetOutputNumFromSlotList(pLastRowNode->node.pOutputDataBlockDesc->pSlots));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->node.pOutputDataBlockDesc->outputRowSize);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
|
|
|
|
|
if (pLastRowNode->node.pConditions) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
|
|
|
|
|
QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
|
|
|
|
|
TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
|
|
|
|
|
SGroupSortPhysiNode *pSortNode = (SGroupSortPhysiNode *)pNode;
|
|
|
|
|
EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_SORT_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
|
|
|
|
|
if (pResNode->pExecInfo) {
|
|
|
|
|
QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
|
|
|
|
|
|
|
|
|
|
if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
|
|
|
|
|
// sort key
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
|
|
|
|
|
if (pResNode->pExecInfo) {
|
|
|
|
|
for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
|
|
|
|
|
SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
|
|
|
|
|
EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
|
|
|
|
|
|
|
|
|
|
// sort method
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
|
|
|
|
|
|
|
|
|
|
int32_t nodeNum = taosArrayGetSize(pResNode->pExecInfo);
|
|
|
|
|
SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
|
|
|
|
|
SSortExecInfo *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
|
|
|
|
|
EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
|
|
|
|
|
if (pExecInfo->sortBuffer > 1024 * 1024) {
|
|
|
|
|
EXPLAIN_ROW_APPEND(" Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
|
|
|
|
|
} else if (pExecInfo->sortBuffer > 1024) {
|
|
|
|
|
EXPLAIN_ROW_APPEND(" Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
|
|
|
|
|
} else {
|
|
|
|
|
EXPLAIN_ROW_APPEND(" Buffers:%d b", pExecInfo->sortBuffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EXPLAIN_ROW_APPEND(" loops:%d", pExecInfo->loops);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (verbose) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
|
|
|
|
|
nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
|
|
|
|
|
if (pSortNode->node.pConditions) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
|
|
|
|
|
QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
|
|
|
|
|
TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL: {
|
|
|
|
|
SMergeIntervalPhysiNode *pIntNode = (SMergeIntervalPhysiNode *)pNode;
|
|
|
|
|
EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
|
|
|
|
|
if (pResNode->pExecInfo) {
|
|
|
|
|
QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
|
|
|
|
|
|
|
|
|
|
if (verbose) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
|
|
|
|
|
nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
uint8_t precision = getIntervalPrecision(pIntNode);
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
|
|
|
|
|
INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision),
|
|
|
|
|
pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
|
|
|
|
|
INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision),
|
|
|
|
|
pIntNode->slidingUnit);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
|
|
|
|
|
if (pIntNode->window.node.pConditions) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
|
|
|
|
|
QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
|
|
|
|
|
TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC: {
|
|
|
|
|
SInterpFuncPhysiNode *pInterpNode = (SInterpFuncPhysiNode *)pNode;
|
|
|
|
|
EXPLAIN_ROW_NEW(level, EXPLAIN_AGG_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
|
|
|
|
|
if (pResNode->pExecInfo) {
|
|
|
|
|
QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
if (pInterpNode->pFuncs) {
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pInterpNode->pFuncs->length);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pInterpNode->fillMode));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
|
|
|
|
|
|
|
|
|
|
if (verbose) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
|
|
|
|
|
nodesGetOutputNumFromSlotList(pInterpNode->node.pOutputDataBlockDesc->pSlots));
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pInterpNode->node.pOutputDataBlockDesc->outputRowSize);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
if (pInterpNode->pFillValues) {
|
|
|
|
|
SNodeListNode *pValues = (SNodeListNode *)pInterpNode->pFillValues;
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
|
|
|
|
|
SNode *tNode = NULL;
|
|
|
|
|
int32_t i = 0;
|
|
|
|
|
FOREACH(tNode, pValues->pNodeList) {
|
|
|
|
|
if (i) {
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
|
|
|
|
|
}
|
|
|
|
|
SValueNode *tValue = (SValueNode *)tNode;
|
|
|
|
|
char *value = nodesGetStrValueFromNode(tValue);
|
|
|
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
|
|
|
|
|
taosMemoryFree(value);
|
|
|
|
|
++i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_INTERVAL_VALUE_FORMAT, pInterpNode->interval, pInterpNode->intervalUnit);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pInterpNode->timeRange.skey, pInterpNode->timeRange.ekey);
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
|
|
|
|
|
if (pInterpNode->node.pConditions) {
|
|
|
|
|
EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
|
|
|
|
|
QRY_ERR_RET(nodesNodeToSQL(pInterpNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
|
|
|
|
|
TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
|
|
|
|
|
EXPLAIN_ROW_END();
|
|
|
|
|
QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
qError("not supported physical node type %d", pNode->type);
|
|
|
|
|
return TSDB_CODE_QRY_APP_ERROR;
|
|
|
|
|