• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4946

02 Feb 2026 09:27AM UTC coverage: 66.932% (+0.06%) from 66.87%
#4946

push

travis-ci

web-flow
enh: [6690002267] Optimize virtual table query with plenty of columns. (#34341)

527 of 634 new or added lines in 23 files covered. (83.12%)

413 existing lines in 119 files now uncovered.

205724 of 307364 relevant lines covered (66.93%)

126528878.24 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

78.64
/source/libs/command/src/explain.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
// clang-format off
17
#include "commandInt.h"
18
#include "plannodes.h"
19
#include "query.h"
20
#include "tcommon.h"
21
#include "tdatablock.h"
22
#include "systable.h"
23
#include "functionMgt.h"
24

25
char *gJoinTypeStr[JOIN_TYPE_MAX_VALUE][JOIN_STYPE_MAX_VALUE] = {
26
           /* NONE                OUTER                  SEMI                  ANTI                   ASOF                   WINDOW */
27
/*INNER*/  {"Inner Join",         NULL,                  NULL,                 NULL,                  NULL,                  NULL},
28
/*LEFT*/   {"Left Join",          "Left Join",           "Left Semi Join",     "Left Anti Join",      "Left ASOF Join",      "Left Window Join"},
29
/*RIGHT*/  {"Right Join",         "Right Join",          "Right Semi Join",    "Right Anti Join",     "Right ASOF Join",     "Right Window Join"},
30
/*FULL*/   {"Full Join",          "Full Join",           NULL,                 NULL,                  NULL,                  NULL},
31
};
32

33
static int32_t qExplainGenerateResNode(SSubplan *plan, SPhysiNode *pNode, SExplainGroup *group, SExplainResNode **pResNode);
34
static int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t *level, bool singleChannel);
35

36
char *qExplainGetDynQryCtrlType(EDynQueryType type) {
879,941✔
37
  switch (type) {
879,941✔
38
    case DYN_QTYPE_STB_HASH:
694,561✔
39
      return "STable Join";
694,561✔
40
    case DYN_QTYPE_VTB_SCAN:
55,016✔
41
      return "Virtual Stable Scan";
55,016✔
42
    case DYN_QTYPE_VTB_WINDOW:
23,920✔
43
      return "Virtual Table Window";
23,920✔
44
    case DYN_QTYPE_VTB_AGG:
106,444✔
45
      return "Virtual Table Agg";
106,444✔
46
    default:
×
47
      break;
×
48
  }
49

50
  return "unknown task";
×
51
}
52

53
char* qExplainGetAsofOpStr(int32_t opType) {
41,216✔
54
  switch (opType) {
41,216✔
55
    case OP_TYPE_GREATER_THAN:
1,472✔
56
      return ">";
1,472✔
57
    case OP_TYPE_GREATER_EQUAL:
6,624✔
58
      return ">=";
6,624✔
59
    case OP_TYPE_LOWER_THAN:
×
60
      return "<";
×
61
    case OP_TYPE_LOWER_EQUAL:
6,624✔
62
      return "<=";
6,624✔
63
    case OP_TYPE_EQUAL:
26,496✔
64
      return "=";
26,496✔
65
    default:
×
66
      return "UNKNOWN";
×
67
  }
68
}
69

70
char* qExplainGetTimerangeTargetStr(int32_t target) {
×
71
  static char* targetName[] = {"", "Left", "Right", "Left/Right"};
72
  if (target <= 0 || target > 3) {
×
73
    return "Unknown";
×
74
  }
75

76
  return targetName[target];
×
77
}
78

79
void qExplainFreeResNode(SExplainResNode *resNode) {
369,937,996✔
80
  if (NULL == resNode) {
369,937,996✔
81
    return;
×
82
  }
83

84
  taosArrayDestroy(resNode->pExecInfo);
369,937,996✔
85

86
  SNode *node = NULL;
369,937,996✔
87
  FOREACH(node, resNode->pChildren) { qExplainFreeResNode((SExplainResNode *)node); }
572,517,651✔
88
  nodesClearList(resNode->pChildren);
369,937,996✔
89

90
  taosMemoryFreeClear(resNode);
369,937,996✔
91
}
92

93
void qExplainFreePlanCtx(SExplainPlanCtx* pCtx, bool isAnalyze) {
114,609,384✔
94
  if (isAnalyze && pCtx->groupHash) {
114,609,384✔
95
    void *pIter = taosHashIterate(pCtx->groupHash, NULL);
33,929,524✔
96
    while (pIter) {
84,794,711✔
97
      SExplainGroup *group = (SExplainGroup *)pIter;
50,865,187✔
98
      if (group->nodeExecInfo) {
50,865,187✔
99
        int32_t num = taosArrayGetSize(group->nodeExecInfo);
36,353,142✔
100
        for (int32_t i = 0; i < num; ++i) {
78,126,816✔
101
          SExplainRsp *rsp = taosArrayGet(group->nodeExecInfo, i);
41,773,674✔
102
          tFreeSExplainRsp(rsp);
41,773,674✔
103
        }
104
        taosArrayDestroy(group->nodeExecInfo);
36,353,142✔
105
      }
106

107
      pIter = taosHashIterate(pCtx->groupHash, pIter);
50,865,187✔
108
    }
109
  }
110

111
  taosHashCleanup(pCtx->groupHash);
114,609,384✔
112
}
114,609,384✔
113

114
void qExplainFreeCtx(SExplainCtx *pCtx) {
875,272,703✔
115
  if (NULL == pCtx) {
875,272,703✔
116
    return;
837,354,559✔
117
  }
118

119
  int32_t rowSize = taosArrayGetSize(pCtx->rows);
37,918,144✔
120
  for (int32_t i = 0; i < rowSize; ++i) {
935,617,438✔
121
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
897,695,746✔
122
    taosMemoryFreeClear(row->buf);
897,695,746✔
123
  }
124

125
  qExplainFreePlanCtx(&pCtx->planCtx, EXPLAIN_MODE_ANALYZE == pCtx->mode);
37,921,692✔
126
  if (pCtx->subPlanCtxs) {
37,921,692✔
127
    int32_t subNum = taosArrayGetSize(pCtx->subPlanCtxs);
25,133,172✔
128
    for (int32_t i = 0; i < subNum; ++i) {
101,820,864✔
129
      SExplainPlanCtx *pSub = taosArrayGet(pCtx->subPlanCtxs, i);
76,687,692✔
130
      qExplainFreePlanCtx(pSub, EXPLAIN_MODE_ANALYZE == pCtx->mode);
76,687,692✔
131
    }
132
    taosArrayDestroy(pCtx->subPlanCtxs);
25,133,172✔
133
  }
134

135
  taosArrayDestroy(pCtx->rows);
37,921,692✔
136
  taosMemoryFreeClear(pCtx->tbuf);
37,921,692✔
137
  taosMemoryFree(pCtx);
37,921,692✔
138
}
139

140
static int32_t qExplainInitCtx(SExplainCtx **pCtx, bool verbose, double ratio, EExplainMode mode) {
37,921,692✔
141
  int32_t      code = 0;
37,921,692✔
142
  SExplainCtx *ctx = taosMemoryCalloc(1, sizeof(SExplainCtx));
37,921,692✔
143
  if (NULL == ctx) {
37,921,692✔
144
    qError("calloc SExplainCtx failed");
×
145
    QRY_ERR_JRET(terrno);
×
146
  }
147

148
  SArray *rows = taosArrayInit(10, sizeof(SQueryExplainRowInfo));
37,921,692✔
149
  if (NULL == rows) {
37,921,692✔
150
    qError("taosArrayInit SQueryExplainRowInfo failed");
×
151
    QRY_ERR_JRET(terrno);
×
152
  }
153

154
  char *tbuf = taosMemoryMalloc(TSDB_EXPLAIN_RESULT_ROW_SIZE);
37,921,692✔
155
  if (NULL == tbuf) {
37,921,692✔
156
    qError("malloc size %d failed", TSDB_EXPLAIN_RESULT_ROW_SIZE);
×
157
    QRY_ERR_JRET(terrno);
×
158
  }
159

160
  ctx->mode = mode;
37,921,692✔
161
  ctx->verbose = verbose;
37,921,692✔
162
  ctx->ratio = ratio;
37,921,692✔
163
  ctx->tbuf = tbuf;
37,921,692✔
164
  ctx->rows = rows;
37,921,692✔
165

166
  *pCtx = ctx;
37,921,692✔
167

168
  return TSDB_CODE_SUCCESS;
37,921,692✔
169

170
_return:
×
171

172
  taosArrayDestroy(rows);
×
173
  taosMemoryFree(ctx);
×
174

175
  QRY_RET(code);
×
176
}
177

178
static int32_t qExplainGenerateResChildren(SSubplan *plan, SPhysiNode *pNode, SExplainGroup *group, SNodeList **pChildren) {
369,937,996✔
179
  int32_t    tlen = 0;
369,937,996✔
180
  SNodeList *pPhysiChildren = pNode->pChildren;
369,937,996✔
181

182
  if (pPhysiChildren) {
369,937,996✔
183
    int32_t code = nodesMakeList(pChildren);
180,784,544✔
184
    if (NULL == *pChildren) {
180,784,544✔
185
      qError("nodesMakeList failed");
×
186
      QRY_ERR_RET(code);
×
187
    }
188
  }
189

190
  SNode           *node = NULL;
369,937,996✔
191
  SExplainResNode *pResNode = NULL;
369,937,996✔
192
  FOREACH(node, pPhysiChildren) {
572,517,651✔
193
    QRY_ERR_RET(qExplainGenerateResNode(plan, (SPhysiNode *)node, group, &pResNode));
202,579,655✔
194
    QRY_ERR_RET(nodesListAppend(*pChildren, (SNode *)pResNode));
202,579,655✔
195
  }
196

197
  return TSDB_CODE_SUCCESS;
369,937,996✔
198
}
199

200
static int32_t qExplainGenerateResNodeExecInfo(SPhysiNode *pNode, SArray **pExecInfo, SExplainGroup *group) {
54,394,077✔
201
  *pExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainExecInfo));
54,394,077✔
202
  if (NULL == (*pExecInfo)) {
54,394,077✔
203
    qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
×
204
    return terrno;
×
205
  }
206

207
  SExplainRsp *rsp = NULL;
54,394,077✔
208
  if (group->singleChannel) {
54,394,077✔
209
    if (0 == group->physiPlanExecIdx) {
19,504✔
210
      group->nodeIdx = 0;
19,504✔
211
    }
212

213
    rsp = taosArrayGet(group->nodeExecInfo, group->nodeIdx++);
19,504✔
214
    if (group->physiPlanExecIdx >= rsp->numOfPlans) {
19,504✔
215
      qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
×
216
      return TSDB_CODE_APP_ERROR;
×
217
    }
218

219
    if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno;
39,008✔
220
  } else {
221
    for (int32_t i = 0; i < group->nodeNum; ++i) {
114,246,550✔
222
      rsp = taosArrayGet(group->nodeExecInfo, i);
59,871,977✔
223
      if (group->physiPlanExecIdx >= rsp->numOfPlans) {
59,871,977✔
224
        qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
×
225
        return TSDB_CODE_APP_ERROR;
×
226
      }
227

228
      if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno;
119,743,954✔
229
    }
230
  }
231

232
  ++group->physiPlanExecIdx;
54,394,077✔
233

234
  return TSDB_CODE_SUCCESS;
54,394,077✔
235
}
236

237
static int32_t qExplainGenerateResNode(SSubplan *plan, SPhysiNode *pNode, SExplainGroup *group, SExplainResNode **pResNode) {
369,937,996✔
238
  if (NULL == pNode) {
369,937,996✔
239
    *pResNode = NULL;
×
240
    qError("physical node is NULL");
×
241
    return TSDB_CODE_APP_ERROR;
×
242
  }
243

244
  SExplainResNode *resNode = taosMemoryCalloc(1, sizeof(SExplainResNode));
369,937,996✔
245
  if (NULL == resNode) {
369,937,996✔
246
    qError("calloc SPhysiNodeExplainRes failed");
×
247
    return terrno;
×
248
  }
249

250
  int32_t code = 0;
369,937,996✔
251
  resNode->pNode = pNode;
369,937,996✔
252
  resNode->pPlan = plan;
369,937,996✔
253

254
  if (group->nodeExecInfo) {
369,937,996✔
255
    QRY_ERR_JRET(qExplainGenerateResNodeExecInfo(pNode, &resNode->pExecInfo, group));
54,394,077✔
256
  }
257

258
  QRY_ERR_JRET(qExplainGenerateResChildren(plan, pNode, group, &resNode->pChildren));
369,937,996✔
259

260
  *pResNode = resNode;
369,937,996✔
261

262
  return TSDB_CODE_SUCCESS;
369,937,996✔
263

264
_return:
×
265

266
  qExplainFreeResNode(resNode);
×
267

268
  QRY_RET(code);
×
269
}
270

271
static int32_t qExplainBufAppendExecInfo(SArray *pExecInfo, char *tbuf, int32_t *len) {
54,394,077✔
272
  int32_t          tlen = *len;
54,394,077✔
273
  int32_t          nodeNum = taosArrayGetSize(pExecInfo);
54,394,077✔
274
  SExplainExecInfo maxExecInfo = {0};
54,394,077✔
275

276
  for (int32_t i = 0; i < nodeNum; ++i) {
114,285,558✔
277
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
59,891,481✔
278
    if (execInfo->startupCost > maxExecInfo.startupCost) {
59,891,481✔
279
      maxExecInfo.startupCost = execInfo->startupCost;
30,997,507✔
280
    }
281
    if (execInfo->totalCost > maxExecInfo.totalCost) {
59,891,481✔
282
      maxExecInfo.totalCost = execInfo->totalCost;
54,486,796✔
283
    }
284
    if (execInfo->numOfRows > maxExecInfo.numOfRows) {
59,891,481✔
285
      maxExecInfo.numOfRows = execInfo->numOfRows;
30,274,014✔
286
    }
287
  }
288

289
  EXPLAIN_ROW_APPEND(EXPLAIN_EXECINFO_FORMAT, maxExecInfo.startupCost, maxExecInfo.totalCost, maxExecInfo.numOfRows);
54,394,077✔
290

291
  *len = tlen;
54,394,077✔
292

293
  return TSDB_CODE_SUCCESS;
54,394,077✔
294
}
295

