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

taosdata / TDengine / #4894

22 Dec 2025 09:33AM UTC coverage: 65.72% (+0.2%) from 65.57%
#4894

push

travis-ci

web-flow
Update README.md (#34007)

* Update README.md

* docs: update table of contents and improve installation instructions in README

* docs: adjust words

---------

Signed-off-by: WANG Xu <feici02@outlook.com>
Co-authored-by: WANG Xu <feici02@outlook.com>

184394 of 280577 relevant lines covered (65.72%)

111859687.16 hits per line

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

73.28
/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) {
282,118✔
37
  switch (type) {
282,118✔
38
    case DYN_QTYPE_STB_HASH:
282,118✔
39
      return "STable Join";
282,118✔
40
    case DYN_QTYPE_VTB_SCAN:
×
41
      return "Virtual Stable Scan";
×
42
    case DYN_QTYPE_VTB_WINDOW:
×
43
      return "Virtual Table Window";
×
44
    default:
×
45
      break;
×
46
  }
47

48
  return "unknown task";
×
49
}
50

51
char* qExplainGetAsofOpStr(int32_t opType) {
51,408✔
52
  switch (opType) {
51,408✔
53
    case OP_TYPE_GREATER_THAN:
1,836✔
54
      return ">";
1,836✔
55
    case OP_TYPE_GREATER_EQUAL:
8,262✔
56
      return ">=";
8,262✔
57
    case OP_TYPE_LOWER_THAN:
×
58
      return "<";
×
59
    case OP_TYPE_LOWER_EQUAL:
8,262✔
60
      return "<=";
8,262✔
61
    case OP_TYPE_EQUAL:
33,048✔
62
      return "=";
33,048✔
63
    default:
×
64
      return "UNKNOWN";
×
65
  }
66
}
67

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

74
  return targetName[target];
×
75
}
76

77
void qExplainFreeResNode(SExplainResNode *resNode) {
35,652,193✔
78
  if (NULL == resNode) {
35,652,193✔
79
    return;
×
80
  }
81

82
  taosArrayDestroy(resNode->pExecInfo);
35,652,193✔
83

84
  SNode *node = NULL;
35,652,193✔
85
  FOREACH(node, resNode->pChildren) { qExplainFreeResNode((SExplainResNode *)node); }
57,168,828✔
86
  nodesClearList(resNode->pChildren);
35,652,193✔
87

88
  taosMemoryFreeClear(resNode);
35,652,193✔
89
}
90

91
void qExplainFreePlanCtx(SExplainPlanCtx* pCtx, bool isAnalyze) {
4,811,504✔
92
  if (isAnalyze && pCtx->groupHash) {
4,811,504✔
93
    void *pIter = taosHashIterate(pCtx->groupHash, NULL);
799,670✔
94
    while (pIter) {
2,438,795✔
95
      SExplainGroup *group = (SExplainGroup *)pIter;
1,639,125✔
96
      if (group->nodeExecInfo) {
1,639,125✔
97
        int32_t num = taosArrayGetSize(group->nodeExecInfo);
1,635,453✔
98
        for (int32_t i = 0; i < num; ++i) {
4,419,613✔
99
          SExplainRsp *rsp = taosArrayGet(group->nodeExecInfo, i);
2,784,160✔
100
          tFreeSExplainRsp(rsp);
2,784,160✔
101
        }
102
        taosArrayDestroy(group->nodeExecInfo);
1,635,453✔
103
      }
104

105
      pIter = taosHashIterate(pCtx->groupHash, pIter);
1,639,125✔
106
    }
107
  }
108

109
  taosHashCleanup(pCtx->groupHash);
4,811,504✔
110
}
4,811,504✔
111

112
void qExplainFreeCtx(SExplainCtx *pCtx) {
743,930,113✔
113
  if (NULL == pCtx) {
743,930,113✔
114
    return;
739,150,725✔
115
  }
116

117
  int32_t rowSize = taosArrayGetSize(pCtx->rows);
4,779,388✔
118
  for (int32_t i = 0; i < rowSize; ++i) {
64,731,616✔
119
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
59,949,824✔
120
    taosMemoryFreeClear(row->buf);
59,949,824✔
121
  }
122

123
  qExplainFreePlanCtx(&pCtx->planCtx, EXPLAIN_MODE_ANALYZE == pCtx->mode);
4,781,792✔
124
  if (pCtx->subPlanCtxs) {
4,781,792✔
125
    int32_t subNum = taosArrayGetSize(pCtx->subPlanCtxs);
14,856✔
126
    for (int32_t i = 0; i < subNum; ++i) {
44,568✔
127
      SExplainPlanCtx *pSub = taosArrayGet(pCtx->subPlanCtxs, i);
29,712✔
128
      qExplainFreePlanCtx(pSub, EXPLAIN_MODE_ANALYZE == pCtx->mode);
29,712✔
129
    }
130
    taosArrayDestroy(pCtx->subPlanCtxs);
14,856✔
131
  }
132

133
  taosArrayDestroy(pCtx->rows);
4,781,792✔
134
  taosMemoryFreeClear(pCtx->tbuf);
4,781,792✔
135
  taosMemoryFree(pCtx);
4,781,792✔
136
}
137

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

146
  SArray *rows = taosArrayInit(10, sizeof(SQueryExplainRowInfo));
4,781,792✔
147
  if (NULL == rows) {
4,781,792✔
148
    qError("taosArrayInit SQueryExplainRowInfo failed");
×
149
    QRY_ERR_JRET(terrno);
×
150
  }
151

152
  char *tbuf = taosMemoryMalloc(TSDB_EXPLAIN_RESULT_ROW_SIZE);
4,781,792✔
153
  if (NULL == tbuf) {
4,781,792✔
154
    qError("malloc size %d failed", TSDB_EXPLAIN_RESULT_ROW_SIZE);
×
155
    QRY_ERR_JRET(terrno);
×
156
  }
157

158
  ctx->mode = mode;
4,781,792✔
159
  ctx->verbose = verbose;
4,781,792✔
160
  ctx->ratio = ratio;
4,781,792✔
161
  ctx->tbuf = tbuf;
4,781,792✔
162
  ctx->rows = rows;
4,781,792✔
163

164
  *pCtx = ctx;
4,781,792✔
165

166
  return TSDB_CODE_SUCCESS;
4,781,792✔
167

168
_return:
×
169

170
  taosArrayDestroy(rows);
×
171
  taosMemoryFree(ctx);
×
172

173
  QRY_RET(code);
×
174
}
175

176
static int32_t qExplainGenerateResChildren(SSubplan *plan, SPhysiNode *pNode, SExplainGroup *group, SNodeList **pChildren) {
35,652,193✔
177
  int32_t    tlen = 0;
35,652,193✔
178
  SNodeList *pPhysiChildren = pNode->pChildren;
35,652,193✔
179

180
  if (pPhysiChildren) {
35,652,193✔
181
    int32_t code = nodesMakeList(pChildren);
16,813,152✔
182
    if (NULL == *pChildren) {
16,813,152✔
183
      qError("nodesMakeList failed");
×
184
      QRY_ERR_RET(code);
×
185
    }
186
  }
187

188
  SNode           *node = NULL;
35,652,193✔
189
  SExplainResNode *pResNode = NULL;
35,652,193✔
190
  FOREACH(node, pPhysiChildren) {
57,168,828✔
191
    QRY_ERR_RET(qExplainGenerateResNode(plan, (SPhysiNode *)node, group, &pResNode));
21,516,635✔
192
    QRY_ERR_RET(nodesListAppend(*pChildren, (SNode *)pResNode));
21,516,635✔
193
  }
194

195
  return TSDB_CODE_SUCCESS;
35,652,193✔
196
}
197

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

205
  SExplainRsp *rsp = NULL;
6,104,845✔
206
  if (group->singleChannel) {
6,104,845✔
207
    if (0 == group->physiPlanExecIdx) {
1,635,352✔
208
      group->nodeIdx = 0;
1,477,038✔
209
    }
210

211
    rsp = taosArrayGet(group->nodeExecInfo, group->nodeIdx++);
1,635,352✔
212
    if (group->physiPlanExecIdx >= rsp->numOfPlans) {
1,635,352✔
213
      qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
×
214
      return TSDB_CODE_APP_ERROR;
×
215
    }
216

217
    if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno;
3,270,704✔
218
  } else {
219
    for (int32_t i = 0; i < group->nodeNum; ++i) {
9,260,456✔
220
      rsp = taosArrayGet(group->nodeExecInfo, i);
4,790,963✔
221
      if (group->physiPlanExecIdx >= rsp->numOfPlans) {
4,790,963✔
222
        qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
×
223
        return TSDB_CODE_APP_ERROR;
×
224
      }
225

226
      if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno;
9,581,926✔
227
    }
228
  }
229

230
  ++group->physiPlanExecIdx;
6,104,845✔
231

232
  return TSDB_CODE_SUCCESS;
6,104,845✔
233
}
234

235
static int32_t qExplainGenerateResNode(SSubplan *plan, SPhysiNode *pNode, SExplainGroup *group, SExplainResNode **pResNode) {
35,652,193✔
236
  if (NULL == pNode) {
35,652,193✔
237
    *pResNode = NULL;
×
238
    qError("physical node is NULL");
×
239
    return TSDB_CODE_APP_ERROR;
×
240
  }
241

242
  SExplainResNode *resNode = taosMemoryCalloc(1, sizeof(SExplainResNode));
35,652,193✔
243
  if (NULL == resNode) {
35,652,193✔
244
    qError("calloc SPhysiNodeExplainRes failed");
×
245
    return terrno;
×
246
  }
247

248
  int32_t code = 0;
35,652,193✔
249
  resNode->pNode = pNode;
35,652,193✔
250
  resNode->pPlan = plan;
35,652,193✔
251

252
  if (group->nodeExecInfo) {
35,652,193✔
253
    QRY_ERR_JRET(qExplainGenerateResNodeExecInfo(pNode, &resNode->pExecInfo, group));
6,104,845✔
254
  }
255

256
  QRY_ERR_JRET(qExplainGenerateResChildren(plan, pNode, group, &resNode->pChildren));
35,652,193✔
257

258
  *pResNode = resNode;
35,652,193✔
259

260
  return TSDB_CODE_SUCCESS;
35,652,193✔
261

262
_return:
×
263

264
  qExplainFreeResNode(resNode);
×
265

266
  QRY_RET(code);
×
267
}
268

269
static int32_t qExplainBufAppendExecInfo(SArray *pExecInfo, char *tbuf, int32_t *len) {
6,104,845✔
270
  int32_t          tlen = *len;
6,104,845✔
271
  int32_t          nodeNum = taosArrayGetSize(pExecInfo);
6,104,845✔
272
  SExplainExecInfo maxExecInfo = {0};
6,104,845✔
273

274
  for (int32_t i = 0; i < nodeNum; ++i) {
12,531,160✔
275
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
6,426,315✔
276
    if (execInfo->startupCost > maxExecInfo.startupCost) {
6,426,315✔
277
      maxExecInfo.startupCost = execInfo->startupCost;
4,065,074✔
278
    }
279
    if (execInfo->totalCost > maxExecInfo.totalCost) {
6,426,315✔
280
      maxExecInfo.totalCost = execInfo->totalCost;
5,731,540✔
281
    }
282
    if (execInfo->numOfRows > maxExecInfo.numOfRows) {
6,426,315✔
283
      maxExecInfo.numOfRows = execInfo->numOfRows;
4,418,543✔
284
    }
285
  }
286

287
  EXPLAIN_ROW_APPEND(EXPLAIN_EXECINFO_FORMAT, maxExecInfo.startupCost, maxExecInfo.totalCost, maxExecInfo.numOfRows);
6,104,845✔
288

289
  *len = tlen;
6,104,845✔
290

291
  return TSDB_CODE_SUCCESS;
6,104,845✔
292
}
293

294
static int32_t qExplainBufAppendVerboseExecInfo(SArray *pExecInfo, char *tbuf, int32_t *len) {
1,836✔
295
  int32_t          tlen = 0;
1,836✔
296
  bool             gotVerbose = false;
1,836✔
297
  int32_t          nodeNum = taosArrayGetSize(pExecInfo);
1,836✔
298
  SExplainExecInfo maxExecInfo = {0};
1,836✔
299

300
  for (int32_t i = 0; i < nodeNum; ++i) {
7,344✔
301
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
5,508✔
302
    if (execInfo->verboseInfo) {
5,508✔
303
      gotVerbose = true;
×
304
    }
305
  }
306

307
  if (gotVerbose) {
1,836✔
308
    EXPLAIN_ROW_APPEND("exec verbose info");
×
309
  }
310

311
  *len = tlen;
1,836✔
312

313
  return TSDB_CODE_SUCCESS;
1,836✔
314
}
315

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

324
  memcpy(row.buf, tbuf, len);
59,949,824✔
325
  row.level = level;
59,949,824✔
326
  row.len = len;
59,949,824✔
327
  ctx->dataSize += row.len;
59,949,824✔
328

329
  if (NULL == taosArrayPush(ctx->rows, &row)) {
119,899,648✔
330
    qError("taosArrayPush row to explain res rows failed");
×
331
    taosMemoryFree(row.buf);
×
332
    QRY_ERR_RET(terrno);
×
333
  }
334

335
  return TSDB_CODE_SUCCESS;
59,949,824✔
336
}
337

338
static uint8_t qExplainGetIntervalPrecision(SIntervalPhysiNode *pIntNode) {
822,686✔
339
  return ((SColumnNode *)pIntNode->window.pTspk)->node.resType.precision;
822,686✔
340
}
341

342
static char* qExplainGetScanMode(STableScanPhysiNode* pScan) {
9,580,222✔
343
  bool isGroupByTbname = false;
9,580,222✔
344
  bool isGroupByTag = false;
9,580,222✔
345
  bool seq = false;
9,580,222✔
346
  bool groupOrder = false;
9,580,222✔
347
  if (pScan->pGroupTags && LIST_LENGTH(pScan->pGroupTags) == 1) {
9,580,222✔
348
    SNode* p = nodesListGetNode(pScan->pGroupTags, 0);
83,593✔
349
    if (QUERY_NODE_FUNCTION == nodeType(p) && (strcmp(((struct SFunctionNode*)p)->functionName, "tbname") == 0)) {
83,593✔
350
      isGroupByTbname = true;
81,557✔
351
    }
352
  }
353

354
  isGroupByTag = (NULL != pScan->pGroupTags) && !isGroupByTbname;
9,580,222✔
355
  if ((((!isGroupByTag) || isGroupByTbname) && pScan->groupSort) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
9,580,222✔
356
    return "seq_grp_order";
×
357
  }
358

359
  if ((isGroupByTbname && (pScan->groupSort || pScan->scan.groupOrderScan)) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
9,580,222✔
360
    return "grp_order";
1,222✔
361
  }
362

363
  return "ts_order";
9,579,000✔
364
}
365

366
static char* qExplainGetScanDataLoad(STableScanPhysiNode* pScan) {
9,580,222✔
367
  switch (pScan->dataRequired) {
9,580,222✔
368
    case FUNC_DATA_REQUIRED_DATA_LOAD:
8,949,338✔
369
      return "data";
8,949,338✔
370
    case FUNC_DATA_REQUIRED_SMA_LOAD:
593,786✔
371
      return "sma";
593,786✔
372
    case FUNC_DATA_REQUIRED_NOT_LOAD:
37,098✔
373
      return "no";
37,098✔
374
    default:
×
375
      break;
×
376
  }
377

378
  return "unknown";
×
379
}
380

381
static EDealRes qExplainVerifyIndex(SNode* pNode, void* pContext) {
41,830✔
382
  if (NULL == pNode) {
41,830✔
383
    return DEAL_RES_CONTINUE;
×
384
  }
385

386
  switch (nodeType(pNode)) {
41,830✔
387
    case QUERY_NODE_COLUMN:
24,493✔
388
    case QUERY_NODE_VALUE:
389
    case QUERY_NODE_LOGIC_CONDITION:
390
    case QUERY_NODE_NODE_LIST:
391
      break;
24,493✔
392
    case QUERY_NODE_OPERATOR: {
15,543✔
393
      SOperatorNode* pOp = (SOperatorNode*)pNode;
15,543✔
394
      if ((pOp->opType >= OP_TYPE_GREATER_THAN && pOp->opType <= OP_TYPE_EQUAL) || (OP_TYPE_IN == pOp->opType)) {
15,543✔
395
        break;
396
      }
397
      // fall through
398
    }
399
    default:
400
      *(bool*)pContext = false;
5,382✔
401
      return DEAL_RES_END;
5,382✔
402
  }
403

404
  return DEAL_RES_CONTINUE;
36,448✔
405
}
406

407
static bool qExplainCouldApplyTagIndex(SSubplan* pPlan) {
2,645,915✔
408
  if (NULL == pPlan->pTagIndexCond) {
2,645,915✔
409
    return false;
2,632,764✔
410
  }
411

412
  bool couldApply = true;
13,151✔
413
  nodesWalkExpr(pPlan->pTagIndexCond, qExplainVerifyIndex, &couldApply);
13,151✔
414

415
  return couldApply;
13,151✔
416
}
417

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

429
  if (0 == *pLevel && ctx->currPlanId >= 0) {
35,652,193✔
430
    EXPLAIN_SUB_PLAN_LINE(ctx->currPlanId + 1);
29,712✔
431
    QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, *pLevel + 1));
29,712✔
432
    *pLevel += 2;
29,712✔
433
  }
434

435
  int32_t level = *pLevel;
35,652,193✔
436
  
437
  switch (pNode->type) {
35,652,193✔
438
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN: {
564,236✔
439
      STagScanPhysiNode *pTagScanNode = (STagScanPhysiNode *)pNode;
564,236✔
440
      EXPLAIN_ROW_NEW(level, EXPLAIN_TAG_SCAN_FORMAT, pTagScanNode->scan.tableName.tname);
564,236✔
441
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
564,236✔
442
      if (pResNode->pExecInfo) {
564,236✔
443
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,836✔
444
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,836✔
445
      }
446
      if (pTagScanNode->scan.pScanPseudoCols) {
564,236✔
447
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTagScanNode->scan.pScanPseudoCols->length);
564,236✔
448
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
564,236✔
449
      }
450
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
564,236✔
451
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
564,236✔
452
      EXPLAIN_ROW_END();
564,236✔
453
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
564,236✔
454

455
      if (verbose) {
564,236✔
456
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,836✔
457
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
1,836✔
458
                           nodesGetOutputNumFromSlotList(pTagScanNode->scan.node.pOutputDataBlockDesc->pSlots));
459
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,836✔
460
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
1,836✔
461
        EXPLAIN_ROW_APPEND_LIMIT(pTagScanNode->scan.node.pLimit);
1,836✔
462
        EXPLAIN_ROW_APPEND_SLIMIT(pTagScanNode->scan.node.pSlimit);
1,836✔
463
        EXPLAIN_ROW_END();
1,836✔
464
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,836✔
465

466
        if (pResNode->pExecInfo) {
1,836✔
467
          QRY_ERR_RET(qExplainBufAppendVerboseExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,836✔
468
          if (tlen) {
1,836✔
469
            EXPLAIN_ROW_END();
×
470
            QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
471
          }
472
        }
473

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

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

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

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

530
        if (pVirtualTableScanNode->scan.node.pConditions) {
×
531
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
532
          QRY_ERR_RET(nodesNodeToSQL(pVirtualTableScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
533
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
534
          EXPLAIN_ROW_END();
×
535
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
536
        }
537
      }
538
      break;
×
539
    }
540
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
9,580,222✔
541
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
542
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: {
543
      STableScanPhysiNode *pTblScanNode = (STableScanPhysiNode *)pNode;
9,580,222✔
544
      EXPLAIN_ROW_NEW(level,
9,580,222✔
545
                      QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN == pNode->type ? EXPLAIN_TBL_MERGE_SCAN_FORMAT
546
                                                                               : EXPLAIN_TBL_SCAN_FORMAT,
547
                      pTblScanNode->scan.tableName.tname);
548
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
9,580,222✔
549
      if (pResNode->pExecInfo) {
9,580,222✔
550
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2,082,019✔
551
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,082,019✔
552
      }
553

554
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pTblScanNode->scan.pScanCols->length);
9,580,222✔
555
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,580,222✔
556
      if (pTblScanNode->scan.pScanPseudoCols) {
9,580,222✔
557
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTblScanNode->scan.pScanPseudoCols->length);
2,205,645✔
558
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,205,645✔
559
      }
560
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
9,580,222✔
561
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,580,222✔
562
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_ORDER_FORMAT, pTblScanNode->scanSeq[0], pTblScanNode->scanSeq[1]);
9,580,222✔
563
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,580,222✔
564
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_MODE_FORMAT, qExplainGetScanMode(pTblScanNode));
9,580,222✔
565
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,580,222✔
566
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_DATA_LOAD_FORMAT, qExplainGetScanDataLoad(pTblScanNode));
9,580,222✔
567
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
9,580,222✔
568
      EXPLAIN_ROW_END();
9,580,222✔
569
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
9,580,222✔
570

571
      // basic analyze output
572
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
9,580,222✔
573
        EXPLAIN_ROW_NEW(level + 1, "I/O: ");
2,082,019✔
574

575
        int32_t                      nodeNum = taosArrayGetSize(pResNode->pExecInfo);
2,082,019✔
576
        struct STableScanAnalyzeInfo info = {0};
2,082,019✔
577

578
        int32_t maxIndex = 0;
2,082,019✔
579
        int32_t totalRows = 0;
2,082,019✔
580
        for (int32_t i = 0; i < nodeNum; ++i) {
4,323,577✔
581
          SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, i);
2,241,558✔
582
          STableScanAnalyzeInfo *pScanInfo = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
2,241,558✔
583

584
          info.totalBlocks += pScanInfo->totalBlocks;
2,241,558✔
585
          info.loadBlocks += pScanInfo->loadBlocks;
2,241,558✔
586
          info.totalRows += pScanInfo->totalRows;
2,241,558✔
587
          info.skipBlocks += pScanInfo->skipBlocks;
2,241,558✔
588
          info.filterTime += pScanInfo->filterTime;
2,241,558✔
589
          info.loadBlockStatis += pScanInfo->loadBlockStatis;
2,241,558✔
590
          info.totalCheckedRows += pScanInfo->totalCheckedRows;
2,241,558✔
591
          info.filterOutBlocks += pScanInfo->filterOutBlocks;
2,241,558✔
592

593
          if (pScanInfo->totalRows > totalRows) {
2,241,558✔
594
            totalRows = pScanInfo->totalRows;
1,284,249✔
595
            maxIndex = i;
1,284,249✔
596
          }
597
        }
598

599
        EXPLAIN_ROW_APPEND("total_blocks=%.1f", ((double)info.totalBlocks) / nodeNum);
2,082,019✔
600
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,082,019✔
601

602
        EXPLAIN_ROW_APPEND("load_blocks=%.1f", ((double)info.loadBlocks) / nodeNum);
2,082,019✔
603
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,082,019✔
604

605
        EXPLAIN_ROW_APPEND("load_block_SMAs=%.1f", ((double)info.loadBlockStatis) / nodeNum);
2,082,019✔
606
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,082,019✔
607

608
        EXPLAIN_ROW_APPEND("total_rows=%.1f", ((double)info.totalRows) / nodeNum);
2,082,019✔
609
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,082,019✔
610

611
        EXPLAIN_ROW_APPEND("check_rows=%.1f", ((double)info.totalCheckedRows) / nodeNum);
2,082,019✔
612
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,082,019✔
613
        EXPLAIN_ROW_END();
2,082,019✔
614

615
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,082,019✔
616

617
        // 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,
618
        // start offset by 1.470 ms.
619
        SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, maxIndex);
2,082,019✔
620
        STableScanAnalyzeInfo *p1 = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
2,082,019✔
621

622
        EXPLAIN_ROW_NEW(level + 1, " ");
2,082,019✔
623
        EXPLAIN_ROW_APPEND("max_row_task=%d, total_rows:%" PRId64 ", ep:%s (cost=%.3f..%.3f)", maxIndex, p1->totalRows,
2,082,019✔
624
                           "tbd", execInfo->startupCost, execInfo->totalCost);
625
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,082,019✔
626
        EXPLAIN_ROW_END();
2,082,019✔
627

628
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,082,019✔
629
      }
630

631
      if (verbose) {
9,580,222✔
632
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
2,620,918✔
633
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
2,620,918✔
634
                           nodesGetOutputNumFromSlotList(pTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
635
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,620,918✔
636
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
2,620,918✔
637
        EXPLAIN_ROW_APPEND_LIMIT(pTblScanNode->scan.node.pLimit);
2,620,918✔
638
        EXPLAIN_ROW_APPEND_SLIMIT(pTblScanNode->scan.node.pSlimit);
2,620,918✔
639
        EXPLAIN_ROW_END();
2,620,918✔
640
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,620,918✔
641

642
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pTblScanNode->scanRange.skey,
2,620,918✔
643
                        pTblScanNode->scanRange.ekey);
644
        EXPLAIN_ROW_END();
2,620,918✔
645
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,620,918✔
646

647
        if (NULL != pTblScanNode->pGroupTags) {
2,620,918✔
648
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
34,226✔
649
          EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pTblScanNode->pGroupTags->length);
34,226✔
650
          EXPLAIN_ROW_END();
34,226✔
651
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
34,226✔
652
        }
653

654
        if (pTblScanNode->scan.node.pConditions) {
2,620,918✔
655
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
21,701✔
656
          QRY_ERR_RET(nodesNodeToSQL(pTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
21,701✔
657
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
658
          EXPLAIN_ROW_END();
21,701✔
659
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
21,701✔
660
        }
661

662
        if (qExplainCouldApplyTagIndex(pResNode->pPlan)) {
2,620,918✔
663
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TAG_INDEX_FORMAT);
7,769✔
664
          QRY_ERR_RET(nodesNodeToSQL(pResNode->pPlan->pTagIndexCond, tbuf + VARSTR_HEADER_SIZE,
7,769✔
665
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
666
          EXPLAIN_ROW_END();
7,769✔
667
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
7,769✔
668
        }
669
      }
670
      break;
9,580,222✔
671
    }
672
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN: {
21,405✔
673
      SSystemTableScanPhysiNode *pSTblScanNode = (SSystemTableScanPhysiNode *)pNode;
21,405✔
674
      EXPLAIN_ROW_NEW(level, EXPLAIN_SYSTBL_SCAN_FORMAT, pSTblScanNode->scan.tableName.tname);
21,405✔
675
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
21,405✔
676
      if (pResNode->pExecInfo) {
21,405✔
677
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
11,079✔
678
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
11,079✔
679
      }
680
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pSTblScanNode->scan.pScanCols->length);
21,405✔
681
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
21,405✔
682
      if (pSTblScanNode->scan.pScanPseudoCols) {
21,405✔
683
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pSTblScanNode->scan.pScanPseudoCols->length);
598✔
684
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
598✔
685
      }
686
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
21,405✔
687
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
21,405✔
688
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
21,405✔
689
      EXPLAIN_ROW_END();
21,405✔
690
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
21,405✔
691

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

703
        if (pSTblScanNode->scan.node.pConditions) {
2,643✔
704
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
1,447✔
705
          QRY_ERR_RET(nodesNodeToSQL(pSTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
1,447✔
706
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
707
          EXPLAIN_ROW_END();
1,447✔
708
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,447✔
709
        }
710
      }
711
      break;
21,405✔
712
    }
713
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
6,212,905✔
714
      SProjectPhysiNode *pPrjNode = (SProjectPhysiNode *)pNode;
6,212,905✔
715
      EXPLAIN_ROW_NEW(level, EXPLAIN_PROJECTION_FORMAT);
6,212,905✔
716
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
6,212,905✔
717
      if (pResNode->pExecInfo) {
6,212,905✔
718
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
857,667✔
719
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
857,667✔
720
      }
721
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pPrjNode->pProjections->length);
6,212,905✔
722
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,212,905✔
723
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->totalRowSize);
6,212,905✔
724
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,212,905✔
725
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pPrjNode->node.inputTsOrder));
6,212,905✔
726
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,212,905✔
727
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
6,212,905✔
728
      EXPLAIN_ROW_END();
6,212,905✔
729
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
6,212,905✔
730

731
      if (verbose) {
6,212,905✔
732
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
690,226✔
733
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
690,226✔
734
                           nodesGetOutputNumFromSlotList(pPrjNode->node.pOutputDataBlockDesc->pSlots));
735
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
690,226✔
736
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->outputRowSize);
690,226✔
737
        EXPLAIN_ROW_APPEND_LIMIT(pPrjNode->node.pLimit);
690,226✔
738
        EXPLAIN_ROW_APPEND_SLIMIT(pPrjNode->node.pSlimit);
690,226✔
739
        EXPLAIN_ROW_END();
690,226✔
740
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
690,226✔
741

742
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
690,226✔
743
        EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pPrjNode->ignoreGroupId ? "true" : "false");
690,226✔
744
        EXPLAIN_ROW_END();
690,226✔
745
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
690,226✔
746

747
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pPrjNode->mergeDataBlock? "True":"False");
690,226✔
748
        EXPLAIN_ROW_END();
690,226✔
749
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
690,226✔
750

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

780
      if (verbose) {
1,244,203✔
781
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
255,386✔
782
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
255,386✔
783
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
784
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
255,386✔
785
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
255,386✔
786
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
255,386✔
787
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
255,386✔
788
        EXPLAIN_ROW_END();
255,386✔
789
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
255,386✔
790

791
        if (IS_ASOF_JOIN(pJoinNode->subType) || IS_WINDOW_JOIN(pJoinNode->subType)) {
255,386✔
792
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_PARAM_FORMAT);
113,832✔
793
          if (IS_ASOF_JOIN(pJoinNode->subType)) {
113,832✔
794
            EXPLAIN_ROW_APPEND(EXPLAIN_ASOF_OP_FORMAT, qExplainGetAsofOpStr(pJoinNode->asofOpType));
51,408✔
795
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
51,408✔
796
          }
797
          if (NULL != pJoinNode->pWindowOffset) {
113,832✔
798
            SWindowOffsetNode* pWinOffset = (SWindowOffsetNode*)pJoinNode->pWindowOffset;
62,424✔
799
            SValueNode* pStart = (SValueNode*)pWinOffset->pStartOffset;
62,424✔
800
            SValueNode* pEnd = (SValueNode*)pWinOffset->pEndOffset;
62,424✔
801
            EXPLAIN_ROW_APPEND(EXPLAIN_WIN_OFFSET_FORMAT, pStart->literal, pEnd->literal);
62,424✔
802
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
62,424✔
803
          }
804
          if (NULL != pJoinNode->pJLimit && NULL != ((SLimitNode*)pJoinNode->pJLimit)->limit) {
113,832✔
805
            SLimitNode* pJLimit = (SLimitNode*)pJoinNode->pJLimit;
20,196✔
806
            EXPLAIN_ROW_APPEND(EXPLAIN_JLIMIT_FORMAT, pJLimit->limit->datum.i);
20,196✔
807
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
20,196✔
808
          }
809
          if (IS_WINDOW_JOIN(pJoinNode->subType)) {
113,832✔
810
            EXPLAIN_ROW_APPEND(EXPLAIN_SEQ_WIN_GRP_FORMAT, pJoinNode->seqWinGroup);
62,424✔
811
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
62,424✔
812
          }
813

814
          EXPLAIN_ROW_APPEND(EXPLAIN_GRP_JOIN_FORMAT, pJoinNode->grpJoin);
113,832✔
815
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
113,832✔
816
          EXPLAIN_ROW_END();
113,832✔
817

818
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
113,832✔
819
        }
820

821
        if (pJoinNode->node.pConditions) {
255,386✔
822
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
21,114✔
823
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
21,114✔
824
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
825
          EXPLAIN_ROW_END();
21,114✔
826
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
21,114✔
827
        }
828

829
        if (NULL != pJoinNode->pPrimKeyCond) {
255,386✔
830
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PRIM_CONDITIONS_FORMAT);
176,438✔
831
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
176,438✔
832
          EXPLAIN_ROW_END();
176,438✔
833
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
176,438✔
834
        }
835

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

846
        if (NULL != pJoinNode->pEqRight && pJoinNode->pEqRight->length > 0) {
255,386✔
847
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_RIGHT_FORMAT);
918✔
848
          SNode* pCol = NULL;
918✔
849
          FOREACH(pCol, pJoinNode->pEqRight) {
1,836✔
850
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
918✔
851
          }
852
          EXPLAIN_ROW_END();
918✔
853
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
918✔
854
        }
855

856
        if (NULL != pJoinNode->pFullOnCond) {
255,386✔
857
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
9,180✔
858
          QRY_ERR_RET(
9,180✔
859
                nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
860
          EXPLAIN_ROW_END();
9,180✔
861
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
9,180✔
862
        }
863

864
        if (NULL != pJoinNode->pColOnCond) {
255,386✔
865
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COL_ON_CONDITIONS_FORMAT);
8,262✔
866
          QRY_ERR_RET(
8,262✔
867
                nodesNodeToSQL(pJoinNode->pColOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
868
          EXPLAIN_ROW_END();
8,262✔
869
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
8,262✔
870
        }
871
      }
872
      break;
1,244,203✔
873
    }
874
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: {
3,508,472✔
875
      SAggPhysiNode *pAggNode = (SAggPhysiNode *)pNode;
3,508,472✔
876
      EXPLAIN_ROW_NEW(level, EXPLAIN_AGG_FORMAT, (pAggNode->pGroupKeys ? "GroupAggregate" : "Aggregate"));
3,508,472✔
877
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
3,508,472✔
878
      if (pResNode->pExecInfo) {
3,508,472✔
879
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
397,333✔
880
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
397,333✔
881
      }
882
      if (pAggNode->pAggFuncs) {
3,508,472✔
883
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pAggNode->pAggFuncs->length);
2,239,743✔
884
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,239,743✔
885
      }
886
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->totalRowSize);
3,508,472✔
887
      if (pAggNode->pGroupKeys) {
3,508,472✔
888
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,318,391✔
889
        EXPLAIN_ROW_APPEND(EXPLAIN_GROUPS_FORMAT, pAggNode->pGroupKeys->length);
1,318,391✔
890
      }
891
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,508,472✔
892
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pAggNode->node.inputTsOrder));
3,508,472✔
893
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,508,472✔
894
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
3,508,472✔
895
      EXPLAIN_ROW_END();
3,508,472✔
896
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
3,508,472✔
897

898
      if (verbose) {
3,508,472✔
899
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
332,382✔
900
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
332,382✔
901
                           nodesGetOutputNumFromSlotList(pAggNode->node.pOutputDataBlockDesc->pSlots));
902
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
332,382✔
903
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->outputRowSize);
332,382✔
904
        EXPLAIN_ROW_APPEND_LIMIT(pAggNode->node.pLimit);
332,382✔
905
        EXPLAIN_ROW_APPEND_SLIMIT(pAggNode->node.pSlimit);
332,382✔
906
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
332,382✔
907
        EXPLAIN_ROW_APPEND(EXPLAIN_PLAN_BLOCKING, !pAggNode->node.forceCreateNonBlockingOptr);
332,382✔
908
        EXPLAIN_ROW_END();
332,382✔
909
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
332,382✔
910

911
        if (pAggNode->node.pConditions) {
332,382✔
912
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
7,652✔
913
          QRY_ERR_RET(nodesNodeToSQL(pAggNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
7,652✔
914
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
915
          EXPLAIN_ROW_END();
7,652✔
916
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
7,652✔
917
        }
918

919
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pAggNode->mergeDataBlock? "True":"False");
332,382✔
920
        EXPLAIN_ROW_END();
332,382✔
921
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
332,382✔
922
      }
923
      break;
3,508,472✔
924
    }
925
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: {
420,743✔
926
      SIndefRowsFuncPhysiNode *pIndefNode = (SIndefRowsFuncPhysiNode *)pNode;
420,743✔
927
      EXPLAIN_ROW_NEW(level, EXPLAIN_INDEF_ROWS_FORMAT);
420,743✔
928
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
420,743✔
929
      if (pResNode->pExecInfo) {
420,743✔
930
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
4,270✔
931
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,270✔
932
      }
933
      if (pIndefNode->pFuncs) {
420,743✔
934
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIndefNode->pFuncs->length);
420,743✔
935
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
420,743✔
936
      }
937
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->totalRowSize);
420,743✔
938
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
420,743✔
939
      EXPLAIN_ROW_END();
420,743✔
940
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
420,743✔
941

942
      if (verbose) {
420,743✔
943
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
10,268✔
944
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
10,268✔
945
                           nodesGetOutputNumFromSlotList(pIndefNode->node.pOutputDataBlockDesc->pSlots));
946
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10,268✔
947
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->outputRowSize);
10,268✔
948
        EXPLAIN_ROW_APPEND_LIMIT(pIndefNode->node.pLimit);
10,268✔
949
        EXPLAIN_ROW_APPEND_SLIMIT(pIndefNode->node.pSlimit);
10,268✔
950
        EXPLAIN_ROW_END();
10,268✔
951
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
10,268✔
952

953
        if (pIndefNode->node.pConditions) {
10,268✔
954
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
955
          QRY_ERR_RET(nodesNodeToSQL(pIndefNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
956
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
957
          EXPLAIN_ROW_END();
×
958
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
959
        }
960
      }
961
      break;
420,743✔
962
    }
963
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
8,545,014✔
964
      SExchangePhysiNode *pExchNode = (SExchangePhysiNode *)pNode;
8,545,014✔
965
      int32_t nodeNum = 0;
8,545,014✔
966
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
17,872,740✔
967
        SExplainGroup      *group = taosHashGet(ctx->pCurrPlanCtx->groupHash, &pExchNode->srcStartGroupId, sizeof(pExchNode->srcStartGroupId));
9,327,726✔
968
        if (NULL == group) {
9,327,726✔
969
          qError("exchange src group %d not in groupHash", pExchNode->srcStartGroupId);
×
970
          QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
971
        }
972

973
        nodeNum += group->nodeNum;
9,327,726✔
974
      }
975

976
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXCHANGE_FORMAT, pExchNode->singleChannel ? 1 : nodeNum);
8,545,014✔
977
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
8,545,014✔
978
      if (pResNode->pExecInfo) {
8,545,014✔
979
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,715,117✔
980
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,715,117✔
981
      }
982
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->totalRowSize);
8,545,014✔
983
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
8,545,014✔
984
      EXPLAIN_ROW_END();
8,545,014✔
985
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
8,545,014✔
986

987
      if (verbose) {
8,545,014✔
988
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
2,366,284✔
989
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
2,366,284✔
990
                           nodesGetOutputNumFromSlotList(pExchNode->node.pOutputDataBlockDesc->pSlots));
991
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,366,284✔
992
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->outputRowSize);
2,366,284✔
993
        EXPLAIN_ROW_APPEND_LIMIT(pExchNode->node.pLimit);
2,366,284✔
994
        EXPLAIN_ROW_APPEND_SLIMIT(pExchNode->node.pSlimit);
2,366,284✔
995
        EXPLAIN_ROW_END();
2,366,284✔
996
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,366,284✔
997

998
        if (pExchNode->node.pConditions) {
2,366,284✔
999
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1000
          QRY_ERR_RET(nodesNodeToSQL(pExchNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1001
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1002
          EXPLAIN_ROW_END();
×
1003
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1004
        }
1005
      }
1006

1007
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
17,872,740✔
1008
        int32_t nlevel = level + 1;
9,327,726✔
1009
        QRY_ERR_RET(qExplainAppendGroupResRows(ctx, i, &nlevel, pExchNode->singleChannel));
9,327,726✔
1010
      }
1011
      break;
8,545,014✔
1012
    }
1013
    case QUERY_NODE_PHYSICAL_PLAN_SORT: {
970,915✔
1014
      SSortPhysiNode *pSortNode = (SSortPhysiNode *)pNode;
970,915✔
1015
      EXPLAIN_ROW_NEW(level, EXPLAIN_SORT_FORMAT);
970,915✔
1016
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
970,915✔
1017
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.inputTsOrder));
970,915✔
1018
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
970,915✔
1019
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.outputTsOrder));
970,915✔
1020
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
970,915✔
1021
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
970,915✔
1022
      if (pResNode->pExecInfo) {
970,915✔
1023
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
93,406✔
1024
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
93,406✔
1025
      }
1026

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

1035
      if (pResNode->pExecInfo) {
970,915✔
1036
        // sort key
1037
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
93,406✔
1038
        for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
186,812✔
1039
          SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
93,406✔
1040
          EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
93,406✔
1041
        }
1042

1043
        EXPLAIN_ROW_END();
93,406✔
1044
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
93,406✔
1045

1046
        // sort method
1047
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
93,406✔
1048

1049
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
93,406✔
1050
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
93,406✔
1051
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
93,406✔
1052
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
93,406✔
1053
        if (pExecInfo->sortBuffer > 1024 * 1024) {
93,406✔
1054
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
78,120✔
1055
        } else if (pExecInfo->sortBuffer > 1024) {
15,286✔
1056
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
1057
        } else {
1058
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
15,286✔
1059
        }
1060

1061
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
93,406✔
1062
        EXPLAIN_ROW_END();
93,406✔
1063
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
93,406✔
1064
      }
1065

1066
      if (verbose) {
970,915✔
1067
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
188,256✔
1068
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
188,256✔
1069
                           nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
1070
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
188,256✔
1071
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
188,256✔
1072
        EXPLAIN_ROW_APPEND_LIMIT(pSortNode->node.pLimit);
188,256✔
1073
        EXPLAIN_ROW_APPEND_SLIMIT(pSortNode->node.pSlimit);
188,256✔
1074
        EXPLAIN_ROW_END();
188,256✔
1075
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
188,256✔
1076

1077
        if (pSortNode->node.pConditions) {
188,256✔
1078
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1079
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1080
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1081
          EXPLAIN_ROW_END();
×
1082
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1083
        }
1084
      }
1085
      break;
970,915✔
1086
    }
1087
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL: {
636,230✔
1088
      SIntervalPhysiNode *pIntNode = (SIntervalPhysiNode *)pNode;
636,230✔
1089
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
636,230✔
1090
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
636,230✔
1091
      if (pResNode->pExecInfo) {
636,230✔
1092
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
6,934✔
1093
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,934✔
1094
      }
1095
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
636,230✔
1096
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
636,230✔
1097
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
636,230✔
1098
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
636,230✔
1099
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
636,230✔
1100
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
636,230✔
1101
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
636,230✔
1102
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
636,230✔
1103
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
636,230✔
1104
      EXPLAIN_ROW_END();
636,230✔
1105
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
636,230✔
1106

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

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

1144
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
565,346✔
1145
        EXPLAIN_ROW_END();
565,346✔
1146
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
565,346✔
1147
      }
1148
      break;
636,230✔
1149
    }
1150
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL: {
263,417✔
1151
      SMergeAlignedIntervalPhysiNode *pIntNode = (SMergeAlignedIntervalPhysiNode *)pNode;
263,417✔
1152
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_ALIGNED_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
263,417✔
1153
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
263,417✔
1154
      if (pResNode->pExecInfo) {
263,417✔
1155
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,447✔
1156
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,447✔
1157
      }
1158
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
263,417✔
1159
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
263,417✔
1160
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
263,417✔
1161
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
263,417✔
1162
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
263,417✔
1163
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
263,417✔
1164
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
263,417✔
1165
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
263,417✔
1166
      EXPLAIN_ROW_END();
263,417✔
1167
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
263,417✔
1168

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

1195
        if (pIntNode->window.node.pConditions) {
257,340✔
1196
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
3,588✔
1197
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
3,588✔
1198
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1199
          EXPLAIN_ROW_END();
3,588✔
1200
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,588✔
1201
        }
1202

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

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

1253
          EXPLAIN_ROW_END();
251✔
1254
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
251✔
1255
        }
1256

1257
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pFillNode->timeRange.skey, pFillNode->timeRange.ekey);
5,035✔
1258
        EXPLAIN_ROW_END();
5,035✔
1259
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
5,035✔
1260

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

1286
      if (verbose) {
46,540✔
1287
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
15,820✔
1288
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
15,820✔
1289
                           nodesGetOutputNumFromSlotList(pSessNode->window.node.pOutputDataBlockDesc->pSlots));
1290
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
15,820✔
1291
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->outputRowSize);
15,820✔
1292
        EXPLAIN_ROW_APPEND_LIMIT(pSessNode->window.node.pLimit);
15,820✔
1293
        EXPLAIN_ROW_APPEND_SLIMIT(pSessNode->window.node.pSlimit);
15,820✔
1294
        EXPLAIN_ROW_END();
15,820✔
1295
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
15,820✔
1296

1297
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_WINDOW_FORMAT, pSessNode->gap);
15,820✔
1298
        EXPLAIN_ROW_END();
15,820✔
1299
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
15,820✔
1300

1301
        if (pSessNode->window.node.pConditions) {
15,820✔
1302
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1303
          QRY_ERR_RET(nodesNodeToSQL(pSessNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1304
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1305
          EXPLAIN_ROW_END();
×
1306
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1307
        }
1308
      }
1309
      break;
46,540✔
1310
    }
1311
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE: {
24,744✔
1312
      SStateWindowPhysiNode *pStateNode = (SStateWindowPhysiNode *)pNode;
24,744✔
1313

1314
      EXPLAIN_ROW_NEW(level, EXPLAIN_STATE_WINDOW_FORMAT,
24,744✔
1315
                      nodesGetNameFromColumnNode(pStateNode->pStateKey));
1316
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
24,744✔
1317
      if (pResNode->pExecInfo) {
24,744✔
1318
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1319
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1320
      }
1321

1322
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pStateNode->window.pFuncs->length);
24,744✔
1323
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
24,744✔
1324
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->totalRowSize);
24,744✔
1325
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
24,744✔
1326
      EXPLAIN_ROW_END();
24,744✔
1327
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
24,744✔
1328

1329
      if (verbose) {
24,744✔
1330
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
9,704✔
1331
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
9,704✔
1332
                           nodesGetOutputNumFromSlotList(pStateNode->window.node.pOutputDataBlockDesc->pSlots));
1333
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,704✔
1334
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->outputRowSize);
9,704✔
1335
        EXPLAIN_ROW_APPEND_LIMIT(pStateNode->window.node.pLimit);
9,704✔
1336
        EXPLAIN_ROW_APPEND_SLIMIT(pStateNode->window.node.pSlimit);
9,704✔
1337
        EXPLAIN_ROW_END();
9,704✔
1338
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
9,704✔
1339

1340
        EXPLAIN_ROW_END();
9,704✔
1341
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
9,704✔
1342

1343
        if (pStateNode->window.node.pConditions) {
9,704✔
1344
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1345
          QRY_ERR_RET(nodesNodeToSQL(pStateNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1346
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1347
          EXPLAIN_ROW_END();
×
1348
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1349
        }
1350
      }
1351
      break;
24,744✔
1352
    }
1353
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
346,901✔
1354
      SPartitionPhysiNode *pPartNode = (SPartitionPhysiNode *)pNode;
346,901✔
1355

1356
      SNode *p = nodesListGetNode(pPartNode->pPartitionKeys, 0);
346,901✔
1357
      EXPLAIN_ROW_NEW(level, EXPLAIN_PARITION_FORMAT, nodesGetNameFromColumnNode(p));
346,901✔
1358
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
346,901✔
1359
      if (pResNode->pExecInfo) {
346,901✔
1360
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
155,646✔
1361
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
155,646✔
1362
      }
1363
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->totalRowSize);
346,901✔
1364

1365
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
346,901✔
1366
      EXPLAIN_ROW_END();
346,901✔
1367
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
346,901✔
1368

1369
      if (verbose) {
346,901✔
1370
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
154,976✔
1371
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
154,976✔
1372
                           nodesGetOutputNumFromSlotList(pPartNode->node.pOutputDataBlockDesc->pSlots));
1373
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
154,976✔
1374
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->outputRowSize);
154,976✔
1375
        EXPLAIN_ROW_APPEND_LIMIT(pPartNode->node.pLimit);
154,976✔
1376
        EXPLAIN_ROW_APPEND_SLIMIT(pPartNode->node.pSlimit);
154,976✔
1377
        EXPLAIN_ROW_END();
154,976✔
1378
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
154,976✔
1379

1380
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
154,976✔
1381
        EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pPartNode->pPartitionKeys->length);
154,976✔
1382
        EXPLAIN_ROW_END();
154,976✔
1383
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
154,976✔
1384

1385
        if (pPartNode->node.pConditions) {
154,976✔
1386
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1387
          QRY_ERR_RET(nodesNodeToSQL(pPartNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1388
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1389
          EXPLAIN_ROW_END();
×
1390
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1391
        }
1392
      }
1393
      break;
346,901✔
1394
    }
1395
    case QUERY_NODE_PHYSICAL_PLAN_MERGE: {
2,307,338✔
1396
      SMergePhysiNode *pMergeNode = (SMergePhysiNode *)pNode;
2,307,338✔
1397
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_FORMAT);
2,307,338✔
1398
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
2,307,338✔
1399
      if (pResNode->pExecInfo) {
2,307,338✔
1400
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
508,622✔
1401
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
508,622✔
1402
      }
1403

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

1418
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
2,307,338✔
1419
        if (MERGE_TYPE_SORT == pMergeNode->type) {
508,622✔
1420
          // sort method
1421
          EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
508,622✔
1422

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

1435
          EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
508,622✔
1436
          EXPLAIN_ROW_END();
508,622✔
1437
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
508,622✔
1438
        }
1439
      }
1440

1441
      if (verbose) {
2,307,338✔
1442
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
786,845✔
1443
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
786,845✔
1444
                           nodesGetOutputNumFromSlotList(pMergeNode->node.pOutputDataBlockDesc->pSlots));
1445
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
786,845✔
1446
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pMergeNode->node.pOutputDataBlockDesc->outputRowSize);
786,845✔
1447
        EXPLAIN_ROW_APPEND_LIMIT(pMergeNode->node.pLimit);
786,845✔
1448
        EXPLAIN_ROW_APPEND_SLIMIT(pMergeNode->node.pSlimit);
786,845✔
1449
        EXPLAIN_ROW_END();
786,845✔
1450
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
786,845✔
1451

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

1458
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGE_KEYS_FORMAT);
786,845✔
1459
          if (pMergeNode->groupSort) {
786,845✔
1460
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, "_group_id asc");
340,729✔
1461
            if (LIST_LENGTH(pMergeNode->pMergeKeys) > 0) {
340,729✔
1462
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
338,864✔
1463
            }
1464
          }
1465
          for (int32_t i = 0; i < LIST_LENGTH(pMergeNode->pMergeKeys); ++i) {
1,578,515✔
1466
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pMergeNode->pMergeKeys, i);
791,670✔
1467
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, nodesGetNameFromColumnNode(ptn->pExpr));
791,670✔
1468
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
791,670✔
1469
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, EXPLAIN_ORDER_STRING(ptn->order));
791,670✔
1470
            if (i != LIST_LENGTH(pMergeNode->pMergeKeys) - 1) {
791,670✔
1471
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
6,690✔
1472
            }
1473
          }
1474
          EXPLAIN_ROW_END();
786,845✔
1475
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
786,845✔
1476
        }
1477

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

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

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

1549
      if (verbose) {
63,356✔
1550
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
23,161✔
1551
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
23,161✔
1552
                           nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
1553
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,161✔
1554
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
23,161✔
1555
        EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
23,161✔
1556
        EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
23,161✔
1557
        EXPLAIN_ROW_END();
23,161✔
1558
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
23,161✔
1559

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

1568
        if (qExplainCouldApplyTagIndex(pResNode->pPlan)) {
23,161✔
1569
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TAG_INDEX_FORMAT);
×
1570
          QRY_ERR_RET(nodesNodeToSQL(pResNode->pPlan->pTagIndexCond, tbuf + VARSTR_HEADER_SIZE,
×
1571
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1572
          EXPLAIN_ROW_END();
×
1573
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1574
        }
1575
      }
1576
      break;
63,356✔
1577
    }
1578
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
10,048✔
1579
      STableCountScanPhysiNode *pLastRowNode = (STableCountScanPhysiNode *)pNode;
10,048✔
1580
      char *dbname = pLastRowNode->scan.tableName.dbname;
10,048✔
1581
      char *tbname = pLastRowNode->scan.tableName.tname;
10,048✔
1582
      if (dbname[0] != '\0' && tbname[0] != '\0') {
10,424✔
1583
        char name[TSDB_TABLE_FNAME_LEN];
376✔
1584
        snprintf(name, sizeof(name), "%s.%s", dbname, tbname);
376✔
1585
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, name);
376✔
1586
      } else if (dbname[0] != '\0') {
9,672✔
1587
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, dbname);
376✔
1588
      } else if (tbname[0] != '\0') {
9,296✔
1589
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, tbname);
376✔
1590
      } else {
1591
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, TSDB_INS_TABLE_TABLES);
8,920✔
1592
      }
1593
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
10,048✔
1594
      if (pResNode->pExecInfo) {
10,048✔
1595
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2,392✔
1596
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,392✔
1597
      }
1598
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, LIST_LENGTH(pLastRowNode->scan.pScanCols));
10,048✔
1599
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10,048✔
1600
      if (pLastRowNode->scan.pScanPseudoCols) {
10,048✔
1601
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
10,048✔
1602
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10,048✔
1603
      }
1604
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
10,048✔
1605
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10,048✔
1606
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
10,048✔
1607
      EXPLAIN_ROW_END();
10,048✔
1608
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
10,048✔
1609

1610
      if (verbose) {
10,048✔
1611
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,784✔
1612
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
4,784✔
1613
                           nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
1614
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,784✔
1615
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
4,784✔
1616
        EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
4,784✔
1617
        EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
4,784✔
1618
        EXPLAIN_ROW_END();
4,784✔
1619
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,784✔
1620

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

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

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

1658
        EXPLAIN_ROW_END();
×
1659
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1660

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

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

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

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

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

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

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

1764
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pInterpNode->fillMode));
5,228✔
1765
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
5,228✔
1766

1767
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
5,228✔
1768
      EXPLAIN_ROW_END();
5,228✔
1769
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
5,228✔
1770

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

1797
          EXPLAIN_ROW_END();
960✔
1798
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
960✔
1799
        }
1800

1801
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_INTERVAL_VALUE_FORMAT, pInterpNode->interval, pInterpNode->intervalUnit);
5,228✔
1802
        EXPLAIN_ROW_END();
5,228✔
1803

1804
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pInterpNode->timeRange.skey, pInterpNode->timeRange.ekey);
5,228✔
1805
        EXPLAIN_ROW_END();
5,228✔
1806
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
5,228✔
1807

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

1833
      if (verbose) {
14,026✔
1834
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_START_FORMAT);
14,026✔
1835
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pStartCond, tbuf + VARSTR_HEADER_SIZE,
14,026✔
1836
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1837
        EXPLAIN_ROW_END();
14,026✔
1838
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
14,026✔
1839

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

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

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

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

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

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

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

1961
        if (pGroupCache->node.pConditions) {
918✔
1962
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1963
          QRY_ERR_RET(nodesNodeToSQL(pGroupCache->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1964
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1965
          EXPLAIN_ROW_END();
×
1966
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1967
        }
1968
      }
1969
      break;
282,118✔
1970
    }
1971
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL:{
282,118✔
1972
      SDynQueryCtrlPhysiNode *pDyn = (SDynQueryCtrlPhysiNode *)pNode;
282,118✔
1973
      EXPLAIN_ROW_NEW(level, EXPLAIN_DYN_QRY_CTRL_FORMAT, qExplainGetDynQryCtrlType(pDyn->qType));
282,118✔
1974
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
282,118✔
1975
      if (pResNode->pExecInfo) {
282,118✔
1976
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
918✔
1977
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
918✔
1978
      }
1979
      switch (pDyn->qType) {
282,118✔
1980
        case DYN_QTYPE_STB_HASH: {
282,118✔
1981
          EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pDyn->stbJoin.batchFetch);
282,118✔
1982
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
282,118✔
1983
          EXPLAIN_ROW_APPEND(EXPLAIN_VGROUP_SLOT_FORMAT, pDyn->stbJoin.vgSlot[0], pDyn->stbJoin.vgSlot[1]);
282,118✔
1984
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
282,118✔
1985
          EXPLAIN_ROW_APPEND(EXPLAIN_UID_SLOT_FORMAT, pDyn->stbJoin.uidSlot[0], pDyn->stbJoin.uidSlot[1]);
282,118✔
1986
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
282,118✔
1987
          EXPLAIN_ROW_APPEND(EXPLAIN_SRC_SCAN_FORMAT, pDyn->stbJoin.srcScan[0], pDyn->stbJoin.srcScan[1]);
282,118✔
1988
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
282,118✔
1989
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
282,118✔
1990
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
282,118✔
1991
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
282,118✔
1992
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
282,118✔
1993
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
282,118✔
1994
          break;
282,118✔
1995
        }
1996
        case DYN_QTYPE_VTB_SCAN: {
×
1997
          EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDyn->vtbScan.pScanCols->length);
×
1998
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1999
          EXPLAIN_ROW_APPEND(EXPLAIN_ORIGIN_VGROUP_NUM_FORMAT, pDyn->vtbScan.pOrgVgIds->length);
×
2000
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2001
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
×
2002
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2003
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
×
2004
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2005
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2006
          break;
×
2007
        }
2008
        case DYN_QTYPE_VTB_WINDOW: {
×
2009
          EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDyn->vtbWindow.pTargets->length);
×
2010
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2011
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
×
2012
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2013
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
×
2014
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2015
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2016
          break;
×
2017
        }
2018
        default:
×
2019
          break;
×
2020
      }
2021

2022
      EXPLAIN_ROW_END();
282,118✔
2023
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
282,118✔
2024

2025
      if (verbose) {
282,118✔
2026
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
918✔
2027
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
918✔
2028
                           nodesGetOutputNumFromSlotList(pDyn->node.pOutputDataBlockDesc->pSlots));
2029
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
918✔
2030
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->outputRowSize);
918✔
2031
        EXPLAIN_ROW_APPEND_LIMIT(pDyn->node.pLimit);
918✔
2032
        EXPLAIN_ROW_APPEND_SLIMIT(pDyn->node.pSlimit);
918✔
2033
        EXPLAIN_ROW_END();
918✔
2034
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
918✔
2035

2036
        if (pDyn->node.pConditions) {
918✔
2037
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2038
          QRY_ERR_RET(nodesNodeToSQL(pDyn->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2039
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2040
          EXPLAIN_ROW_END();
×
2041
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2042
        }
2043
      }
2044
      break;
282,118✔
2045
    }
2046
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT: {
9,840✔
2047
      SCountWindowPhysiNode *pCountNode = (SCountWindowPhysiNode *)pNode;
9,840✔
2048
      EXPLAIN_ROW_NEW(level, EXPLAIN_COUNT_FORMAT);
9,840✔
2049
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
9,840✔
2050
      if (pResNode->pExecInfo) {
9,840✔
2051
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2052
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2053
      }
2054
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pCountNode->window.pFuncs->length);
9,840✔
2055
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,840✔
2056
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pCountNode->window.node.pOutputDataBlockDesc->totalRowSize);
9,840✔
2057
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
9,840✔
2058
      EXPLAIN_ROW_END();
9,840✔
2059
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
9,840✔
2060

2061
      if (verbose) {
9,840✔
2062
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_NUM_FORMAT, pCountNode->windowCount);
9,840✔
2063
        EXPLAIN_ROW_END();
9,840✔
2064
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
9,840✔
2065
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_SLIDING_FORMAT, pCountNode->windowSliding);
9,840✔
2066
        EXPLAIN_ROW_END();
9,840✔
2067
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
9,840✔
2068
      }
2069
      break;
9,840✔
2070
    }
2071
    case QUERY_NODE_PHYSICAL_PLAN_EXTERNAL_WINDOW: {
×
2072
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
×
2073
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
×
2074
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
2075
      if (pResNode->pExecInfo) {
×
2076
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2077
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2078
      }
2079
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pExternal->window.pFuncs->length);
×
2080
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2081
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
×
2082
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2083
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
×
2084
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2085
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
×
2086
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2087
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2088
      EXPLAIN_ROW_END();
×
2089
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
2090

2091
      if (verbose) {
×
2092
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
2093
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
2094
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2095
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2096
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
×
2097
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
×
2098
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
×
2099
        EXPLAIN_ROW_END();
×
2100
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2101
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pExternal->timeRange.skey, pExternal->timeRange.ekey);
×
2102
        EXPLAIN_ROW_END();
×
2103
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2104

2105
        if (pExternal->window.node.pConditions) {
×
2106
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2107
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2108
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2109
          EXPLAIN_ROW_END();
×
2110
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2111
        }
2112

2113
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
×
2114
        EXPLAIN_ROW_END();
×
2115
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2116
      }
2117
      break;
×
2118
    }
2119
    case QUERY_NODE_PHYSICAL_PLAN_HASH_EXTERNAL: {
×
2120
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
×
2121
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
×
2122
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
2123
      if (pResNode->pExecInfo) {
×
2124
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2125
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2126
      }
2127
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pExternal->window.pFuncs->length);
×
2128
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2129
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
×
2130
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2131
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
×
2132
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2133
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
×
2134
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2135
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2136
      EXPLAIN_ROW_END();
×
2137
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
2138

2139
      if (verbose) {
×
2140
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
2141
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
2142
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2143
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2144
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
×
2145
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
×
2146
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
×
2147
        EXPLAIN_ROW_END();
×
2148
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2149
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pExternal->timeRange.skey, pExternal->timeRange.ekey);
×
2150
        EXPLAIN_ROW_END();
×
2151
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2152

2153
        if (pExternal->window.node.pConditions) {
×
2154
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2155
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2156
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2157
          EXPLAIN_ROW_END();
×
2158
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2159
        }
2160

2161
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
×
2162
        EXPLAIN_ROW_END();
×
2163
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2164
      }
2165
      break;
×
2166
    }
2167
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_EXTERNAL: {
×
2168
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
×
2169
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_ALIGNED_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
×
2170
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
2171
      if (pResNode->pExecInfo) {
×
2172
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2173
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2174
      }
2175
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pExternal->window.pFuncs->length);
×
2176
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2177
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
×
2178
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2179
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
×
2180
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2181
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
×
2182
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2183
      EXPLAIN_ROW_END();
×
2184
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
2185

2186
      if (verbose) {
×
2187
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
2188
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
2189
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2190
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2191
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
×
2192
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
×
2193
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
×
2194
        EXPLAIN_ROW_END();
×
2195
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2196

2197
        if (pExternal->window.node.pConditions) {
×
2198
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2199
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2200
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2201
          EXPLAIN_ROW_END();
×
2202
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2203
        }
2204

2205
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
×
2206
        EXPLAIN_ROW_END();
×
2207
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2208
      }
2209
      break;
×
2210
    }
2211
    default:
×
2212
      qError("not supported physical node type %d", pNode->type);
×
2213
      return TSDB_CODE_APP_ERROR;
×
2214
  }
2215

2216
  return TSDB_CODE_SUCCESS;
35,652,193✔
2217
}
2218

2219
static int32_t qExplainResNodeToRows(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t *level) {
35,652,193✔
2220
  if (NULL == pResNode) {
35,652,193✔
2221
    qError("explain res node is NULL");
×
2222
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2223
  }
2224

2225
  int32_t code = 0;
35,652,193✔
2226
  QRY_ERR_RET(qExplainResNodeToRowsImpl(pResNode, ctx, level));
35,652,193✔
2227

2228
  SNode *pNode = NULL;
35,652,193✔
2229
  FOREACH(pNode, pResNode->pChildren) { 
57,168,828✔
2230
    int32_t nlevel = *level + 1;
21,516,635✔
2231
    QRY_ERR_RET(qExplainResNodeToRows((SExplainResNode *)pNode, ctx, &nlevel)); 
21,516,635✔
2232
  }
2233

2234
  return TSDB_CODE_SUCCESS;
35,652,193✔
2235
}
2236

2237
static int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t *level, bool singleChannel) {
14,135,558✔
2238
  SExplainResNode *node = NULL;
14,135,558✔
2239
  int32_t          code = 0;
14,135,558✔
2240
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
14,135,558✔
2241

2242
  SExplainGroup *group = taosHashGet(ctx->pCurrPlanCtx->groupHash, &groupId, sizeof(groupId));
14,135,558✔
2243
  if (NULL == group) {
14,135,558✔
2244
    qError("group %d not in groupHash", groupId);
×
2245
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2246
  }
2247

2248
  group->singleChannel = singleChannel;
14,135,558✔
2249
  group->physiPlanExecIdx = 0;
14,135,558✔
2250

2251
  QRY_ERR_RET(qExplainGenerateResNode(group->plan, group->plan->pNode, group, &node));
14,135,558✔
2252

2253
  QRY_ERR_JRET(qExplainResNodeToRows(node, ctx, level));
14,135,558✔
2254

2255
_return:
14,135,558✔
2256

2257
  qExplainFreeResNode(node);
14,135,558✔
2258

2259
  QRY_RET(code);
14,135,558✔
2260
}
2261

2262
static int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
4,778,120✔
2263
  int32_t      code = 0;
4,778,120✔
2264
  SSDataBlock *pBlock = NULL;
4,778,120✔
2265
  SExplainCtx *pCtx = (SExplainCtx *)ctx;
4,778,120✔
2266
  int32_t      rowNum = taosArrayGetSize(pCtx->rows);
4,778,120✔
2267
  if (rowNum <= 0) {
4,778,120✔
2268
    qError("empty explain res rows");
×
2269
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2270
  }
2271

2272
  code = createDataBlock(&pBlock);
4,778,120✔
2273
  QRY_ERR_JRET(code);
4,778,120✔
2274

2275
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, TSDB_EXPLAIN_RESULT_ROW_SIZE, 1);
4,778,120✔
2276
  QRY_ERR_JRET(blockDataAppendColInfo(pBlock, &infoData));
4,778,120✔
2277
  QRY_ERR_JRET(blockDataEnsureCapacity(pBlock, rowNum));
4,778,120✔
2278

2279
  SColumnInfoData *pInfoData = taosArrayGet(pBlock->pDataBlock, 0);
4,778,120✔
2280

2281
  for (int32_t i = 0; i < rowNum; ++i) {
64,727,944✔
2282
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
59,949,824✔
2283
    QRY_ERR_JRET(colDataSetVal(pInfoData, i, row->buf, false));
59,949,824✔
2284
  }
2285

2286
  pBlock->info.rows = rowNum;
4,778,120✔
2287

2288
  size_t dataEncodeBufSize = blockGetEncodeSize(pBlock);
4,778,120✔
2289
  int32_t rspSize = sizeof(SRetrieveTableRsp) + dataEncodeBufSize + PAYLOAD_PREFIX_LEN;
4,778,120✔
2290

2291
  SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, rspSize);
4,778,120✔
2292
  if (NULL == rsp) {
4,778,120✔
2293
    qError("malloc SRetrieveTableRsp failed, size:%d", rspSize);
×
2294
    QRY_ERR_JRET(terrno);
×
2295
  }
2296

2297
  rsp->completed = 1;
4,778,120✔
2298
  rsp->numOfRows = htobe64((int64_t)rowNum);
4,778,120✔
2299

2300
  int32_t len = blockEncode(pBlock, rsp->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, taosArrayGetSize(pBlock->pDataBlock));
4,778,120✔
2301
  if(len < 0) {
4,778,120✔
2302
    qError("qExplainGetRspFromCtx: blockEncode failed");
×
2303
    QRY_ERR_JRET(terrno);
×
2304
  }
2305

2306
  rsp->compLen = htonl(len);
4,778,120✔
2307
  rsp->payloadLen = htonl(len);
4,778,120✔
2308
  rsp->compressed = 0;
4,778,120✔
2309

2310
  SET_PAYLOAD_LEN(rsp->data, len, len);
4,778,120✔
2311

2312
_return:
4,778,120✔
2313
  blockDataDestroy(pBlock);
4,778,120✔
2314

2315
  *pRsp = rsp;
4,778,120✔
2316
  QRY_RET(code);
4,778,120✔
2317
}
2318

2319
static int32_t qExplainBuildPlanCtx(SQueryPlan *pDag, SExplainPlanCtx *pCtx) {
4,811,504✔
2320
  int32_t        code = 0;
4,811,504✔
2321
  SNodeListNode *plans = NULL;
4,811,504✔
2322
  int32_t        taskNum = 0;
4,811,504✔
2323
  SExplainGroup *pGroup = NULL;
4,811,504✔
2324

2325
  if (pDag->numOfSubplans <= 0) {
4,811,504✔
2326
    qError("invalid subplan num:%d", pDag->numOfSubplans);
×
2327
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2328
  }
2329

2330
  int32_t levelNum = (int32_t)LIST_LENGTH(pDag->pSubplans);
4,811,504✔
2331
  if (levelNum <= 0) {
4,811,504✔
2332
    qError("invalid level num:%d", levelNum);
×
2333
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2334
  }
2335

2336
  pCtx->groupHash =
4,811,504✔
2337
      taosHashInit(EXPLAIN_MAX_GROUP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
4,811,504✔
2338
  if (NULL == pCtx->groupHash) {
4,811,504✔
2339
    qError("groupHash %d failed", EXPLAIN_MAX_GROUP_NUM);
×
2340
    QRY_ERR_RET(terrno);
×
2341
  }
2342

2343
  for (int32_t i = 0; i < levelNum; ++i) {
13,463,023✔
2344
    plans = (SNodeListNode *)nodesListGetNode(pDag->pSubplans, i);
8,651,519✔
2345
    if (NULL == plans) {
8,651,519✔
2346
      qError("empty level plan, level:%d", i);
×
2347
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2348
    }
2349

2350
    taskNum = (int32_t)LIST_LENGTH(plans->pNodeList);
8,651,519✔
2351
    if (taskNum <= 0) {
8,651,519✔
2352
      qError("invalid level plan number:%d, level:%d", taskNum, i);
×
2353
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2354
    }
2355

2356
    SSubplan *plan = NULL;
8,651,519✔
2357
    for (int32_t n = 0; n < taskNum; ++n) {
25,152,657✔
2358
      plan = (SSubplan *)nodesListGetNode(plans->pNodeList, n);
16,501,138✔
2359
      pGroup = taosHashGet(pCtx->groupHash, &plan->id.groupId, sizeof(plan->id.groupId));
16,501,138✔
2360
      if (pGroup) {
16,501,138✔
2361
        ++pGroup->nodeNum;
5,240,278✔
2362
        continue;
5,240,278✔
2363
      }
2364

2365
      SExplainGroup group = {0};
11,260,860✔
2366
      group.nodeNum = 1;
11,260,860✔
2367
      group.plan = plan;
11,260,860✔
2368

2369
      if (0 != taosHashPut(pCtx->groupHash, &plan->id.groupId, sizeof(plan->id.groupId), &group, sizeof(group))) {
11,260,860✔
2370
        qError("taosHashPut to explainGroupHash failed, taskIdx:%d", n);
×
2371
        QRY_ERR_JRET(terrno);
×
2372
      }
2373
    }
2374

2375
    if (0 == i) {
8,651,519✔
2376
      if (taskNum > 1) {
4,811,504✔
2377
        qError("invalid taskNum %d for level 0", taskNum);
×
2378
        QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2379
      }
2380

2381
      pCtx->rootGroupId = plan->id.groupId;
4,811,504✔
2382
    }
2383

2384
    qDebug("level %d group handled, taskNum:%d", i, taskNum);
8,651,519✔
2385
  }
2386

2387
  pCtx->groupNum = taosHashGetSize(pCtx->groupHash);
4,811,504✔
2388

2389
  return TSDB_CODE_SUCCESS;
4,811,504✔
2390

2391
_return:
×
2392

2393
  if (code) {
×
2394
    qError("QID:0x%" PRIx64 " %s failed since %s", pDag->queryId, __func__, tstrerror(code));
×
2395
  }
2396
  
2397
  QRY_RET(code);
×
2398
}
2399

2400
static int32_t qExplainBuildCtx(SQueryPlan *pDag, SExplainCtx **pCtx) {
4,781,792✔
2401
  int32_t        code = 0;
4,781,792✔
2402
  SNodeListNode *plans = NULL;
4,781,792✔
2403
  int32_t        taskNum = 0;
4,781,792✔
2404
  SExplainGroup *pGroup = NULL;
4,781,792✔
2405
  SExplainCtx   *ctx = NULL;
4,781,792✔
2406

2407
  if (pDag->numOfSubplans <= 0) {
4,781,792✔
2408
    qError("invalid subplan num:%d", pDag->numOfSubplans);
×
2409
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2410
  }
2411

2412
  int32_t levelNum = (int32_t)LIST_LENGTH(pDag->pSubplans);
4,781,792✔
2413
  if (levelNum <= 0) {
4,781,792✔
2414
    qError("invalid level num:%d", levelNum);
×
2415
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2416
  }
2417

2418
  QRY_ERR_JRET(qExplainInitCtx(&ctx, pDag->explainInfo.verbose, pDag->explainInfo.ratio, pDag->explainInfo.mode));
4,781,792✔
2419

2420
  QRY_ERR_JRET(qExplainBuildPlanCtx(pDag, &ctx->planCtx));
4,781,792✔
2421
  ctx->groupNum = ctx->planCtx.groupNum;
4,781,792✔
2422

2423
  if (pDag->pChildren && pDag->pChildren->length > 0) {
4,781,792✔
2424
    ctx->subPlanCtxs = taosArrayInit_s(sizeof(SExplainPlanCtx), pDag->pChildren->length);
14,856✔
2425
    if (NULL == ctx->subPlanCtxs) {
14,856✔
2426
      qError("taosArrayInit %d explainPlanCtx failed, error:%s", pDag->pChildren->length, tstrerror(terrno));
×
2427
      QRY_ERR_JRET(terrno);
×
2428
    }
2429
    
2430
    SNode* pNode = NULL;
14,856✔
2431
    int32_t i = 0;
14,856✔
2432
    FOREACH(pNode, pDag->pChildren) {
44,568✔
2433
      SExplainPlanCtx* pSub = taosArrayGet(ctx->subPlanCtxs, i);
29,712✔
2434
      QRY_ERR_JRET(qExplainBuildPlanCtx((SQueryPlan*)pNode, pSub));
29,712✔
2435
      ctx->groupNum += pSub->groupNum;
29,712✔
2436
      i++;
29,712✔
2437
    }
2438
  }
2439

2440
  *pCtx = ctx;
4,781,792✔
2441

2442
  return TSDB_CODE_SUCCESS;
4,781,792✔
2443

2444
_return:
×
2445

2446
  qExplainFreeCtx(ctx);
×
2447

2448
  QRY_RET(code);
×
2449
}
2450

2451
static int32_t qExplainAppendPlanRows(SExplainCtx *pCtx) {
4,778,120✔
2452
  if (EXPLAIN_MODE_ANALYZE != pCtx->mode) {
4,778,120✔
2453
    return TSDB_CODE_SUCCESS;
3,996,978✔
2454
  }
2455

2456
  int32_t tlen = 0;
781,142✔
2457
  char   *tbuf = pCtx->tbuf;
781,142✔
2458

2459
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_RATIO_TIME_FORMAT, pCtx->ratio);
781,142✔
2460
  EXPLAIN_SUM_ROW_END();
781,142✔
2461
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
781,142✔
2462

2463
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_PLANNING_TIME_FORMAT, (double)(pCtx->jobStartTs - pCtx->reqStartTs) / 1000.0);
781,142✔
2464
  EXPLAIN_SUM_ROW_END();
781,142✔
2465
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
781,142✔
2466

2467
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_EXEC_TIME_FORMAT, (double)(pCtx->jobDoneTs - pCtx->jobStartTs) / 1000.0);
781,142✔
2468
  EXPLAIN_SUM_ROW_END();
781,142✔
2469
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
781,142✔
2470

2471
  return TSDB_CODE_SUCCESS;
781,142✔
2472
}
2473

2474
static int32_t qExplainGenerateRsp(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
4,778,120✔
2475
  int32_t level = 0;
4,778,120✔
2476
  
2477
  pCtx->currPlanId = -1;
4,778,120✔
2478
  pCtx->pCurrPlanCtx = &pCtx->planCtx;
4,778,120✔
2479
  QRY_ERR_RET(qExplainAppendGroupResRows(pCtx, pCtx->pCurrPlanCtx->rootGroupId, &level, false));
4,778,120✔
2480
  
2481
  if (pCtx->subPlanCtxs) {
4,778,120✔
2482
    int32_t subNum = taosArrayGetSize(pCtx->subPlanCtxs);
14,856✔
2483
    for (pCtx->currPlanId = subNum - 1; pCtx->currPlanId >= 0; --pCtx->currPlanId) {
44,568✔
2484
      pCtx->pCurrPlanCtx = taosArrayGet(pCtx->subPlanCtxs, pCtx->currPlanId);
29,712✔
2485
      level = 0;
29,712✔
2486
      QRY_ERR_RET(qExplainAppendGroupResRows(pCtx, pCtx->pCurrPlanCtx->rootGroupId, &level, false));
29,712✔
2487
    }
2488
  }
2489
  QRY_ERR_RET(qExplainAppendPlanRows(pCtx));
4,778,120✔
2490
  QRY_ERR_RET(qExplainGetRspFromCtx(pCtx, pRsp));
4,778,120✔
2491

2492
  return TSDB_CODE_SUCCESS;
4,778,120✔
2493
}
2494

2495
void qExplainSetCurrPlan(SExplainCtx *pCtx, int32_t subJobId) {
2,783,701✔
2496
  pCtx->currPlanId = subJobId;
2,783,701✔
2497
  pCtx->pCurrPlanCtx = EXPLAIN_GET_CUR_PLAN_CTX(pCtx);
2,784,160✔
2498
}
2,784,160✔
2499

2500
int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t groupId, SRetrieveTableRsp **pRsp) {
2,784,160✔
2501
  if(!pCtx || !pRspMsg || !pRsp) return TSDB_CODE_INVALID_PARA;
2,784,160✔
2502
  SExplainResNode *node = NULL;
2,784,160✔
2503
  int32_t          code = 0;
2,784,160✔
2504
  bool             groupDone = false;
2,784,160✔
2505
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
2,784,160✔
2506

2507
  SExplainGroup *group = taosHashGet(ctx->pCurrPlanCtx->groupHash, &groupId, sizeof(groupId));
2,784,160✔
2508
  if (NULL == group) {
2,784,160✔
2509
    qError("group %d not in groupHash", groupId);
×
2510
    tFreeSExplainRsp(pRspMsg);
×
2511
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2512
  }
2513

2514
  taosWLockLatch(&group->lock);
2,784,160✔
2515
  if (NULL == group->nodeExecInfo) {
2,784,160✔
2516
    group->nodeExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainRsp));
1,635,453✔
2517
    if (NULL == group->nodeExecInfo) {
1,635,453✔
2518
      qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
×
2519
      code = terrno;
×
2520
      TAOS_CHECK_ERRNO(code);
×
2521
    }
2522

2523
    group->physiPlanExecNum = pRspMsg->numOfPlans;
1,635,453✔
2524
  } else if (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum) {
1,148,248✔
2525
    qError("group execInfo already full, size:%d, nodeNum:%d", (int32_t)taosArrayGetSize(group->nodeExecInfo),
×
2526
           group->nodeNum);
2527
    code = TSDB_CODE_APP_ERROR;
×
2528
    TAOS_CHECK_ERRNO(code);
×
2529
  }
2530

2531
  if (group->physiPlanExecNum != pRspMsg->numOfPlans) {
2,784,160✔
2532
    qError("physiPlanExecNum %d mismatch with others %d in group %d", pRspMsg->numOfPlans, group->physiPlanExecNum,
×
2533
           groupId);
2534
    code = TSDB_CODE_APP_ERROR;
×
2535
    TAOS_CHECK_ERRNO(code);
×
2536
  }
2537

2538
  if(taosArrayPush(group->nodeExecInfo, pRspMsg) == NULL)
5,568,320✔
2539
  {
2540
    code = terrno;
×
2541
    TAOS_CHECK_ERRNO(code);
×
2542
  }
2543

2544
  groupDone = (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum);
2,784,160✔
2545

2546
  taosWUnLockLatch(&group->lock);
2,784,160✔
2547

2548
  if (groupDone && (pCtx->groupNum == atomic_add_fetch_32(&pCtx->groupDoneNum, 1))) {
2,784,160✔
2549
    if (atomic_load_8((int8_t *)&pCtx->execDone)) {
781,142✔
2550
      if (0 == taosWTryLockLatch(&pCtx->lock)) {
1,892✔
2551
        QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
1,892✔
2552
        // LEAVE LOCK THERE
2553
      }
2554
    }
2555
  }
2556

2557
  return TSDB_CODE_SUCCESS;
2,784,160✔
2558

2559
_exit:
×
2560
  tFreeSExplainRsp(pRspMsg);
×
2561
  taosWUnLockLatch(&group->lock);
×
2562
  return code;
×
2563
}
2564

2565
int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp) {
3,996,978✔
2566
  if (!pDag || !pRsp) return TSDB_CODE_INVALID_PARA;
3,996,978✔
2567
  int32_t      code = 0;
3,996,978✔
2568
  SExplainCtx *pCtx = NULL;
3,996,978✔
2569

2570
  QRY_ERR_RET(qExplainBuildCtx(pDag, &pCtx));
3,996,978✔
2571
  QRY_ERR_JRET(qExplainGenerateRsp(pCtx, pRsp));
3,996,978✔
2572

2573
_return:
3,996,978✔
2574
  qExplainFreeCtx(pCtx);
3,996,978✔
2575
  QRY_RET(code);
3,996,978✔
2576
}
2577

2578
int32_t qExecExplainBegin(SQueryPlan *pDag, SExplainCtx **pCtx, int64_t startTs) {
784,814✔
2579
  if(!pDag || !pCtx) return TSDB_CODE_INVALID_PARA;
784,814✔
2580
  QRY_ERR_RET(qExplainBuildCtx(pDag, pCtx));
784,814✔
2581

2582
  (*pCtx)->reqStartTs = startTs;
784,814✔
2583
  (*pCtx)->jobStartTs = taosGetTimestampUs();
1,569,628✔
2584

2585
  return TSDB_CODE_SUCCESS;
784,814✔
2586
}
2587

2588
int32_t qExecExplainEnd(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
781,142✔
2589
  if(!pCtx || !pRsp) {
781,142✔
2590
    return TSDB_CODE_INVALID_PARA;
×
2591
  }
2592
  
2593
  int32_t code = 0;
781,142✔
2594
  pCtx->jobDoneTs = taosGetTimestampUs();
781,142✔
2595

2596
  atomic_store_8((int8_t *)&pCtx->execDone, true);
781,142✔
2597

2598
  if (pCtx->groupNum == atomic_load_32(&pCtx->groupDoneNum)) {
781,142✔
2599
    if (0 == taosWTryLockLatch(&pCtx->lock)) {
779,250✔
2600
      QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
779,250✔
2601
      // LEAVE LOCK THERE
2602
    }
2603
  }
2604

2605
  return TSDB_CODE_SUCCESS;
781,142✔
2606
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc