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

taosdata / TDengine / #3548

04 Dec 2024 01:03PM UTC coverage: 59.846% (-0.8%) from 60.691%
#3548

push

travis-ci

web-flow
Merge pull request #29033 from taosdata/fix/calculate-vnode-memory-used

fix/calculate-vnode-memory-used

118484 of 254183 branches covered (46.61%)

Branch coverage included in aggregate %.

199691 of 277471 relevant lines covered (71.97%)

18794141.86 hits per line

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

55.53
/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(SPhysiNode *pNode, SExplainGroup *group, SExplainResNode **pRes);
34
static int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t level, bool singleChannel);
35

36
char *qExplainGetDynQryCtrlType(EDynQueryType type) {
7,910✔
37
  switch (type) {
7,910!
38
    case DYN_QTYPE_STB_HASH:
7,910✔
39
      return "STable Join";
7,910✔
40
    default:
×
41
      break;
×
42
  }
43

44
  return "unknown task";
×
45
}
46

47
char* qExplainGetAsofOpStr(int32_t opType) {
112✔
48
  switch (opType) {
112!
49
    case OP_TYPE_GREATER_THAN:
4✔
50
      return ">";
4✔
51
    case OP_TYPE_GREATER_EQUAL:
18✔
52
      return ">=";
18✔
53
    case OP_TYPE_LOWER_THAN:
×
54
      return "<";
×
55
    case OP_TYPE_LOWER_EQUAL:
18✔
56
      return "<=";
18✔
57
    case OP_TYPE_EQUAL:
72✔
58
      return "=";
72✔
59
    default:
×
60
      return "UNKNOWN";
×
61
  }
62
}
63

64
char* qExplainGetTimerangeTargetStr(int32_t target) {
×
65
  static char* targetName[] = {"", "Left", "Right", "Left/Right"};
66
  if (target <= 0 || target > 3) {
×
67
    return "Unknown";
×
68
  }
69

70
  return targetName[target];
×
71
}
72

73
void qExplainFreeResNode(SExplainResNode *resNode) {
841,368✔
74
  if (NULL == resNode) {
841,368!
75
    return;
×
76
  }
77

78
  taosArrayDestroy(resNode->pExecInfo);
841,368✔
79

80
  SNode *node = NULL;
841,368✔
81
  FOREACH(node, resNode->pChildren) { qExplainFreeResNode((SExplainResNode *)node); }
1,351,516✔
82
  nodesClearList(resNode->pChildren);
841,368✔
83

84
  taosMemoryFreeClear(resNode);
841,368!
85
}
86

87
void qExplainFreeCtx(SExplainCtx *pCtx) {
10,468,430✔
88
  if (NULL == pCtx) {
10,468,430✔
89
    return;
10,360,832✔
90
  }
91

92
  int32_t rowSize = taosArrayGetSize(pCtx->rows);
107,598✔
93
  for (int32_t i = 0; i < rowSize; ++i) {
1,228,986✔
94
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
1,119,570✔
95
    taosMemoryFreeClear(row->buf);
1,119,570!
96
  }
97

98
  if (EXPLAIN_MODE_ANALYZE == pCtx->mode && pCtx->groupHash) {
109,416!
99
    void *pIter = taosHashIterate(pCtx->groupHash, NULL);
9,307✔
100
    while (pIter) {
24,534✔
101
      SExplainGroup *group = (SExplainGroup *)pIter;
15,227✔
102
      if (group->nodeExecInfo) {
15,227✔
103
        int32_t num = taosArrayGetSize(group->nodeExecInfo);
15,219✔
104
        for (int32_t i = 0; i < num; ++i) {
34,644✔
105
          SExplainRsp *rsp = taosArrayGet(group->nodeExecInfo, i);
19,425✔
106
          tFreeSExplainRsp(rsp);
19,425✔
107
        }
108
        taosArrayDestroy(group->nodeExecInfo);
15,219✔
109
      }
110

111
      pIter = taosHashIterate(pCtx->groupHash, pIter);
15,227✔
112
    }
113
  }
114

115
  taosHashCleanup(pCtx->groupHash);
109,416✔
116
  taosArrayDestroy(pCtx->rows);
109,416✔
117
  taosMemoryFreeClear(pCtx->tbuf);
109,416!
118
  taosMemoryFree(pCtx);
109,416✔
119
}
120

121
static int32_t qExplainInitCtx(SExplainCtx **pCtx, SHashObj *groupHash, bool verbose, double ratio, EExplainMode mode) {
109,416✔
122
  int32_t      code = 0;
109,416✔
123
  SExplainCtx *ctx = taosMemoryCalloc(1, sizeof(SExplainCtx));
109,416✔
124
  if (NULL == ctx) {
109,416!
125
    qError("calloc SExplainCtx failed");
×
126
    QRY_ERR_JRET(terrno);
×
127
  }
128

129
  SArray *rows = taosArrayInit(10, sizeof(SQueryExplainRowInfo));
109,416✔
130
  if (NULL == rows) {
109,416!
131
    qError("taosArrayInit SQueryExplainRowInfo failed");
×
132
    QRY_ERR_JRET(terrno);
×
133
  }
134

135
  char *tbuf = taosMemoryMalloc(TSDB_EXPLAIN_RESULT_ROW_SIZE);
109,416✔
136
  if (NULL == tbuf) {
109,416!
137
    qError("malloc size %d failed", TSDB_EXPLAIN_RESULT_ROW_SIZE);
×
138
    QRY_ERR_JRET(terrno);
×
139
  }
140

141
  ctx->mode = mode;
109,416✔
142
  ctx->verbose = verbose;
109,416✔
143
  ctx->ratio = ratio;
109,416✔
144
  ctx->tbuf = tbuf;
109,416✔
145
  ctx->rows = rows;
109,416✔
146
  ctx->groupHash = groupHash;
109,416✔
147

148
  *pCtx = ctx;
109,416✔
149

150
  return TSDB_CODE_SUCCESS;
109,416✔
151

152
_return:
×
153

154
  taosArrayDestroy(rows);
×
155
  taosHashCleanup(groupHash);
×
156
  taosMemoryFree(ctx);
×
157

158
  QRY_RET(code);
×
159
}
160

161
static int32_t qExplainGenerateResChildren(SPhysiNode *pNode, SExplainGroup *group, SNodeList **pChildren) {
841,368✔
162
  int32_t    tlen = 0;
841,368✔
163
  SNodeList *pPhysiChildren = pNode->pChildren;
841,368✔
164

165
  if (pPhysiChildren) {
841,368✔
166
    int32_t code = nodesMakeList(pChildren);
408,413✔
167
    if (NULL == *pChildren) {
408,413!
168
      qError("nodesMakeList failed");
×
169
      QRY_ERR_RET(code);
×
170
    }
171
  }
172

173
  SNode           *node = NULL;
841,368✔
174
  SExplainResNode *pResNode = NULL;
841,368✔
175
  FOREACH(node, pPhysiChildren) {
1,351,516✔
176
    QRY_ERR_RET(qExplainGenerateResNode((SPhysiNode *)node, group, &pResNode));
510,148!
177
    QRY_ERR_RET(nodesListAppend(*pChildren, (SNode *)pResNode));
510,148!
178
  }
179

180
  return TSDB_CODE_SUCCESS;
841,368✔
181
}
182

183
static int32_t qExplainGenerateResNodeExecInfo(SPhysiNode *pNode, SArray **pExecInfo, SExplainGroup *group) {
36,917✔
184
  *pExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainExecInfo));
36,917✔
185
  if (NULL == (*pExecInfo)) {
36,917!
186
    qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
×
187
    return terrno;
×
188
  }
189

190
  SExplainRsp *rsp = NULL;
36,917✔
191
  if (group->singleChannel) {
36,917✔
192
    if (0 == group->physiPlanExecIdx) {
3,512✔
193
      group->nodeIdx = 0;
3,170✔
194
    }
195

196
    rsp = taosArrayGet(group->nodeExecInfo, group->nodeIdx++);
3,512✔
197
    if (group->physiPlanExecIdx >= rsp->numOfPlans) {
3,512!
198
      qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
×
199
      return TSDB_CODE_APP_ERROR;
×
200
    }
201

202
    if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno;
7,024!
203
  } else {
204
    for (int32_t i = 0; i < group->nodeNum; ++i) {
70,706✔
205
      rsp = taosArrayGet(group->nodeExecInfo, i);
37,301✔
206
      if (group->physiPlanExecIdx >= rsp->numOfPlans) {
37,301!
207
        qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
×
208
        return TSDB_CODE_APP_ERROR;
×
209
      }
210

211
      if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno;
74,602!
212
    }
213
  }
214

215
  ++group->physiPlanExecIdx;
36,917✔
216

217
  return TSDB_CODE_SUCCESS;
36,917✔
218
}
219

220
static int32_t qExplainGenerateResNode(SPhysiNode *pNode, SExplainGroup *group, SExplainResNode **pResNode) {
841,368✔
221
  if (NULL == pNode) {
841,368!
222
    *pResNode = NULL;
×
223
    qError("physical node is NULL");
×
224
    return TSDB_CODE_APP_ERROR;
×
225
  }
226

227
  SExplainResNode *resNode = taosMemoryCalloc(1, sizeof(SExplainResNode));
841,368✔
228
  if (NULL == resNode) {
841,368!
229
    qError("calloc SPhysiNodeExplainRes failed");
×
230
    return terrno;
×
231
  }
232

233
  int32_t code = 0;
841,368✔
234
  resNode->pNode = pNode;
841,368✔
235

236
  if (group->nodeExecInfo) {
841,368✔
237
    QRY_ERR_JRET(qExplainGenerateResNodeExecInfo(pNode, &resNode->pExecInfo, group));
36,917!
238
  }
239

240
  QRY_ERR_JRET(qExplainGenerateResChildren(pNode, group, &resNode->pChildren));
841,368!
241

242
  *pResNode = resNode;
841,368✔
243

244
  return TSDB_CODE_SUCCESS;
841,368✔
245

246
_return:
×
247

248
  qExplainFreeResNode(resNode);
×
249

250
  QRY_RET(code);
×
251
}
252

253
static int32_t qExplainBufAppendExecInfo(SArray *pExecInfo, char *tbuf, int32_t *len) {
36,917✔
254
  int32_t          tlen = *len;
36,917✔
255
  int32_t          nodeNum = taosArrayGetSize(pExecInfo);
36,917✔
256
  SExplainExecInfo maxExecInfo = {0};
36,917✔
257

258
  for (int32_t i = 0; i < nodeNum; ++i) {
77,730✔
259
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
40,813✔
260
    if (execInfo->startupCost > maxExecInfo.startupCost) {
40,813✔
261
      maxExecInfo.startupCost = execInfo->startupCost;
25,942✔
262
    }
263
    if (execInfo->totalCost > maxExecInfo.totalCost) {
40,813✔
264
      maxExecInfo.totalCost = execInfo->totalCost;
38,000✔
265
    }
266
    if (execInfo->numOfRows > maxExecInfo.numOfRows) {
40,813✔
267
      maxExecInfo.numOfRows = execInfo->numOfRows;
34,548✔
268
    }
269
  }
270

271
  EXPLAIN_ROW_APPEND(EXPLAIN_EXECINFO_FORMAT, maxExecInfo.startupCost, maxExecInfo.totalCost, maxExecInfo.numOfRows);
36,917✔
272

273
  *len = tlen;
36,917✔
274

275
  return TSDB_CODE_SUCCESS;
36,917✔
276
}
277

278
static int32_t qExplainBufAppendVerboseExecInfo(SArray *pExecInfo, char *tbuf, int32_t *len) {
×
279
  int32_t          tlen = 0;
×
280
  bool             gotVerbose = false;
×
281
  int32_t          nodeNum = taosArrayGetSize(pExecInfo);
×
282
  SExplainExecInfo maxExecInfo = {0};
×
283

284
  for (int32_t i = 0; i < nodeNum; ++i) {
×
285
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
×
286
    if (execInfo->verboseInfo) {
×
287
      gotVerbose = true;
×
288
    }
289
  }
290

291
  if (gotVerbose) {
×
292
    EXPLAIN_ROW_APPEND("exec verbose info");
×
293
  }
294

295
  *len = tlen;
×
296

297
  return TSDB_CODE_SUCCESS;
×
298
}
299

300
static int32_t qExplainResAppendRow(SExplainCtx *ctx, char *tbuf, int32_t len, int32_t level) {
1,119,570✔
301
  SQueryExplainRowInfo row = {0};
1,119,570✔
302
  row.buf = taosMemoryMalloc(len);
1,119,570✔
303
  if (NULL == row.buf) {
1,119,570!
304
    qError("taosMemoryMalloc %d failed", len);
×
305
    QRY_ERR_RET(terrno);
×
306
  }
307

308
  memcpy(row.buf, tbuf, len);
1,119,570✔
309
  row.level = level;
1,119,570✔
310
  row.len = len;
1,119,570✔
311
  ctx->dataSize += row.len;
1,119,570✔
312

313
  if (NULL == taosArrayPush(ctx->rows, &row)) {
2,239,140!
314
    qError("taosArrayPush row to explain res rows failed");
×
315
    taosMemoryFree(row.buf);
×
316
    QRY_ERR_RET(terrno);
×
317
  }
318

319
  return TSDB_CODE_SUCCESS;
1,119,570✔
320
}
321

322
static uint8_t qExplainGetIntervalPrecision(SIntervalPhysiNode *pIntNode) {
14,941✔
323
  return ((SColumnNode *)pIntNode->window.pTspk)->node.resType.precision;
14,941✔
324
}
325

326
static char* qExplainGetScanMode(STableScanPhysiNode* pScan) {
212,559✔
327
  bool isGroupByTbname = false;
212,559✔
328
  bool isGroupByTag = false;
212,559✔
329
  bool seq = false;
212,559✔
330
  bool groupOrder = false;
212,559✔
331
  if (pScan->pGroupTags && LIST_LENGTH(pScan->pGroupTags) == 1) {
212,559!
332
    SNode* p = nodesListGetNode(pScan->pGroupTags, 0);
4,363✔
333
    if (QUERY_NODE_FUNCTION == nodeType(p) && (strcmp(((struct SFunctionNode*)p)->functionName, "tbname") == 0)) {
4,363✔
334
      isGroupByTbname = true;
915✔
335
    }
336
  }
337

338
  isGroupByTag = (NULL != pScan->pGroupTags) && !isGroupByTbname;
212,559✔
339
  if ((((!isGroupByTag) || isGroupByTbname) && pScan->groupSort) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
212,559!
340
    return "seq_grp_order";
×
341
  }
342

343
  if ((isGroupByTbname && (pScan->groupSort || pScan->scan.groupOrderScan)) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
212,559!
344
    return "grp_order";
17✔
345
  }
346

347
  return "ts_order";
212,542✔
348
}
349

350
static char* qExplainGetScanDataLoad(STableScanPhysiNode* pScan) {
212,559✔
351
  switch (pScan->dataRequired) {
212,559!
352
    case FUNC_DATA_REQUIRED_DATA_LOAD:
201,683✔
353
      return "data";
201,683✔
354
    case FUNC_DATA_REQUIRED_SMA_LOAD:
10,856✔
355
      return "sma";
10,856✔
356
    case FUNC_DATA_REQUIRED_NOT_LOAD:
20✔
357
      return "no";
20✔
358
    default:
×
359
      break;
×
360
  }
361

362
  return "unknown";
×
363
}
364

365
static int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t level) {
841,368✔
366
  int32_t     tlen = 0;
841,368✔
367
  bool        isVerboseLine = false;
841,368✔
368
  char       *tbuf = ctx->tbuf;
841,368✔
369
  bool        verbose = ctx->verbose;
841,368✔
370
  SPhysiNode *pNode = pResNode->pNode;
841,368✔
371
  if (NULL == pNode) {
841,368!
372
    qError("pyhsical node in explain res node is NULL");
×
373
    return TSDB_CODE_APP_ERROR;
×
374
  }
375

376
  switch (pNode->type) {
841,368!
377
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN: {
15,820✔
378
      STagScanPhysiNode *pTagScanNode = (STagScanPhysiNode *)pNode;
15,820✔
379
      EXPLAIN_ROW_NEW(level, EXPLAIN_TAG_SCAN_FORMAT, pTagScanNode->scan.tableName.tname);
15,820!
380
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
15,820✔
381
      if (pResNode->pExecInfo) {
15,820!
382
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
383
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
384
      }
385
      if (pTagScanNode->scan.pScanPseudoCols) {
15,820!
386
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTagScanNode->scan.pScanPseudoCols->length);
15,820✔
387
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
15,820✔
388
      }
389
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
15,820✔
390
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
15,820✔
391
      EXPLAIN_ROW_END();
15,820✔
392
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
15,820!
393

394
      if (verbose) {
15,820!
395
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
396
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
397
                           nodesGetOutputNumFromSlotList(pTagScanNode->scan.node.pOutputDataBlockDesc->pSlots));
398
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
399
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
×
400
        EXPLAIN_ROW_APPEND_LIMIT(pTagScanNode->scan.node.pLimit);
×
401
        EXPLAIN_ROW_APPEND_SLIMIT(pTagScanNode->scan.node.pSlimit);
×
402
        EXPLAIN_ROW_END();
×
403
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
404

405
        if (pResNode->pExecInfo) {
×
406
          QRY_ERR_RET(qExplainBufAppendVerboseExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
407
          if (tlen) {
×
408
            EXPLAIN_ROW_END();
×
409
            QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
410
          }
411
        }
412

413
        if (pTagScanNode->scan.node.pConditions) {
×
414
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
415
          QRY_ERR_RET(nodesNodeToSQL(pTagScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
416
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
417
          EXPLAIN_ROW_END();
×
418
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
419
        }
420
      }
421
      break;
15,820✔
422
    }
423
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
212,559✔
424
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
425
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: {
426
      STableScanPhysiNode *pTblScanNode = (STableScanPhysiNode *)pNode;
212,559✔
427
      EXPLAIN_ROW_NEW(level,
212,559!
428
                      QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN == pNode->type ? EXPLAIN_TBL_MERGE_SCAN_FORMAT
429
                                                                               : EXPLAIN_TBL_SCAN_FORMAT,
430
                      pTblScanNode->scan.tableName.tname);
431
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
212,559✔
432
      if (pResNode->pExecInfo) {
212,559✔
433
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
12,106!
434
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,106✔
435
      }
436

437
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pTblScanNode->scan.pScanCols->length);
212,559✔
438
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
212,559✔
439
      if (pTblScanNode->scan.pScanPseudoCols) {
212,559✔
440
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTblScanNode->scan.pScanPseudoCols->length);
79,604✔
441
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
79,604✔
442
      }
443
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
212,559✔
444
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
212,559✔
445
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_ORDER_FORMAT, pTblScanNode->scanSeq[0], pTblScanNode->scanSeq[1]);
212,559✔
446
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
212,559✔
447
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_MODE_FORMAT, qExplainGetScanMode(pTblScanNode));
212,559✔
448
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
212,559✔
449
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_DATA_LOAD_FORMAT, qExplainGetScanDataLoad(pTblScanNode));
212,559✔
450
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
212,559✔
451
      EXPLAIN_ROW_END();
212,559✔
452
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
212,559!
453

454
      // basic analyze output
455
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
212,559✔
456
        EXPLAIN_ROW_NEW(level + 1, "I/O: ");
12,106!
457

458
        int32_t                      nodeNum = taosArrayGetSize(pResNode->pExecInfo);
12,106✔
459
        struct STableScanAnalyzeInfo info = {0};
12,106✔
460

461
        int32_t maxIndex = 0;
12,106✔
462
        int32_t totalRows = 0;
12,106✔
463
        for (int32_t i = 0; i < nodeNum; ++i) {
26,011✔
464
          SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, i);
13,905✔
465
          STableScanAnalyzeInfo *pScanInfo = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
13,905✔
466

467
          info.totalBlocks += pScanInfo->totalBlocks;
13,905✔
468
          info.loadBlocks += pScanInfo->loadBlocks;
13,905✔
469
          info.totalRows += pScanInfo->totalRows;
13,905✔
470
          info.skipBlocks += pScanInfo->skipBlocks;
13,905✔
471
          info.filterTime += pScanInfo->filterTime;
13,905✔
472
          info.loadBlockStatis += pScanInfo->loadBlockStatis;
13,905✔
473
          info.totalCheckedRows += pScanInfo->totalCheckedRows;
13,905✔
474
          info.filterOutBlocks += pScanInfo->filterOutBlocks;
13,905✔
475

476
          if (pScanInfo->totalRows > totalRows) {
13,905✔
477
            totalRows = pScanInfo->totalRows;
11,112✔
478
            maxIndex = i;
11,112✔
479
          }
480
        }
481

482
        EXPLAIN_ROW_APPEND("total_blocks=%.1f", ((double)info.totalBlocks) / nodeNum);
12,106✔
483
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,106✔
484

485
        EXPLAIN_ROW_APPEND("load_blocks=%.1f", ((double)info.loadBlocks) / nodeNum);
12,106✔
486
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,106✔
487

488
        EXPLAIN_ROW_APPEND("load_block_SMAs=%.1f", ((double)info.loadBlockStatis) / nodeNum);
12,106✔
489
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,106✔
490

491
        EXPLAIN_ROW_APPEND("total_rows=%.1f", ((double)info.totalRows) / nodeNum);
12,106✔
492
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,106✔
493

494
        EXPLAIN_ROW_APPEND("check_rows=%.1f", ((double)info.totalCheckedRows) / nodeNum);
12,106✔
495
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,106✔
496
        EXPLAIN_ROW_END();
12,106✔
497

498
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
12,106!
499

500
        // 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,
501
        // start offset by 1.470 ms.
502
        SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, maxIndex);
12,106✔
503
        STableScanAnalyzeInfo *p1 = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
12,106✔
504

505
        EXPLAIN_ROW_NEW(level + 1, " ");
12,106!
506
        EXPLAIN_ROW_APPEND("max_row_task=%d, total_rows:%" PRId64 ", ep:%s (cost=%.3f..%.3f)", maxIndex, p1->totalRows,
12,106✔
507
                           "tbd", execInfo->startupCost, execInfo->totalCost);
508
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,106✔
509
        EXPLAIN_ROW_END();
12,106✔
510

511
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
12,106!
512
      }
513

514
      if (verbose) {
212,559✔
515
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
28,700!
516
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
28,700✔
517
                           nodesGetOutputNumFromSlotList(pTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
518
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
28,700✔
519
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
28,700✔
520
        EXPLAIN_ROW_APPEND_LIMIT(pTblScanNode->scan.node.pLimit);
28,700!
521
        EXPLAIN_ROW_APPEND_SLIMIT(pTblScanNode->scan.node.pSlimit);
28,700!
522
        EXPLAIN_ROW_END();
28,700✔
523
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
28,700!
524

525
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pTblScanNode->scanRange.skey,
28,700!
526
                        pTblScanNode->scanRange.ekey);
527
        EXPLAIN_ROW_END();
28,700✔
528
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
28,700!
529

530
        if (NULL != pTblScanNode->pGroupTags) {
28,700✔
531
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
7,801!
532
          EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pTblScanNode->pGroupTags->length);
7,801✔
533
          EXPLAIN_ROW_END();
7,801✔
534
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
7,801!
535
        }
536

537
        if (pTblScanNode->scan.node.pConditions) {
28,700✔
538
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
1,312!
539
          QRY_ERR_RET(nodesNodeToSQL(pTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
1,312!
540
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
541
          EXPLAIN_ROW_END();
1,312✔
542
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,312!
543
        }
544
      }
545
      break;
212,559✔
546
    }
547
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN: {
32✔
548
      SSystemTableScanPhysiNode *pSTblScanNode = (SSystemTableScanPhysiNode *)pNode;
32✔
549
      EXPLAIN_ROW_NEW(level, EXPLAIN_SYSTBL_SCAN_FORMAT, pSTblScanNode->scan.tableName.tname);
32!
550
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
32✔
551
      if (pResNode->pExecInfo) {
32✔
552
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
16!
553
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
16✔
554
      }
555
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pSTblScanNode->scan.pScanCols->length);
32✔
556
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
32✔
557
      if (pSTblScanNode->scan.pScanPseudoCols) {
32✔
558
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pSTblScanNode->scan.pScanPseudoCols->length);
1✔
559
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1✔
560
      }
561
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
32✔
562
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
32✔
563
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
32✔
564
      EXPLAIN_ROW_END();
32✔
565
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
32!
566

567
      if (verbose) {
32✔
568
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
6!
569
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
6✔
570
                           nodesGetOutputNumFromSlotList(pSTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
571
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6✔
572
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
6✔
573
        EXPLAIN_ROW_APPEND_LIMIT(pSTblScanNode->scan.node.pLimit);
6!
574
        EXPLAIN_ROW_APPEND_SLIMIT(pSTblScanNode->scan.node.pSlimit);
6!
575
        EXPLAIN_ROW_END();
6✔
576
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6!
577

578
        if (pSTblScanNode->scan.node.pConditions) {
6✔
579
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
2!
580
          QRY_ERR_RET(nodesNodeToSQL(pSTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
2!
581
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
582
          EXPLAIN_ROW_END();
2✔
583
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
584
        }
585
      }
586
      break;
32✔
587
    }
588
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
156,416✔
589
      SProjectPhysiNode *pPrjNode = (SProjectPhysiNode *)pNode;
156,416✔
590
      EXPLAIN_ROW_NEW(level, EXPLAIN_PROJECTION_FORMAT);
156,416!
591
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
156,416✔
592
      if (pResNode->pExecInfo) {
156,416✔
593
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
9,366!
594
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9,366✔
595
      }
596
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pPrjNode->pProjections->length);
156,416✔
597
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
156,416✔
598
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->totalRowSize);
156,416✔
599
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
156,416✔
600
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pPrjNode->node.inputTsOrder));
156,416✔
601
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
156,416✔
602
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
156,416✔
603
      EXPLAIN_ROW_END();
156,416✔
604
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
156,416!
605

606
      if (verbose) {
156,416✔
607
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
10,124!
608
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
10,124✔
609
                           nodesGetOutputNumFromSlotList(pPrjNode->node.pOutputDataBlockDesc->pSlots));
610
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10,124✔
611
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->outputRowSize);
10,124✔
612
        EXPLAIN_ROW_APPEND_LIMIT(pPrjNode->node.pLimit);
10,124✔
613
        EXPLAIN_ROW_APPEND_SLIMIT(pPrjNode->node.pSlimit);
10,124✔
614
        EXPLAIN_ROW_END();
10,124✔
615
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
10,124!
616

617
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
10,124!
618
        EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pPrjNode->ignoreGroupId ? "true" : "false");
10,124✔
619
        EXPLAIN_ROW_END();
10,124✔
620
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
10,124!
621

622
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pPrjNode->mergeDataBlock? "True":"False");
10,124!
623
        EXPLAIN_ROW_END();
10,124✔
624
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
10,124!
625

626
        if (pPrjNode->node.pConditions) {
10,124!
627
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
628
          QRY_ERR_RET(nodesNodeToSQL(pPrjNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
629
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
630
          EXPLAIN_ROW_END();
×
631
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
632
        }
633
      }
634
      break;
156,416✔
635
    }
636
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN: {
28,945✔
637
      SSortMergeJoinPhysiNode *pJoinNode = (SSortMergeJoinPhysiNode *)pNode;
28,945✔
638
      EXPLAIN_ROW_NEW(level, EXPLAIN_JOIN_FORMAT, gJoinTypeStr[pJoinNode->joinType][pJoinNode->subType]);
28,945!
639
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
28,945✔
640
      if (pResNode->pExecInfo) {
28,945✔
641
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
591!
642
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
591✔
643
      }
644
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pJoinNode->pTargets->length);
28,945✔
645
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
28,945✔
646
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->totalRowSize);
28,945✔
647
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
28,945✔
648
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pJoinNode->node.inputTsOrder));
28,945!
649
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
28,945✔
650
      EXPLAIN_ROW_APPEND(EXPLAIN_JOIN_ALGO, "Merge");
28,945✔
651
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
28,945✔
652
      EXPLAIN_ROW_END();
28,945✔
653
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
28,945!
654

655
      if (verbose) {
28,945✔
656
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
573!
657
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
573✔
658
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
659
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
573✔
660
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
573✔
661
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
573!
662
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
573!
663
        EXPLAIN_ROW_END();
573✔
664
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
573!
665

666
        if (IS_ASOF_JOIN(pJoinNode->subType) || IS_WINDOW_JOIN(pJoinNode->subType)) {
573✔
667
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_PARAM_FORMAT);
248!
668
          if (IS_ASOF_JOIN(pJoinNode->subType)) {
248✔
669
            EXPLAIN_ROW_APPEND(EXPLAIN_ASOF_OP_FORMAT, qExplainGetAsofOpStr(pJoinNode->asofOpType));
112✔
670
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
112✔
671
          }
672
          if (NULL != pJoinNode->pWindowOffset) {
248✔
673
            SWindowOffsetNode* pWinOffset = (SWindowOffsetNode*)pJoinNode->pWindowOffset;
136✔
674
            SValueNode* pStart = (SValueNode*)pWinOffset->pStartOffset;
136✔
675
            SValueNode* pEnd = (SValueNode*)pWinOffset->pEndOffset;
136✔
676
            EXPLAIN_ROW_APPEND(EXPLAIN_WIN_OFFSET_FORMAT, pStart->literal, pEnd->literal);
136✔
677
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
136✔
678
          }
679
          if (NULL != pJoinNode->pJLimit) {
248✔
680
            SLimitNode* pJLimit = (SLimitNode*)pJoinNode->pJLimit;
44✔
681
            EXPLAIN_ROW_APPEND(EXPLAIN_JLIMIT_FORMAT, pJLimit->limit);
44✔
682
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
44✔
683
          }
684
          if (IS_WINDOW_JOIN(pJoinNode->subType)) {
248✔
685
            EXPLAIN_ROW_APPEND(EXPLAIN_SEQ_WIN_GRP_FORMAT, pJoinNode->seqWinGroup);
136✔
686
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
136✔
687
          }
688

689
          EXPLAIN_ROW_APPEND(EXPLAIN_GRP_JOIN_FORMAT, pJoinNode->grpJoin);
248✔
690
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
248✔
691
          EXPLAIN_ROW_END();
248✔
692

693
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
248!
694
        }
695

696
        if (pJoinNode->node.pConditions) {
573✔
697
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
46!
698
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
46!
699
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
700
          EXPLAIN_ROW_END();
46✔
701
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
46!
702
        }
703

704
        if (NULL != pJoinNode->pPrimKeyCond) {
573✔
705
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PRIM_CONDITIONS_FORMAT);
401!
706
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
401!
707
          EXPLAIN_ROW_END();
401✔
708
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
401!
709
        }
710

711
        if (NULL != pJoinNode->pEqLeft && pJoinNode->pEqLeft->length > 0) {
573!
712
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_LEFT_FORMAT);
2!
713
          SNode* pCol = NULL;
2✔
714
          FOREACH(pCol, pJoinNode->pEqLeft) {
4!
715
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
2✔
716
          }
717
          EXPLAIN_ROW_END();
2✔
718
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
719
        }
720

721
        if (NULL != pJoinNode->pEqRight && pJoinNode->pEqRight->length > 0) {
573!
722
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_RIGHT_FORMAT);
2!
723
          SNode* pCol = NULL;
2✔
724
          FOREACH(pCol, pJoinNode->pEqRight) {
4!
725
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
2✔
726
          }
727
          EXPLAIN_ROW_END();
2✔
728
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
729
        }
730

731
        if (NULL != pJoinNode->pFullOnCond) {
573✔
732
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
20!
733
          QRY_ERR_RET(
20!
734
                nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
735
          EXPLAIN_ROW_END();
20✔
736
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
20!
737
        }
738

739
        if (NULL != pJoinNode->pColOnCond) {
573✔
740
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COL_ON_CONDITIONS_FORMAT);
18!
741
          QRY_ERR_RET(
18!
742
                nodesNodeToSQL(pJoinNode->pColOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
743
          EXPLAIN_ROW_END();
18✔
744
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
18!
745
        }
746
      }
747
      break;
28,945✔
748
    }
749
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: {
91,060✔
750
      SAggPhysiNode *pAggNode = (SAggPhysiNode *)pNode;
91,060✔
751
      EXPLAIN_ROW_NEW(level, EXPLAIN_AGG_FORMAT, (pAggNode->pGroupKeys ? "GroupAggregate" : "Aggregate"));
91,060!
752
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
91,060✔
753
      if (pResNode->pExecInfo) {
91,060✔
754
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
5,373!
755
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
5,373✔
756
      }
757
      if (pAggNode->pAggFuncs) {
91,060✔
758
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pAggNode->pAggFuncs->length);
65,986✔
759
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
65,986✔
760
      }
761
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->totalRowSize);
91,060✔
762
      if (pAggNode->pGroupKeys) {
91,060✔
763
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,806✔
764
        EXPLAIN_ROW_APPEND(EXPLAIN_GROUPS_FORMAT, pAggNode->pGroupKeys->length);
25,806✔
765
      }
766
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
91,060✔
767
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pAggNode->node.inputTsOrder));
91,060✔
768
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
91,060✔
769
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
91,060✔
770
      EXPLAIN_ROW_END();
91,060✔
771
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
91,060!
772

773
      if (verbose) {
91,060✔
774
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
12,906!
775
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
12,906✔
776
                           nodesGetOutputNumFromSlotList(pAggNode->node.pOutputDataBlockDesc->pSlots));
777
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,906✔
778
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->outputRowSize);
12,906✔
779
        EXPLAIN_ROW_APPEND_LIMIT(pAggNode->node.pLimit);
12,906!
780
        EXPLAIN_ROW_APPEND_SLIMIT(pAggNode->node.pSlimit);
12,906!
781
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,906✔
782
        EXPLAIN_ROW_APPEND(EXPLAIN_PLAN_BLOCKING, !pAggNode->node.forceCreateNonBlockingOptr);
12,906✔
783
        EXPLAIN_ROW_END();
12,906✔
784
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
12,906!
785

786
        if (pAggNode->node.pConditions) {
12,906✔
787
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
49!
788
          QRY_ERR_RET(nodesNodeToSQL(pAggNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
49!
789
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
790
          EXPLAIN_ROW_END();
49✔
791
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
49!
792
        }
793

794
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pAggNode->mergeDataBlock? "True":"False");
12,906!
795
        EXPLAIN_ROW_END();
12,906✔
796
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
12,906!
797
      }
798
      break;
91,060✔
799
    }
800
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: {
10,765✔
801
      SIndefRowsFuncPhysiNode *pIndefNode = (SIndefRowsFuncPhysiNode *)pNode;
10,765✔
802
      EXPLAIN_ROW_NEW(level, EXPLAIN_INDEF_ROWS_FORMAT);
10,765!
803
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
10,765✔
804
      if (pResNode->pExecInfo) {
10,765✔
805
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
9!
806
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
9✔
807
      }
808
      if (pIndefNode->pFuncs) {
10,765!
809
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIndefNode->pFuncs->length);
10,765✔
810
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10,765✔
811
      }
812
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->totalRowSize);
10,765✔
813
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
10,765✔
814
      EXPLAIN_ROW_END();
10,765✔
815
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
10,765!
816

817
      if (verbose) {
10,765✔
818
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
10!
819
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
10✔
820
                           nodesGetOutputNumFromSlotList(pIndefNode->node.pOutputDataBlockDesc->pSlots));
821
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10✔
822
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->outputRowSize);
10✔
823
        EXPLAIN_ROW_APPEND_LIMIT(pIndefNode->node.pLimit);
10!
824
        EXPLAIN_ROW_APPEND_SLIMIT(pIndefNode->node.pSlimit);
10!
825
        EXPLAIN_ROW_END();
10✔
826
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
10!
827

828
        if (pIndefNode->node.pConditions) {
10!
829
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
830
          QRY_ERR_RET(nodesNodeToSQL(pIndefNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
831
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
832
          EXPLAIN_ROW_END();
×
833
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
834
        }
835
      }
836
      break;
10,765✔
837
    }
838
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
203,168✔
839
      SExchangePhysiNode *pExchNode = (SExchangePhysiNode *)pNode;
203,168✔
840
      int32_t nodeNum = 0;
203,168✔
841
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
424,980✔
842
        SExplainGroup      *group = taosHashGet(ctx->groupHash, &pExchNode->srcStartGroupId, sizeof(pExchNode->srcStartGroupId));
221,812✔
843
        if (NULL == group) {
221,812!
844
          qError("exchange src group %d not in groupHash", pExchNode->srcStartGroupId);
×
845
          QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
846
        }
847

848
        nodeNum += group->nodeNum;
221,812✔
849
      }
850

851
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXCHANGE_FORMAT, pExchNode->singleChannel ? 1 : nodeNum);
203,168!
852
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
203,168✔
853
      if (pResNode->pExecInfo) {
203,168✔
854
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
7,810!
855
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,810✔
856
      }
857
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->totalRowSize);
203,168✔
858
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
203,168✔
859
      EXPLAIN_ROW_END();
203,168✔
860
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
203,168!
861

862
      if (verbose) {
203,168✔
863
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
26,624!
864
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
26,624✔
865
                           nodesGetOutputNumFromSlotList(pExchNode->node.pOutputDataBlockDesc->pSlots));
866
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
26,624✔
867
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->outputRowSize);
26,624✔
868
        EXPLAIN_ROW_APPEND_LIMIT(pExchNode->node.pLimit);
26,624!
869
        EXPLAIN_ROW_APPEND_SLIMIT(pExchNode->node.pSlimit);
26,624!
870
        EXPLAIN_ROW_END();
26,624✔
871
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
26,624!
872

873
        if (pExchNode->node.pConditions) {
26,624!
874
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
875
          QRY_ERR_RET(nodesNodeToSQL(pExchNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
876
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
877
          EXPLAIN_ROW_END();
×
878
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
879
        }
880
      }
881

882
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
424,980✔
883
        QRY_ERR_RET(qExplainAppendGroupResRows(ctx, i, level + 1, pExchNode->singleChannel));
221,812!
884
      }
885
      break;
203,168✔
886
    }
887
    case QUERY_NODE_PHYSICAL_PLAN_SORT: {
25,349✔
888
      SSortPhysiNode *pSortNode = (SSortPhysiNode *)pNode;
25,349✔
889
      EXPLAIN_ROW_NEW(level, EXPLAIN_SORT_FORMAT);
25,349!
890
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,349✔
891
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.inputTsOrder));
25,349✔
892
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,349✔
893
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.outputTsOrder));
25,349✔
894
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,349✔
895
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
25,349✔
896
      if (pResNode->pExecInfo) {
25,349✔
897
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
201!
898
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
201✔
899
      }
900

901
      SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
25,349✔
902
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
25,349✔
903
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
25,349✔
904
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
25,349✔
905
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
25,349✔
906
      EXPLAIN_ROW_END();
25,349✔
907
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
25,349!
908

909
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
25,349✔
910
        // sort key
911
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
201!
912
        if (pResNode->pExecInfo) {
201!
913
          for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
402!
914
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
201✔
915
            EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
201✔
916
          }
917
        }
918

919
        EXPLAIN_ROW_END();
201✔
920
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
201!
921

922
        // sort method
923
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
201!
924

925
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
201✔
926
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
201✔
927
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
201✔
928
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
201✔
929
        if (pExecInfo->sortBuffer > 1024 * 1024) {
201✔
930
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
168✔
931
        } else if (pExecInfo->sortBuffer > 1024) {
33!
932
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
933
        } else {
934
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
33✔
935
        }
936

937
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
201✔
938
        EXPLAIN_ROW_END();
201✔
939
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
201!
940
      }
941

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

953
        if (pSortNode->node.pConditions) {
3,047!
954
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
955
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->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;
25,349✔
962
    }
963
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL: {
14,721✔
964
      SIntervalPhysiNode *pIntNode = (SIntervalPhysiNode *)pNode;
14,721✔
965
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
14,721!
966
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
14,721✔
967
      if (pResNode->pExecInfo) {
14,721✔
968
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
10!
969
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10✔
970
      }
971
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
14,721✔
972
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
14,721✔
973
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
14,721✔
974
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
14,721✔
975
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
14,721!
976
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
14,721✔
977
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
14,721!
978
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
14,721✔
979
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
14,721✔
980
      EXPLAIN_ROW_END();
14,721✔
981
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
14,721!
982

983
      if (verbose) {
14,721✔
984
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
12,297!
985
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
12,297✔
986
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
987
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,297✔
988
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
12,297✔
989
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
12,297!
990
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
12,297!
991
        EXPLAIN_ROW_END();
12,297✔
992
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
12,297!
993
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pIntNode->timeRange.skey, pIntNode->timeRange.ekey);
12,297!
994
        EXPLAIN_ROW_END();
12,297✔
995
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
12,297!
996
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
12,297✔
997
        int64_t time1 = -1;
12,297✔
998
        int64_t time2 = -1;
12,297✔
999
        int32_t code = TSDB_CODE_SUCCESS;
12,297✔
1000
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
12,297✔
1001
        QRY_ERR_RET(code);
12,297!
1002
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
12,297✔
1003
        QRY_ERR_RET(code);
12,297!
1004
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
12,297!
1005
                        time1,
1006
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1007
                        time2,
1008
                        pIntNode->slidingUnit);
1009
        EXPLAIN_ROW_END();
12,297✔
1010
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
12,297!
1011

1012
        if (pIntNode->window.node.pConditions) {
12,297!
1013
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1014
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1015
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1016
          EXPLAIN_ROW_END();
×
1017
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1018
        }
1019

1020
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
12,297!
1021
        EXPLAIN_ROW_END();
12,297✔
1022
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
12,297!
1023
      }
1024
      break;
14,721✔
1025
    }
1026
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL: {
2,815✔
1027
      SMergeAlignedIntervalPhysiNode *pIntNode = (SMergeAlignedIntervalPhysiNode *)pNode;
2,815✔
1028
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_ALIGNED_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
2,815!
1029
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
2,815✔
1030
      if (pResNode->pExecInfo) {
2,815✔
1031
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2!
1032
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1033
      }
1034
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
2,815✔
1035
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,815✔
1036
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
2,815✔
1037
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,815✔
1038
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
2,815!
1039
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,815✔
1040
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
2,815!
1041
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
2,815✔
1042
      EXPLAIN_ROW_END();
2,815✔
1043
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
2,815!
1044

1045
      if (verbose) {
2,815✔
1046
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
2,644!
1047
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
2,644✔
1048
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1049
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,644✔
1050
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
2,644✔
1051
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
2,644!
1052
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
2,644!
1053
        EXPLAIN_ROW_END();
2,644✔
1054
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,644!
1055
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
2,644✔
1056
        int64_t time1 = -1;
2,644✔
1057
        int64_t time2 = -1;
2,644✔
1058
        int32_t code = TSDB_CODE_SUCCESS;
2,644✔
1059
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
2,644✔
1060
        QRY_ERR_RET(code);
2,644!
1061
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
2,644✔
1062
        QRY_ERR_RET(code);
2,644!
1063
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
2,644!
1064
                        time1,
1065
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1066
                        time2,
1067
                        pIntNode->slidingUnit);
1068
        EXPLAIN_ROW_END();
2,644✔
1069
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,644!
1070

1071
        if (pIntNode->window.node.pConditions) {
2,644✔
1072
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
6!
1073
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
6!
1074
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1075
          EXPLAIN_ROW_END();
6✔
1076
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6!
1077
        }
1078

1079
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
2,644!
1080
        EXPLAIN_ROW_END();
2,644✔
1081
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,644!
1082
      }
1083
      break;
2,815✔
1084
    }
1085
    case QUERY_NODE_PHYSICAL_PLAN_FILL: {
8✔
1086
      SFillPhysiNode *pFillNode = (SFillPhysiNode *)pNode;
8✔
1087
      EXPLAIN_ROW_NEW(level, EXPLAIN_FILL_FORMAT);
8!
1088
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
8✔
1089
      if (pResNode->pExecInfo) {
8✔
1090
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1!
1091
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1✔
1092
      }
1093
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pFillNode->mode));
8✔
1094
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8✔
1095
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pFillNode->node.pOutputDataBlockDesc->totalRowSize);
8✔
1096
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8✔
1097
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pFillNode->node.inputTsOrder));
8!
1098
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8✔
1099
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
8✔
1100
      EXPLAIN_ROW_END();
8✔
1101
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
8!
1102

1103
      if (verbose) {
8!
1104
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
8!
1105
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
8✔
1106
                           nodesGetOutputNumFromSlotList(pFillNode->node.pOutputDataBlockDesc->pSlots));
1107
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8✔
1108
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pFillNode->node.pOutputDataBlockDesc->outputRowSize);
8✔
1109
        EXPLAIN_ROW_APPEND_LIMIT(pFillNode->node.pLimit);
8!
1110
        EXPLAIN_ROW_APPEND_SLIMIT(pFillNode->node.pSlimit);
8!
1111
        EXPLAIN_ROW_END();
8✔
1112
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
8!
1113
        if (pFillNode->pValues) {
8!
1114
          SNodeListNode *pValues = (SNodeListNode *)pFillNode->pValues;
×
1115
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
×
1116
          SNode  *tNode = NULL;
×
1117
          int32_t i = 0;
×
1118
          FOREACH(tNode, pValues->pNodeList) {
×
1119
            if (i) {
×
1120
              EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1121
            }
1122
            SValueNode *tValue = (SValueNode *)tNode;
×
1123
            char       *value = nodesGetStrValueFromNode(tValue);
×
1124
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
×
1125
            taosMemoryFree(value);
×
1126
            ++i;
×
1127
          }
1128

1129
          EXPLAIN_ROW_END();
×
1130
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1131
        }
1132

1133
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pFillNode->timeRange.skey, pFillNode->timeRange.ekey);
8!
1134
        EXPLAIN_ROW_END();
8✔
1135
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
8!
1136

1137
        if (pFillNode->node.pConditions) {
8!
1138
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1139
          QRY_ERR_RET(nodesNodeToSQL(pFillNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1140
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1141
          EXPLAIN_ROW_END();
×
1142
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1143
        }
1144
      }
1145
      break;
8✔
1146
    }
1147
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION: {
1,330✔
1148
      SSessionWinodwPhysiNode *pSessNode = (SSessionWinodwPhysiNode *)pNode;
1,330✔
1149
      EXPLAIN_ROW_NEW(level, EXPLAIN_SESSION_FORMAT);
1,330!
1150
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,330✔
1151
      if (pResNode->pExecInfo) {
1,330!
1152
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1153
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1154
      }
1155
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pSessNode->window.pFuncs->length);
1,330✔
1156
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,330✔
1157
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,330✔
1158
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,330✔
1159
      EXPLAIN_ROW_END();
1,330✔
1160
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,330!
1161

1162
      if (verbose) {
1,330✔
1163
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
10!
1164
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
10✔
1165
                           nodesGetOutputNumFromSlotList(pSessNode->window.node.pOutputDataBlockDesc->pSlots));
1166
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10✔
1167
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->outputRowSize);
10✔
1168
        EXPLAIN_ROW_APPEND_LIMIT(pSessNode->window.node.pLimit);
10!
1169
        EXPLAIN_ROW_APPEND_SLIMIT(pSessNode->window.node.pSlimit);
10!
1170
        EXPLAIN_ROW_END();
10✔
1171
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
10!
1172

1173
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_WINDOW_FORMAT, pSessNode->gap);
10!
1174
        EXPLAIN_ROW_END();
10✔
1175
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
10!
1176

1177
        if (pSessNode->window.node.pConditions) {
10!
1178
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1179
          QRY_ERR_RET(nodesNodeToSQL(pSessNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1180
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1181
          EXPLAIN_ROW_END();
×
1182
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1183
        }
1184
      }
1185
      break;
1,330✔
1186
    }
1187
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE: {
648✔
1188
      SStateWinodwPhysiNode *pStateNode = (SStateWinodwPhysiNode *)pNode;
648✔
1189

1190
      EXPLAIN_ROW_NEW(level, EXPLAIN_STATE_WINDOW_FORMAT,
648!
1191
                      nodesGetNameFromColumnNode(pStateNode->pStateKey));
1192
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
648✔
1193
      if (pResNode->pExecInfo) {
648!
1194
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1195
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1196
      }
1197

1198
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pStateNode->window.pFuncs->length);
648✔
1199
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
648✔
1200
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->totalRowSize);
648✔
1201
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
648✔
1202
      EXPLAIN_ROW_END();
648✔
1203
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
648!
1204

1205
      if (verbose) {
648✔
1206
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
8!
1207
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
8✔
1208
                           nodesGetOutputNumFromSlotList(pStateNode->window.node.pOutputDataBlockDesc->pSlots));
1209
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8✔
1210
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->outputRowSize);
8✔
1211
        EXPLAIN_ROW_APPEND_LIMIT(pStateNode->window.node.pLimit);
8!
1212
        EXPLAIN_ROW_APPEND_SLIMIT(pStateNode->window.node.pSlimit);
8!
1213
        EXPLAIN_ROW_END();
8✔
1214
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
8!
1215

1216
        EXPLAIN_ROW_END();
8✔
1217
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
8!
1218

1219
        if (pStateNode->window.node.pConditions) {
8!
1220
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1221
          QRY_ERR_RET(nodesNodeToSQL(pStateNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1222
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1223
          EXPLAIN_ROW_END();
×
1224
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1225
        }
1226
      }
1227
      break;
648✔
1228
    }
1229
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
5,788✔
1230
      SPartitionPhysiNode *pPartNode = (SPartitionPhysiNode *)pNode;
5,788✔
1231

1232
      SNode *p = nodesListGetNode(pPartNode->pPartitionKeys, 0);
5,788✔
1233
      EXPLAIN_ROW_NEW(level, EXPLAIN_PARITION_FORMAT, nodesGetNameFromColumnNode(p));
5,788!
1234
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
5,788✔
1235
      if (pResNode->pExecInfo) {
5,788✔
1236
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
338!
1237
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
338✔
1238
      }
1239
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->totalRowSize);
5,788✔
1240

1241
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
5,788✔
1242
      EXPLAIN_ROW_END();
5,788✔
1243
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
5,788!
1244

1245
      if (verbose) {
5,788✔
1246
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
348!
1247
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
348✔
1248
                           nodesGetOutputNumFromSlotList(pPartNode->node.pOutputDataBlockDesc->pSlots));
1249
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
348✔
1250
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->outputRowSize);
348✔
1251
        EXPLAIN_ROW_APPEND_LIMIT(pPartNode->node.pLimit);
348!
1252
        EXPLAIN_ROW_APPEND_SLIMIT(pPartNode->node.pSlimit);
348!
1253
        EXPLAIN_ROW_END();
348✔
1254
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
348!
1255

1256
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
348!
1257
        EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pPartNode->pPartitionKeys->length);
348✔
1258
        EXPLAIN_ROW_END();
348✔
1259
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
348!
1260

1261
        if (pPartNode->node.pConditions) {
348!
1262
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1263
          QRY_ERR_RET(nodesNodeToSQL(pPartNode->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,788✔
1270
    }
1271
    case QUERY_NODE_PHYSICAL_PLAN_MERGE: {
47,844✔
1272
      SMergePhysiNode *pMergeNode = (SMergePhysiNode *)pNode;
47,844✔
1273
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_FORMAT);
47,844!
1274
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
47,844✔
1275
      if (pResNode->pExecInfo) {
47,844✔
1276
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,090!
1277
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,090✔
1278
      }
1279

1280
      SDataBlockDescNode *pDescNode = pMergeNode->node.pOutputDataBlockDesc;
47,844✔
1281
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
47,844✔
1282
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
47,844✔
1283
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
47,844✔
1284
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
47,844✔
1285
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pMergeNode->node.inputTsOrder));
47,844✔
1286
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
47,844✔
1287
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pMergeNode->node.outputTsOrder));
47,844✔
1288
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
47,844✔
1289
      EXPLAIN_ROW_APPEND(EXPLAIN_MERGE_MODE_FORMAT, EXPLAIN_MERGE_MODE_STRING(pMergeNode->type));
47,844✔
1290
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
47,844✔
1291
      EXPLAIN_ROW_END();
47,844✔
1292
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
47,844!
1293

1294
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
47,844✔
1295
        if (MERGE_TYPE_SORT == pMergeNode->type) {
1,090!
1296
          // sort method
1297
          EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
1,090!
1298

1299
          int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
1,090✔
1300
          SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
1,090✔
1301
          SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
1,090✔
1302
          EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
1,090!
1303
          if (pExecInfo->sortBuffer > 1024 * 1024) {
1,090!
1304
            EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
×
1305
          } else if (pExecInfo->sortBuffer > 1024) {
1,090!
1306
            EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
1,090✔
1307
          } else {
1308
            EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
×
1309
          }
1310

1311
          EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
1,090✔
1312
          EXPLAIN_ROW_END();
1,090✔
1313
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,090!
1314
        }
1315
      }
1316

1317
      if (verbose) {
47,844✔
1318
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
5,230!
1319
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
5,230✔
1320
                           nodesGetOutputNumFromSlotList(pMergeNode->node.pOutputDataBlockDesc->pSlots));
1321
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
5,230✔
1322
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pMergeNode->node.pOutputDataBlockDesc->outputRowSize);
5,230✔
1323
        EXPLAIN_ROW_APPEND_LIMIT(pMergeNode->node.pLimit);
5,230!
1324
        EXPLAIN_ROW_APPEND_SLIMIT(pMergeNode->node.pSlimit);
5,230!
1325
        EXPLAIN_ROW_END();
5,230✔
1326
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
5,230!
1327

1328
        if (MERGE_TYPE_SORT == pMergeNode->type) {
5,230✔
1329
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
3,771!
1330
          EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pMergeNode->ignoreGroupId ? "true" : "false");
3,771!
1331
          EXPLAIN_ROW_END();
3,771✔
1332
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,771!
1333

1334
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGE_KEYS_FORMAT);
3,771!
1335
          if (pMergeNode->groupSort) {
3,771✔
1336
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, "_group_id asc");
2,797✔
1337
            if (LIST_LENGTH(pMergeNode->pMergeKeys) > 0) {
2,797!
1338
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
2,785✔
1339
            }
1340
          }
1341
          for (int32_t i = 0; i < LIST_LENGTH(pMergeNode->pMergeKeys); ++i) {
7,534✔
1342
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pMergeNode->pMergeKeys, i);
3,763✔
1343
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, nodesGetNameFromColumnNode(ptn->pExpr));
3,763✔
1344
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,763✔
1345
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, EXPLAIN_ORDER_STRING(ptn->order));
3,763!
1346
            if (i != LIST_LENGTH(pMergeNode->pMergeKeys) - 1) {
3,763!
1347
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
4✔
1348
            }
1349
          }
1350
          EXPLAIN_ROW_END();
3,771✔
1351
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,771!
1352
        }
1353

1354
        if (pMergeNode->node.pConditions) {
5,230!
1355
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1356
          QRY_ERR_RET(nodesNodeToSQL(pMergeNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1357
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1358
          EXPLAIN_ROW_END();
×
1359
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1360
        }
1361
      }
1362
      break;
47,844✔
1363
    }
1364
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN: {
×
1365
      SBlockDistScanPhysiNode *pDistScanNode = (SBlockDistScanPhysiNode *)pNode;
×
1366
      EXPLAIN_ROW_NEW(level, EXPLAIN_DISTBLK_SCAN_FORMAT, pDistScanNode->tableName.tname);
×
1367
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1368
      if (pResNode->pExecInfo) {
×
1369
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1370
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1371
      }
1372
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDistScanNode->pScanCols->length);
×
1373
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1374
      if (pDistScanNode->pScanPseudoCols) {
×
1375
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pDistScanNode->pScanPseudoCols->length);
×
1376
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1377
      }
1378
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->totalRowSize);
×
1379
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1380
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1381
      EXPLAIN_ROW_END();
×
1382
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1383

1384
      if (verbose) {
×
1385
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1386
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1387
                           nodesGetOutputNumFromSlotList(pDistScanNode->node.pOutputDataBlockDesc->pSlots));
1388
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1389
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->outputRowSize);
×
1390
        EXPLAIN_ROW_APPEND_LIMIT(pDistScanNode->node.pLimit);
×
1391
        EXPLAIN_ROW_APPEND_SLIMIT(pDistScanNode->node.pSlimit);
×
1392
        EXPLAIN_ROW_END();
×
1393
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1394

1395
        if (pDistScanNode->node.pConditions) {
×
1396
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1397
          QRY_ERR_RET(nodesNodeToSQL(pDistScanNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1398
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1399
          EXPLAIN_ROW_END();
×
1400
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1401
        }
1402
      }
1403
      break;
×
1404
    }
1405
    case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: {
216✔
1406
      SLastRowScanPhysiNode *pLastRowNode = (SLastRowScanPhysiNode *)pNode;
216✔
1407
      EXPLAIN_ROW_NEW(level, EXPLAIN_LASTROW_SCAN_FORMAT, pLastRowNode->scan.tableName.tname);
216!
1408
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
216✔
1409
      if (pResNode->pExecInfo) {
216✔
1410
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2!
1411
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1412
      }
1413
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pLastRowNode->scan.pScanCols->length);
216✔
1414
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
216✔
1415
      if (pLastRowNode->scan.pScanPseudoCols) {
216✔
1416
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
110✔
1417
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
110✔
1418
      }
1419
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
216✔
1420
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
216✔
1421
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
216✔
1422
      EXPLAIN_ROW_END();
216✔
1423
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
216!
1424

1425
      if (verbose) {
216✔
1426
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
192!
1427
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
192✔
1428
                           nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
1429
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
192✔
1430
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
192✔
1431
        EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
192!
1432
        EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
192!
1433
        EXPLAIN_ROW_END();
192✔
1434
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
192!
1435

1436
        if (pLastRowNode->scan.node.pConditions) {
192!
1437
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1438
          QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1439
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1440
          EXPLAIN_ROW_END();
×
1441
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1442
        }
1443
      }
1444
      break;
216✔
1445
    }
1446
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
×
1447
      STableCountScanPhysiNode *pLastRowNode = (STableCountScanPhysiNode *)pNode;
×
1448
      EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT,
×
1449
                      ('\0' != pLastRowNode->scan.tableName.tname[0] ? pLastRowNode->scan.tableName.tname : TSDB_INS_TABLE_TABLES));
1450
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1451
      if (pResNode->pExecInfo) {
×
1452
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1453
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1454
      }
1455
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, LIST_LENGTH(pLastRowNode->scan.pScanCols));
×
1456
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1457
      if (pLastRowNode->scan.pScanPseudoCols) {
×
1458
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
×
1459
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1460
      }
1461
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
×
1462
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1463
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1464
      EXPLAIN_ROW_END();
×
1465
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1466

1467
      if (verbose) {
×
1468
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1469
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1470
                           nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
1471
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1472
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
×
1473
        EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
×
1474
        EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
×
1475
        EXPLAIN_ROW_END();
×
1476
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1477

1478
        if (pLastRowNode->scan.node.pConditions) {
×
1479
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1480
          QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.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;
×
1487
    }
1488
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
145✔
1489
      SGroupSortPhysiNode *pSortNode = (SGroupSortPhysiNode *)pNode;
145✔
1490
      EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_SORT_FORMAT);
145!
1491
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
145✔
1492
      if (pResNode->pExecInfo) {
145!
1493
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1494
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1495
      }
1496

1497
      SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
145✔
1498
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
145✔
1499
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
145✔
1500
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
145✔
1501
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
145✔
1502
      EXPLAIN_ROW_END();
145✔
1503
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
145!
1504

1505
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
145!
1506
        // sort key
1507
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
×
1508
        if (pResNode->pExecInfo) {
×
1509
          for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
×
1510
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
×
1511
            EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
×
1512
          }
1513
        }
1514

1515
        EXPLAIN_ROW_END();
×
1516
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1517

1518
        // sort method
1519
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
×
1520

1521
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
×
1522
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
×
1523
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
×
1524
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
×
1525
        if (pExecInfo->sortBuffer > 1024 * 1024) {
×
1526
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
×
1527
        } else if (pExecInfo->sortBuffer > 1024) {
×
1528
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
1529
        } else {
1530
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
×
1531
        }
1532

1533
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
×
1534
        EXPLAIN_ROW_END();
×
1535
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1536
      }
1537

1538
      if (verbose) {
145!
1539
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1540
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1541
                           nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
1542
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1543
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
×
1544
        EXPLAIN_ROW_APPEND_LIMIT(pSortNode->node.pLimit);
×
1545
        EXPLAIN_ROW_APPEND_SLIMIT(pSortNode->node.pSlimit);
×
1546
        EXPLAIN_ROW_END();
×
1547
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1548

1549
        if (pSortNode->node.pConditions) {
×
1550
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1551
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1552
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1553
          EXPLAIN_ROW_END();
×
1554
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1555
        }
1556
      }
1557
      break;
145✔
1558
    }
1559
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL: {
×
1560
      SMergeIntervalPhysiNode *pIntNode = (SMergeIntervalPhysiNode *)pNode;
×
1561
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
×
1562
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1563
      if (pResNode->pExecInfo) {
×
1564
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1565
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1566
      }
1567
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
×
1568
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1569
      EXPLAIN_ROW_END();
×
1570
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1571

1572
      if (verbose) {
×
1573
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1574
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1575
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1576
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1577
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
×
1578
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
×
1579
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
×
1580
        EXPLAIN_ROW_END();
×
1581
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1582
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
×
1583
        int64_t time1 = -1;
×
1584
        int64_t time2 = -1;
×
1585
        int32_t code = TSDB_CODE_SUCCESS;
×
1586
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
×
1587
        QRY_ERR_RET(code);
×
1588
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
×
1589
        QRY_ERR_RET(code);
×
1590
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
×
1591
                        time1,
1592
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1593
                        time2,
1594
                        pIntNode->slidingUnit);
1595
        EXPLAIN_ROW_END();
×
1596
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1597

1598
        if (pIntNode->window.node.pConditions) {
×
1599
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1600
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1601
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1602
          EXPLAIN_ROW_END();
×
1603
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1604
        }
1605
      }
1606
      break;
×
1607
    }
1608
    case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC: {
2✔
1609
      SInterpFuncPhysiNode *pInterpNode = (SInterpFuncPhysiNode *)pNode;
2✔
1610
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERP_FORMAT);
2!
1611
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
2✔
1612
      if (pResNode->pExecInfo) {
2✔
1613
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1!
1614
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1✔
1615
      }
1616
      if (pInterpNode->pFuncs) {
2!
1617
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pInterpNode->pFuncs->length);
2✔
1618
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1619
      }
1620

1621
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pInterpNode->fillMode));
2✔
1622
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1623

1624
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
2✔
1625
      EXPLAIN_ROW_END();
2✔
1626
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
2!
1627

1628
      if (verbose) {
2!
1629
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
2!
1630
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
2✔
1631
                           nodesGetOutputNumFromSlotList(pInterpNode->node.pOutputDataBlockDesc->pSlots));
1632
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1633
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pInterpNode->node.pOutputDataBlockDesc->outputRowSize);
2✔
1634
        EXPLAIN_ROW_APPEND_LIMIT(pInterpNode->node.pLimit);
2!
1635
        EXPLAIN_ROW_APPEND_SLIMIT(pInterpNode->node.pSlimit);
2!
1636
        EXPLAIN_ROW_END();
2✔
1637
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
1638
        if (pInterpNode->pFillValues) {
2!
1639
          SNodeListNode *pValues = (SNodeListNode *)pInterpNode->pFillValues;
×
1640
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
×
1641
          SNode  *tNode = NULL;
×
1642
          int32_t i = 0;
×
1643
          FOREACH(tNode, pValues->pNodeList) {
×
1644
            if (i) {
×
1645
              EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1646
            }
1647
            SValueNode *tValue = (SValueNode *)tNode;
×
1648
            char       *value = nodesGetStrValueFromNode(tValue);
×
1649
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
×
1650
            taosMemoryFree(value);
×
1651
            ++i;
×
1652
          }
1653

1654
          EXPLAIN_ROW_END();
×
1655
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1656
        }
1657

1658
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_INTERVAL_VALUE_FORMAT, pInterpNode->interval, pInterpNode->intervalUnit);
2!
1659
        EXPLAIN_ROW_END();
2✔
1660

1661
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pInterpNode->timeRange.skey, pInterpNode->timeRange.ekey);
2!
1662
        EXPLAIN_ROW_END();
2✔
1663
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
1664

1665
        if (pInterpNode->node.pConditions) {
2!
1666
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1667
          QRY_ERR_RET(nodesNodeToSQL(pInterpNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1668
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1669
          EXPLAIN_ROW_END();
×
1670
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1671
        }
1672
      }
1673
      break;
2✔
1674
    }
1675
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_EVENT: {
7✔
1676
      SEventWinodwPhysiNode *pEventNode = (SEventWinodwPhysiNode *)pNode;
7✔
1677
      EXPLAIN_ROW_NEW(level, EXPLAIN_EVENT_FORMAT);
7!
1678
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
7✔
1679
      if (pResNode->pExecInfo) {
7✔
1680
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1!
1681
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1✔
1682
      }
1683
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pEventNode->window.pFuncs->length);
7✔
1684
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7✔
1685
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pEventNode->window.node.pOutputDataBlockDesc->totalRowSize);
7✔
1686
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
7✔
1687
      EXPLAIN_ROW_END();
7✔
1688
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
7!
1689

1690
      if (verbose) {
7!
1691
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_START_FORMAT);
7!
1692
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pStartCond, tbuf + VARSTR_HEADER_SIZE,
7!
1693
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1694
        EXPLAIN_ROW_END();
7✔
1695
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
7!
1696

1697
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_END_FORMAT);
7!
1698
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pEndCond, tbuf + VARSTR_HEADER_SIZE,
7!
1699
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1700
        EXPLAIN_ROW_END();
7✔
1701
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
7!
1702
      }
1703
      break;
7✔
1704
    }
1705
    case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN:{
7,910✔
1706
      SHashJoinPhysiNode *pJoinNode = (SHashJoinPhysiNode *)pNode;
7,910✔
1707
      EXPLAIN_ROW_NEW(level, EXPLAIN_JOIN_FORMAT, gJoinTypeStr[pJoinNode->joinType][pJoinNode->subType]);
7,910!
1708
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
7,910✔
1709
      if (pResNode->pExecInfo) {
7,910!
1710
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1711
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1712
      }
1713
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pJoinNode->pTargets->length);
7,910✔
1714
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1715
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->totalRowSize);
7,910✔
1716
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1717
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pJoinNode->node.inputTsOrder));
7,910!
1718
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1719
      EXPLAIN_ROW_APPEND(EXPLAIN_JOIN_ALGO, "Hash");
7,910✔
1720
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
7,910✔
1721
      EXPLAIN_ROW_END();
7,910✔
1722
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
7,910!
1723

1724
      if (verbose) {
7,910!
1725
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1726
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1727
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
1728
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1729
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
×
1730
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
×
1731
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
×
1732
        EXPLAIN_ROW_END();
×
1733
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1734

1735
        if (pJoinNode->node.pConditions) {
×
1736
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1737
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1738
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1739

1740
          EXPLAIN_ROW_END();
×
1741
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1742
        }
1743

1744
        bool conditionsGot = false;
×
1745
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
×
1746
        if (pJoinNode->pPrimKeyCond) {
×
1747
          QRY_ERR_RET(
×
1748
              nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1749
          conditionsGot = true;
×
1750
        }
1751
        if (pJoinNode->pColEqCond) {
×
1752
          if (conditionsGot) {
×
1753
            EXPLAIN_ROW_APPEND(" AND ");
×
1754
          }
1755
          QRY_ERR_RET(
×
1756
              nodesNodeToSQL(pJoinNode->pColEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1757
          conditionsGot = true;
×
1758
        }
1759
        if (pJoinNode->pTagEqCond) {
×
1760
          if (conditionsGot) {
×
1761
            EXPLAIN_ROW_APPEND(" AND ");
×
1762
          }
1763
          QRY_ERR_RET(
×
1764
              nodesNodeToSQL(pJoinNode->pTagEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1765
          conditionsGot = true;
×
1766
        }
1767
        if (pJoinNode->pFullOnCond) {
×
1768
          if (conditionsGot) {
×
1769
            EXPLAIN_ROW_APPEND(" AND ");
×
1770
          }
1771
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE,
×
1772
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1773
        }
1774
        EXPLAIN_ROW_END();
×
1775
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1776

1777
        if (pJoinNode->timeRangeTarget) {
×
1778
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TABLE_TIMERANGE_FORMAT, qExplainGetTimerangeTargetStr(pJoinNode->timeRangeTarget), pJoinNode->timeRange.skey, pJoinNode->timeRange.ekey);
×
1779
          EXPLAIN_ROW_END();
×
1780
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1781
        }
1782
      }
1783
      break;
7,910✔
1784
    }
1785
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE:{
7,910✔
1786
      SGroupCachePhysiNode *pGroupCache = (SGroupCachePhysiNode *)pNode;
7,910✔
1787
      EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_CACHE_FORMAT);
7,910!
1788
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
7,910✔
1789
      if (pResNode->pExecInfo) {
7,910!
1790
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1791
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1792
      }
1793
      EXPLAIN_ROW_APPEND(EXPLAIN_GLOBAL_GROUP_FORMAT, pGroupCache->globalGrp);
7,910✔
1794
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1795
      EXPLAIN_ROW_APPEND(EXPLAIN_GROUP_BY_UID_FORMAT, pGroupCache->grpByUid);
7,910✔
1796
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1797
      EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pGroupCache->batchFetch);
7,910✔
1798
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1799
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pGroupCache->node.pOutputDataBlockDesc->totalRowSize);
7,910✔
1800
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1801
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pGroupCache->node.inputTsOrder));
7,910!
1802
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1803
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
7,910✔
1804
      EXPLAIN_ROW_END();
7,910✔
1805
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
7,910!
1806

1807
      if (verbose) {
7,910!
1808
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1809
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1810
                           nodesGetOutputNumFromSlotList(pGroupCache->node.pOutputDataBlockDesc->pSlots));
1811
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1812
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pGroupCache->node.pOutputDataBlockDesc->outputRowSize);
×
1813
        EXPLAIN_ROW_APPEND_LIMIT(pGroupCache->node.pLimit);
×
1814
        EXPLAIN_ROW_APPEND_SLIMIT(pGroupCache->node.pSlimit);
×
1815
        EXPLAIN_ROW_END();
×
1816
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1817

1818
        if (pGroupCache->node.pConditions) {
×
1819
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1820
          QRY_ERR_RET(nodesNodeToSQL(pGroupCache->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1821
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1822
          EXPLAIN_ROW_END();
×
1823
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1824
        }
1825
      }
1826
      break;
7,910✔
1827
    }
1828
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL:{
7,910✔
1829
      SDynQueryCtrlPhysiNode *pDyn = (SDynQueryCtrlPhysiNode *)pNode;
7,910✔
1830
      EXPLAIN_ROW_NEW(level, EXPLAIN_DYN_QRY_CTRL_FORMAT, qExplainGetDynQryCtrlType(pDyn->qType));
7,910!
1831
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
7,910✔
1832
      if (pResNode->pExecInfo) {
7,910!
1833
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1834
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1835
      }
1836
      EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pDyn->stbJoin.batchFetch);
7,910✔
1837
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1838
      EXPLAIN_ROW_APPEND(EXPLAIN_VGROUP_SLOT_FORMAT, pDyn->stbJoin.vgSlot[0], pDyn->stbJoin.vgSlot[1]);
7,910✔
1839
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1840
      EXPLAIN_ROW_APPEND(EXPLAIN_UID_SLOT_FORMAT, pDyn->stbJoin.uidSlot[0], pDyn->stbJoin.uidSlot[1]);
7,910✔
1841
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1842
      EXPLAIN_ROW_APPEND(EXPLAIN_SRC_SCAN_FORMAT, pDyn->stbJoin.srcScan[0], pDyn->stbJoin.srcScan[1]);
7,910✔
1843
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1844
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
7,910✔
1845
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1846
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
7,910!
1847
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,910✔
1848
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
7,910✔
1849
      EXPLAIN_ROW_END();
7,910✔
1850
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
7,910!
1851

1852
      if (verbose) {
7,910!
1853
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1854
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1855
                           nodesGetOutputNumFromSlotList(pDyn->node.pOutputDataBlockDesc->pSlots));
1856
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1857
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->outputRowSize);
×
1858
        EXPLAIN_ROW_APPEND_LIMIT(pDyn->node.pLimit);
×
1859
        EXPLAIN_ROW_APPEND_SLIMIT(pDyn->node.pSlimit);
×
1860
        EXPLAIN_ROW_END();
×
1861
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1862

1863
        if (pDyn->node.pConditions) {
×
1864
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1865
          QRY_ERR_RET(nodesNodeToSQL(pDyn->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1866
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1867
          EXPLAIN_ROW_END();
×
1868
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1869
        }
1870
      }
1871
      break;
7,910✔
1872
    }
1873
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT: {
×
1874
      SCountWinodwPhysiNode *pCountNode = (SCountWinodwPhysiNode *)pNode;
×
1875
      EXPLAIN_ROW_NEW(level, EXPLAIN_COUNT_FORMAT);
×
1876
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1877
      if (pResNode->pExecInfo) {
×
1878
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1879
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1880
      }
1881
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pCountNode->window.pFuncs->length);
×
1882
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1883
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pCountNode->window.node.pOutputDataBlockDesc->totalRowSize);
×
1884
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1885
      EXPLAIN_ROW_END();
×
1886
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1887

1888
      if (verbose) {
×
1889
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_NUM_FORMAT, pCountNode->windowCount);
×
1890
        EXPLAIN_ROW_END();
×
1891
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1892
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_SLIDING_FORMAT, pCountNode->windowSliding);
×
1893
        EXPLAIN_ROW_END();
×
1894
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1895
      }
1896
      break;
×
1897
    }
1898
    default:
×
1899
      qError("not supported physical node type %d", pNode->type);
×
1900
      return TSDB_CODE_APP_ERROR;
×
1901
  }
1902

1903
  return TSDB_CODE_SUCCESS;
841,368✔
1904
}
1905

1906
static int32_t qExplainResNodeToRows(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t level) {
841,368✔
1907
  if (NULL == pResNode) {
841,368!
1908
    qError("explain res node is NULL");
×
1909
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
1910
  }
1911

1912
  int32_t code = 0;
841,368✔
1913
  QRY_ERR_RET(qExplainResNodeToRowsImpl(pResNode, ctx, level));
841,368!
1914

1915
  SNode *pNode = NULL;
841,368✔
1916
  FOREACH(pNode, pResNode->pChildren) { QRY_ERR_RET(qExplainResNodeToRows((SExplainResNode *)pNode, ctx, level + 1)); }
1,351,516!
1917

1918
  return TSDB_CODE_SUCCESS;
841,368✔
1919
}
1920

1921
static int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t level, bool singleChannel) {
331,220✔
1922
  SExplainResNode *node = NULL;
331,220✔
1923
  int32_t          code = 0;
331,220✔
1924
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
331,220✔
1925

1926
  SExplainGroup *group = taosHashGet(ctx->groupHash, &groupId, sizeof(groupId));
331,220✔
1927
  if (NULL == group) {
331,220!
1928
    qError("group %d not in groupHash", groupId);
×
1929
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
1930
  }
1931

1932
  group->singleChannel = singleChannel;
331,220✔
1933
  group->physiPlanExecIdx = 0;
331,220✔
1934

1935
  QRY_ERR_RET(qExplainGenerateResNode(group->plan->pNode, group, &node));
331,220!
1936

1937
  QRY_ERR_JRET(qExplainResNodeToRows(node, ctx, level));
331,220!
1938

1939
_return:
331,220✔
1940

1941
  qExplainFreeResNode(node);
331,220✔
1942

1943
  QRY_RET(code);
331,220!
1944
}
1945

1946
static int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
109,408✔
1947
  int32_t      code = 0;
109,408✔
1948
  SSDataBlock *pBlock = NULL;
109,408✔
1949
  SExplainCtx *pCtx = (SExplainCtx *)ctx;
109,408✔
1950
  int32_t      rowNum = taosArrayGetSize(pCtx->rows);
109,408✔
1951
  if (rowNum <= 0) {
109,408!
1952
    qError("empty explain res rows");
×
1953
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
1954
  }
1955

1956
  code = createDataBlock(&pBlock);
109,408✔
1957
  QRY_ERR_JRET(code);
109,408!
1958

1959
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, TSDB_EXPLAIN_RESULT_ROW_SIZE, 1);
109,408✔
1960
  QRY_ERR_JRET(blockDataAppendColInfo(pBlock, &infoData));
109,408!
1961
  QRY_ERR_JRET(blockDataEnsureCapacity(pBlock, rowNum));
109,408!
1962

1963
  SColumnInfoData *pInfoData = taosArrayGet(pBlock->pDataBlock, 0);
109,408✔
1964

1965
  for (int32_t i = 0; i < rowNum; ++i) {
1,228,978✔
1966
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
1,119,570✔
1967
    QRY_ERR_JRET(colDataSetVal(pInfoData, i, row->buf, false));
1,119,570!
1968
  }
1969

1970
  pBlock->info.rows = rowNum;
109,408✔
1971

1972
  size_t dataEncodeBufSize = blockGetEncodeSize(pBlock);
109,408✔
1973
  int32_t rspSize = sizeof(SRetrieveTableRsp) + dataEncodeBufSize + PAYLOAD_PREFIX_LEN;
109,408✔
1974

1975
  SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, rspSize);
109,408✔
1976
  if (NULL == rsp) {
109,408!
1977
    qError("malloc SRetrieveTableRsp failed, size:%d", rspSize);
×
1978
    QRY_ERR_JRET(terrno);
×
1979
  }
1980

1981
  rsp->completed = 1;
109,408✔
1982
  rsp->numOfRows = htobe64((int64_t)rowNum);
109,408✔
1983

1984
  int32_t len = blockEncode(pBlock, rsp->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, taosArrayGetSize(pBlock->pDataBlock));
109,408✔
1985
  if(len < 0) {
109,408!
1986
    qError("qExplainGetRspFromCtx: blockEncode failed");
×
1987
    QRY_ERR_JRET(terrno);
×
1988
  }
1989

1990
  rsp->compLen = htonl(len);
109,408✔
1991
  rsp->payloadLen = htonl(len);
109,408✔
1992
  rsp->compressed = 0;
109,408✔
1993

1994
  SET_PAYLOAD_LEN(rsp->data, len, len);
109,408✔
1995

1996
_return:
109,408✔
1997
  blockDataDestroy(pBlock);
109,408✔
1998

1999
  *pRsp = rsp;
109,408✔
2000
  QRY_RET(code);
109,408!
2001
}
2002

2003
static int32_t qExplainPrepareCtx(SQueryPlan *pDag, SExplainCtx **pCtx) {
109,416✔
2004
  int32_t        code = 0;
109,416✔
2005
  SNodeListNode *plans = NULL;
109,416✔
2006
  int32_t        taskNum = 0;
109,416✔
2007
  SExplainGroup *pGroup = NULL;
109,416✔
2008
  SExplainCtx   *ctx = NULL;
109,416✔
2009

2010
  if (pDag->numOfSubplans <= 0) {
109,416!
2011
    qError("invalid subplan num:%d", pDag->numOfSubplans);
×
2012
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2013
  }
2014

2015
  int32_t levelNum = (int32_t)LIST_LENGTH(pDag->pSubplans);
109,416!
2016
  if (levelNum <= 0) {
109,416!
2017
    qError("invalid level num:%d", levelNum);
×
2018
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2019
  }
2020

2021
  SHashObj *groupHash =
2022
      taosHashInit(EXPLAIN_MAX_GROUP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
109,416✔
2023
  if (NULL == groupHash) {
109,416!
2024
    qError("groupHash %d failed", EXPLAIN_MAX_GROUP_NUM);
×
2025
    QRY_ERR_RET(terrno);
×
2026
  }
2027

2028
  QRY_ERR_JRET(
109,416!
2029
      qExplainInitCtx(&ctx, groupHash, pDag->explainInfo.verbose, pDag->explainInfo.ratio, pDag->explainInfo.mode));
2030

2031
  for (int32_t i = 0; i < levelNum; ++i) {
319,010✔
2032
    plans = (SNodeListNode *)nodesListGetNode(pDag->pSubplans, i);
209,594✔
2033
    if (NULL == plans) {
209,594!
2034
      qError("empty level plan, level:%d", i);
×
2035
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2036
    }
2037

2038
    taskNum = (int32_t)LIST_LENGTH(plans->pNodeList);
209,594!
2039
    if (taskNum <= 0) {
209,594!
2040
      qError("invalid level plan number:%d, level:%d", taskNum, i);
×
2041
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2042
    }
2043

2044
    SSubplan *plan = NULL;
209,594✔
2045
    for (int32_t n = 0; n < taskNum; ++n) {
596,843✔
2046
      plan = (SSubplan *)nodesListGetNode(plans->pNodeList, n);
387,249✔
2047
      pGroup = taosHashGet(groupHash, &plan->id.groupId, sizeof(plan->id.groupId));
387,249✔
2048
      if (pGroup) {
387,249✔
2049
        ++pGroup->nodeNum;
112,094✔
2050
        continue;
112,094✔
2051
      }
2052

2053
      SExplainGroup group = {0};
275,155✔
2054
      group.nodeNum = 1;
275,155✔
2055
      group.plan = plan;
275,155✔
2056

2057
      if (0 != taosHashPut(groupHash, &plan->id.groupId, sizeof(plan->id.groupId), &group, sizeof(group))) {
275,155!
2058
        qError("taosHashPut to explainGroupHash failed, taskIdx:%d", n);
×
2059
        QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
×
2060
      }
2061
    }
2062

2063
    if (0 == i) {
209,594✔
2064
      if (taskNum > 1) {
109,416!
2065
        qError("invalid taskNum %d for level 0", taskNum);
×
2066
        QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2067
      }
2068

2069
      ctx->rootGroupId = plan->id.groupId;
109,416✔
2070
    }
2071

2072
    qDebug("level %d group handled, taskNum:%d", i, taskNum);
209,594✔
2073
  }
2074

2075
  *pCtx = ctx;
109,416✔
2076

2077
  return TSDB_CODE_SUCCESS;
109,416✔
2078

2079
_return:
×
2080

2081
  qExplainFreeCtx(ctx);
×
2082

2083
  QRY_RET(code);
×
2084
}
2085

2086
static int32_t qExplainAppendPlanRows(SExplainCtx *pCtx) {
109,408✔
2087
  if (EXPLAIN_MODE_ANALYZE != pCtx->mode) {
109,408✔
2088
    return TSDB_CODE_SUCCESS;
100,109✔
2089
  }
2090

2091
  int32_t tlen = 0;
9,299✔
2092
  char   *tbuf = pCtx->tbuf;
9,299✔
2093

2094
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_RATIO_TIME_FORMAT, pCtx->ratio);
9,299✔
2095
  EXPLAIN_SUM_ROW_END();
9,299✔
2096
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
9,299!
2097

2098
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_PLANNING_TIME_FORMAT, (double)(pCtx->jobStartTs - pCtx->reqStartTs) / 1000.0);
9,299✔
2099
  EXPLAIN_SUM_ROW_END();
9,299✔
2100
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
9,299!
2101

2102
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_EXEC_TIME_FORMAT, (double)(pCtx->jobDoneTs - pCtx->jobStartTs) / 1000.0);
9,299✔
2103
  EXPLAIN_SUM_ROW_END();
9,299✔
2104
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
9,299!
2105

2106
  return TSDB_CODE_SUCCESS;
9,299✔
2107
}
2108

2109
static int32_t qExplainGenerateRsp(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
109,408✔
2110
  QRY_ERR_RET(qExplainAppendGroupResRows(pCtx, pCtx->rootGroupId, 0, false));
109,408!
2111
  QRY_ERR_RET(qExplainAppendPlanRows(pCtx));
109,408!
2112
  QRY_ERR_RET(qExplainGetRspFromCtx(pCtx, pRsp));
109,408!
2113

2114
  return TSDB_CODE_SUCCESS;
109,408✔
2115
}
2116

2117
int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t groupId, SRetrieveTableRsp **pRsp) {
19,425✔
2118
  if(!pCtx || !pRspMsg || !pRsp) return TSDB_CODE_INVALID_PARA;
19,425!
2119
  SExplainResNode *node = NULL;
19,425✔
2120
  int32_t          code = 0;
19,425✔
2121
  bool             groupDone = false;
19,425✔
2122
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
19,425✔
2123

2124
  SExplainGroup *group = taosHashGet(ctx->groupHash, &groupId, sizeof(groupId));
19,425✔
2125
  if (NULL == group) {
19,425!
2126
    qError("group %d not in groupHash", groupId);
×
2127
    tFreeSExplainRsp(pRspMsg);
×
2128
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2129
  }
2130

2131
  taosWLockLatch(&group->lock);
19,425✔
2132
  if (NULL == group->nodeExecInfo) {
19,425✔
2133
    group->nodeExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainRsp));
15,219✔
2134
    if (NULL == group->nodeExecInfo) {
15,219!
2135
      qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
×
2136
      code = terrno;
×
2137
      TAOS_CHECK_ERRNO(code);
×
2138
    }
2139

2140
    group->physiPlanExecNum = pRspMsg->numOfPlans;
15,219✔
2141
  } else if (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum) {
4,206!
2142
    qError("group execInfo already full, size:%d, nodeNum:%d", (int32_t)taosArrayGetSize(group->nodeExecInfo),
×
2143
           group->nodeNum);
2144
    code = TSDB_CODE_APP_ERROR;
×
2145
    TAOS_CHECK_ERRNO(code);
×
2146
  }
2147

2148
  if (group->physiPlanExecNum != pRspMsg->numOfPlans) {
19,425!
2149
    qError("physiPlanExecNum %d mismatch with others %d in group %d", pRspMsg->numOfPlans, group->physiPlanExecNum,
×
2150
           groupId);
2151
    code = TSDB_CODE_APP_ERROR;
×
2152
    TAOS_CHECK_ERRNO(code);
×
2153
  }
2154

2155
  if(taosArrayPush(group->nodeExecInfo, pRspMsg) == NULL)
38,850!
2156
  {
2157
    code = terrno;
×
2158
    TAOS_CHECK_ERRNO(code);
×
2159
  }
2160

2161
  groupDone = (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum);
19,425✔
2162

2163
  taosWUnLockLatch(&group->lock);
19,425✔
2164

2165
  if (groupDone && (taosHashGetSize(pCtx->groupHash) == atomic_add_fetch_32(&pCtx->groupDoneNum, 1))) {
19,425✔
2166
    if (atomic_load_8((int8_t *)&pCtx->execDone)) {
9,299!
2167
      if (0 == taosWTryLockLatch(&pCtx->lock)) {
×
2168
        QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
×
2169
        // LEAVE LOCK THERE
2170
      }
2171
    }
2172
  }
2173

2174
  return TSDB_CODE_SUCCESS;
19,425✔
2175

2176
_exit:
×
2177
  tFreeSExplainRsp(pRspMsg);
×
2178
  taosWUnLockLatch(&group->lock);
×
2179
  return code;
×
2180
}
2181

2182
int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp) {
100,109✔
2183
  if (!pDag || !pRsp) return TSDB_CODE_INVALID_PARA;
100,109!
2184
  int32_t      code = 0;
100,109✔
2185
  SExplainCtx *pCtx = NULL;
100,109✔
2186

2187
  QRY_ERR_RET(qExplainPrepareCtx(pDag, &pCtx));
100,109!
2188
  QRY_ERR_JRET(qExplainGenerateRsp(pCtx, pRsp));
100,109!
2189

2190
_return:
100,109✔
2191
  qExplainFreeCtx(pCtx);
100,109✔
2192
  QRY_RET(code);
100,109!
2193
}
2194

2195
int32_t qExecExplainBegin(SQueryPlan *pDag, SExplainCtx **pCtx, int64_t startTs) {
9,307✔
2196
  if(!pDag || !pCtx) return TSDB_CODE_INVALID_PARA;
9,307!
2197
  QRY_ERR_RET(qExplainPrepareCtx(pDag, pCtx));
9,307!
2198

2199
  (*pCtx)->reqStartTs = startTs;
9,307✔
2200
  (*pCtx)->jobStartTs = taosGetTimestampUs();
9,307✔
2201

2202
  return TSDB_CODE_SUCCESS;
9,307✔
2203
}
2204

2205
int32_t qExecExplainEnd(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
9,299✔
2206
  if(!pCtx || !pRsp) return TSDB_CODE_INVALID_PARA;
9,299!
2207
  int32_t code = 0;
9,299✔
2208
  pCtx->jobDoneTs = taosGetTimestampUs();
9,299✔
2209

2210
  atomic_store_8((int8_t *)&pCtx->execDone, true);
9,299✔
2211

2212
  if (taosHashGetSize(pCtx->groupHash) == atomic_load_32(&pCtx->groupDoneNum)) {
9,299!
2213
    if (0 == taosWTryLockLatch(&pCtx->lock)) {
9,299!
2214
      QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
9,299!
2215
      // LEAVE LOCK THERE
2216
    }
2217
  }
2218

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

© 2026 Coveralls, Inc