296
static int32_t qExplainBufAppendVerboseExecInfo(SArray *pExecInfo, char *tbuf, int32_t *len) {
631,778✔
297
  int32_t          tlen = 0;
631,778✔
298
  bool             gotVerbose = false;
631,778✔
299
  int32_t          nodeNum = taosArrayGetSize(pExecInfo);
631,778✔
300
  SExplainExecInfo maxExecInfo = {0};
631,778✔
301

302
  for (int32_t i = 0; i < nodeNum; ++i) {
1,300,940✔
303
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
669,162✔
304
    if (execInfo->verboseInfo) {
669,162✔
305
      gotVerbose = true;
×
306
    }
307
  }
308

309
  if (gotVerbose) {
631,778✔
310
    EXPLAIN_ROW_APPEND("exec verbose info");
×
311
  }
312

313
  *len = tlen;
631,778✔
314

315
  return TSDB_CODE_SUCCESS;
631,778✔
316
}
317

318
static int32_t qExplainResAppendRow(SExplainCtx *ctx, char *tbuf, int32_t len, int32_t level) {
897,695,746✔
319
  SQueryExplainRowInfo row = {0};
897,695,746✔
320
  row.buf = taosMemoryMalloc(len);
897,695,746✔
321
  if (NULL == row.buf) {
897,695,746✔
322
    qError("taosMemoryMalloc %d failed", len);
×
323
    QRY_ERR_RET(terrno);
×
324
  }
325

326
  memcpy(row.buf, tbuf, len);
897,695,746✔
327
  row.level = level;
897,695,746✔
328
  row.len = len;
897,695,746✔
329
  ctx->dataSize += row.len;
897,695,746✔
330

331
  if (NULL == taosArrayPush(ctx->rows, &row)) {
1,795,391,492✔
332
    qError("taosArrayPush row to explain res rows failed");
×
333
    taosMemoryFree(row.buf);
×
334
    QRY_ERR_RET(terrno);
×
335
  }
336

337
  return TSDB_CODE_SUCCESS;
897,695,746✔
338
}
339

340
static uint8_t qExplainGetIntervalPrecision(SIntervalPhysiNode *pIntNode) {
7,078,659✔
341
  return ((SColumnNode *)pIntNode->window.pTspk)->node.resType.precision;
7,078,659✔
342
}
343

344
static char* qExplainGetScanMode(STableScanPhysiNode* pScan) {
121,326,366✔
345
  bool isGroupByTbname = false;
121,326,366✔
346
  bool isGroupByTag = false;
121,326,366✔
347
  bool seq = false;
121,326,366✔
348
  bool groupOrder = false;
121,326,366✔
349
  if (pScan->pGroupTags && LIST_LENGTH(pScan->pGroupTags) == 1) {
121,326,366✔
350
    SNode* p = nodesListGetNode(pScan->pGroupTags, 0);
3,204,280✔
351
    if (QUERY_NODE_FUNCTION == nodeType(p) && (strcmp(((struct SFunctionNode*)p)->functionName, "tbname") == 0)) {
3,204,280✔
352
      isGroupByTbname = true;
3,203,342✔
353
    }
354
  }
355

356
  isGroupByTag = (NULL != pScan->pGroupTags) && !isGroupByTbname;
121,326,366✔
357
  if ((((!isGroupByTag) || isGroupByTbname) && pScan->groupSort) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
121,326,366✔
358
    return "seq_grp_order";
22,930✔
359
  }
360

361
  if ((isGroupByTbname && (pScan->groupSort || pScan->scan.groupOrderScan)) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
121,303,436✔
362
    return "grp_order";
3,943✔
363
  }
364

365
  return "ts_order";
121,299,493✔
366
}
367

368
static char* qExplainGetScanDataLoad(STableScanPhysiNode* pScan) {
121,326,366✔
369
  switch (pScan->dataRequired) {
121,326,366✔
370
    case FUNC_DATA_REQUIRED_DATA_LOAD:
112,249,232✔
371
      return "data";
112,249,232✔
372
    case FUNC_DATA_REQUIRED_SMA_LOAD:
6,902,383✔
373
      return "sma";
6,902,383✔
374
    case FUNC_DATA_REQUIRED_NOT_LOAD:
2,174,751✔
375
      return "no";
2,174,751✔
376
    default:
×
377
      break;
×
378
  }
379

380
  return "unknown";
×
381
}
382

383
static EDealRes qExplainVerifyIndex(SNode* pNode, void* pContext) {
35,250✔
384
  if (NULL == pNode) {
35,250✔
385
    return DEAL_RES_CONTINUE;
×
386
  }
387

388
  switch (nodeType(pNode)) {
35,250✔
389
    case QUERY_NODE_COLUMN:
20,643✔
390
    case QUERY_NODE_VALUE:
391
    case QUERY_NODE_LOGIC_CONDITION:
392
    case QUERY_NODE_NODE_LIST:
393
      break;
20,643✔
394
    case QUERY_NODE_OPERATOR: {
13,095✔
395
      SOperatorNode* pOp = (SOperatorNode*)pNode;
13,095✔
396
      if ((pOp->opType >= OP_TYPE_GREATER_THAN && pOp->opType <= OP_TYPE_EQUAL) || (OP_TYPE_IN == pOp->opType)) {
13,095✔
397
        break;
398
      }
399
      // fall through
400
    }
401
    default:
402
      *(bool*)pContext = false;
4,536✔
403
      return DEAL_RES_END;
4,536✔
404
  }
405

406
  return DEAL_RES_CONTINUE;
30,714✔
407
}
408

409
static bool qExplainCouldApplyTagIndex(SSubplan* pPlan) {
66,120,757✔
410
  if (NULL == pPlan->pTagIndexCond) {
66,120,757✔
411
    return false;
66,109,678✔
412
  }
413

414
  bool couldApply = true;
11,079✔
415
  nodesWalkExpr(pPlan->pTagIndexCond, qExplainVerifyIndex, &couldApply);
11,079✔
416

417
  return couldApply;
11,079✔
418
}
419

420
static int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t *pLevel) {
369,937,996✔
421
  int32_t     tlen = 0;
369,937,996✔
422
  bool        isVerboseLine = false;
369,937,996✔
423
  char       *tbuf = ctx->tbuf;
369,937,996✔
424
  bool        verbose = ctx->verbose;
369,937,996✔
425
  SPhysiNode *pNode = pResNode->pNode;
369,937,996✔
426
  if (NULL == pNode) {
369,937,996✔
427
    qError("pyhsical node in explain res node is NULL");
×
428
    return TSDB_CODE_APP_ERROR;
×
429
  }
430

431
  if (0 == *pLevel && ctx->currPlanId >= 0) {
369,937,996✔
432
    EXPLAIN_SUB_PLAN_LINE(ctx->currPlanId + 1);
65,359,327✔
433
    QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, *pLevel + 1));
65,359,327✔
434
    *pLevel += 2;
65,359,327✔
435
  }
436

437
  int32_t level = *pLevel;
369,937,996✔
438
  
439
  switch (pNode->type) {
369,937,996✔
440
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN: {
4,518,327✔
441
      STagScanPhysiNode *pTagScanNode = (STagScanPhysiNode *)pNode;
4,518,327✔
442
      EXPLAIN_ROW_NEW(level, EXPLAIN_TAG_SCAN_FORMAT, pTagScanNode->scan.tableName.tname);
4,518,327✔
443
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
4,518,327✔
444
      if (pResNode->pExecInfo) {
4,518,327✔
445
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
631,778✔
446
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
631,778✔
447
      }
448
      if (pTagScanNode->scan.pScanPseudoCols) {
4,518,327✔
449
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTagScanNode->scan.pScanPseudoCols->length);
1,514,729✔
450
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,514,729✔
451
      }
452
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
4,518,327✔
453
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
4,518,327✔
454
      EXPLAIN_ROW_END();
4,518,327✔
455
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
4,518,327✔
456

457
      if (verbose) {
4,518,327✔
458
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,826,225✔
459
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
1,826,225✔
460
                           nodesGetOutputNumFromSlotList(pTagScanNode->scan.node.pOutputDataBlockDesc->pSlots));
461
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,826,225✔
462
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
1,826,225✔
463
        EXPLAIN_ROW_APPEND_LIMIT(pTagScanNode->scan.node.pLimit);
1,826,225✔
464
        EXPLAIN_ROW_APPEND_SLIMIT(pTagScanNode->scan.node.pSlimit);
1,826,225✔
465
        EXPLAIN_ROW_END();
1,826,225✔
466
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,826,225✔
467

468
        if (pResNode->pExecInfo) {
1,826,225✔
469
          QRY_ERR_RET(qExplainBufAppendVerboseExecInfo(pResNode->pExecInfo, tbuf, &tlen));
631,778✔
470
          if (tlen) {
631,778✔
471
            EXPLAIN_ROW_END();
×
472
            QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
473
          }
474
        }
475

476
        if (pTagScanNode->scan.node.pConditions) {
1,826,225✔
477
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
478
          QRY_ERR_RET(nodesNodeToSQL(pTagScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
479
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
480
          EXPLAIN_ROW_END();
×
481
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
482
        }
483

484
        if (qExplainCouldApplyTagIndex(pResNode->pPlan)) {
1,826,225✔
485
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TAG_INDEX_FORMAT);
×
486
          QRY_ERR_RET(nodesNodeToSQL(pResNode->pPlan->pTagIndexCond, tbuf + VARSTR_HEADER_SIZE,
×
487
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
488
          EXPLAIN_ROW_END();
×
489
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
490
        }
491
      }
492
      break;
4,518,327✔
493
    }
494
    case QUERY_NODE_PHYSICAL_PLAN_VIRTUAL_TABLE_SCAN: {
69,440✔
495
      SVirtualScanPhysiNode *pVirtualTableScanNode = (SVirtualScanPhysiNode *)pNode;
69,440✔
496
      EXPLAIN_ROW_NEW(level, EXPLAIN_VIRTUAL_TABLE_SCAN_FORMAT, pVirtualTableScanNode->scan.tableName.tname);
69,440✔
497
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
69,440✔
498
      if (pResNode->pExecInfo) {
69,440✔
499
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
500
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
501
      }
502
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pVirtualTableScanNode->scan.pScanCols->length);
69,440✔
503
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
69,440✔
504
      if (pVirtualTableScanNode->scan.pScanPseudoCols) {
69,440✔
505
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pVirtualTableScanNode->scan.pScanPseudoCols->length);
33,515✔
506
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
33,515✔
507
      }
508
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
69,440✔
509
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
69,440✔
510
      EXPLAIN_ROW_END();
69,440✔
511
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
69,440✔
512

513
      if (verbose) {
69,440✔
514
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
40,736✔
515
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
40,736✔
516
                           nodesGetOutputNumFromSlotList(pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->pSlots));
517
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
40,736✔
518
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
40,736✔
519
        EXPLAIN_ROW_APPEND_LIMIT(pVirtualTableScanNode->scan.node.pLimit);
40,736✔
520
        EXPLAIN_ROW_APPEND_SLIMIT(pVirtualTableScanNode->scan.node.pSlimit);
40,736✔
521
        EXPLAIN_ROW_END();
40,736✔
522
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
40,736✔
523

524
        if (pResNode->pExecInfo) {
40,736✔
525
          QRY_ERR_RET(qExplainBufAppendVerboseExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
526
          if (tlen) {
×
527
            EXPLAIN_ROW_END();
×
528
            QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
529
          }
530
        }
531

532
        if (pVirtualTableScanNode->scan.node.pConditions) {
40,736✔
533
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
13,823✔
534
          QRY_ERR_RET(nodesNodeToSQL(pVirtualTableScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
13,823✔
535
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
536
          EXPLAIN_ROW_END();
13,823✔
537
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
13,823✔
538
        }
539
      }
540
      break;
69,440✔
541
    }
542
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
121,326,366✔
543
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
544
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: {
545
      STableScanPhysiNode *pTblScanNode = (STableScanPhysiNode *)pNode;
121,326,366✔
546
      EXPLAIN_ROW_NEW(level,
121,326,366✔
547
                      QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN == pNode->type ? EXPLAIN_TBL_MERGE_SCAN_FORMAT
548
                                                                               : EXPLAIN_TBL_SCAN_FORMAT,
549
                      pTblScanNode->scan.tableName.tname);
550
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
121,326,366✔
551
      if (pResNode->pExecInfo) {
121,326,366✔
552
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
20,368,846✔
553
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
20,368,846✔
554
      }
555

556
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pTblScanNode->scan.pScanCols->length);
121,326,366✔
557
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
121,326,366✔
558
      if (pTblScanNode->scan.pScanPseudoCols) {
121,326,366✔
559
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTblScanNode->scan.pScanPseudoCols->length);
6,373,372✔
560
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,373,372✔
561
      }
562
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
121,326,366✔
563
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
121,326,366✔
564
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_ORDER_FORMAT, pTblScanNode->scanSeq[0], pTblScanNode->scanSeq[1]);
121,326,366✔
565
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
121,326,366✔
566
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_MODE_FORMAT, qExplainGetScanMode(pTblScanNode));
121,326,366✔
567
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
121,326,366✔
568
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_DATA_LOAD_FORMAT, qExplainGetScanDataLoad(pTblScanNode));
121,326,366✔
569
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
121,326,366✔
570
      EXPLAIN_ROW_END();
121,326,366✔
571
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
121,326,366✔
572

573
      // basic analyze output
574
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
121,326,366✔
575
        EXPLAIN_ROW_NEW(level + 1, "I/O: ");
20,368,846✔
576

577
        int32_t                      nodeNum = taosArrayGetSize(pResNode->pExecInfo);
20,368,846✔
578
        struct STableScanAnalyzeInfo info = {0};
20,368,846✔
579

580
        int32_t maxIndex = 0;
20,368,846✔
581
        int32_t totalRows = 0;
20,368,846✔
582
        for (int32_t i = 0; i < nodeNum; ++i) {
44,543,132✔
583
          SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, i);
24,174,286✔
584
          STableScanAnalyzeInfo *pScanInfo = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
24,174,286✔
585

586
          info.totalBlocks += pScanInfo->totalBlocks;
24,174,286✔
587
          info.loadBlocks += pScanInfo->loadBlocks;
24,174,286✔
588
          info.totalRows += pScanInfo->totalRows;
24,174,286✔
589
          info.skipBlocks += pScanInfo->skipBlocks;
24,174,286✔
590
          info.filterTime += pScanInfo->filterTime;
24,174,286✔
591
          info.loadBlockStatis += pScanInfo->loadBlockStatis;
24,174,286✔
592
          info.totalCheckedRows += pScanInfo->totalCheckedRows;
24,174,286✔
593
          info.filterOutBlocks += pScanInfo->filterOutBlocks;
24,174,286✔
594

595
          if (pScanInfo->totalRows > totalRows) {
24,174,286✔
596
            totalRows = pScanInfo->totalRows;
11,323,684✔
597
            maxIndex = i;
11,323,684✔
598
          }
599
        }
600

601
        EXPLAIN_ROW_APPEND("total_blocks=%.1f", ((double)info.totalBlocks) / nodeNum);
20,368,846✔
602
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
20,368,846✔
603

604
        EXPLAIN_ROW_APPEND("load_blocks=%.1f", ((double)info.loadBlocks) / nodeNum);
20,368,846✔
605
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
20,368,846✔
606

607
        EXPLAIN_ROW_APPEND("load_block_SMAs=%.1f", ((double)info.loadBlockStatis) / nodeNum);
20,368,846✔
608
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
20,368,846✔
609

610
        EXPLAIN_ROW_APPEND("total_rows=%.1f", ((double)info.totalRows) / nodeNum);
20,368,846✔
611
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
20,368,846✔
612

613
        EXPLAIN_ROW_APPEND("check_rows=%.1f", ((double)info.totalCheckedRows) / nodeNum);
20,368,846✔
614
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
20,368,846✔
615
        EXPLAIN_ROW_END();
20,368,846✔
616

617
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
20,368,846✔
618

619
        // Rows out: Avg 4166.7 rows x 24 workers. Max 4187 rows (seg7) with 0.220 ms to first row, 1.738 ms to end,
620
        // start offset by 1.470 ms.
621
        SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, maxIndex);
20,368,846✔
622
        STableScanAnalyzeInfo *p1 = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
20,368,846✔
623

624
        EXPLAIN_ROW_NEW(level + 1, " ");
20,368,846✔
625
        EXPLAIN_ROW_APPEND("max_row_task=%d, total_rows:%" PRId64 ", ep:%s (cost=%.3f..%.3f)", maxIndex, p1->totalRows,
20,368,846✔
626
                           "tbd", execInfo->startupCost, execInfo->totalCost);
627
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
20,368,846✔
628
        EXPLAIN_ROW_END();
20,368,846✔
629

630
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
20,368,846✔
631
      }
632

633
      if (verbose) {
121,326,366✔
634
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
64,135,768✔
635
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
64,135,768✔
636
                           nodesGetOutputNumFromSlotList(pTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
637
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,135,768✔
638
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
64,135,768✔
639
        EXPLAIN_ROW_APPEND_LIMIT(pTblScanNode->scan.node.pLimit);
64,135,768✔
640
        EXPLAIN_ROW_APPEND_SLIMIT(pTblScanNode->scan.node.pSlimit);
64,135,768✔
641
        EXPLAIN_ROW_END();
64,135,768✔
642
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
64,135,768✔
643

644
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pTblScanNode->scanRange.skey,
64,135,768✔
645
                        pTblScanNode->scanRange.ekey);
646
        EXPLAIN_ROW_END();
64,135,768✔
647
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
64,135,768✔
648

649
        if (NULL != pTblScanNode->pGroupTags) {
64,135,768✔
650
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
2,123,019✔
651
          EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pTblScanNode->pGroupTags->length);
2,123,019✔
652
          EXPLAIN_ROW_END();
2,123,019✔
653
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,123,019✔
654
        }
655

656
        if (pTblScanNode->scan.node.pConditions) {
64,135,768✔
657
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
9,090,458✔
658
          QRY_ERR_RET(nodesNodeToSQL(pTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
9,090,458✔
659
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
660
          EXPLAIN_ROW_END();
9,090,458✔
661
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
9,090,458✔
662
        }
663

664
        if (qExplainCouldApplyTagIndex(pResNode->pPlan)) {
64,135,768✔
665
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TAG_INDEX_FORMAT);
6,543✔
666
          QRY_ERR_RET(nodesNodeToSQL(pResNode->pPlan->pTagIndexCond, tbuf + VARSTR_HEADER_SIZE,
6,543✔
667
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
668
          EXPLAIN_ROW_END();
6,543✔
669
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6,543✔
670
        }
671
      }
672
      break;
121,326,366✔
673
    }
674
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN: {
201,700✔
675
      SSystemTableScanPhysiNode *pSTblScanNode = (SSystemTableScanPhysiNode *)pNode;
201,700✔
676
      EXPLAIN_ROW_NEW(level, EXPLAIN_SYSTBL_SCAN_FORMAT, pSTblScanNode->scan.tableName.tname);
201,700✔
677
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
201,700✔
678
      if (pResNode->pExecInfo) {
201,700✔
679
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
8,208✔
680
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8,208✔
681
      }
682
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pSTblScanNode->scan.pScanCols->length);
201,700✔
683
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
201,700✔
684
      if (pSTblScanNode->scan.pScanPseudoCols) {
201,700✔
685
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pSTblScanNode->scan.pScanPseudoCols->length);
496✔
686
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
496✔
687
      }
688
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
201,700✔
689
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
201,700✔
690
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
201,700✔
691
      EXPLAIN_ROW_END();
201,700✔
692
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
201,700✔
693

694
      if (verbose) {
201,700✔
695
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
52,248✔
696
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
52,248✔
697
                           nodesGetOutputNumFromSlotList(pSTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
698
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
52,248✔
699
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
52,248✔
700
        EXPLAIN_ROW_APPEND_LIMIT(pSTblScanNode->scan.node.pLimit);
52,248✔
701
        EXPLAIN_ROW_APPEND_SLIMIT(pSTblScanNode->scan.node.pSlimit);
52,248✔
702
        EXPLAIN_ROW_END();
52,248✔
703
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
52,248✔
704

705
        if (pSTblScanNode->scan.node.pConditions) {
52,248✔
706
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
1,024✔
707
          QRY_ERR_RET(nodesNodeToSQL(pSTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
1,024✔
708
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
709
          EXPLAIN_ROW_END();
1,024✔
710
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,024✔
711
        }
712
      }
713
      break;
201,700✔
714
    }
715
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
74,713,133✔
716
      SProjectPhysiNode *pPrjNode = (SProjectPhysiNode *)pNode;
74,713,133✔
717
      EXPLAIN_ROW_NEW(level, EXPLAIN_PROJECTION_FORMAT);
74,713,133✔
718
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
74,713,133✔
719
      if (pResNode->pExecInfo) {
74,713,133✔
720
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
12,640,467✔
721
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,640,467✔
722
      }
723
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pPrjNode->pProjections->length);
74,713,133✔
724
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
74,713,133✔
725
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->totalRowSize);
74,713,133✔
726
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
74,713,133✔
727
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pPrjNode->node.inputTsOrder));
74,713,133✔
728
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
74,713,133✔
729
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
74,713,133✔
730
      EXPLAIN_ROW_END();
74,713,133✔
731
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
74,713,133✔
732

733
      if (verbose) {
74,713,133✔
734
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
36,959,587✔
735
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
36,959,587✔
736
                           nodesGetOutputNumFromSlotList(pPrjNode->node.pOutputDataBlockDesc->pSlots));
737
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
36,959,587✔
738
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->outputRowSize);
36,959,587✔
739
        EXPLAIN_ROW_APPEND_LIMIT(pPrjNode->node.pLimit);
36,959,587✔
740
        EXPLAIN_ROW_APPEND_SLIMIT(pPrjNode->node.pSlimit);
36,959,587✔
741
        EXPLAIN_ROW_END();
36,959,587✔
742
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
36,959,587✔
743

744
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
36,959,587✔
745
        EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pPrjNode->ignoreGroupId ? "true" : "false");
36,959,587✔
746
        EXPLAIN_ROW_END();
36,959,587✔
747
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
36,959,587✔
748

749
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pPrjNode->mergeDataBlock? "True":"False");
36,959,587✔
750
        EXPLAIN_ROW_END();
36,959,587✔
751
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
36,959,587✔
752

753
        if (pPrjNode->node.pConditions) {
36,959,587✔
754
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
755
          QRY_ERR_RET(nodesNodeToSQL(pPrjNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
756
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
757
          EXPLAIN_ROW_END();
×
758
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
759
        }
760
      }
761
      break;
74,713,133✔
762
    }
763
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN: {
6,617,781✔
764
      SSortMergeJoinPhysiNode *pJoinNode = (SSortMergeJoinPhysiNode *)pNode;
6,617,781✔
765
      EXPLAIN_ROW_NEW(level, EXPLAIN_JOIN_FORMAT, gJoinTypeStr[pJoinNode->joinType][pJoinNode->subType]);
6,617,781✔
766
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
6,617,781✔
767
      if (pResNode->pExecInfo) {
6,617,781✔
768
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
990,894✔
769
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
990,894✔
770
      }
771
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pJoinNode->pTargets->length);
6,617,781✔
772
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,617,781✔
773
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->totalRowSize);
6,617,781✔
774
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,617,781✔
775
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pJoinNode->node.inputTsOrder));
6,617,781✔
776
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,617,781✔
777
      EXPLAIN_ROW_APPEND(EXPLAIN_JOIN_ALGO, "Merge");
6,617,781✔
778
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
6,617,781✔
779
      EXPLAIN_ROW_END();
6,617,781✔
780
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
6,617,781✔
781

782
      if (verbose) {
6,617,781✔
783
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
2,613,968✔
784
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
2,613,968✔
785
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
786
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,613,968✔
787
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
2,613,968✔
788
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
2,613,968✔
789
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
2,613,968✔
790
        EXPLAIN_ROW_END();
2,613,968✔
791
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,613,968✔
792

793
        if (IS_ASOF_JOIN(pJoinNode->subType) || IS_WINDOW_JOIN(pJoinNode->subType)) {
2,613,968✔
794
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_PARAM_FORMAT);
91,264✔
795
          if (IS_ASOF_JOIN(pJoinNode->subType)) {
91,264✔
796
            EXPLAIN_ROW_APPEND(EXPLAIN_ASOF_OP_FORMAT, qExplainGetAsofOpStr(pJoinNode->asofOpType));
41,216✔
797
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
41,216✔
798
          }
799
          if (NULL != pJoinNode->pWindowOffset) {
91,264✔
800
            SWindowOffsetNode* pWinOffset = (SWindowOffsetNode*)pJoinNode->pWindowOffset;
50,048✔
801
            SValueNode* pStart = (SValueNode*)pWinOffset->pStartOffset;
50,048✔
802
            SValueNode* pEnd = (SValueNode*)pWinOffset->pEndOffset;
50,048✔
803
            EXPLAIN_ROW_APPEND(EXPLAIN_WIN_OFFSET_FORMAT, pStart->literal, pEnd->literal);
50,048✔
804
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
50,048✔
805
          }
806
          if (NULL != pJoinNode->pJLimit && NULL != ((SLimitNode*)pJoinNode->pJLimit)->limit) {
91,264✔
807
            SLimitNode* pJLimit = (SLimitNode*)pJoinNode->pJLimit;
16,192✔
808
            EXPLAIN_ROW_APPEND(EXPLAIN_JLIMIT_FORMAT, pJLimit->limit->datum.i);
16,192✔
809
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
16,192✔
810
          }
811
          if (IS_WINDOW_JOIN(pJoinNode->subType)) {
91,264✔
812
            EXPLAIN_ROW_APPEND(EXPLAIN_SEQ_WIN_GRP_FORMAT, pJoinNode->seqWinGroup);
50,048✔
813
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
50,048✔
814
          }
815

816
          EXPLAIN_ROW_APPEND(EXPLAIN_GRP_JOIN_FORMAT, pJoinNode->grpJoin);
91,264✔
817
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
91,264✔
818
          EXPLAIN_ROW_END();
91,264✔
819

820
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
91,264✔
821
        }
822

823
        if (pJoinNode->node.pConditions) {
2,613,968✔
824
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
16,928✔
825
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
16,928✔
826
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
827
          EXPLAIN_ROW_END();
16,928✔
828
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
16,928✔
829
        }
830

831
        if (NULL != pJoinNode->pPrimKeyCond) {
2,613,968✔
832
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PRIM_CONDITIONS_FORMAT);
2,550,672✔
833
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2,550,672✔
834
          EXPLAIN_ROW_END();
2,550,672✔
835
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,550,672✔
836
        }
837

838
        if (NULL != pJoinNode->pEqLeft && pJoinNode->pEqLeft->length > 0) {
2,613,968✔
839
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_LEFT_FORMAT);
736✔
840
          SNode* pCol = NULL;
736✔
841
          FOREACH(pCol, pJoinNode->pEqLeft) {
1,472✔
842
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
736✔
843
          }
844
          EXPLAIN_ROW_END();
736✔
845
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
736✔
846
        }
847

848
        if (NULL != pJoinNode->pEqRight && pJoinNode->pEqRight->length > 0) {
2,613,968✔
849
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_RIGHT_FORMAT);
736✔
850
          SNode* pCol = NULL;
736✔
851
          FOREACH(pCol, pJoinNode->pEqRight) {
1,472✔
852
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
736✔
853
          }
854
          EXPLAIN_ROW_END();
736✔
855
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
736✔
856
        }
857

858
        if (NULL != pJoinNode->pFullOnCond) {
2,613,968✔
859
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
248,982✔
860
          QRY_ERR_RET(
248,982✔
861
                nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
862
          EXPLAIN_ROW_END();
248,982✔
863
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
248,982✔
864
        }
865

866
        if (NULL != pJoinNode->pColOnCond) {
2,613,968✔
867
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COL_ON_CONDITIONS_FORMAT);
248,246✔
868
          QRY_ERR_RET(
248,246✔
869
                nodesNodeToSQL(pJoinNode->pColOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
870
          EXPLAIN_ROW_END();
248,246✔
871
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
248,246✔
872
        }
873
      }
874
      break;
6,617,781✔
875
    }
876
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: {
37,634,911✔
877
      SAggPhysiNode *pAggNode = (SAggPhysiNode *)pNode;
37,634,911✔
878
      EXPLAIN_ROW_NEW(level, EXPLAIN_AGG_FORMAT, (pAggNode->pGroupKeys ? "GroupAggregate" : "Aggregate"));
37,634,911✔
879
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
37,634,911✔
880
      if (pResNode->pExecInfo) {
37,634,911✔
881
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
6,305,430✔
882
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,305,430✔
883
      }
884
      if (pAggNode->pAggFuncs) {
37,634,911✔
885
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pAggNode->pAggFuncs->length);
26,199,903✔
886
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
26,199,903✔
887
      }
888
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->totalRowSize);
37,634,911✔
889
      if (pAggNode->pGroupKeys) {
37,634,911✔
890
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
21,618,305✔
891
        EXPLAIN_ROW_APPEND(EXPLAIN_GROUPS_FORMAT, pAggNode->pGroupKeys->length);
21,618,305✔
892
      }
893
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
37,634,911✔
894
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pAggNode->node.inputTsOrder));
37,634,911✔
895
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
37,634,911✔
896
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
37,634,911✔
897
      EXPLAIN_ROW_END();
37,634,911✔
898
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
37,634,911✔
899

900
      if (verbose) {
37,634,911✔
901
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
18,435,746✔
902
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
18,435,746✔
903
                           nodesGetOutputNumFromSlotList(pAggNode->node.pOutputDataBlockDesc->pSlots));
904
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
18,435,746✔
905
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->outputRowSize);
18,435,746✔
906
        EXPLAIN_ROW_APPEND_LIMIT(pAggNode->node.pLimit);
18,435,746✔
907
        EXPLAIN_ROW_APPEND_SLIMIT(pAggNode->node.pSlimit);
18,435,746✔
908
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
18,435,746✔
909
        EXPLAIN_ROW_APPEND(EXPLAIN_PLAN_BLOCKING, !pAggNode->node.forceCreateNonBlockingOptr);
18,435,746✔
910
        EXPLAIN_ROW_END();
18,435,746✔
911
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
18,435,746✔
912

913
        if (pAggNode->node.pConditions) {
18,435,746✔
914
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
807,286✔
915
          QRY_ERR_RET(nodesNodeToSQL(pAggNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
807,286✔
916
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
917
          EXPLAIN_ROW_END();
807,286✔
918
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
807,286✔
919
        }
920

921
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pAggNode->mergeDataBlock? "True":"False");
18,435,746✔
922
        EXPLAIN_ROW_END();
18,435,746✔
923
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
18,435,746✔
924
      }
925
      break;
37,634,911✔
926
    }
927
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: {
1,129,794✔
928
      SIndefRowsFuncPhysiNode *pIndefNode = (SIndefRowsFuncPhysiNode *)pNode;
1,129,794✔
929
      EXPLAIN_ROW_NEW(level, EXPLAIN_INDEF_ROWS_FORMAT);
1,129,794✔
930
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,129,794✔
931
      if (pResNode->pExecInfo) {
1,129,794✔
932
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
3,440✔
933
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,440✔
934
      }
935
      if (pIndefNode->pFuncs) {
1,129,794✔
936
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIndefNode->pFuncs->length);
1,129,794✔
937
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,129,794✔
938
      }
939
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->totalRowSize);
1,129,794✔
940
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,129,794✔
941
      EXPLAIN_ROW_END();
1,129,794✔
942
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,129,794✔
943

944
      if (verbose) {
1,129,794✔
945
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
215,904✔
946
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
215,904✔
947
                           nodesGetOutputNumFromSlotList(pIndefNode->node.pOutputDataBlockDesc->pSlots));
948
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
215,904✔
949
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->outputRowSize);
215,904✔
950
        EXPLAIN_ROW_APPEND_LIMIT(pIndefNode->node.pLimit);
215,904✔
951
        EXPLAIN_ROW_APPEND_SLIMIT(pIndefNode->node.pSlimit);
215,904✔
952
        EXPLAIN_ROW_END();
215,904✔
953
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
215,904✔
954

955
        if (pIndefNode->node.pConditions) {
215,904✔
956
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
957
          QRY_ERR_RET(nodesNodeToSQL(pIndefNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
958
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
959
          EXPLAIN_ROW_END();
×
960
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
961
        }
962
      }
963
      break;
1,129,794✔
964
    }
965
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
57,496,081✔
966
      SExchangePhysiNode *pExchNode = (SExchangePhysiNode *)pNode;
57,496,081✔
967
      int32_t nodeNum = 0;
57,496,081✔
968
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
125,236,121✔
969
        SExplainGroup      *group = taosHashGet(ctx->pCurrPlanCtx->groupHash, &pExchNode->srcStartGroupId, sizeof(pExchNode->srcStartGroupId));
67,740,040✔
970
        if (NULL == group) {
67,740,040✔
971
          qError("exchange src group %d not in groupHash", pExchNode->srcStartGroupId);
×
972
          QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
973
        }
974

975
        nodeNum += group->nodeNum;
67,740,040✔
976
      }
977

978
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXCHANGE_FORMAT, pExchNode->singleSrc ? 1 : nodeNum);
57,496,081✔
979
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
57,496,081✔
980
      if (pResNode->pExecInfo) {
57,496,081✔
981
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
4,750,730✔
982
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,750,730✔
983
      }
984
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->totalRowSize);
57,496,081✔
985
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
57,496,081✔
986
      EXPLAIN_ROW_END();
57,496,081✔
987
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
57,496,081✔
988

989
      if (verbose) {
57,496,081✔
990
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
24,957,933✔
991
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
24,957,933✔
992
                           nodesGetOutputNumFromSlotList(pExchNode->node.pOutputDataBlockDesc->pSlots));
993
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
24,957,933✔
994
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->outputRowSize);
24,957,933✔
995
        EXPLAIN_ROW_APPEND_LIMIT(pExchNode->node.pLimit);
24,957,933✔
996
        EXPLAIN_ROW_APPEND_SLIMIT(pExchNode->node.pSlimit);
24,957,933✔
997
        EXPLAIN_ROW_END();
24,957,933✔
998
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
24,957,933✔
999

1000
        if (pExchNode->node.pConditions) {
24,957,933✔
1001
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1002
          QRY_ERR_RET(nodesNodeToSQL(pExchNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1003
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1004
          EXPLAIN_ROW_END();
×
1005
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1006
        }
1007
      }
1008

1009
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
125,236,121✔
1010
        int32_t nlevel = level + 1;
67,740,040✔
1011
        QRY_ERR_RET(qExplainAppendGroupResRows(ctx, i, &nlevel, pExchNode->grpSingleChannel));
67,740,040✔
1012
      }
1013
      break;
57,496,081✔
1014
    }
1015
    case QUERY_NODE_PHYSICAL_PLAN_SORT: {
25,671,900✔
1016
      SSortPhysiNode *pSortNode = (SSortPhysiNode *)pNode;
25,671,900✔
1017
      EXPLAIN_ROW_NEW(level, EXPLAIN_SORT_FORMAT);
25,671,900✔
1018
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,671,900✔
1019
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.inputTsOrder));
25,671,900✔
1020
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,671,900✔
1021
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.outputTsOrder));
25,671,900✔
1022
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,671,900✔
1023
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
25,671,900✔
1024
      if (pResNode->pExecInfo) {
25,671,900✔
1025
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
4,012,219✔
1026
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,012,219✔
1027
      }
1028

1029
      SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
25,671,900✔
1030
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
25,671,900✔
1031
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,671,900✔
1032
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
25,671,900✔
1033
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
25,671,900✔
1034
      EXPLAIN_ROW_END();
25,671,900✔
1035
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
25,671,900✔
1036

1037
      if (pResNode->pExecInfo) {
25,671,900✔
1038
        // sort key
1039
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
4,012,219✔
1040
        for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
8,828,158✔
1041
          SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
4,815,939✔
1042
          EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
4,815,939✔
1043
        }
1044

1045
        EXPLAIN_ROW_END();
4,012,219✔
1046
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
4,012,219✔
1047

1048
        // sort method
1049
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
4,012,219✔
1050

1051
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
4,012,219✔
1052
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
4,012,219✔
1053
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
4,012,219✔
1054
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
4,012,219✔
1055
        if (pExecInfo->sortBuffer > 1024 * 1024) {
4,012,219✔
1056
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
893,946✔
1057
        } else if (pExecInfo->sortBuffer > 1024) {
3,118,273✔
1058
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
1059
        } else {
1060
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
3,118,273✔
1061
        }
1062

1063
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
4,012,219✔
1064
        EXPLAIN_ROW_END();
4,012,219✔
1065
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
4,012,219✔
1066
      }
1067

1068
      if (verbose) {
25,671,900✔
1069
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
14,646,970✔
1070
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
14,646,970✔
1071
                           nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
1072
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
14,646,970✔
1073
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
14,646,970✔
1074
        EXPLAIN_ROW_APPEND_LIMIT(pSortNode->node.pLimit);
14,646,970✔
1075
        EXPLAIN_ROW_APPEND_SLIMIT(pSortNode->node.pSlimit);
14,646,970✔
1076
        EXPLAIN_ROW_END();
14,646,970✔
1077
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
14,646,970✔
1078

1079
        if (pSortNode->node.pConditions) {
14,646,970✔
1080
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1081
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1082
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1083
          EXPLAIN_ROW_END();
×
1084
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1085
        }
1086
      }
1087
      break;
25,671,900✔
1088
    }
1089
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL: {
9,454,886✔
1090
      SIntervalPhysiNode *pIntNode = (SIntervalPhysiNode *)pNode;
9,454,886✔
1091
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
9,454,886✔
1092
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
9,454,886✔
1093
      if (pResNode->pExecInfo) {
9,454,886✔
1094
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,310,195✔
1095
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,310,195✔
1096
      }
1097
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pIntNode->window.pFuncs));
9,454,886✔
1098
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,454,886✔
1099
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
9,454,886✔
1100
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,454,886✔
1101
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
9,454,886✔
1102
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,454,886✔
1103
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
9,454,886✔
1104
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,454,886✔
1105
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
9,454,886✔
1106
      EXPLAIN_ROW_END();
9,454,886✔
1107
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
9,454,886✔
1108

1109
      if (verbose) {
9,454,886✔
1110
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
6,057,708✔
1111
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
6,057,708✔
1112
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1113
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,057,708✔
1114
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
6,057,708✔
1115
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
6,057,708✔
1116
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
6,057,708✔
1117
        EXPLAIN_ROW_END();
6,057,708✔
1118
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6,057,708✔
1119
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pIntNode->timeRange.skey, pIntNode->timeRange.ekey);
6,057,708✔
1120
        EXPLAIN_ROW_END();
6,057,708✔
1121
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6,057,708✔
1122
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
6,057,708✔
1123
        int64_t time1 = -1;
6,057,708✔
1124
        int64_t time2 = -1;
6,057,708✔
1125
        int32_t code = TSDB_CODE_SUCCESS;
6,057,708✔
1126
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
6,057,708✔
1127
        QRY_ERR_RET(code);
6,057,708✔
1128
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
6,057,708✔
1129
        QRY_ERR_RET(code);
6,057,708✔
1130
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
6,057,708✔
1131
                        time1,
1132
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1133
                        time2,
1134
                        pIntNode->slidingUnit);
1135
        EXPLAIN_ROW_END();
6,057,708✔
1136
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6,057,708✔
1137

1138
        if (pIntNode->window.node.pConditions) {
6,057,708✔
1139
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1140
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1141
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1142
          EXPLAIN_ROW_END();
×
1143
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1144
        }
1145

1146
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
6,057,708✔
1147
        EXPLAIN_ROW_END();
6,057,708✔
1148
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6,057,708✔
1149
      }
1150
      break;
9,454,886✔
1151
    }
1152
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL: {
1,554,922✔
1153
      SMergeAlignedIntervalPhysiNode *pIntNode = (SMergeAlignedIntervalPhysiNode *)pNode;
1,554,922✔
1154
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_ALIGNED_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
1,554,922✔
1155
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,554,922✔
1156
      if (pResNode->pExecInfo) {
1,554,922✔
1157
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
35,536✔
1158
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
35,536✔
1159
      }
1160
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pIntNode->window.pFuncs));
1,554,922✔
1161
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,554,922✔
1162
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,554,922✔
1163
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,554,922✔
1164
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
1,554,922✔
1165
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,554,922✔
1166
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
1,554,922✔
1167
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,554,922✔
1168
      EXPLAIN_ROW_END();
1,554,922✔
1169
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,554,922✔
1170

1171
      if (verbose) {
1,554,922✔
1172
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,020,951✔
1173
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
1,020,951✔
1174
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1175
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,020,951✔
1176
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
1,020,951✔
1177
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
1,020,951✔
1178
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
1,020,951✔
1179
        EXPLAIN_ROW_END();
1,020,951✔
1180
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,020,951✔
1181
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
1,020,951✔
1182
        int64_t time1 = -1;
1,020,951✔
1183
        int64_t time2 = -1;
1,020,951✔
1184
        int32_t code = TSDB_CODE_SUCCESS;
1,020,951✔
1185
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
1,020,951✔
1186
        QRY_ERR_RET(code);
1,020,951✔
1187
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
1,020,951✔
1188
        QRY_ERR_RET(code);
1,020,951✔
1189
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
1,020,951✔
1190
                        time1,
1191
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1192
                        time2,
1193
                        pIntNode->slidingUnit);
1194
        EXPLAIN_ROW_END();
1,020,951✔
1195
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,020,951✔
1196

1197
        if (pIntNode->window.node.pConditions) {
1,020,951✔
1198
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
3,024✔
1199
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
3,024✔
1200
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1201
          EXPLAIN_ROW_END();
3,024✔
1202
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,024✔
1203
        }
1204

1205
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
1,020,951✔
1206
        EXPLAIN_ROW_END();
1,020,951✔
1207
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,020,951✔
1208
      }
1209
      break;
1,554,922✔
1210
    }
1211
    case QUERY_NODE_PHYSICAL_PLAN_FILL: {
4,080✔
1212
      SFillPhysiNode *pFillNode = (SFillPhysiNode *)pNode;
4,080✔
1213
      EXPLAIN_ROW_NEW(level, EXPLAIN_FILL_FORMAT);
4,080✔
1214
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
4,080✔
1215
      if (pResNode->pExecInfo) {
4,080✔
1216
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
528✔
1217
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
528✔
1218
      }
1219
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pFillNode->mode));
4,080✔
1220
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,080✔
1221
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pFillNode->node.pOutputDataBlockDesc->totalRowSize);
4,080✔
1222
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,080✔
1223
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pFillNode->node.inputTsOrder));
4,080✔
1224
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,080✔
1225
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
4,080✔
1226
      EXPLAIN_ROW_END();
4,080✔
1227
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
4,080✔
1228

1229
      if (verbose) {
4,080✔
1230
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,048✔
1231
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
4,048✔
1232
                           nodesGetOutputNumFromSlotList(pFillNode->node.pOutputDataBlockDesc->pSlots));
1233
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,048✔
1234
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pFillNode->node.pOutputDataBlockDesc->outputRowSize);
4,048✔
1235
        EXPLAIN_ROW_APPEND_LIMIT(pFillNode->node.pLimit);
4,048✔
1236
        EXPLAIN_ROW_APPEND_SLIMIT(pFillNode->node.pSlimit);
4,048✔
1237
        EXPLAIN_ROW_END();
4,048✔
1238
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,048✔
1239
        if (pFillNode->pValues) {
4,048✔
1240
          SNodeListNode *pValues = (SNodeListNode *)pFillNode->pValues;
32✔
1241
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
32✔
1242
          SNode  *tNode = NULL;
32✔
1243
          int32_t i = 0;
32✔
1244
          FOREACH(tNode, pValues->pNodeList) {
192✔
1245
            if (i) {
160✔
1246
              EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
128✔
1247
            }
1248
            SValueNode *tValue = (SValueNode *)tNode;
160✔
1249
            char       *value = nodesGetStrValueFromNode(tValue);
160✔
1250
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
160✔
1251
            taosMemoryFree(value);
160✔
1252
            ++i;
160✔
1253
          }
1254

1255
          EXPLAIN_ROW_END();
32✔
1256
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
32✔
1257
        }
1258

1259
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pFillNode->timeRange.skey, pFillNode->timeRange.ekey);
4,048✔
1260
        EXPLAIN_ROW_END();
4,048✔
1261
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,048✔
1262

1263
        if (pFillNode->node.pConditions) {
4,048✔
1264
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1265
          QRY_ERR_RET(nodesNodeToSQL(pFillNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1266
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1267
          EXPLAIN_ROW_END();
×
1268
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1269
        }
1270
      }
1271
      break;
4,080✔
1272
    }
1273
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION: {
2,419,216✔
1274
      SSessionWinodwPhysiNode *pSessNode = (SSessionWinodwPhysiNode *)pNode;
2,419,216✔
1275
      EXPLAIN_ROW_NEW(level, EXPLAIN_SESSION_FORMAT);
2,419,216✔
1276
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
2,419,216✔
1277
      if (pResNode->pExecInfo) {
2,419,216✔
1278
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
467,934✔
1279
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
467,934✔
1280
      }
1281
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pSessNode->window.pFuncs));
2,419,216✔
1282
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,419,216✔
1283
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->totalRowSize);
2,419,216✔
1284
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
2,419,216✔
1285
      EXPLAIN_ROW_END();
2,419,216✔
1286
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
2,419,216✔
1287

1288
      if (verbose) {
2,419,216✔
1289
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,450,819✔
1290
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
1,450,819✔
1291
                           nodesGetOutputNumFromSlotList(pSessNode->window.node.pOutputDataBlockDesc->pSlots));
1292
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,450,819✔
1293
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->outputRowSize);
1,450,819✔
1294
        EXPLAIN_ROW_APPEND_LIMIT(pSessNode->window.node.pLimit);
1,450,819✔
1295
        EXPLAIN_ROW_APPEND_SLIMIT(pSessNode->window.node.pSlimit);
1,450,819✔
1296
        EXPLAIN_ROW_END();
1,450,819✔
1297
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,450,819✔
1298

1299
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_WINDOW_FORMAT, pSessNode->gap);
1,450,819✔
1300
        EXPLAIN_ROW_END();
1,450,819✔
1301
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,450,819✔
1302

1303
        if (pSessNode->window.node.pConditions) {
1,450,819✔
1304
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1305
          QRY_ERR_RET(nodesNodeToSQL(pSessNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1306
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1307
          EXPLAIN_ROW_END();
×
1308
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1309
        }
1310
      }
1311
      break;
2,419,216✔
1312
    }
1313
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE: {
1,568,796✔
1314
      SStateWindowPhysiNode *pStateNode = (SStateWindowPhysiNode *)pNode;
1,568,796✔
1315

1316
      EXPLAIN_ROW_NEW(level, EXPLAIN_STATE_WINDOW_FORMAT,
1,568,796✔
1317
                      nodesGetNameFromColumnNode(pStateNode->pStateKey));
1318
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,568,796✔
1319
      if (pResNode->pExecInfo) {
1,568,796✔
1320
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
266,591✔
1321
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
266,591✔
1322
      }
1323

1324
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pStateNode->window.pFuncs));
1,568,796✔
1325
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,568,796✔
1326
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,568,796✔
1327
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,568,796✔
1328
      EXPLAIN_ROW_END();
1,568,796✔
1329
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,568,796✔
1330

1331
      if (verbose) {
1,568,796✔
1332
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
935,974✔
1333
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
935,974✔
1334
                           nodesGetOutputNumFromSlotList(pStateNode->window.node.pOutputDataBlockDesc->pSlots));
1335
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
935,974✔
1336
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->outputRowSize);
935,974✔
1337
        EXPLAIN_ROW_APPEND_LIMIT(pStateNode->window.node.pLimit);
935,974✔
1338
        EXPLAIN_ROW_APPEND_SLIMIT(pStateNode->window.node.pSlimit);
935,974✔
1339
        EXPLAIN_ROW_END();
935,974✔
1340
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
935,974✔
1341

1342
        EXPLAIN_ROW_END();
935,974✔
1343
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
935,974✔
1344

1345
        if (pStateNode->window.node.pConditions) {
935,974✔
1346
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1347
          QRY_ERR_RET(nodesNodeToSQL(pStateNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1348
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1349
          EXPLAIN_ROW_END();
×
1350
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1351
        }
1352
      }
1353
      break;
1,568,796✔
1354
    }
1355
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
7,702,142✔
1356
      SPartitionPhysiNode *pPartNode = (SPartitionPhysiNode *)pNode;
7,702,142✔
1357

1358
      SNode *p = nodesListGetNode(pPartNode->pPartitionKeys, 0);
7,702,142✔
1359
      EXPLAIN_ROW_NEW(level, EXPLAIN_PARITION_FORMAT, nodesGetNameFromColumnNode(p));
7,702,142✔
1360
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
7,702,142✔
1361
      if (pResNode->pExecInfo) {
7,702,142✔
1362
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,270,503✔
1363
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,270,503✔
1364
      }
1365
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->totalRowSize);
7,702,142✔
1366

1367
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
7,702,142✔
1368
      EXPLAIN_ROW_END();
7,702,142✔
1369
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
7,702,142✔
1370

1371
      if (verbose) {
7,702,142✔
1372
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,209,035✔
1373
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
4,209,035✔
1374
                           nodesGetOutputNumFromSlotList(pPartNode->node.pOutputDataBlockDesc->pSlots));
1375
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,209,035✔
1376
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->outputRowSize);
4,209,035✔
1377
        EXPLAIN_ROW_APPEND_LIMIT(pPartNode->node.pLimit);
4,209,035✔
1378
        EXPLAIN_ROW_APPEND_SLIMIT(pPartNode->node.pSlimit);
4,209,035✔
1379
        EXPLAIN_ROW_END();
4,209,035✔
1380
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,209,035✔
1381

1382
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
4,209,035✔
1383
        EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pPartNode->pPartitionKeys->length);
4,209,035✔
1384
        EXPLAIN_ROW_END();
4,209,035✔
1385
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,209,035✔
1386

1387
        if (pPartNode->node.pConditions) {
4,209,035✔
1388
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1389
          QRY_ERR_RET(nodesNodeToSQL(pPartNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1390
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1391
          EXPLAIN_ROW_END();
×
1392
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1393
        }
1394
      }
1395
      break;
7,702,142✔
1396
    }
1397
    case QUERY_NODE_PHYSICAL_PLAN_MERGE: {
11,807,258✔
1398
      SMergePhysiNode *pMergeNode = (SMergePhysiNode *)pNode;
11,807,258✔
1399
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_FORMAT);
11,807,258✔
1400
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
11,807,258✔
1401
      if (pResNode->pExecInfo) {
11,807,258✔
1402
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
709,661✔
1403
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
709,661✔
1404
      }
1405

1406
      SDataBlockDescNode *pDescNode = pMergeNode->node.pOutputDataBlockDesc;
11,807,258✔
1407
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
11,807,258✔
1408
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
11,807,258✔
1409
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
11,807,258✔
1410
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
11,807,258✔
1411
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pMergeNode->node.inputTsOrder));
11,807,258✔
1412
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
11,807,258✔
1413
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pMergeNode->node.outputTsOrder));
11,807,258✔
1414
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
11,807,258✔
1415
      EXPLAIN_ROW_APPEND(EXPLAIN_MERGE_MODE_FORMAT, EXPLAIN_MERGE_MODE_STRING(pMergeNode->type));
11,807,258✔
1416
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
11,807,258✔
1417
      EXPLAIN_ROW_END();
11,807,258✔
1418
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
11,807,258✔
1419

1420
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
11,807,258✔
1421
        if (MERGE_TYPE_SORT == pMergeNode->type) {
709,661✔
1422
          // sort method
1423
          EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
709,661✔
1424

1425
          int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
709,661✔
1426
          SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
709,661✔
1427
          SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
709,661✔
1428
          EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
709,661✔
1429
          if (pExecInfo->sortBuffer > 1024 * 1024) {
709,661✔
1430
            EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
2,823✔
1431
          } else if (pExecInfo->sortBuffer > 1024) {
706,838✔
1432
            EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
706,838✔
1433
          } else {
1434
            EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
×
1435
          }
1436

1437
          EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
709,661✔
1438
          EXPLAIN_ROW_END();
709,661✔
1439
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
709,661✔
1440
        }
1441
      }
1442

1443
      if (verbose) {
11,807,258✔
1444
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,748,599✔
1445
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
4,748,599✔
1446
                           nodesGetOutputNumFromSlotList(pMergeNode->node.pOutputDataBlockDesc->pSlots));
1447
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,748,599✔
1448
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pMergeNode->node.pOutputDataBlockDesc->outputRowSize);
4,748,599✔
1449
        EXPLAIN_ROW_APPEND_LIMIT(pMergeNode->node.pLimit);
4,748,599✔
1450
        EXPLAIN_ROW_APPEND_SLIMIT(pMergeNode->node.pSlimit);
4,748,599✔
1451
        EXPLAIN_ROW_END();
4,748,599✔
1452
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,748,599✔
1453

1454
        if (MERGE_TYPE_SORT == pMergeNode->type) {
4,748,599✔
1455
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,748,599✔
1456
          EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pMergeNode->ignoreGroupId ? "true" : "false");
4,748,599✔
1457
          EXPLAIN_ROW_END();
4,748,599✔
1458
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,748,599✔
1459

1460
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGE_KEYS_FORMAT);
4,748,599✔
1461
          if (pMergeNode->groupSort) {
4,748,599✔
1462
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, "_group_id asc");
2,142,277✔
1463
            if (LIST_LENGTH(pMergeNode->pMergeKeys) > 0) {
2,142,277✔
1464
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
1,861,335✔
1465
            }
1466
          }
1467
          for (int32_t i = 0; i < LIST_LENGTH(pMergeNode->pMergeKeys); ++i) {
9,660,229✔
1468
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pMergeNode->pMergeKeys, i);
4,911,630✔
1469
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, nodesGetNameFromColumnNode(ptn->pExpr));
4,911,630✔
1470
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,911,630✔
1471
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, EXPLAIN_ORDER_STRING(ptn->order));
4,911,630✔
1472
            if (i != LIST_LENGTH(pMergeNode->pMergeKeys) - 1) {
4,911,630✔
1473
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
443,973✔
1474
            }
1475
          }
1476
          EXPLAIN_ROW_END();
4,748,599✔
1477
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,748,599✔
1478
        }
1479

1480
        if (pMergeNode->node.pConditions) {
4,748,599✔
1481
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1482
          QRY_ERR_RET(nodesNodeToSQL(pMergeNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1483
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1484
          EXPLAIN_ROW_END();
×
1485
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1486
        }
1487
      }
1488
      break;
11,807,258✔
1489
    }
1490
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN: {
×
1491
      SBlockDistScanPhysiNode *pDistScanNode = (SBlockDistScanPhysiNode *)pNode;
×
1492
      EXPLAIN_ROW_NEW(level, EXPLAIN_DISTBLK_SCAN_FORMAT, pDistScanNode->tableName.tname);
×
1493
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1494
      if (pResNode->pExecInfo) {
×
1495
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1496
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1497
      }
1498
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDistScanNode->pScanCols->length);
×
1499
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1500
      if (pDistScanNode->pScanPseudoCols) {
×
1501
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pDistScanNode->pScanPseudoCols->length);
×
1502
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1503
      }
1504
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->totalRowSize);
×
1505
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1506
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1507
      EXPLAIN_ROW_END();
×
1508
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1509

1510
      if (verbose) {
×
1511
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1512
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1513
                           nodesGetOutputNumFromSlotList(pDistScanNode->node.pOutputDataBlockDesc->pSlots));
1514
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1515
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->outputRowSize);
×
1516
        EXPLAIN_ROW_APPEND_LIMIT(pDistScanNode->node.pLimit);
×
1517
        EXPLAIN_ROW_APPEND_SLIMIT(pDistScanNode->node.pSlimit);
×
1518
        EXPLAIN_ROW_END();
×
1519
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1520

1521
        if (pDistScanNode->node.pConditions) {
×
1522
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1523
          QRY_ERR_RET(nodesNodeToSQL(pDistScanNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1524
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1525
          EXPLAIN_ROW_END();
×
1526
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1527
        }
1528
      }
1529
      break;
×
1530
    }
1531
    case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: {
232,171✔
1532
      SLastRowScanPhysiNode *pLastRowNode = (SLastRowScanPhysiNode *)pNode;
232,171✔
1533
      EXPLAIN_ROW_NEW(level, EXPLAIN_LASTROW_SCAN_FORMAT, pLastRowNode->scan.tableName.tname);
232,171✔
1534
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
232,171✔
1535
      if (pResNode->pExecInfo) {
232,171✔
1536
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
992✔
1537
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
992✔
1538
      }
1539
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pLastRowNode->scan.pScanCols->length);
232,171✔
1540
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
232,171✔
1541
      if (pLastRowNode->scan.pScanPseudoCols) {
232,171✔
1542
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
5,998✔
1543
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
5,998✔
1544
      }
1545
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
232,171✔
1546
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
232,171✔
1547
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
232,171✔
1548
      EXPLAIN_ROW_END();
232,171✔
1549
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
232,171✔
1550

1551
      if (verbose) {
232,171✔
1552
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
158,764✔
1553
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
158,764✔
1554
                           nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
1555
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
158,764✔
1556
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
158,764✔
1557
        EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
158,764✔
1558
        EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
158,764✔
1559
        EXPLAIN_ROW_END();
158,764✔
1560
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
158,764✔
1561

1562
        if (pLastRowNode->scan.node.pConditions) {
158,764✔
1563
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1564
          QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1565
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1566
          EXPLAIN_ROW_END();
×
1567
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1568
        }
1569

1570
        if (qExplainCouldApplyTagIndex(pResNode->pPlan)) {
158,764✔
1571
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TAG_INDEX_FORMAT);
×
1572
          QRY_ERR_RET(nodesNodeToSQL(pResNode->pPlan->pTagIndexCond, tbuf + VARSTR_HEADER_SIZE,
×
1573
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1574
          EXPLAIN_ROW_END();
×
1575
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1576
        }
1577
      }
1578
      break;
232,171✔
1579
    }
1580
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
6,390✔
1581
      STableCountScanPhysiNode *pLastRowNode = (STableCountScanPhysiNode *)pNode;
6,390✔
1582
      char *dbname = pLastRowNode->scan.tableName.dbname;
6,390✔
1583
      char *tbname = pLastRowNode->scan.tableName.tname;
6,390✔
1584
      if (dbname[0] != '\0' && tbname[0] != '\0') {
6,563✔
1585
        char name[TSDB_TABLE_FNAME_LEN];
173✔
1586
        snprintf(name, sizeof(name), "%s.%s", dbname, tbname);
173✔
1587
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, name);
173✔
1588
      } else if (dbname[0] != '\0') {
6,217✔
1589
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, dbname);
173✔
1590
      } else if (tbname[0] != '\0') {
6,044✔
1591
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, tbname);
173✔
1592
      } else {
1593
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, TSDB_INS_TABLE_TABLES);
5,871✔
1594
      }
1595
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
6,390✔
1596
      if (pResNode->pExecInfo) {
6,390✔
1597
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,984✔
1598
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,984✔
1599
      }
1600
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, LIST_LENGTH(pLastRowNode->scan.pScanCols));
6,390✔
1601
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,390✔
1602
      if (pLastRowNode->scan.pScanPseudoCols) {
6,390✔
1603
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
6,390✔
1604
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,390✔
1605
      }
1606
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
6,390✔
1607
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,390✔
1608
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
6,390✔
1609
      EXPLAIN_ROW_END();
6,390✔
1610
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
6,390✔
1611

1612
      if (verbose) {
6,390✔
1613
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
3,968✔
1614
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
3,968✔
1615
                           nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
1616
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,968✔
1617
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
3,968✔
1618
        EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
3,968✔
1619
        EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
3,968✔
1620
        EXPLAIN_ROW_END();
3,968✔
1621
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,968✔
1622

1623
        if (pLastRowNode->scan.node.pConditions) {
3,968✔
1624
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1625
          QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1626
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1627
          EXPLAIN_ROW_END();
×
1628
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1629
        }
1630
      }
1631
      break;
6,390✔
1632
    }
1633
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
39,179✔
1634
      SGroupSortPhysiNode *pSortNode = (SGroupSortPhysiNode *)pNode;
39,179✔
1635
      EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_SORT_FORMAT);
39,179✔
1636
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
39,179✔
1637
      if (pResNode->pExecInfo) {
39,179✔
1638
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1639
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1640
      }
1641

1642
      SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
39,179✔
1643
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
39,179✔
1644
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
39,179✔
1645
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
39,179✔
1646
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
39,179✔
1647
      EXPLAIN_ROW_END();
39,179✔
1648
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
39,179✔
1649

1650
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
39,179✔
1651
        // sort key
1652
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
×
1653
        if (pResNode->pExecInfo) {
×
1654
          for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
×
1655
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
×
1656
            EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
×
1657
          }
1658
        }
1659

1660
        EXPLAIN_ROW_END();
×
1661
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1662

1663
        // sort method
1664
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
×
1665

1666
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
×
1667
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
×
1668
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
×
1669
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
×
1670
        if (pExecInfo->sortBuffer > 1024 * 1024) {
×
1671
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
×
1672
        } else if (pExecInfo->sortBuffer > 1024) {
×
1673
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
1674
        } else {
1675
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
×
1676
        }
1677

1678
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
×
1679
        EXPLAIN_ROW_END();
×
1680
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1681
      }
1682

1683
      if (verbose) {
39,179✔
1684
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1685
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1686
                           nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
1687
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1688
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
×
1689
        EXPLAIN_ROW_APPEND_LIMIT(pSortNode->node.pLimit);
×
1690
        EXPLAIN_ROW_APPEND_SLIMIT(pSortNode->node.pSlimit);
×
1691
        EXPLAIN_ROW_END();
×
1692
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1693

1694
        if (pSortNode->node.pConditions) {
×
1695
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1696
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1697
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1698
          EXPLAIN_ROW_END();
×
1699
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1700
        }
1701
      }
1702
      break;
39,179✔
1703
    }
1704
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL: {
×
1705
      SMergeIntervalPhysiNode *pIntNode = (SMergeIntervalPhysiNode *)pNode;
×
1706
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
×
1707
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1708
      if (pResNode->pExecInfo) {
×
1709
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1710
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1711
      }
1712
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pIntNode->window.pFuncs));
×
1713
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1714
      EXPLAIN_ROW_END();
×
1715
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1716

1717
      if (verbose) {
×
1718
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1719
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1720
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1721
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1722
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
×
1723
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
×
1724
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
×
1725
        EXPLAIN_ROW_END();
×
1726
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1727
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
×
1728
        int64_t time1 = -1;
×
1729
        int64_t time2 = -1;
×
1730
        int32_t code = TSDB_CODE_SUCCESS;
×
1731
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
×
1732
        QRY_ERR_RET(code);
×
1733
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
×
1734
        QRY_ERR_RET(code);
×
1735
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
×
1736
                        time1,
1737
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1738
                        time2,
1739
                        pIntNode->slidingUnit);
1740
        EXPLAIN_ROW_END();
×
1741
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1742

1743
        if (pIntNode->window.node.pConditions) {
×
1744
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1745
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1746
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1747
          EXPLAIN_ROW_END();
×
1748
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1749
        }
1750
      }
1751
      break;
×
1752
    }
1753
    case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC: {
160,508✔
1754
      SInterpFuncPhysiNode *pInterpNode = (SInterpFuncPhysiNode *)pNode;
160,508✔
1755
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERP_FORMAT);
160,508✔
1756
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
160,508✔
1757
      if (pResNode->pExecInfo) {
160,508✔
1758
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
496✔
1759
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
496✔
1760
      }
1761
      if (pInterpNode->pFuncs) {
160,508✔
1762
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pInterpNode->pFuncs->length);
160,508✔
1763
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
160,508✔
1764
      }
1765

1766
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pInterpNode->fillMode));
160,508✔
1767
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
160,508✔
1768

1769
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
160,508✔
1770
      EXPLAIN_ROW_END();
160,508✔
1771
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
160,508✔
1772

1773
      if (verbose) {
160,508✔
1774
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
160,508✔
1775
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
160,508✔
1776
                           nodesGetOutputNumFromSlotList(pInterpNode->node.pOutputDataBlockDesc->pSlots));
1777
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
160,508✔
1778
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pInterpNode->node.pOutputDataBlockDesc->outputRowSize);
160,508✔
1779
        EXPLAIN_ROW_APPEND_LIMIT(pInterpNode->node.pLimit);
160,508✔
1780
        EXPLAIN_ROW_APPEND_SLIMIT(pInterpNode->node.pSlimit);
160,508✔
1781
        EXPLAIN_ROW_END();
160,508✔
1782
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
160,508✔
1783
        if (pInterpNode->pFillValues) {
160,508✔
1784
          SNodeListNode *pValues = (SNodeListNode *)pInterpNode->pFillValues;
37,980✔
1785
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
37,980✔
1786
          SNode  *tNode = NULL;
37,980✔
1787
          int32_t i = 0;
37,980✔
1788
          FOREACH(tNode, pValues->pNodeList) {
75,960✔
1789
            if (i) {
37,980✔
1790
              EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1791
            }
1792
            SValueNode *tValue = (SValueNode *)tNode;
37,980✔
1793
            char       *value = nodesGetStrValueFromNode(tValue);
37,980✔
1794
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
37,980✔
1795
            taosMemoryFree(value);
37,980✔
1796
            ++i;
37,980✔
1797
          }
1798

1799
          EXPLAIN_ROW_END();
37,980✔
1800
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
37,980✔
1801
        }
1802

1803
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_INTERVAL_VALUE_FORMAT, pInterpNode->interval, pInterpNode->intervalUnit);
160,508✔
1804
        EXPLAIN_ROW_END();
160,508✔
1805

1806
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pInterpNode->timeRange.skey, pInterpNode->timeRange.ekey);
160,508✔
1807
        EXPLAIN_ROW_END();
160,508✔
1808
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
160,508✔
1809

1810
        if (pInterpNode->node.pConditions) {
160,508✔
1811
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1812
          QRY_ERR_RET(nodesNodeToSQL(pInterpNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1813
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1814
          EXPLAIN_ROW_END();
×
1815
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1816
        }
1817
      }
1818
      break;
160,508✔
1819
    }
1820
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_EVENT: {
1,772,565✔
1821
      SEventWinodwPhysiNode *pEventNode = (SEventWinodwPhysiNode *)pNode;
1,772,565✔
1822
      EXPLAIN_ROW_NEW(level, EXPLAIN_EVENT_FORMAT);
1,772,565✔
1823
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,772,565✔
1824
      if (pResNode->pExecInfo) {
1,772,565✔
1825
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
348,846✔
1826
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
348,846✔
1827
      }
1828
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pEventNode->window.pFuncs));
1,772,565✔
1829
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,772,565✔
1830
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pEventNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,772,565✔
1831
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,772,565✔
1832
      EXPLAIN_ROW_END();
1,772,565✔
1833
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,772,565✔
1834

1835
      if (verbose) {
1,772,565✔
1836
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_START_FORMAT);
1,107,370✔
1837
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pStartCond, tbuf + VARSTR_HEADER_SIZE,
1,107,370✔
1838
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1839
        EXPLAIN_ROW_END();
1,107,370✔
1840
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,107,370✔
1841

1842
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_END_FORMAT);
1,107,370✔
1843
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pEndCond, tbuf + VARSTR_HEADER_SIZE,
1,107,370✔
1844
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1845
        EXPLAIN_ROW_END();
1,107,370✔
1846
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,107,370✔
1847
      }
1848
      break;
1,772,565✔
1849
    }
1850
    case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN:{
694,561✔
1851
      SHashJoinPhysiNode *pJoinNode = (SHashJoinPhysiNode *)pNode;
694,561✔
1852
      EXPLAIN_ROW_NEW(level, EXPLAIN_JOIN_FORMAT, gJoinTypeStr[pJoinNode->joinType][pJoinNode->subType]);
694,561✔
1853
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
694,561✔
1854
      if (pResNode->pExecInfo) {
694,561✔
1855
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
736✔
1856
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
736✔
1857
      }
1858
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pJoinNode->pTargets->length);
694,561✔
1859
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1860
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->totalRowSize);
694,561✔
1861
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1862
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pJoinNode->node.inputTsOrder));
694,561✔
1863
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1864
      EXPLAIN_ROW_APPEND(EXPLAIN_JOIN_ALGO, "Hash");
694,561✔
1865
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
694,561✔
1866
      EXPLAIN_ROW_END();
694,561✔
1867
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
694,561✔
1868

1869
      if (verbose) {
694,561✔
1870
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
736✔
1871
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
736✔
1872
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
1873
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
736✔
1874
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
736✔
1875
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
736✔
1876
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
736✔
1877
        EXPLAIN_ROW_END();
736✔
1878
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
736✔
1879

1880
        if (pJoinNode->node.pConditions) {
736✔
1881
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1882
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1883
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1884

1885
          EXPLAIN_ROW_END();
×
1886
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1887
        }
1888

1889
        bool conditionsGot = false;
736✔
1890
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
736✔
1891
        if (pJoinNode->pPrimKeyCond) {
736✔
1892
          QRY_ERR_RET(
×
1893
              nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1894
          conditionsGot = true;
×
1895
        }
1896
        if (pJoinNode->pColEqCond) {
736✔
1897
          if (conditionsGot) {
×
1898
            EXPLAIN_ROW_APPEND(" AND ");
×
1899
          }
1900
          QRY_ERR_RET(
×
1901
              nodesNodeToSQL(pJoinNode->pColEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1902
          conditionsGot = true;
×
1903
        }
1904
        if (pJoinNode->pTagEqCond) {
736✔
1905
          if (conditionsGot) {
736✔
1906
            EXPLAIN_ROW_APPEND(" AND ");
×
1907
          }
1908
          QRY_ERR_RET(
736✔
1909
              nodesNodeToSQL(pJoinNode->pTagEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1910
          conditionsGot = true;
736✔
1911
        }
1912
        if (pJoinNode->pFullOnCond) {
736✔
1913
          if (conditionsGot) {
×
1914
            EXPLAIN_ROW_APPEND(" AND ");
×
1915
          }
1916
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE,
×
1917
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1918
        }
1919
        EXPLAIN_ROW_END();
736✔
1920
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
736✔
1921

1922
        if (pJoinNode->timeRangeTarget) {
736✔
1923
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TABLE_TIMERANGE_FORMAT, qExplainGetTimerangeTargetStr(pJoinNode->timeRangeTarget), pJoinNode->timeRange.skey, pJoinNode->timeRange.ekey);
×
1924
          EXPLAIN_ROW_END();
×
1925
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1926
        }
1927
      }
1928
      break;
694,561✔
1929
    }
1930
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE:{
694,561✔
1931
      SGroupCachePhysiNode *pGroupCache = (SGroupCachePhysiNode *)pNode;
694,561✔
1932
      EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_CACHE_FORMAT);
694,561✔
1933
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
694,561✔
1934
      if (pResNode->pExecInfo) {
694,561✔
1935
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
736✔
1936
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
736✔
1937
      }
1938
      EXPLAIN_ROW_APPEND(EXPLAIN_GLOBAL_GROUP_FORMAT, pGroupCache->globalGrp);
694,561✔
1939
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1940
      EXPLAIN_ROW_APPEND(EXPLAIN_GROUP_BY_UID_FORMAT, pGroupCache->grpByUid);
694,561✔
1941
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1942
      EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pGroupCache->batchFetch);
694,561✔
1943
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1944
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pGroupCache->node.pOutputDataBlockDesc->totalRowSize);
694,561✔
1945
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1946
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pGroupCache->node.inputTsOrder));
694,561✔
1947
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1948
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
694,561✔
1949
      EXPLAIN_ROW_END();
694,561✔
1950
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
694,561✔
1951

1952
      if (verbose) {
694,561✔
1953
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
736✔
1954
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
736✔
1955
                           nodesGetOutputNumFromSlotList(pGroupCache->node.pOutputDataBlockDesc->pSlots));
1956
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
736✔
1957
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pGroupCache->node.pOutputDataBlockDesc->outputRowSize);
736✔
1958
        EXPLAIN_ROW_APPEND_LIMIT(pGroupCache->node.pLimit);
736✔
1959
        EXPLAIN_ROW_APPEND_SLIMIT(pGroupCache->node.pSlimit);
736✔
1960
        EXPLAIN_ROW_END();
736✔
1961
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
736✔
1962

1963
        if (pGroupCache->node.pConditions) {
736✔
1964
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1965
          QRY_ERR_RET(nodesNodeToSQL(pGroupCache->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1966
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1967
          EXPLAIN_ROW_END();
×
1968
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1969
        }
1970
      }
1971
      break;
694,561✔
1972
    }
1973
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL:{
879,941✔
1974
      SDynQueryCtrlPhysiNode *pDyn = (SDynQueryCtrlPhysiNode *)pNode;
879,941✔
1975
      EXPLAIN_ROW_NEW(level, EXPLAIN_DYN_QRY_CTRL_FORMAT, qExplainGetDynQryCtrlType(pDyn->qType));
879,941✔
1976
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
879,941✔
1977
      if (pResNode->pExecInfo) {
879,941✔
1978
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
736✔
1979
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
736✔
1980
      }
1981
      switch (pDyn->qType) {
879,941✔
1982
        case DYN_QTYPE_STB_HASH: {
694,561✔
1983
          EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pDyn->stbJoin.batchFetch);
694,561✔
1984
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1985
          EXPLAIN_ROW_APPEND(EXPLAIN_VGROUP_SLOT_FORMAT, pDyn->stbJoin.vgSlot[0], pDyn->stbJoin.vgSlot[1]);
694,561✔
1986
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1987
          EXPLAIN_ROW_APPEND(EXPLAIN_UID_SLOT_FORMAT, pDyn->stbJoin.uidSlot[0], pDyn->stbJoin.uidSlot[1]);
694,561✔
1988
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1989
          EXPLAIN_ROW_APPEND(EXPLAIN_SRC_SCAN_FORMAT, pDyn->stbJoin.srcScan[0], pDyn->stbJoin.srcScan[1]);
694,561✔
1990
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1991
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
694,561✔
1992
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1993
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
694,561✔
1994
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
694,561✔
1995
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
694,561✔
1996
          break;
694,561✔
1997
        }
1998
        case DYN_QTYPE_VTB_AGG: {
106,444✔
1999
          EXPLAIN_ROW_APPEND(EXPLAIN_HAS_PARTITION_FORMAT, pDyn->vtbScan.hasPartition);
106,444✔
2000
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
106,444✔
2001
          EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_PROCESS_CHILD_FORMAT, pDyn->vtbScan.batchProcessChild);
106,444✔
2002
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
106,444✔
2003
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
106,444✔
2004
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
106,444✔
2005

2006
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
106,444✔
2007
          break;
106,444✔
2008
        }
2009
        case DYN_QTYPE_VTB_SCAN: {
55,016✔
2010
          EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDyn->vtbScan.pScanCols->length);
55,016✔
2011
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
55,016✔
2012
          EXPLAIN_ROW_APPEND(EXPLAIN_ORIGIN_VGROUP_NUM_FORMAT, pDyn->vtbScan.pOrgVgIds->length);
55,016✔
2013
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
55,016✔
2014
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
55,016✔
2015
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
55,016✔
2016
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
55,016✔
2017
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
55,016✔
2018
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
55,016✔
2019
          break;
55,016✔
2020
        }
2021
        case DYN_QTYPE_VTB_WINDOW: {
23,920✔
2022
          EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDyn->vtbWindow.pTargets->length);
23,920✔
2023
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,920✔
2024
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
23,920✔
2025
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,920✔
2026
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
23,920✔
2027
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,920✔
2028
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
23,920✔
2029
          break;
23,920✔
2030
        }
2031
        default:
×
2032
          break;
×
2033
      }
2034

2035
      EXPLAIN_ROW_END();
879,941✔
2036
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
879,941✔
2037

2038
      if (verbose) {
879,941✔
2039
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
50,968✔
2040
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
50,968✔
2041
                           nodesGetOutputNumFromSlotList(pDyn->node.pOutputDataBlockDesc->pSlots));
2042
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
50,968✔
2043
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->outputRowSize);
50,968✔
2044
        EXPLAIN_ROW_APPEND_LIMIT(pDyn->node.pLimit);
50,968✔
2045
        EXPLAIN_ROW_APPEND_SLIMIT(pDyn->node.pSlimit);
50,968✔
2046
        EXPLAIN_ROW_END();
50,968✔
2047
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
50,968✔
2048

2049
        if (pDyn->node.pConditions) {
50,968✔
2050
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2051
          QRY_ERR_RET(nodesNodeToSQL(pDyn->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2052
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2053
          EXPLAIN_ROW_END();
×
2054
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2055
        }
2056
      }
2057
      break;
879,941✔
2058
    }
2059
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT: {
1,543,467✔
2060
      SCountWindowPhysiNode *pCountNode = (SCountWindowPhysiNode *)pNode;
1,543,467✔
2061
      EXPLAIN_ROW_NEW(level, EXPLAIN_COUNT_FORMAT);
1,543,467✔
2062
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,543,467✔
2063
      if (pResNode->pExecInfo) {
1,543,467✔
2064
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
266,591✔
2065
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
266,591✔
2066
      }
2067
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pCountNode->window.pFuncs));
1,543,467✔
2068
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,543,467✔
2069
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pCountNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,543,467✔
2070
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,543,467✔
2071
      EXPLAIN_ROW_END();
1,543,467✔
2072
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,543,467✔
2073

2074
      if (verbose) {
1,543,467✔
2075
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_NUM_FORMAT, pCountNode->windowCount);
949,885✔
2076
        EXPLAIN_ROW_END();
949,885✔
2077
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
949,885✔
2078
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_SLIDING_FORMAT, pCountNode->windowSliding);
949,885✔
2079
        EXPLAIN_ROW_END();
949,885✔
2080
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
949,885✔
2081
      }
2082
      break;
1,543,467✔
2083
    }
2084
    case QUERY_NODE_PHYSICAL_PLAN_EXTERNAL_WINDOW: {
×
2085
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
×
2086
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
×
2087
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
2088
      if (pResNode->pExecInfo) {
×
2089
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2090
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2091
      }
2092
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pExternal->window.pFuncs));
×
2093
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2094
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
×
2095
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2096
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
×
2097
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2098
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
×
2099
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2100
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2101
      EXPLAIN_ROW_END();
×
2102
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
2103

2104
      if (verbose) {
×
2105
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
2106
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
2107
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2108
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2109
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
×
2110
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
×
2111
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
×
2112
        EXPLAIN_ROW_END();
×
2113
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2114
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pExternal->timeRange.skey, pExternal->timeRange.ekey);
×
2115
        EXPLAIN_ROW_END();
×
2116
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2117

2118
        if (pExternal->window.node.pConditions) {
×
2119
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2120
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2121
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2122
          EXPLAIN_ROW_END();
×
2123
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2124
        }
2125

2126
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
×
2127
        EXPLAIN_ROW_END();
×
2128
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2129
      }
2130
      break;
×
2131
    }
2132
    case QUERY_NODE_PHYSICAL_PLAN_HASH_EXTERNAL: {
23,920✔
2133
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
23,920✔
2134
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
23,920✔
2135
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
23,920✔
2136
      if (pResNode->pExecInfo) {
23,920✔
2137
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2138
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2139
      }
2140
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pExternal->window.pFuncs));
23,920✔
2141
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,920✔
2142
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
23,920✔
2143
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,920✔
2144
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
23,920✔
2145
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,920✔
2146
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
23,920✔
2147
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,920✔
2148
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
23,920✔
2149
      EXPLAIN_ROW_END();
23,920✔
2150
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
23,920✔
2151

2152
      if (verbose) {
23,920✔
2153
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
23,920✔
2154
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
23,920✔
2155
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2156
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,920✔
2157
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
23,920✔
2158
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
23,920✔
2159
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
23,920✔
2160
        EXPLAIN_ROW_END();
23,920✔
2161
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
23,920✔
2162
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pExternal->timeRange.skey, pExternal->timeRange.ekey);
23,920✔
2163
        EXPLAIN_ROW_END();
23,920✔
2164
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
23,920✔
2165

2166
        if (pExternal->window.node.pConditions) {
23,920✔
2167
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2168
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2169
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2170
          EXPLAIN_ROW_END();
×
2171
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2172
        }
2173

2174
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
23,920✔
2175
        EXPLAIN_ROW_END();
23,920✔
2176
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
23,920✔
2177
      }
2178
      break;
23,920✔
2179
    }
2180
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_EXTERNAL: {
×
2181
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
×
2182
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_ALIGNED_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
×
2183
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
2184
      if (pResNode->pExecInfo) {
×
2185
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2186
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2187
      }
2188
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pExternal->window.pFuncs));
×
2189
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2190
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
×
2191
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2192
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
×
2193
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2194
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
×
2195
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2196
      EXPLAIN_ROW_END();
×
2197
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
2198

2199
      if (verbose) {
×
2200
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
2201
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
2202
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2203
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2204
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
×
2205
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
×
2206
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
×
2207
        EXPLAIN_ROW_END();
×
2208
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2209

2210
        if (pExternal->window.node.pConditions) {
×
2211
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2212
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2213
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2214
          EXPLAIN_ROW_END();
×
2215
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2216
        }
2217

2218
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
×
2219
        EXPLAIN_ROW_END();
×
2220
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2221
      }
2222
      break;
×
2223
    }
2224
    default:
×
2225
      qError("not supported physical node type %d", pNode->type);
×
2226
      return TSDB_CODE_APP_ERROR;
×
2227
  }
2228

2229
  return TSDB_CODE_SUCCESS;
369,937,996✔
2230
}
2231

2232
static int32_t qExplainResNodeToRows(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t *level) {
369,937,996✔
2233
  if (NULL == pResNode) {
369,937,996✔
2234
    qError("explain res node is NULL");
×
2235
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2236
  }
2237

2238
  int32_t code = 0;
369,937,996✔
2239
  QRY_ERR_RET(qExplainResNodeToRowsImpl(pResNode, ctx, level));
369,937,996✔
2240

2241
  SNode *pNode = NULL;
369,937,996✔
2242
  FOREACH(pNode, pResNode->pChildren) { 
572,517,651✔
2243
    int32_t nlevel = *level + 1;
202,579,655✔
2244
    QRY_ERR_RET(qExplainResNodeToRows((SExplainResNode *)pNode, ctx, &nlevel)); 
202,579,655✔
2245
  }
2246

2247
  return TSDB_CODE_SUCCESS;
369,937,996✔
2248
}
2249

2250
static int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t *level, bool grpSingleChannel) {
167,358,341✔
2251
  SExplainResNode *node = NULL;
167,358,341✔
2252
  int32_t          code = 0;
167,358,341✔
2253
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
167,358,341✔
2254

2255
  SExplainGroup *group = taosHashGet(ctx->pCurrPlanCtx->groupHash, &groupId, sizeof(groupId));
167,358,341✔
2256
  if (NULL == group) {
167,358,341✔
2257
    qError("group %d not in groupHash", groupId);
×
2258
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2259
  }
2260

2261
  group->singleChannel = grpSingleChannel;
167,358,341✔
2262
  group->physiPlanExecIdx = 0;
167,358,341✔
2263

2264
  QRY_ERR_RET(qExplainGenerateResNode(group->plan, group->plan->pNode, group, &node));
167,358,341✔
2265

2266
  QRY_ERR_JRET(qExplainResNodeToRows(node, ctx, level));
167,358,341✔
2267

2268
_return:
167,358,341✔
2269

2270
  qExplainFreeResNode(node);
167,358,341✔
2271

2272
  QRY_RET(code);
167,358,341✔
2273
}
2274

2275
static int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
34,258,974✔
2276
  int32_t      code = 0;
34,258,974✔
2277
  SSDataBlock *pBlock = NULL;
34,258,974✔
2278
  SExplainCtx *pCtx = (SExplainCtx *)ctx;
34,258,974✔
2279
  int32_t      rowNum = taosArrayGetSize(pCtx->rows);
34,258,974✔
2280
  if (rowNum <= 0) {
34,258,974✔
2281
    qError("empty explain res rows");
×
2282
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2283
  }
2284

2285
  code = createDataBlock(&pBlock);
34,258,974✔
2286
  QRY_ERR_JRET(code);
34,258,974✔
2287

2288
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, TSDB_EXPLAIN_RESULT_ROW_SIZE, 1);
34,258,974✔
2289
  QRY_ERR_JRET(blockDataAppendColInfo(pBlock, &infoData));
34,258,974✔
2290
  QRY_ERR_JRET(blockDataEnsureCapacity(pBlock, rowNum));
34,258,974✔
2291

2292
  SColumnInfoData *pInfoData = taosArrayGet(pBlock->pDataBlock, 0);
34,258,974✔
2293

2294
  for (int32_t i = 0; i < rowNum; ++i) {
931,954,720✔
2295
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
897,695,746✔
2296
    QRY_ERR_JRET(colDataSetVal(pInfoData, i, row->buf, false));
897,695,746✔
2297
  }
2298

2299
  pBlock->info.rows = rowNum;
34,258,974✔
2300

2301
  size_t dataEncodeBufSize = blockGetEncodeSize(pBlock);
34,258,974✔
2302
  int32_t rspSize = sizeof(SRetrieveTableRsp) + dataEncodeBufSize + PAYLOAD_PREFIX_LEN;
34,258,974✔
2303

2304
  SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, rspSize);
34,258,974✔
2305
  if (NULL == rsp) {
34,258,974✔
2306
    qError("malloc SRetrieveTableRsp failed, size:%d", rspSize);
×
2307
    QRY_ERR_JRET(terrno);
×
2308
  }
2309

2310
  rsp->completed = 1;
34,258,974✔
2311
  rsp->numOfRows = htobe64((int64_t)rowNum);
34,258,974✔
2312

2313
  int32_t len = blockEncode(pBlock, rsp->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, taosArrayGetSize(pBlock->pDataBlock));
34,258,974✔
2314
  if(len < 0) {
34,258,974✔
2315
    qError("qExplainGetRspFromCtx: blockEncode failed");
×
2316
    QRY_ERR_JRET(terrno);
×
2317
  }
2318

2319
  rsp->compLen = htonl(len);
34,258,974✔
2320
  rsp->payloadLen = htonl(len);
34,258,974✔
2321
  rsp->compressed = 0;
34,258,974✔
2322

2323
  SET_PAYLOAD_LEN(rsp->data, len, len);
34,258,974✔
2324

2325
_return:
34,258,974✔
2326
  blockDataDestroy(pBlock);
34,258,974✔
2327

2328
  *pRsp = rsp;
34,258,974✔
2329
  QRY_RET(code);
34,258,974✔
2330
}
2331

2332
static int32_t qExplainBuildPlanCtx(SQueryPlan *pDag, SExplainPlanCtx *pCtx) {
114,609,384✔
2333
  int32_t        code = 0;
114,609,384✔
2334
  SNodeListNode *plans = NULL;
114,609,384✔
2335
  int32_t        taskNum = 0;
114,609,384✔
2336
  SExplainGroup *pGroup = NULL;
114,609,384✔
2337

2338
  if (pDag->numOfSubplans <= 0) {
114,609,384✔
2339
    qError("invalid subplan num:%d", pDag->numOfSubplans);
×
2340
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2341
  }
2342

2343
  int32_t levelNum = (int32_t)LIST_LENGTH(pDag->pSubplans);
114,609,384✔
2344
  if (levelNum <= 0) {
114,609,384✔
2345
    qError("invalid level num:%d", levelNum);
×
2346
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2347
  }
2348

2349
  pCtx->groupHash =
114,609,384✔
2350
      taosHashInit(EXPLAIN_MAX_GROUP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
114,609,384✔
2351
  if (NULL == pCtx->groupHash) {
114,609,384✔
2352
    qError("groupHash %d failed", EXPLAIN_MAX_GROUP_NUM);
×
2353
    QRY_ERR_RET(terrno);
×
2354
  }
2355

2356
  int32_t i = 0;
114,609,384✔
2357
  SNode*  levelNode = NULL;
114,609,384✔
2358
  FOREACH(levelNode, pDag->pSubplans) {
275,216,584✔
2359
    plans = (SNodeListNode *)levelNode;
160,607,200✔
2360
    if (NULL == plans) {
160,607,200✔
2361
      qError("empty level plan, level:%d", i);
×
2362
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2363
    }
2364

2365
    taskNum = (int32_t)LIST_LENGTH(plans->pNodeList);
160,607,200✔
2366
    if (taskNum <= 0) {
160,607,200✔
2367
      qError("invalid level plan number:%d, level:%d", taskNum, i);
×
2368
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2369
    }
2370

2371
    SSubplan *plan = NULL;
160,607,200✔
2372
    int32_t   n = 0;
160,607,200✔
2373
    SNode*    taskNode = NULL;
160,607,200✔
2374
    FOREACH(taskNode, plans->pNodeList) {
381,553,540✔
2375
      plan = (SSubplan *)taskNode;
220,946,340✔
2376
      pGroup = taosHashGet(pCtx->groupHash, &plan->id.groupId, sizeof(plan->id.groupId));
220,946,340✔
2377
      if (pGroup) {
220,946,340✔
2378
        ++pGroup->nodeNum;
39,931,669✔
2379
        ++n;
39,931,669✔
2380
        continue;
39,931,669✔
2381
      }
2382

2383
      SExplainGroup group = {0};
181,014,671✔
2384
      group.nodeNum = 1;
181,014,671✔
2385
      group.plan = plan;
181,014,671✔
2386

2387
      if (0 != taosHashPut(pCtx->groupHash, &plan->id.groupId, sizeof(plan->id.groupId), &group, sizeof(group))) {
181,014,671✔
2388
        qError("taosHashPut to explainGroupHash failed, taskIdx:%d", n);
×
2389
        QRY_ERR_JRET(terrno);
×
2390
      }
2391
      ++n;
181,014,671✔
2392
    }
2393

2394
    if (0 == i) {
160,607,200✔
2395
      if (taskNum > 1) {
114,609,384✔
2396
        qError("invalid taskNum %d for level 0", taskNum);
×
2397
        QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2398
      }
2399

2400
      pCtx->rootGroupId = plan->id.groupId;
114,609,384✔
2401
    }
2402

2403
    qDebug("level %d group handled, taskNum:%d", i, taskNum);
160,607,200✔
2404
    ++i;
160,607,200✔
2405
  }
2406

2407
  pCtx->groupNum = taosHashGetSize(pCtx->groupHash);
114,609,384✔
2408

2409
  return TSDB_CODE_SUCCESS;
114,609,384✔
2410

2411
_return:
×
2412

2413
  if (code) {
×
2414
    qError("QID:0x%" PRIx64 " %s failed since %s", pDag->queryId, __func__, tstrerror(code));
×
2415
  }
2416
  
2417
  QRY_RET(code);
×
2418
}
2419

2420
static int32_t qExplainBuildCtx(SQueryPlan *pDag, SExplainCtx **pCtx) {
37,921,692✔
2421
  int32_t        code = 0;
37,921,692✔
2422
  SNodeListNode *plans = NULL;
37,921,692✔
2423
  int32_t        taskNum = 0;
37,921,692✔
2424
  SExplainGroup *pGroup = NULL;
37,921,692✔
2425
  SExplainCtx   *ctx = NULL;
37,921,692✔
2426

2427
  if (pDag->numOfSubplans <= 0) {
37,921,692✔
2428
    qError("invalid subplan num:%d", pDag->numOfSubplans);
×
2429
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2430
  }
2431

2432
  int32_t levelNum = (int32_t)LIST_LENGTH(pDag->pSubplans);
37,921,692✔
2433
  if (levelNum <= 0) {
37,921,692✔
2434
    qError("invalid level num:%d", levelNum);
×
2435
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2436
  }
2437

2438
  QRY_ERR_JRET(qExplainInitCtx(&ctx, pDag->explainInfo.verbose, pDag->explainInfo.ratio, pDag->explainInfo.mode));
37,921,692✔
2439

2440
  QRY_ERR_JRET(qExplainBuildPlanCtx(pDag, &ctx->planCtx));
37,921,692✔
2441
  ctx->groupNum = ctx->planCtx.groupNum;
37,921,692✔
2442

2443
  if (pDag->pChildren && pDag->pChildren->length > 0) {
37,921,692✔
2444
    ctx->subPlanCtxs = taosArrayInit_s(sizeof(SExplainPlanCtx), pDag->pChildren->length);
25,133,172✔
2445
    if (NULL == ctx->subPlanCtxs) {
25,133,172✔
2446
      qError("taosArrayInit %d explainPlanCtx failed, error:%s", pDag->pChildren->length, tstrerror(terrno));
×
2447
      QRY_ERR_JRET(terrno);
×
2448
    }
2449
    
2450
    SNode* pNode = NULL;
25,133,172✔
2451
    int32_t i = 0;
25,133,172✔
2452
    FOREACH(pNode, pDag->pChildren) {
101,820,864✔
2453
      SExplainPlanCtx* pSub = taosArrayGet(ctx->subPlanCtxs, i);
76,687,692✔
2454
      QRY_ERR_JRET(qExplainBuildPlanCtx((SQueryPlan*)pNode, pSub));
76,687,692✔
2455
      ctx->groupNum += pSub->groupNum;
76,687,692✔
2456
      i++;
76,687,692✔
2457
    }
2458
  }
2459

2460
  *pCtx = ctx;
37,921,692✔
2461

2462
  return TSDB_CODE_SUCCESS;
37,921,692✔
2463

2464
_return:
×
2465

2466
  qExplainFreeCtx(ctx);
×
2467

2468
  QRY_RET(code);
×
2469
}
2470

2471
static int32_t qExplainAppendPlanRows(SExplainCtx *pCtx) {
34,258,974✔
2472
  if (EXPLAIN_MODE_ANALYZE != pCtx->mode) {
34,258,974✔
2473
    return TSDB_CODE_SUCCESS;
28,309,748✔
2474
  }
2475

2476
  int32_t tlen = 0;
5,949,226✔
2477
  char   *tbuf = pCtx->tbuf;
5,949,226✔
2478

2479
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_RATIO_TIME_FORMAT, pCtx->ratio);
5,949,226✔
2480
  EXPLAIN_SUM_ROW_END();
5,949,226✔
2481
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
5,949,226✔
2482

2483
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_PLANNING_TIME_FORMAT, (double)(pCtx->jobStartTs - pCtx->reqStartTs) / 1000.0);
5,949,226✔
2484
  EXPLAIN_SUM_ROW_END();
5,949,226✔
2485
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
5,949,226✔
2486

2487
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_EXEC_TIME_FORMAT, (double)(pCtx->jobDoneTs - pCtx->jobStartTs) / 1000.0);
5,949,226✔
2488
  EXPLAIN_SUM_ROW_END();
5,949,226✔
2489
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
5,949,226✔
2490

2491
  return TSDB_CODE_SUCCESS;
5,949,226✔
2492
}
2493

2494
static int32_t qExplainGenerateRsp(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
34,258,974✔
2495
  int32_t level = 0;
34,258,974✔
2496
  
2497
  pCtx->currPlanId = -1;
34,258,974✔
2498
  pCtx->pCurrPlanCtx = &pCtx->planCtx;
34,258,974✔
2499
  QRY_ERR_RET(qExplainAppendGroupResRows(pCtx, pCtx->pCurrPlanCtx->rootGroupId, &level, false));
34,258,974✔
2500
  
2501
  if (pCtx->subPlanCtxs) {
34,258,974✔
2502
    int32_t subNum = taosArrayGetSize(pCtx->subPlanCtxs);
21,473,398✔
2503
    for (pCtx->currPlanId = subNum - 1; pCtx->currPlanId >= 0; --pCtx->currPlanId) {
86,832,725✔
2504
      pCtx->pCurrPlanCtx = taosArrayGet(pCtx->subPlanCtxs, pCtx->currPlanId);
65,359,327✔
2505
      level = 0;
65,359,327✔
2506
      QRY_ERR_RET(qExplainAppendGroupResRows(pCtx, pCtx->pCurrPlanCtx->rootGroupId, &level, false));
65,359,327✔
2507
    }
2508
  }
2509
  QRY_ERR_RET(qExplainAppendPlanRows(pCtx));
34,258,974✔
2510
  QRY_ERR_RET(qExplainGetRspFromCtx(pCtx, pRsp));
34,258,974✔
2511

2512
  return TSDB_CODE_SUCCESS;
34,258,974✔
2513
}
2514

2515
void qExplainSetCurrPlan(SExplainCtx *pCtx, int32_t subJobId) {
41,760,555✔
2516
  pCtx->currPlanId = subJobId;
41,760,555✔
2517
  pCtx->pCurrPlanCtx = EXPLAIN_GET_CUR_PLAN_CTX(pCtx);
41,760,923✔
2518
}
41,755,938✔
2519

2520
int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t groupId, SRetrieveTableRsp **pRsp) {
41,758,261✔
2521
  if(!pCtx || !pRspMsg || !pRsp) return TSDB_CODE_INVALID_PARA;
41,758,261✔
2522
  SExplainResNode *node = NULL;
41,766,667✔
2523
  int32_t          code = 0;
41,766,667✔
2524
  bool             groupDone = false;
41,766,667✔
2525
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
41,766,667✔
2526

2527
  SExplainGroup *group = taosHashGet(ctx->pCurrPlanCtx->groupHash, &groupId, sizeof(groupId));
41,766,667✔
2528
  if (NULL == group) {
41,768,237✔
UNCOV
2529
    qError("group %d not in groupHash", groupId);
×
UNCOV
2530
    tFreeSExplainRsp(pRspMsg);
×
UNCOV
2531
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2532
  }
2533

2534
  taosWLockLatch(&group->lock);
41,768,237✔
2535
  if (NULL == group->nodeExecInfo) {
41,768,896✔
2536
    group->nodeExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainRsp));
36,349,481✔
2537
    if (NULL == group->nodeExecInfo) {
36,351,725✔
2538
      qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
×
2539
      code = terrno;
×
2540
      TAOS_CHECK_ERRNO(code);
×
2541
    }
2542

2543
    group->physiPlanExecNum = pRspMsg->numOfPlans;
36,350,341✔
2544
  } else if (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum) {
5,419,415✔
2545
    qError("group execInfo already full, size:%d, nodeNum:%d", (int32_t)taosArrayGetSize(group->nodeExecInfo),
×
2546
           group->nodeNum);
2547
    code = TSDB_CODE_APP_ERROR;
×
2548
    TAOS_CHECK_ERRNO(code);
×
2549
  }
2550

2551
  if (group->physiPlanExecNum != pRspMsg->numOfPlans) {
41,771,109✔
2552
    qError("physiPlanExecNum %d mismatch with others %d in group %d", pRspMsg->numOfPlans, group->physiPlanExecNum,
×
2553
           groupId);
2554
    code = TSDB_CODE_APP_ERROR;
×
2555
    TAOS_CHECK_ERRNO(code);
×
2556
  }
2557

2558
  if(taosArrayPush(group->nodeExecInfo, pRspMsg) == NULL)
83,539,595✔
2559
  {
2560
    code = terrno;
×
2561
    TAOS_CHECK_ERRNO(code);
×
2562
  }
2563

2564
  groupDone = (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum);
41,768,486✔
2565

2566
  taosWUnLockLatch(&group->lock);
41,768,747✔
2567

2568
  if (groupDone && (pCtx->groupNum == atomic_add_fetch_32(&pCtx->groupDoneNum, 1))) {
41,772,232✔
2569
    if (atomic_load_8((int8_t *)&pCtx->execDone)) {
5,949,226✔
2570
      if (0 == taosWTryLockLatch(&pCtx->lock)) {
15,004✔
2571
        QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
15,004✔
2572
        // LEAVE LOCK THERE
2573
      }
2574
    }
2575
  }
2576

2577
  return TSDB_CODE_SUCCESS;
41,767,978✔
2578

2579
_exit:
×
2580
  tFreeSExplainRsp(pRspMsg);
×
2581
  taosWUnLockLatch(&group->lock);
×
2582
  return code;
×
2583
}
2584

2585
int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp) {
28,309,748✔
2586
  if (!pDag || !pRsp) return TSDB_CODE_INVALID_PARA;
28,309,748✔
2587
  int32_t      code = 0;
28,309,748✔
2588
  SExplainCtx *pCtx = NULL;
28,309,748✔
2589

2590
  QRY_ERR_RET(qExplainBuildCtx(pDag, &pCtx));
28,309,748✔
2591
  QRY_ERR_JRET(qExplainGenerateRsp(pCtx, pRsp));
28,309,748✔
2592

2593
_return:
28,309,748✔
2594
  qExplainFreeCtx(pCtx);
28,309,748✔
2595
  QRY_RET(code);
28,309,748✔
2596
}
2597

2598
int32_t qExecExplainBegin(SQueryPlan *pDag, SExplainCtx **pCtx, int64_t startTs) {
9,611,944✔
2599
  if(!pDag || !pCtx) return TSDB_CODE_INVALID_PARA;
9,611,944✔
2600
  QRY_ERR_RET(qExplainBuildCtx(pDag, pCtx));
9,611,944✔
2601

2602
  (*pCtx)->reqStartTs = startTs;
9,611,944✔
2603
  (*pCtx)->jobStartTs = taosGetTimestampUs();
11,257,080✔
2604

2605
  return TSDB_CODE_SUCCESS;
9,611,944✔
2606
}
2607

2608
int32_t qExecExplainEnd(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
5,949,226✔
2609
  if(!pCtx || !pRsp) {
5,949,226✔
2610
    return TSDB_CODE_INVALID_PARA;
×
2611
  }
2612
  
2613
  int32_t code = 0;
5,949,226✔
2614
  pCtx->jobDoneTs = taosGetTimestampUs();
5,949,226✔
2615

2616
  atomic_store_8((int8_t *)&pCtx->execDone, true);
5,949,226✔
2617

2618
  if (pCtx->groupNum == atomic_load_32(&pCtx->groupDoneNum)) {
5,949,226✔
2619
    if (0 == taosWTryLockLatch(&pCtx->lock)) {
5,934,222✔
2620
      QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
5,934,222✔
2621
      // LEAVE LOCK THERE
2622
    }
2623
  }
2624

2625
  return TSDB_CODE_SUCCESS;
5,949,226✔
2626
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc