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

taosdata / TDengine / #4985

15 Mar 2026 07:43AM UTC coverage: 68.601% (-0.04%) from 68.643%
#4985

push

travis-ci

web-flow
feat(stream): add natural time units support for PERIOD trigger (#34766)

Implement week/month/year units for stream PERIOD trigger with natural
boundary alignment and offset support.

Key changes:
- Parser: Add validation for natural time units (w/n/y) and offset parameter
- Time utilities: Add getDuration() support for week/month/year units
- TriggerTask: Implement window calculation with natural boundary alignment
  - Week: align to Monday 00:00:00
  - Month: align to 1st of month 00:00:00
  - Year: align to Jan 1st 00:00:00
- Add offset support: PERIOD(1w, 1d) shifts window by 1 day
- Unit tests: Parser validation, time utilities, TriggerTask window calculation
- System tests: End-to-end tests for week/month/year units with offset
- Documentation: Update user manual with natural time unit examples

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

2 of 60 new or added lines in 2 files covered. (3.33%)

448 existing lines in 114 files now uncovered.

212624 of 309941 relevant lines covered (68.6%)

136450774.73 hits per line

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

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

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

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

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

36
/*
37
 * Convert dynamic-query control type to a printable explain label.
38
 *
39
 * @param pDyn Dynamic-query control physical node, can be NULL.
40
 *
41
 * @return Static string for explain output, or "unknown task" when type is unknown.
42
 */
43
char* qExplainGetDynQryCtrlType(const SDynQueryCtrlPhysiNode* pDyn) {
1,023,168✔
44
  if (NULL == pDyn) {
1,023,168✔
45
    return "unknown task";
×
46
  }
47

48
  switch (pDyn->qType) {
1,023,168✔
49
    case DYN_QTYPE_STB_HASH:
731,197✔
50
      return "STable Join";
731,197✔
51
    case DYN_QTYPE_VTB_SCAN:
95,433✔
52
      return "Virtual Stable Scan";
95,433✔
53
    case DYN_QTYPE_VTB_WINDOW:
64,228✔
54
      return "Virtual Table Window";
64,228✔
55
    case DYN_QTYPE_VTB_INTERVAL:
3,738✔
56
      return "Virtual Stable Interval";
3,738✔
57
    case DYN_QTYPE_VTB_AGG:
111,072✔
58
      return "Virtual Stable Agg";
111,072✔
59
    case DYN_QTYPE_VTB_TS_SCAN:
17,500✔
60
      return "Virtual Stable Ts Scan";
17,500✔
61
    default:
×
62
      break;
×
63
  }
64

65
  return "unknown task";
×
66
}
67

68
char* qExplainGetAsofOpStr(int32_t opType) {
43,792✔
69
  switch (opType) {
43,792✔
70
    case OP_TYPE_GREATER_THAN:
1,564✔
71
      return ">";
1,564✔
72
    case OP_TYPE_GREATER_EQUAL:
7,038✔
73
      return ">=";
7,038✔
74
    case OP_TYPE_LOWER_THAN:
×
75
      return "<";
×
76
    case OP_TYPE_LOWER_EQUAL:
7,038✔
77
      return "<=";
7,038✔
78
    case OP_TYPE_EQUAL:
28,152✔
79
      return "=";
28,152✔
80
    default:
×
81
      return "UNKNOWN";
×
82
  }
83
}
84

85
char* qExplainGetTimerangeTargetStr(int32_t target) {
×
86
  static char* targetName[] = {"", "Left", "Right", "Left/Right"};
87
  if (target <= 0 || target > 3) {
×
88
    return "Unknown";
×
89
  }
90

91
  return targetName[target];
×
92
}
93

94
void qExplainFreeResNode(SExplainResNode *resNode) {
334,541,265✔
95
  if (NULL == resNode) {
334,541,265✔
96
    return;
×
97
  }
98

99
  taosArrayDestroy(resNode->pExecInfo);
334,541,265✔
100

101
  SNode *node = NULL;
334,545,416✔
102
  FOREACH(node, resNode->pChildren) { qExplainFreeResNode((SExplainResNode *)node); }
517,984,345✔
103
  nodesClearList(resNode->pChildren);
334,546,964✔
104

105
  taosMemoryFreeClear(resNode);
334,555,506✔
106
}
107

108
void qExplainFreePlanCtx(SExplainPlanCtx* pCtx, bool isAnalyze) {
137,850,578✔
109
  if (isAnalyze && pCtx->groupHash) {
137,850,578✔
110
    void *pIter = taosHashIterate(pCtx->groupHash, NULL);
55,118,880✔
111
    while (pIter) {
138,076,930✔
112
      SExplainGroup *group = (SExplainGroup *)pIter;
82,958,022✔
113
      if (group->nodeExecInfo) {
82,958,022✔
114
        int32_t num = taosArrayGetSize(group->nodeExecInfo);
59,835,723✔
115
        for (int32_t i = 0; i < num; ++i) {
128,934,969✔
116
          SExplainRsp *rsp = taosArrayGet(group->nodeExecInfo, i);
69,099,327✔
117
          tFreeSExplainRsp(rsp);
69,099,017✔
118
        }
119
        taosArrayDestroy(group->nodeExecInfo);
59,835,642✔
120
      }
121

122
      pIter = taosHashIterate(pCtx->groupHash, pIter);
82,958,214✔
123
    }
124
  }
125

126
  taosHashCleanup(pCtx->groupHash);
137,850,606✔
127
}
137,853,586✔
128

129
void qExplainFreeCtx(SExplainCtx *pCtx) {
1,031,211,652✔
130
  if (NULL == pCtx) {
1,031,211,652✔
131
    return;
986,737,430✔
132
  }
133

134
  int32_t rowSize = taosArrayGetSize(pCtx->rows);
44,474,483✔
135
  for (int32_t i = 0; i < rowSize; ++i) {
744,540,993✔
136
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
700,052,287✔
137
    taosMemoryFreeClear(row->buf);
699,985,260✔
138
  }
139

140
  qExplainFreePlanCtx(&pCtx->planCtx, EXPLAIN_MODE_ANALYZE == pCtx->mode);
44,488,706✔
141
  if (pCtx->subPlanCtxs) {
44,490,230✔
142
    int32_t subNum = taosArrayGetSize(pCtx->subPlanCtxs);
31,134,662✔
143
    for (int32_t i = 0; i < subNum; ++i) {
124,499,391✔
144
      SExplainPlanCtx *pSub = taosArrayGet(pCtx->subPlanCtxs, i);
93,364,729✔
145
      qExplainFreePlanCtx(pSub, EXPLAIN_MODE_ANALYZE == pCtx->mode);
93,364,672✔
146
    }
147
    taosArrayDestroy(pCtx->subPlanCtxs);
31,134,662✔
148
  }
149

150
  taosArrayDestroy(pCtx->rows);
44,489,640✔
151
  taosMemoryFreeClear(pCtx->tbuf);
44,490,247✔
152
  taosMemoryFree(pCtx);
44,490,376✔
153
}
154

155
static int32_t qExplainInitCtx(SExplainCtx **pCtx, bool verbose, double ratio, EExplainMode mode) {
44,472,881✔
156
  int32_t      code = 0;
44,472,881✔
157
  SExplainCtx *ctx = taosMemoryCalloc(1, sizeof(SExplainCtx));
44,472,881✔
158
  if (NULL == ctx) {
44,483,686✔
159
    qError("calloc SExplainCtx failed");
×
160
    QRY_ERR_JRET(terrno);
×
161
  }
162

163
  SArray *rows = taosArrayInit(10, sizeof(SQueryExplainRowInfo));
44,483,686✔
164
  if (NULL == rows) {
44,482,241✔
165
    qError("taosArrayInit SQueryExplainRowInfo failed");
×
166
    QRY_ERR_JRET(terrno);
×
167
  }
168

169
  char *tbuf = taosMemoryMalloc(TSDB_EXPLAIN_RESULT_ROW_SIZE);
44,482,241✔
170
  if (NULL == tbuf) {
44,489,234✔
171
    qError("malloc size %d failed", TSDB_EXPLAIN_RESULT_ROW_SIZE);
×
172
    QRY_ERR_JRET(terrno);
×
173
  }
174

175
  ctx->mode = mode;
44,489,234✔
176
  ctx->verbose = verbose;
44,489,234✔
177
  ctx->ratio = ratio;
44,489,234✔
178
  ctx->tbuf = tbuf;
44,489,234✔
179
  ctx->rows = rows;
44,489,234✔
180

181
  *pCtx = ctx;
44,489,234✔
182

183
  return TSDB_CODE_SUCCESS;
44,489,234✔
184

185
_return:
×
186

187
  taosArrayDestroy(rows);
×
188
  taosMemoryFree(ctx);
×
189

190
  QRY_RET(code);
×
191
}
192

193
static int32_t qExplainGenerateResChildren(SSubplan *plan, SPhysiNode *pNode, SExplainGroup *group, SNodeList **pChildren) {
334,567,105✔
194
  int32_t    tlen = 0;
334,567,105✔
195
  SNodeList *pPhysiChildren = pNode->pChildren;
334,567,105✔
196

197
  if (pPhysiChildren) {
334,567,105✔
198
    int32_t code = nodesMakeList(pChildren);
160,822,195✔
199
    if (NULL == *pChildren) {
160,824,201✔
200
      qError("nodesMakeList failed");
×
UNCOV
201
      QRY_ERR_RET(code);
×
202
    }
203
  }
204

205
  SNode           *node = NULL;
334,558,707✔
206
  SExplainResNode *pResNode = NULL;
334,558,707✔
207
  FOREACH(node, pPhysiChildren) {
518,004,435✔
208
    QRY_ERR_RET(qExplainGenerateResNode(plan, (SPhysiNode *)node, group, &pResNode));
183,444,630✔
209
    QRY_ERR_RET(nodesListAppend(*pChildren, (SNode *)pResNode));
183,442,982✔
210
  }
211

212
  return TSDB_CODE_SUCCESS;
334,559,805✔
213
}
214

215
static int32_t qExplainGenerateResNodeExecInfo(SPhysiNode *pNode, SArray **pExecInfo, SExplainGroup *group) {
8,206,964✔
216
  *pExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainExecInfo));
8,206,964✔
217
  if (NULL == (*pExecInfo)) {
8,206,964✔
218
    qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
×
219
    return terrno;
×
220
  }
221

222
  SExplainRsp *rsp = NULL;
8,206,964✔
223
  if (group->singleChannel) {
8,206,964✔
224
    if (0 == group->physiPlanExecIdx) {
20,660✔
225
      group->nodeIdx = 0;
20,660✔
226
    }
227

228
    rsp = taosArrayGet(group->nodeExecInfo, group->nodeIdx++);
20,660✔
229
    if (group->physiPlanExecIdx >= rsp->numOfPlans) {
20,660✔
230
      qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
×
231
      return TSDB_CODE_APP_ERROR;
×
232
    }
233

234
    if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno;
41,320✔
235
  } else {
236
    for (int32_t i = 0; i < group->nodeNum; ++i) {
19,828,784✔
237
      rsp = taosArrayGet(group->nodeExecInfo, i);
11,642,480✔
238
      if (group->physiPlanExecIdx >= rsp->numOfPlans) {
11,642,480✔
239
        qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans);
×
240
        return TSDB_CODE_APP_ERROR;
×
241
      }
242

243
      if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno;
23,284,960✔
244
    }
245
  }
246

247
  ++group->physiPlanExecIdx;
8,206,964✔
248

249
  return TSDB_CODE_SUCCESS;
8,206,964✔
250
}
251

252
static int32_t qExplainGenerateResNode(SSubplan *plan, SPhysiNode *pNode, SExplainGroup *group, SExplainResNode **pResNode) {
334,556,648✔
253
  if (NULL == pNode) {
334,556,648✔
254
    *pResNode = NULL;
×
255
    qError("physical node is NULL");
×
256
    return TSDB_CODE_APP_ERROR;
×
257
  }
258

259
  SExplainResNode *resNode = taosMemoryCalloc(1, sizeof(SExplainResNode));
334,556,648✔
260
  if (NULL == resNode) {
334,569,435✔
261
    qError("calloc SPhysiNodeExplainRes failed");
×
262
    return terrno;
×
263
  }
264

265
  int32_t code = 0;
334,569,435✔
266
  resNode->pNode = pNode;
334,569,435✔
267
  resNode->pPlan = plan;
334,569,435✔
268

269
  if (group->nodeExecInfo) {
334,569,435✔
270
    QRY_ERR_JRET(qExplainGenerateResNodeExecInfo(pNode, &resNode->pExecInfo, group));
8,206,964✔
271
  }
272

273
  QRY_ERR_JRET(qExplainGenerateResChildren(plan, pNode, group, &resNode->pChildren));
334,569,435✔
274

275
  *pResNode = resNode;
334,563,510✔
276

277
  return TSDB_CODE_SUCCESS;
334,563,510✔
278

279
_return:
×
280

281
  qExplainFreeResNode(resNode);
×
282

283
  QRY_RET(code);
×
284
}
285

286
static int32_t qExplainBufAppendExecInfo(SArray *pExecInfo, char *tbuf, int32_t *len) {
8,206,964✔
287
  int32_t          tlen = *len;
8,206,964✔
288
  int32_t          nodeNum = taosArrayGetSize(pExecInfo);
8,206,964✔
289
  SExplainExecInfo maxExecInfo = {0};
8,206,964✔
290

291
  for (int32_t i = 0; i < nodeNum; ++i) {
19,870,104✔
292
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
11,663,140✔
293
    if (execInfo->startupCost > maxExecInfo.startupCost) {
11,663,140✔
294
      maxExecInfo.startupCost = execInfo->startupCost;
5,624,739✔
295
    }
296
    if (execInfo->totalCost > maxExecInfo.totalCost) {
11,663,140✔
297
      maxExecInfo.totalCost = execInfo->totalCost;
9,540,188✔
298
    }
299
    if (execInfo->numOfRows > maxExecInfo.numOfRows) {
11,663,140✔
300
      maxExecInfo.numOfRows = execInfo->numOfRows;
7,808,062✔
301
    }
302
  }
303

304
  EXPLAIN_ROW_APPEND(EXPLAIN_EXECINFO_FORMAT, maxExecInfo.startupCost, maxExecInfo.totalCost, maxExecInfo.numOfRows);
8,206,964✔
305

306
  *len = tlen;
8,206,964✔
307

308
  return TSDB_CODE_SUCCESS;
8,206,964✔
309
}
310

311
static int32_t qExplainBufAppendVerboseExecInfo(SArray *pExecInfo, char *tbuf, int32_t *len) {
1,564✔
312
  int32_t          tlen = 0;
1,564✔
313
  bool             gotVerbose = false;
1,564✔
314
  int32_t          nodeNum = taosArrayGetSize(pExecInfo);
1,564✔
315
  SExplainExecInfo maxExecInfo = {0};
1,564✔
316

317
  for (int32_t i = 0; i < nodeNum; ++i) {
6,256✔
318
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
4,692✔
319
    if (execInfo->verboseInfo) {
4,692✔
320
      gotVerbose = true;
×
321
    }
322
  }
323

324
  if (gotVerbose) {
1,564✔
325
    EXPLAIN_ROW_APPEND("exec verbose info");
×
326
  }
327

328
  *len = tlen;
1,564✔
329

330
  return TSDB_CODE_SUCCESS;
1,564✔
331
}
332

333
static int32_t qExplainResAppendRow(SExplainCtx *ctx, char *tbuf, int32_t len, int32_t level) {
700,030,604✔
334
  SQueryExplainRowInfo row = {0};
700,030,604✔
335
  row.buf = taosMemoryMalloc(len);
700,030,604✔
336
  if (NULL == row.buf) {
700,071,804✔
337
    qError("taosMemoryMalloc %d failed", len);
×
338
    QRY_ERR_RET(terrno);
×
339
  }
340

341
  memcpy(row.buf, tbuf, len);
700,071,804✔
342
  row.level = level;
700,071,804✔
343
  row.len = len;
700,071,804✔
344
  ctx->dataSize += row.len;
700,071,804✔
345

346
  if (NULL == taosArrayPush(ctx->rows, &row)) {
1,400,076,601✔
347
    qError("taosArrayPush row to explain res rows failed");
×
348
    taosMemoryFree(row.buf);
×
349
    QRY_ERR_RET(terrno);
×
350
  }
351

352
  return TSDB_CODE_SUCCESS;
700,007,727✔
353
}
354

355
static uint8_t qExplainGetIntervalPrecision(SIntervalPhysiNode *pIntNode) {
4,942,877✔
356
  return ((SColumnNode *)pIntNode->window.pTspk)->node.resType.precision;
4,942,877✔
357
}
358

359
static char* qExplainGetScanMode(STableScanPhysiNode* pScan) {
107,514,544✔
360
  bool isGroupByTbname = false;
107,514,544✔
361
  bool isGroupByTag = false;
107,514,544✔
362
  bool seq = false;
107,514,544✔
363
  bool groupOrder = false;
107,514,544✔
364
  if (pScan->pGroupTags && LIST_LENGTH(pScan->pGroupTags) == 1) {
107,514,544✔
365
    SNode* p = nodesListGetNode(pScan->pGroupTags, 0);
2,973,359✔
366
    if (QUERY_NODE_FUNCTION == nodeType(p) && (strcmp(((struct SFunctionNode*)p)->functionName, "tbname") == 0)) {
2,973,195✔
367
      isGroupByTbname = true;
2,833,383✔
368
    }
369
  }
370

371
  isGroupByTag = (NULL != pScan->pGroupTags) && !isGroupByTbname;
107,514,380✔
372
  if ((((!isGroupByTag) || isGroupByTbname) && pScan->groupSort) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
107,514,380✔
373
    return "seq_grp_order";
24,180✔
374
  }
375

376
  if ((isGroupByTbname && (pScan->groupSort || pScan->scan.groupOrderScan)) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
107,490,200✔
377
    return "grp_order";
1,037✔
378
  }
379

380
  return "ts_order";
107,489,163✔
381
}
382

383
static char* qExplainGetScanDataLoad(STableScanPhysiNode* pScan) {
107,515,093✔
384
  switch (pScan->dataRequired) {
107,515,093✔
385
    case FUNC_DATA_REQUIRED_DATA_LOAD:
101,251,510✔
386
      return "data";
101,251,510✔
387
    case FUNC_DATA_REQUIRED_SMA_LOAD:
4,887,914✔
388
      return "sma";
4,887,914✔
389
    case FUNC_DATA_REQUIRED_NOT_LOAD:
1,378,160✔
390
      return "no";
1,378,160✔
391
    default:
×
392
      break;
×
393
  }
394

395
  return "unknown";
×
396
}
397

398
static EDealRes qExplainVerifyIndex(SNode* pNode, void* pContext) {
84,016✔
399
  if (NULL == pNode) {
84,016✔
400
    return DEAL_RES_CONTINUE;
×
401
  }
402

403
  switch (nodeType(pNode)) {
84,016✔
404
    case QUERY_NODE_COLUMN:
52,991✔
405
    case QUERY_NODE_VALUE:
406
    case QUERY_NODE_LOGIC_CONDITION:
407
    case QUERY_NODE_NODE_LIST:
408
      break;
52,991✔
409
    case QUERY_NODE_OPERATOR: {
29,453✔
410
      SOperatorNode* pOp = (SOperatorNode*)pNode;
29,453✔
411
      if ((pOp->opType >= OP_TYPE_GREATER_THAN && pOp->opType <= OP_TYPE_EQUAL) || (OP_TYPE_IN == pOp->opType)) {
29,453✔
412
        break;
413
      }
414
      // fall through
415
    }
416
    default:
417
      *(bool*)pContext = false;
5,456✔
418
      return DEAL_RES_END;
5,456✔
419
  }
420

421
  return DEAL_RES_CONTINUE;
78,560✔
422
}
423

424
static bool qExplainCouldApplyTagIndex(SSubplan* pPlan) {
49,995,109✔
425
  if (NULL == pPlan->pTagIndexCond) {
49,995,109✔
426
    return false;
49,968,987✔
427
  }
428

429
  bool couldApply = true;
27,357✔
430
  nodesWalkExpr(pPlan->pTagIndexCond, qExplainVerifyIndex, &couldApply);
27,357✔
431

432
  return couldApply;
27,357✔
433
}
434

435
static int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t *pLevel) {
334,545,558✔
436
  int32_t     tlen = 0;
334,545,558✔
437
  bool        isVerboseLine = false;
334,545,558✔
438
  char       *tbuf = ctx->tbuf;
334,545,558✔
439
  bool        verbose = ctx->verbose;
334,545,558✔
440
  SPhysiNode *pNode = pResNode->pNode;
334,545,558✔
441
  if (NULL == pNode) {
334,545,558✔
442
    qError("pyhsical node in explain res node is NULL");
×
443
    return TSDB_CODE_APP_ERROR;
×
444
  }
445

446
  if (0 == *pLevel && ctx->currPlanId >= 0) {
334,545,558✔
447
    EXPLAIN_SUB_PLAN_LINE(ctx->currPlanId + 1);
53,300,325✔
448
    QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, *pLevel + 1));
53,297,803✔
449
    *pLevel += 2;
53,298,715✔
450
  }
451

452
  int32_t level = *pLevel;
334,543,948✔
453
  
454
  switch (pNode->type) {
334,543,948✔
455
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN: {
3,921,013✔
456
      STagScanPhysiNode *pTagScanNode = (STagScanPhysiNode *)pNode;
3,921,013✔
457
      EXPLAIN_ROW_NEW(level, EXPLAIN_TAG_SCAN_FORMAT, pTagScanNode->scan.tableName.tname);
3,921,013✔
458
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
3,921,094✔
459
      if (pResNode->pExecInfo) {
3,921,159✔
460
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,564✔
461
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,564✔
462
      }
463
      if (pTagScanNode->scan.pScanPseudoCols) {
3,921,159✔
464
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTagScanNode->scan.pScanPseudoCols->length);
1,592,227✔
465
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,592,227✔
466
      }
467
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
3,921,159✔
468
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
3,921,069✔
469
      EXPLAIN_ROW_END();
3,920,923✔
470
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
3,920,923✔
471

472
      if (verbose) {
3,920,979✔
473
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,172,755✔
474
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
1,172,674✔
475
                           nodesGetOutputNumFromSlotList(pTagScanNode->scan.node.pOutputDataBlockDesc->pSlots));
476
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,172,935✔
477
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTagScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
1,172,935✔
478
        EXPLAIN_ROW_APPEND_LIMIT(pTagScanNode->scan.node.pLimit);
1,172,935✔
479
        EXPLAIN_ROW_APPEND_SLIMIT(pTagScanNode->scan.node.pSlimit);
1,172,935✔
480
        EXPLAIN_ROW_END();
1,172,935✔
481
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,172,935✔
482

483
        if (pResNode->pExecInfo) {
1,172,854✔
484
          QRY_ERR_RET(qExplainBufAppendVerboseExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,564✔
485
          if (tlen) {
1,564✔
486
            EXPLAIN_ROW_END();
×
487
            QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
488
          }
489
        }
490

491
        if (pTagScanNode->scan.node.pConditions) {
1,172,854✔
492
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
493
          QRY_ERR_RET(nodesNodeToSQL(pTagScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
494
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
495
          EXPLAIN_ROW_END();
×
496
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
497
        }
498

499
        if (qExplainCouldApplyTagIndex(pResNode->pPlan)) {
1,172,854✔
500
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TAG_INDEX_FORMAT);
×
501
          QRY_ERR_RET(nodesNodeToSQL(pResNode->pPlan->pTagIndexCond, tbuf + VARSTR_HEADER_SIZE,
×
502
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
503
          EXPLAIN_ROW_END();
×
504
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
505
        }
506
      }
507
      break;
3,920,743✔
508
    }
509
    case QUERY_NODE_PHYSICAL_PLAN_VIRTUAL_TABLE_SCAN: {
110,008✔
510
      SVirtualScanPhysiNode *pVirtualTableScanNode = (SVirtualScanPhysiNode *)pNode;
110,008✔
511
      EXPLAIN_ROW_NEW(level, EXPLAIN_VIRTUAL_TABLE_SCAN_FORMAT, pVirtualTableScanNode->scan.tableName.tname);
110,008✔
512
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
110,008✔
513
      if (pResNode->pExecInfo) {
110,008✔
514
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
515
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
516
      }
517
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pVirtualTableScanNode->scan.pScanCols->length);
110,008✔
518
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
110,008✔
519
      if (pVirtualTableScanNode->scan.pScanPseudoCols) {
110,008✔
520
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pVirtualTableScanNode->scan.pScanPseudoCols->length);
33,737✔
521
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
33,737✔
522
      }
523
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
110,008✔
524
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
110,008✔
525
      EXPLAIN_ROW_END();
110,008✔
526
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
110,008✔
527

528
      if (verbose) {
110,008✔
529
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
80,056✔
530
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
80,056✔
531
                           nodesGetOutputNumFromSlotList(pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->pSlots));
532
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
80,056✔
533
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
80,056✔
534
        EXPLAIN_ROW_APPEND_LIMIT(pVirtualTableScanNode->scan.node.pLimit);
80,056✔
535
        EXPLAIN_ROW_APPEND_SLIMIT(pVirtualTableScanNode->scan.node.pSlimit);
80,056✔
536
        EXPLAIN_ROW_END();
80,056✔
537
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
80,056✔
538

539
        if (pResNode->pExecInfo) {
80,056✔
540
          QRY_ERR_RET(qExplainBufAppendVerboseExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
541
          if (tlen) {
×
542
            EXPLAIN_ROW_END();
×
543
            QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
544
          }
545
        }
546

547
        if (pVirtualTableScanNode->scan.node.pConditions) {
80,056✔
548
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
3,744✔
549
          QRY_ERR_RET(nodesNodeToSQL(pVirtualTableScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
3,744✔
550
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
551
          EXPLAIN_ROW_END();
3,744✔
552
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,744✔
553
        }
554
      }
555
      break;
110,008✔
556
    }
557
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
107,513,207✔
558
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
559
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: {
560
      STableScanPhysiNode *pTblScanNode = (STableScanPhysiNode *)pNode;
107,513,207✔
561
      EXPLAIN_ROW_NEW(level,
107,513,207✔
562
                      QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN == pNode->type ? EXPLAIN_TBL_MERGE_SCAN_FORMAT
563
                                                                               : EXPLAIN_TBL_SCAN_FORMAT,
564
                      pTblScanNode->scan.tableName.tname);
565
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
107,516,854✔
566
      if (pResNode->pExecInfo) {
107,518,258✔
567
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2,848,874✔
568
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,848,874✔
569
      }
570

571
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pTblScanNode->scan.pScanCols->length);
107,518,258✔
572
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
107,515,822✔
573
      if (pTblScanNode->scan.pScanPseudoCols) {
107,517,334✔
574
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTblScanNode->scan.pScanPseudoCols->length);
6,915,743✔
575
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,915,743✔
576
      }
577
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
107,517,334✔
578
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
107,518,260✔
579
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_ORDER_FORMAT, pTblScanNode->scanSeq[0], pTblScanNode->scanSeq[1]);
107,518,920✔
580
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
107,512,389✔
581
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_MODE_FORMAT, qExplainGetScanMode(pTblScanNode));
107,517,353✔
582
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
107,515,575✔
583
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_DATA_LOAD_FORMAT, qExplainGetScanDataLoad(pTblScanNode));
107,518,232✔
584
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
107,515,938✔
585
      EXPLAIN_ROW_END();
107,518,610✔
586
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
107,518,610✔
587

588
      // basic analyze output
589
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
107,513,507✔
590
        EXPLAIN_ROW_NEW(level + 1, "I/O: ");
2,848,874✔
591

592
        int32_t                      nodeNum = taosArrayGetSize(pResNode->pExecInfo);
2,848,874✔
593
        struct STableScanAnalyzeInfo info = {0};
2,848,874✔
594

595
        int32_t maxIndex = 0;
2,848,874✔
596
        int32_t totalRows = 0;
2,848,874✔
597
        for (int32_t i = 0; i < nodeNum; ++i) {
8,520,610✔
598
          SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, i);
5,671,736✔
599
          STableScanAnalyzeInfo *pScanInfo = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
5,671,736✔
600

601
          info.totalBlocks += pScanInfo->totalBlocks;
5,671,736✔
602
          info.loadBlocks += pScanInfo->loadBlocks;
5,671,736✔
603
          info.totalRows += pScanInfo->totalRows;
5,671,736✔
604
          info.skipBlocks += pScanInfo->skipBlocks;
5,671,736✔
605
          info.filterTime += pScanInfo->filterTime;
5,671,736✔
606
          info.loadBlockStatis += pScanInfo->loadBlockStatis;
5,671,736✔
607
          info.totalCheckedRows += pScanInfo->totalCheckedRows;
5,671,736✔
608
          info.filterOutBlocks += pScanInfo->filterOutBlocks;
5,671,736✔
609

610
          if (pScanInfo->totalRows > totalRows) {
5,671,736✔
611
            totalRows = pScanInfo->totalRows;
3,065,945✔
612
            maxIndex = i;
3,065,945✔
613
          }
614
        }
615

616
        EXPLAIN_ROW_APPEND("total_blocks=%.1f", ((double)info.totalBlocks) / nodeNum);
2,848,874✔
617
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,848,874✔
618

619
        EXPLAIN_ROW_APPEND("load_blocks=%.1f", ((double)info.loadBlocks) / nodeNum);
2,848,874✔
620
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,848,874✔
621

622
        EXPLAIN_ROW_APPEND("load_block_SMAs=%.1f", ((double)info.loadBlockStatis) / nodeNum);
2,848,874✔
623
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,848,874✔
624

625
        EXPLAIN_ROW_APPEND("total_rows=%.1f", ((double)info.totalRows) / nodeNum);
2,848,874✔
626
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,848,874✔
627

628
        EXPLAIN_ROW_APPEND("check_rows=%.1f", ((double)info.totalCheckedRows) / nodeNum);
2,848,874✔
629
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,848,874✔
630
        EXPLAIN_ROW_END();
2,848,874✔
631

632
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,848,874✔
633

634
        // 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,
635
        // start offset by 1.470 ms.
636
        SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, maxIndex);
2,848,874✔
637
        STableScanAnalyzeInfo *p1 = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
2,848,874✔
638

639
        EXPLAIN_ROW_NEW(level + 1, " ");
2,848,874✔
640
        EXPLAIN_ROW_APPEND("max_row_task=%d, total_rows:%" PRId64 ", ep:%s (cost=%.3f..%.3f)", maxIndex, p1->totalRows,
2,848,874✔
641
                           "tbd", execInfo->startupCost, execInfo->totalCost);
642
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,848,874✔
643
        EXPLAIN_ROW_END();
2,848,874✔
644

645
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2,848,874✔
646
      }
647

648
      if (verbose) {
107,513,507✔
649
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
48,589,319✔
650
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
48,592,103✔
651
                           nodesGetOutputNumFromSlotList(pTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
652
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
48,592,062✔
653
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
48,592,043✔
654
        EXPLAIN_ROW_APPEND_LIMIT(pTblScanNode->scan.node.pLimit);
48,592,101✔
655
        EXPLAIN_ROW_APPEND_SLIMIT(pTblScanNode->scan.node.pSlimit);
48,592,101✔
656
        EXPLAIN_ROW_END();
48,592,101✔
657
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
48,592,101✔
658

659
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pTblScanNode->scanRange.skey,
48,591,414✔
660
                        pTblScanNode->scanRange.ekey);
661
        EXPLAIN_ROW_END();
48,589,883✔
662
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
48,589,883✔
663

664
        if (NULL != pTblScanNode->pGroupTags) {
48,591,808✔
665
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
1,928,809✔
666
          EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pTblScanNode->pGroupTags->length);
1,928,727✔
667
          EXPLAIN_ROW_END();
1,928,727✔
668
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,928,727✔
669
        }
670

671
        if (pTblScanNode->scan.node.pConditions) {
48,591,718✔
672
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
6,754,927✔
673
          QRY_ERR_RET(nodesNodeToSQL(pTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
6,754,584✔
674
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
675
          EXPLAIN_ROW_END();
6,754,845✔
676
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6,754,845✔
677
        }
678

679
        if (pTblScanNode->pPrimaryCond) {
48,591,808✔
680
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PRIMARY_FILTER_FORMAT);
7,692✔
681
          QRY_ERR_RET(nodesNodeToSQL(pTblScanNode->pPrimaryCond, tbuf + VARSTR_HEADER_SIZE,
7,692✔
682
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
683
          EXPLAIN_ROW_END();
7,692✔
684
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
7,692✔
685
        }
686

687
        if (qExplainCouldApplyTagIndex(pResNode->pPlan)) {
48,591,808✔
688
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TAG_INDEX_FORMAT);
21,901✔
689
          QRY_ERR_RET(nodesNodeToSQL(pResNode->pPlan->pTagIndexCond, tbuf + VARSTR_HEADER_SIZE,
21,901✔
690
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
691
          EXPLAIN_ROW_END();
21,901✔
692
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
21,901✔
693
        }
694
      }
695
      break;
107,513,545✔
696
    }
697
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN: {
308,993✔
698
      SSystemTableScanPhysiNode *pSTblScanNode = (SSystemTableScanPhysiNode *)pNode;
308,993✔
699
      EXPLAIN_ROW_NEW(level, EXPLAIN_SYSTBL_SCAN_FORMAT, pSTblScanNode->scan.tableName.tname);
308,993✔
700
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
308,993✔
701
      if (pResNode->pExecInfo) {
308,993✔
702
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
8,556✔
703
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8,556✔
704
      }
705
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pSTblScanNode->scan.pScanCols->length);
308,993✔
706
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
308,993✔
707
      if (pSTblScanNode->scan.pScanPseudoCols) {
308,993✔
708
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pSTblScanNode->scan.pScanPseudoCols->length);
518✔
709
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
518✔
710
      }
711
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
308,993✔
712
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
308,993✔
713
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
308,993✔
714
      EXPLAIN_ROW_END();
308,993✔
715
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
308,993✔
716

717
      if (verbose) {
308,993✔
718
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
153,049✔
719
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
153,049✔
720
                           nodesGetOutputNumFromSlotList(pSTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
721
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
153,049✔
722
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
153,049✔
723
        EXPLAIN_ROW_APPEND_LIMIT(pSTblScanNode->scan.node.pLimit);
153,049✔
724
        EXPLAIN_ROW_APPEND_SLIMIT(pSTblScanNode->scan.node.pSlimit);
153,049✔
725
        EXPLAIN_ROW_END();
153,049✔
726
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
153,049✔
727

728
        if (pSTblScanNode->scan.node.pConditions) {
153,049✔
729
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
1,066✔
730
          QRY_ERR_RET(nodesNodeToSQL(pSTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
1,066✔
731
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
732
          EXPLAIN_ROW_END();
1,066✔
733
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,066✔
734
        }
735
      }
736
      break;
308,993✔
737
    }
738
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
65,799,108✔
739
      SProjectPhysiNode *pPrjNode = (SProjectPhysiNode *)pNode;
65,799,108✔
740
      EXPLAIN_ROW_NEW(level, EXPLAIN_PROJECTION_FORMAT);
65,799,108✔
741
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
65,804,475✔
742
      if (pResNode->pExecInfo) {
65,805,142✔
743
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,798,094✔
744
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,798,094✔
745
      }
746
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pPrjNode->pProjections->length);
65,805,142✔
747
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
65,798,824✔
748
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->totalRowSize);
65,804,170✔
749
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
65,805,254✔
750
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pPrjNode->node.inputTsOrder));
65,803,710✔
751
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
65,800,921✔
752
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
65,805,154✔
753
      EXPLAIN_ROW_END();
65,805,681✔
754
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
65,805,681✔
755

756
      if (verbose) {
65,799,683✔
757
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
26,815,054✔
758
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
26,815,456✔
759
                           nodesGetOutputNumFromSlotList(pPrjNode->node.pOutputDataBlockDesc->pSlots));
760
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
26,815,108✔
761
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->outputRowSize);
26,815,294✔
762
        EXPLAIN_ROW_APPEND_LIMIT(pPrjNode->node.pLimit);
26,815,302✔
763
        EXPLAIN_ROW_APPEND_SLIMIT(pPrjNode->node.pSlimit);
26,815,302✔
764
        EXPLAIN_ROW_END();
26,815,302✔
765
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
26,815,302✔
766

767
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
26,814,041✔
768
        EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pPrjNode->ignoreGroupId ? "true" : "false");
26,815,645✔
769
        EXPLAIN_ROW_END();
26,815,268✔
770
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
26,815,268✔
771

772
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pPrjNode->mergeDataBlock? "True":"False");
26,814,314✔
773
        EXPLAIN_ROW_END();
26,815,530✔
774
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
26,815,530✔
775

776
        if (pPrjNode->node.pConditions) {
26,813,723✔
777
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
778
          QRY_ERR_RET(nodesNodeToSQL(pPrjNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
779
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
780
          EXPLAIN_ROW_END();
×
781
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
782
        }
783
      }
784
      break;
65,803,318✔
785
    }
786
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN: {
5,837,100✔
787
      SSortMergeJoinPhysiNode *pJoinNode = (SSortMergeJoinPhysiNode *)pNode;
5,837,100✔
788
      EXPLAIN_ROW_NEW(level, EXPLAIN_JOIN_FORMAT, gJoinTypeStr[pJoinNode->joinType][pJoinNode->subType]);
5,837,100✔
789
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
5,836,815✔
790
      if (pResNode->pExecInfo) {
5,837,035✔
791
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
226,350✔
792
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
226,350✔
793
      }
794
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pJoinNode->pTargets->length);
5,837,035✔
795
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
5,837,010✔
796
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->totalRowSize);
5,836,815✔
797
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
5,837,100✔
798
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pJoinNode->node.inputTsOrder));
5,837,035✔
799
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
5,837,100✔
800
      EXPLAIN_ROW_APPEND(EXPLAIN_JOIN_ALGO, "Merge");
5,837,100✔
801
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
5,837,035✔
802
      EXPLAIN_ROW_END();
5,836,815✔
803
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
5,836,815✔
804

805
      if (verbose) {
5,837,100✔
806
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,778,648✔
807
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
1,778,583✔
808
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
809
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,778,648✔
810
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
1,778,648✔
811
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
1,778,648✔
812
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
1,778,648✔
813
        EXPLAIN_ROW_END();
1,778,648✔
814
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,778,648✔
815

816
        if (IS_ASOF_JOIN(pJoinNode->subType) || IS_WINDOW_JOIN(pJoinNode->subType)) {
1,778,583✔
817
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_PARAM_FORMAT);
96,968✔
818
          if (IS_ASOF_JOIN(pJoinNode->subType)) {
96,968✔
819
            EXPLAIN_ROW_APPEND(EXPLAIN_ASOF_OP_FORMAT, qExplainGetAsofOpStr(pJoinNode->asofOpType));
43,792✔
820
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
43,792✔
821
          }
822
          if (NULL != pJoinNode->pWindowOffset) {
96,968✔
823
            SWindowOffsetNode* pWinOffset = (SWindowOffsetNode*)pJoinNode->pWindowOffset;
53,176✔
824
            SValueNode* pStart = (SValueNode*)pWinOffset->pStartOffset;
53,176✔
825
            SValueNode* pEnd = (SValueNode*)pWinOffset->pEndOffset;
53,176✔
826
            EXPLAIN_ROW_APPEND(EXPLAIN_WIN_OFFSET_FORMAT, pStart->literal, pEnd->literal);
53,176✔
827
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
53,176✔
828
          }
829
          if (NULL != pJoinNode->pJLimit && NULL != ((SLimitNode*)pJoinNode->pJLimit)->limit) {
96,968✔
830
            SLimitNode* pJLimit = (SLimitNode*)pJoinNode->pJLimit;
17,204✔
831
            EXPLAIN_ROW_APPEND(EXPLAIN_JLIMIT_FORMAT, pJLimit->limit->datum.i);
17,204✔
832
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
17,204✔
833
          }
834
          if (IS_WINDOW_JOIN(pJoinNode->subType)) {
96,968✔
835
            EXPLAIN_ROW_APPEND(EXPLAIN_SEQ_WIN_GRP_FORMAT, pJoinNode->seqWinGroup);
53,176✔
836
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
53,176✔
837
          }
838

839
          EXPLAIN_ROW_APPEND(EXPLAIN_GRP_JOIN_FORMAT, pJoinNode->grpJoin);
96,968✔
840
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
96,968✔
841
          EXPLAIN_ROW_END();
96,968✔
842

843
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
96,968✔
844
        }
845

846
        if (pJoinNode->node.pConditions) {
1,778,583✔
847
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
17,986✔
848
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
17,986✔
849
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
850
          EXPLAIN_ROW_END();
17,986✔
851
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
17,986✔
852
        }
853

854
        if (NULL != pJoinNode->pPrimKeyCond) {
1,778,583✔
855
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PRIM_CONDITIONS_FORMAT);
1,711,331✔
856
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1,711,331✔
857
          EXPLAIN_ROW_END();
1,711,331✔
858
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,711,331✔
859
        }
860

861
        if (NULL != pJoinNode->pEqLeft && pJoinNode->pEqLeft->length > 0) {
1,778,648✔
862
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_LEFT_FORMAT);
782✔
863
          SNode* pCol = NULL;
782✔
864
          FOREACH(pCol, pJoinNode->pEqLeft) {
1,564✔
865
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
782✔
866
          }
867
          EXPLAIN_ROW_END();
782✔
868
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
782✔
869
        }
870

871
        if (NULL != pJoinNode->pEqRight && pJoinNode->pEqRight->length > 0) {
1,778,648✔
872
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_RIGHT_FORMAT);
782✔
873
          SNode* pCol = NULL;
782✔
874
          FOREACH(pCol, pJoinNode->pEqRight) {
1,564✔
875
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
782✔
876
          }
877
          EXPLAIN_ROW_END();
782✔
878
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
782✔
879
        }
880

881
        if (NULL != pJoinNode->pFullOnCond) {
1,778,648✔
882
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
168,114✔
883
          QRY_ERR_RET(
168,114✔
884
                nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
885
          EXPLAIN_ROW_END();
168,114✔
886
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
168,114✔
887
        }
888

889
        if (NULL != pJoinNode->pColOnCond) {
1,778,648✔
890
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COL_ON_CONDITIONS_FORMAT);
167,332✔
891
          QRY_ERR_RET(
167,332✔
892
                nodesNodeToSQL(pJoinNode->pColOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
893
          EXPLAIN_ROW_END();
167,332✔
894
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
167,332✔
895
        }
896
      }
897
      break;
5,836,880✔
898
    }
899
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: {
33,032,851✔
900
      SAggPhysiNode *pAggNode = (SAggPhysiNode *)pNode;
33,032,851✔
901
      EXPLAIN_ROW_NEW(level, EXPLAIN_AGG_FORMAT, (pAggNode->pGroupKeys ? "GroupAggregate" : "Aggregate"));
33,032,851✔
902
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
33,034,853✔
903
      if (pResNode->pExecInfo) {
33,036,083✔
904
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
978,654✔
905
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
978,654✔
906
      }
907
      if (pAggNode->pAggFuncs) {
33,036,083✔
908
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pAggNode->pAggFuncs->length);
22,850,858✔
909
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
22,852,814✔
910
      }
911
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->totalRowSize);
33,037,898✔
912
      if (pAggNode->pGroupKeys) {
33,035,524✔
913
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
18,521,703✔
914
        EXPLAIN_ROW_APPEND(EXPLAIN_GROUPS_FORMAT, pAggNode->pGroupKeys->length);
18,521,961✔
915
      }
916
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
33,035,678✔
917
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pAggNode->node.inputTsOrder));
33,035,998✔
918
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
33,034,569✔
919
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
33,035,830✔
920
      EXPLAIN_ROW_END();
33,036,284✔
921
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
33,036,284✔
922

923
      if (verbose) {
33,035,494✔
924
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
13,469,038✔
925
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
13,469,873✔
926
                           nodesGetOutputNumFromSlotList(pAggNode->node.pOutputDataBlockDesc->pSlots));
927
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
13,469,875✔
928
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->outputRowSize);
13,469,791✔
929
        EXPLAIN_ROW_APPEND_LIMIT(pAggNode->node.pLimit);
13,468,703✔
930
        EXPLAIN_ROW_APPEND_SLIMIT(pAggNode->node.pSlimit);
13,468,703✔
931
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
13,468,703✔
932
        EXPLAIN_ROW_APPEND(EXPLAIN_PLAN_BLOCKING, !pAggNode->node.forceCreateNonBlockingOptr);
13,468,974✔
933
        EXPLAIN_ROW_END();
13,468,459✔
934
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
13,468,459✔
935

936
        if (pAggNode->node.pConditions) {
13,469,630✔
937
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
492,520✔
938
          QRY_ERR_RET(nodesNodeToSQL(pAggNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
492,340✔
939
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
940
          EXPLAIN_ROW_END();
492,495✔
941
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
492,495✔
942
        }
943

944
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pAggNode->mergeDataBlock? "True":"False");
13,468,852✔
945
        EXPLAIN_ROW_END();
13,469,648✔
946
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
13,469,648✔
947
      }
948
      break;
33,035,642✔
949
    }
950
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: {
1,176,330✔
951
      SIndefRowsFuncPhysiNode *pIndefNode = (SIndefRowsFuncPhysiNode *)pNode;
1,176,330✔
952
      EXPLAIN_ROW_NEW(level, EXPLAIN_INDEF_ROWS_FORMAT);
1,176,330✔
953
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,176,330✔
954
      if (pResNode->pExecInfo) {
1,176,330✔
955
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
3,646✔
956
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,646✔
957
      }
958
      if (pIndefNode->pFuncs) {
1,176,330✔
959
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIndefNode->pFuncs->length);
1,176,330✔
960
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,176,330✔
961
      }
962
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->totalRowSize);
1,176,330✔
963
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,176,330✔
964
      EXPLAIN_ROW_END();
1,176,330✔
965
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,176,330✔
966

967
      if (verbose) {
1,176,330✔
968
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
212,100✔
969
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
212,100✔
970
                           nodesGetOutputNumFromSlotList(pIndefNode->node.pOutputDataBlockDesc->pSlots));
971
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
212,100✔
972
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->outputRowSize);
212,100✔
973
        EXPLAIN_ROW_APPEND_LIMIT(pIndefNode->node.pLimit);
212,100✔
974
        EXPLAIN_ROW_APPEND_SLIMIT(pIndefNode->node.pSlimit);
212,100✔
975
        EXPLAIN_ROW_END();
212,100✔
976
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
212,100✔
977

978
        if (pIndefNode->node.pConditions) {
212,100✔
979
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
980
          QRY_ERR_RET(nodesNodeToSQL(pIndefNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
981
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
982
          EXPLAIN_ROW_END();
×
983
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
984
        }
985
      }
986
      break;
1,176,330✔
987
    }
988
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
57,793,274✔
989
      SExchangePhysiNode *pExchNode = (SExchangePhysiNode *)pNode;
57,793,274✔
990
      int32_t nodeNum = 0;
57,793,274✔
991
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
124,440,037✔
992
        SExplainGroup      *group = taosHashGet(ctx->pCurrPlanCtx->groupHash, &pExchNode->srcStartGroupId, sizeof(pExchNode->srcStartGroupId));
66,644,883✔
993
        if (NULL == group) {
66,645,374✔
994
          qError("exchange src group %d not in groupHash", pExchNode->srcStartGroupId);
×
995
          QRY_ERR_RET(TSDB_CODE_APP_ERROR);
1,389✔
996
        }
997

998
        nodeNum += group->nodeNum;
66,646,763✔
999
      }
1000

1001
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXCHANGE_FORMAT, pExchNode->singleSrc ? 1 : nodeNum);
57,795,154✔
1002
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
57,794,544✔
1003
      if (pResNode->pExecInfo) {
57,795,058✔
1004
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,683,302✔
1005
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,683,302✔
1006
      }
1007
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->totalRowSize);
57,795,058✔
1008
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
57,793,383✔
1009
      EXPLAIN_ROW_END();
57,794,358✔
1010
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
57,794,358✔
1011

1012
      if (verbose) {
57,794,525✔
1013
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
23,980,219✔
1014
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
23,980,373✔
1015
                           nodesGetOutputNumFromSlotList(pExchNode->node.pOutputDataBlockDesc->pSlots));
1016
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
23,980,515✔
1017
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->outputRowSize);
23,980,660✔
1018
        EXPLAIN_ROW_APPEND_LIMIT(pExchNode->node.pLimit);
23,980,579✔
1019
        EXPLAIN_ROW_APPEND_SLIMIT(pExchNode->node.pSlimit);
23,980,579✔
1020
        EXPLAIN_ROW_END();
23,980,579✔
1021
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
23,980,579✔
1022

1023
        if (pExchNode->node.pConditions) {
23,979,919✔
1024
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1025
          QRY_ERR_RET(nodesNodeToSQL(pExchNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1026
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1027
          EXPLAIN_ROW_END();
×
1028
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1029
        }
1030
      }
1031

1032
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
124,440,262✔
1033
        int32_t nlevel = level + 1;
66,644,872✔
1034
        QRY_ERR_RET(qExplainAppendGroupResRows(ctx, i, &nlevel, pExchNode->grpSingleChannel));
66,644,872✔
1035
      }
1036
      break;
57,795,390✔
1037
    }
1038
    case QUERY_NODE_PHYSICAL_PLAN_SORT: {
22,124,378✔
1039
      SSortPhysiNode *pSortNode = (SSortPhysiNode *)pNode;
22,124,378✔
1040
      EXPLAIN_ROW_NEW(level, EXPLAIN_SORT_FORMAT);
22,124,378✔
1041
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
22,127,247✔
1042
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.inputTsOrder));
22,127,182✔
1043
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
22,126,511✔
1044
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.outputTsOrder));
22,124,427✔
1045
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
22,126,492✔
1046
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
22,127,324✔
1047
      if (pResNode->pExecInfo) {
22,126,946✔
1048
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
79,458✔
1049
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
79,458✔
1050
      }
1051

1052
      SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
22,126,946✔
1053
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
22,126,946✔
1054
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
22,126,598✔
1055
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
22,127,625✔
1056
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
22,127,495✔
1057
      EXPLAIN_ROW_END();
22,127,469✔
1058
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
22,127,469✔
1059

1060
      if (pResNode->pExecInfo) {
22,124,755✔
1061
        // sort key
1062
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
79,458✔
1063
        for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
158,916✔
1064
          SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
79,458✔
1065
          EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
79,458✔
1066
        }
1067

1068
        EXPLAIN_ROW_END();
79,458✔
1069
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
79,458✔
1070

1071
        // sort method
1072
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
79,458✔
1073

1074
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
79,458✔
1075
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
79,458✔
1076
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
79,458✔
1077
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
79,458✔
1078
        if (pExecInfo->sortBuffer > 1024 * 1024) {
79,458✔
1079
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
66,428✔
1080
        } else if (pExecInfo->sortBuffer > 1024) {
13,030✔
1081
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
1082
        } else {
1083
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
13,030✔
1084
        }
1085

1086
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
79,458✔
1087
        EXPLAIN_ROW_END();
79,458✔
1088
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
79,458✔
1089
      }
1090

1091
      if (verbose) {
22,124,755✔
1092
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
10,862,189✔
1093
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
10,862,960✔
1094
                           nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
1095
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
10,863,050✔
1096
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
10,863,050✔
1097
        EXPLAIN_ROW_APPEND_LIMIT(pSortNode->node.pLimit);
10,861,755✔
1098
        EXPLAIN_ROW_APPEND_SLIMIT(pSortNode->node.pSlimit);
10,861,755✔
1099
        EXPLAIN_ROW_END();
10,861,755✔
1100
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
10,861,755✔
1101

1102
        if (pSortNode->node.pConditions) {
10,861,870✔
1103
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1104
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1105
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1106
          EXPLAIN_ROW_END();
×
1107
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1108
        }
1109
      }
1110
      break;
22,125,813✔
1111
    }
1112
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL: {
7,545,902✔
1113
      SIntervalPhysiNode *pIntNode = (SIntervalPhysiNode *)pNode;
7,545,902✔
1114
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
7,545,902✔
1115
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
7,546,253✔
1116
      if (pResNode->pExecInfo) {
7,545,567✔
1117
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
5,472✔
1118
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
5,472✔
1119
      }
1120
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pIntNode->window.pFuncs));
7,545,567✔
1121
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,545,691✔
1122
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
7,546,226✔
1123
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,546,774✔
1124
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
7,546,709✔
1125
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,546,538✔
1126
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
7,545,944✔
1127
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
7,546,156✔
1128
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
7,546,593✔
1129
      EXPLAIN_ROW_END();
7,546,682✔
1130
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
7,546,682✔
1131

1132
      if (verbose) {
7,546,400✔
1133
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,228,415✔
1134
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
4,228,633✔
1135
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1136
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,228,633✔
1137
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
4,228,633✔
1138
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
4,228,153✔
1139
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
4,228,153✔
1140
        EXPLAIN_ROW_END();
4,228,153✔
1141
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,228,153✔
1142
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pIntNode->timeRange.skey, pIntNode->timeRange.ekey);
4,228,261✔
1143
        EXPLAIN_ROW_END();
4,228,505✔
1144
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,228,505✔
1145
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
4,228,543✔
1146
        int64_t time1 = -1;
4,228,307✔
1147
        int64_t time2 = -1;
4,228,307✔
1148
        int32_t code = TSDB_CODE_SUCCESS;
4,228,307✔
1149
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
4,228,307✔
1150
        QRY_ERR_RET(code);
4,228,171✔
1151
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
4,228,171✔
1152
        QRY_ERR_RET(code);
4,228,569✔
1153
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
4,228,569✔
1154
                        time1,
1155
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1156
                        time2,
1157
                        pIntNode->slidingUnit);
1158
        EXPLAIN_ROW_END();
4,227,892✔
1159
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,227,892✔
1160

1161
        if (pIntNode->window.node.pConditions) {
4,228,462✔
1162
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1163
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1164
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1165
          EXPLAIN_ROW_END();
×
1166
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1167
        }
1168

1169
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
4,227,892✔
1170
        EXPLAIN_ROW_END();
4,228,243✔
1171
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,228,243✔
1172
      }
1173
      break;
7,546,554✔
1174
    }
1175
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL: {
1,250,163✔
1176
      SMergeAlignedIntervalPhysiNode *pIntNode = (SMergeAlignedIntervalPhysiNode *)pNode;
1,250,163✔
1177
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_ALIGNED_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
1,250,163✔
1178
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,250,291✔
1179
      if (pResNode->pExecInfo) {
1,250,163✔
1180
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,066✔
1181
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,066✔
1182
      }
1183
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pIntNode->window.pFuncs));
1,250,163✔
1184
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,250,163✔
1185
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,250,291✔
1186
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,250,227✔
1187
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
1,250,163✔
1188
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,250,227✔
1189
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
1,250,291✔
1190
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,250,227✔
1191
      EXPLAIN_ROW_END();
1,250,291✔
1192
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,250,291✔
1193

1194
      if (verbose) {
1,250,355✔
1195
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
714,660✔
1196
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
714,660✔
1197
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1198
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
714,596✔
1199
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
714,660✔
1200
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
714,660✔
1201
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
714,660✔
1202
        EXPLAIN_ROW_END();
714,660✔
1203
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
714,660✔
1204
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
714,596✔
1205
        int64_t time1 = -1;
714,596✔
1206
        int64_t time2 = -1;
714,596✔
1207
        int32_t code = TSDB_CODE_SUCCESS;
714,596✔
1208
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
714,596✔
1209
        QRY_ERR_RET(code);
714,596✔
1210
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
714,596✔
1211
        QRY_ERR_RET(code);
714,660✔
1212
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
714,660✔
1213
                        time1,
1214
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1215
                        time2,
1216
                        pIntNode->slidingUnit);
1217
        EXPLAIN_ROW_END();
714,596✔
1218
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
714,596✔
1219

1220
        if (pIntNode->window.node.pConditions) {
714,660✔
1221
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
3,144✔
1222
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
3,144✔
1223
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1224
          EXPLAIN_ROW_END();
3,144✔
1225
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,144✔
1226
        }
1227

1228
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
714,596✔
1229
        EXPLAIN_ROW_END();
714,660✔
1230
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
714,660✔
1231
      }
1232
      break;
1,250,355✔
1233
    }
1234
    case QUERY_NODE_PHYSICAL_PLAN_FILL: {
4,240✔
1235
      SFillPhysiNode *pFillNode = (SFillPhysiNode *)pNode;
4,240✔
1236
      EXPLAIN_ROW_NEW(level, EXPLAIN_FILL_FORMAT);
4,240✔
1237
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
4,240✔
1238
      if (pResNode->pExecInfo) {
4,240✔
1239
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
548✔
1240
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
548✔
1241
      }
1242
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pFillNode->mode));
4,240✔
1243
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,240✔
1244
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pFillNode->node.pOutputDataBlockDesc->totalRowSize);
4,240✔
1245
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,240✔
1246
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pFillNode->node.inputTsOrder));
4,240✔
1247
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,240✔
1248
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
4,240✔
1249
      EXPLAIN_ROW_END();
4,240✔
1250
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
4,240✔
1251

1252
      if (verbose) {
4,240✔
1253
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,210✔
1254
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
4,210✔
1255
                           nodesGetOutputNumFromSlotList(pFillNode->node.pOutputDataBlockDesc->pSlots));
1256
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,210✔
1257
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pFillNode->node.pOutputDataBlockDesc->outputRowSize);
4,210✔
1258
        EXPLAIN_ROW_APPEND_LIMIT(pFillNode->node.pLimit);
4,210✔
1259
        EXPLAIN_ROW_APPEND_SLIMIT(pFillNode->node.pSlimit);
4,210✔
1260
        EXPLAIN_ROW_END();
4,210✔
1261
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,210✔
1262
        if (pFillNode->pValues) {
4,210✔
1263
          SNodeListNode *pValues = (SNodeListNode *)pFillNode->pValues;
30✔
1264
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
30✔
1265
          SNode  *tNode = NULL;
30✔
1266
          int32_t i = 0;
30✔
1267
          FOREACH(tNode, pValues->pNodeList) {
180✔
1268
            if (i) {
150✔
1269
              EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
120✔
1270
            }
1271
            SValueNode *tValue = (SValueNode *)tNode;
150✔
1272
            char       *value = nodesGetStrValueFromNode(tValue);
150✔
1273
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
150✔
1274
            taosMemoryFree(value);
150✔
1275
            ++i;
150✔
1276
          }
1277

1278
          EXPLAIN_ROW_END();
30✔
1279
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
30✔
1280
        }
1281

1282
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pFillNode->timeRange.skey, pFillNode->timeRange.ekey);
4,210✔
1283
        EXPLAIN_ROW_END();
4,210✔
1284
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,210✔
1285

1286
        if (pFillNode->node.pConditions) {
4,210✔
1287
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1288
          QRY_ERR_RET(nodesNodeToSQL(pFillNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1289
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1290
          EXPLAIN_ROW_END();
×
1291
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1292
        }
1293
      }
1294
      break;
4,240✔
1295
    }
1296
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION: {
2,025,647✔
1297
      SSessionWinodwPhysiNode *pSessNode = (SSessionWinodwPhysiNode *)pNode;
2,025,647✔
1298
      EXPLAIN_ROW_NEW(level, EXPLAIN_SESSION_FORMAT);
2,025,647✔
1299
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
2,026,128✔
1300
      if (pResNode->pExecInfo) {
2,025,999✔
1301
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1302
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1303
      }
1304
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pSessNode->window.pFuncs));
2,025,999✔
1305
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,026,128✔
1306
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->totalRowSize);
2,025,999✔
1307
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
2,026,193✔
1308
      EXPLAIN_ROW_END();
2,026,129✔
1309
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
2,026,129✔
1310

1311
      if (verbose) {
2,025,999✔
1312
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,030,723✔
1313
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
1,030,723✔
1314
                           nodesGetOutputNumFromSlotList(pSessNode->window.node.pOutputDataBlockDesc->pSlots));
1315
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,030,658✔
1316
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->outputRowSize);
1,030,658✔
1317
        EXPLAIN_ROW_APPEND_LIMIT(pSessNode->window.node.pLimit);
1,030,723✔
1318
        EXPLAIN_ROW_APPEND_SLIMIT(pSessNode->window.node.pSlimit);
1,030,723✔
1319
        EXPLAIN_ROW_END();
1,030,723✔
1320
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,030,723✔
1321

1322
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_WINDOW_FORMAT, pSessNode->gap);
1,030,723✔
1323
        EXPLAIN_ROW_END();
1,030,461✔
1324
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,030,461✔
1325

1326
        if (pSessNode->window.node.pConditions) {
1,030,723✔
1327
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1328
          QRY_ERR_RET(nodesNodeToSQL(pSessNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1329
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1330
          EXPLAIN_ROW_END();
×
1331
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1332
        }
1333
      }
1334
      break;
2,025,729✔
1335
    }
1336
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE: {
1,398,808✔
1337
      SStateWindowPhysiNode *pStateNode = (SStateWindowPhysiNode *)pNode;
1,398,808✔
1338

1339
      EXPLAIN_ROW_NEW(level, EXPLAIN_STATE_WINDOW_FORMAT,
1,398,808✔
1340
                      nodesGetNameFromColumnNode(pStateNode->pStateKey));
1341
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,399,217✔
1342
      if (pResNode->pExecInfo) {
1,398,808✔
1343
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1344
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1345
      }
1346

1347
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pStateNode->window.pFuncs));
1,398,808✔
1348
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,399,200✔
1349
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,399,307✔
1350
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,399,282✔
1351
      EXPLAIN_ROW_END();
1,399,372✔
1352
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,399,372✔
1353

1354
      if (verbose) {
1,398,800✔
1355
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
718,960✔
1356
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
719,140✔
1357
                           nodesGetOutputNumFromSlotList(pStateNode->window.node.pOutputDataBlockDesc->pSlots));
1358
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
718,878✔
1359
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->outputRowSize);
719,058✔
1360
        EXPLAIN_ROW_APPEND_LIMIT(pStateNode->window.node.pLimit);
719,140✔
1361
        EXPLAIN_ROW_APPEND_SLIMIT(pStateNode->window.node.pSlimit);
719,140✔
1362
        EXPLAIN_ROW_END();
719,140✔
1363
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
719,140✔
1364

1365
        EXPLAIN_ROW_END();
718,878✔
1366
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
718,878✔
1367

1368
        if (pStateNode->window.node.pConditions) {
719,050✔
1369
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1370
          QRY_ERR_RET(nodesNodeToSQL(pStateNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1371
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1372
          EXPLAIN_ROW_END();
×
1373
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1374
        }
1375
      }
1376
      break;
1,398,808✔
1377
    }
1378
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
6,718,559✔
1379
      SPartitionPhysiNode *pPartNode = (SPartitionPhysiNode *)pNode;
6,718,559✔
1380

1381
      SNode *p = nodesListGetNode(pPartNode->pPartitionKeys, 0);
6,718,559✔
1382
      EXPLAIN_ROW_NEW(level, EXPLAIN_PARITION_FORMAT, nodesGetNameFromColumnNode(p));
6,718,893✔
1383
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
6,719,446✔
1384
      if (pResNode->pExecInfo) {
6,718,430✔
1385
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
132,528✔
1386
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
132,528✔
1387
      }
1388
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->totalRowSize);
6,718,430✔
1389

1390
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
6,719,626✔
1391
      EXPLAIN_ROW_END();
6,719,472✔
1392
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
6,719,472✔
1393

1394
      if (verbose) {
6,718,522✔
1395
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
3,132,557✔
1396
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
3,133,120✔
1397
                           nodesGetOutputNumFromSlotList(pPartNode->node.pOutputDataBlockDesc->pSlots));
1398
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,133,119✔
1399
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->outputRowSize);
3,133,100✔
1400
        EXPLAIN_ROW_APPEND_LIMIT(pPartNode->node.pLimit);
3,133,094✔
1401
        EXPLAIN_ROW_APPEND_SLIMIT(pPartNode->node.pSlimit);
3,133,094✔
1402
        EXPLAIN_ROW_END();
3,133,094✔
1403
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,133,094✔
1404

1405
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
3,132,602✔
1406
        EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pPartNode->pPartitionKeys->length);
3,132,447✔
1407
        EXPLAIN_ROW_END();
3,133,004✔
1408
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,133,004✔
1409

1410
        if (pPartNode->node.pConditions) {
3,133,184✔
1411
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1412
          QRY_ERR_RET(nodesNodeToSQL(pPartNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1413
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1414
          EXPLAIN_ROW_END();
×
1415
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1416
        }
1417
      }
1418
      break;
6,718,192✔
1419
    }
1420
    case QUERY_NODE_PHYSICAL_PLAN_MERGE: {
12,001,871✔
1421
      SMergePhysiNode *pMergeNode = (SMergePhysiNode *)pNode;
12,001,871✔
1422
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_FORMAT);
12,001,871✔
1423
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
12,002,568✔
1424
      if (pResNode->pExecInfo) {
12,002,478✔
1425
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
432,362✔
1426
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
432,362✔
1427
      }
1428

1429
      SDataBlockDescNode *pDescNode = pMergeNode->node.pOutputDataBlockDesc;
12,002,478✔
1430
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
12,002,478✔
1431
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,002,248✔
1432
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
12,002,504✔
1433
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,002,440✔
1434
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pMergeNode->node.inputTsOrder));
12,002,350✔
1435
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,002,077✔
1436
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pMergeNode->node.outputTsOrder));
12,002,504✔
1437
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
12,002,286✔
1438
      EXPLAIN_ROW_APPEND(EXPLAIN_MERGE_MODE_FORMAT, EXPLAIN_MERGE_MODE_STRING(pMergeNode->type));
12,002,004✔
1439
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
12,001,923✔
1440
      EXPLAIN_ROW_END();
12,002,260✔
1441
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
12,002,260✔
1442

1443
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
12,002,248✔
1444
        if (MERGE_TYPE_SORT == pMergeNode->type) {
432,362✔
1445
          // sort method
1446
          EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
432,362✔
1447

1448
          int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
432,362✔
1449
          SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
432,362✔
1450
          SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
432,362✔
1451
          EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
432,362✔
1452
          if (pExecInfo->sortBuffer > 1024 * 1024) {
432,362✔
1453
            EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
×
1454
          } else if (pExecInfo->sortBuffer > 1024) {
432,362✔
1455
            EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
432,362✔
1456
          } else {
1457
            EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
×
1458
          }
1459

1460
          EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
432,362✔
1461
          EXPLAIN_ROW_END();
432,362✔
1462
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
432,362✔
1463
        }
1464
      }
1465

1466
      if (verbose) {
12,002,248✔
1467
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,605,730✔
1468
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
4,605,948✔
1469
                           nodesGetOutputNumFromSlotList(pMergeNode->node.pOutputDataBlockDesc->pSlots));
1470
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,605,948✔
1471
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pMergeNode->node.pOutputDataBlockDesc->outputRowSize);
4,605,794✔
1472
        EXPLAIN_ROW_APPEND_LIMIT(pMergeNode->node.pLimit);
4,605,858✔
1473
        EXPLAIN_ROW_APPEND_SLIMIT(pMergeNode->node.pSlimit);
4,605,858✔
1474
        EXPLAIN_ROW_END();
4,605,858✔
1475
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,605,858✔
1476

1477
        if (MERGE_TYPE_SORT == pMergeNode->type) {
4,605,794✔
1478
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,555,538✔
1479
          EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pMergeNode->ignoreGroupId ? "true" : "false");
4,555,628✔
1480
          EXPLAIN_ROW_END();
4,555,564✔
1481
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,555,564✔
1482

1483
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGE_KEYS_FORMAT);
4,555,564✔
1484
          if (pMergeNode->groupSort) {
4,555,474✔
1485
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, "_group_id asc");
2,075,241✔
1486
            if (LIST_LENGTH(pMergeNode->pMergeKeys) > 0) {
2,075,267✔
1487
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
1,790,577✔
1488
            }
1489
          }
1490
          for (int32_t i = 0; i < LIST_LENGTH(pMergeNode->pMergeKeys); ++i) {
9,311,484✔
1491
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pMergeNode->pMergeKeys, i);
4,755,911✔
1492
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, nodesGetNameFromColumnNode(ptn->pExpr));
4,755,766✔
1493
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,755,847✔
1494
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, EXPLAIN_ORDER_STRING(ptn->order));
4,755,847✔
1495
            if (i != LIST_LENGTH(pMergeNode->pMergeKeys) - 1) {
4,755,920✔
1496
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
485,191✔
1497
            }
1498
          }
1499
          EXPLAIN_ROW_END();
4,555,573✔
1500
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,555,573✔
1501
        }
1502

1503
        if (pMergeNode->node.pConditions) {
4,605,585✔
1504
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1505
          QRY_ERR_RET(nodesNodeToSQL(pMergeNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1506
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1507
          EXPLAIN_ROW_END();
×
1508
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1509
        }
1510
      }
1511
      break;
12,002,205✔
1512
    }
1513
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN: {
×
1514
      SBlockDistScanPhysiNode *pDistScanNode = (SBlockDistScanPhysiNode *)pNode;
×
1515
      EXPLAIN_ROW_NEW(level, EXPLAIN_DISTBLK_SCAN_FORMAT, pDistScanNode->tableName.tname);
×
1516
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1517
      if (pResNode->pExecInfo) {
×
1518
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1519
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1520
      }
1521
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDistScanNode->pScanCols->length);
×
1522
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1523
      if (pDistScanNode->pScanPseudoCols) {
×
1524
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pDistScanNode->pScanPseudoCols->length);
×
1525
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1526
      }
1527
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->totalRowSize);
×
1528
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1529
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1530
      EXPLAIN_ROW_END();
×
1531
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1532

1533
      if (verbose) {
×
1534
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1535
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1536
                           nodesGetOutputNumFromSlotList(pDistScanNode->node.pOutputDataBlockDesc->pSlots));
1537
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1538
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->outputRowSize);
×
1539
        EXPLAIN_ROW_APPEND_LIMIT(pDistScanNode->node.pLimit);
×
1540
        EXPLAIN_ROW_APPEND_SLIMIT(pDistScanNode->node.pSlimit);
×
1541
        EXPLAIN_ROW_END();
×
1542
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1543

1544
        if (pDistScanNode->node.pConditions) {
×
1545
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1546
          QRY_ERR_RET(nodesNodeToSQL(pDistScanNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1547
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1548
          EXPLAIN_ROW_END();
×
1549
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1550
        }
1551
      }
1552
      break;
×
1553
    }
1554
    case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: {
311,964✔
1555
      SLastRowScanPhysiNode *pLastRowNode = (SLastRowScanPhysiNode *)pNode;
311,964✔
1556
      EXPLAIN_ROW_NEW(level, EXPLAIN_LASTROW_SCAN_FORMAT, pLastRowNode->scan.tableName.tname);
311,964✔
1557
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
311,964✔
1558
      if (pResNode->pExecInfo) {
311,964✔
1559
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,036✔
1560
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,036✔
1561
      }
1562
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pLastRowNode->scan.pScanCols->length);
311,964✔
1563
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
311,964✔
1564
      if (pLastRowNode->scan.pScanPseudoCols) {
311,964✔
1565
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
6,322✔
1566
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,322✔
1567
      }
1568
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
311,964✔
1569
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
311,964✔
1570
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
311,964✔
1571
      EXPLAIN_ROW_END();
311,964✔
1572
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
311,964✔
1573

1574
      if (verbose) {
311,964✔
1575
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
232,984✔
1576
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
232,984✔
1577
                           nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
1578
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
232,984✔
1579
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
232,984✔
1580
        EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
232,984✔
1581
        EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
232,984✔
1582
        EXPLAIN_ROW_END();
232,984✔
1583
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
232,984✔
1584

1585
        if (pLastRowNode->scan.node.pConditions) {
232,984✔
1586
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1587
          QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1588
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1589
          EXPLAIN_ROW_END();
×
1590
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1591
        }
1592

1593
        if (qExplainCouldApplyTagIndex(pResNode->pPlan)) {
232,984✔
1594
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TAG_INDEX_FORMAT);
×
1595
          QRY_ERR_RET(nodesNodeToSQL(pResNode->pPlan->pTagIndexCond, tbuf + VARSTR_HEADER_SIZE,
×
1596
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1597
          EXPLAIN_ROW_END();
×
1598
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1599
        }
1600
      }
1601
      break;
311,964✔
1602
    }
1603
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
6,664✔
1604
      STableCountScanPhysiNode *pLastRowNode = (STableCountScanPhysiNode *)pNode;
6,664✔
1605
      char *dbname = pLastRowNode->scan.tableName.dbname;
6,664✔
1606
      char *tbname = pLastRowNode->scan.tableName.tname;
6,664✔
1607
      if (dbname[0] != '\0' && tbname[0] != '\0') {
6,844✔
1608
        char name[TSDB_TABLE_FNAME_LEN];
180✔
1609
        snprintf(name, sizeof(name), "%s.%s", dbname, tbname);
180✔
1610
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, name);
180✔
1611
      } else if (dbname[0] != '\0') {
6,484✔
1612
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, dbname);
180✔
1613
      } else if (tbname[0] != '\0') {
6,304✔
1614
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, tbname);
180✔
1615
      } else {
1616
        EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT, TSDB_INS_TABLE_TABLES);
6,124✔
1617
      }
1618
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
6,664✔
1619
      if (pResNode->pExecInfo) {
6,664✔
1620
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2,072✔
1621
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2,072✔
1622
      }
1623
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, LIST_LENGTH(pLastRowNode->scan.pScanCols));
6,664✔
1624
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,664✔
1625
      if (pLastRowNode->scan.pScanPseudoCols) {
6,664✔
1626
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
6,664✔
1627
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,664✔
1628
      }
1629
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
6,664✔
1630
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
6,664✔
1631
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
6,664✔
1632
      EXPLAIN_ROW_END();
6,664✔
1633
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
6,664✔
1634

1635
      if (verbose) {
6,664✔
1636
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
4,144✔
1637
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
4,144✔
1638
                           nodesGetOutputNumFromSlotList(pLastRowNode->scan.node.pOutputDataBlockDesc->pSlots));
1639
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
4,144✔
1640
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->outputRowSize);
4,144✔
1641
        EXPLAIN_ROW_APPEND_LIMIT(pLastRowNode->scan.node.pLimit);
4,144✔
1642
        EXPLAIN_ROW_APPEND_SLIMIT(pLastRowNode->scan.node.pSlimit);
4,144✔
1643
        EXPLAIN_ROW_END();
4,144✔
1644
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4,144✔
1645

1646
        if (pLastRowNode->scan.node.pConditions) {
4,144✔
1647
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1648
          QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1649
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1650
          EXPLAIN_ROW_END();
×
1651
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1652
        }
1653
      }
1654
      break;
6,664✔
1655
    }
1656
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
41,262✔
1657
      SGroupSortPhysiNode *pSortNode = (SGroupSortPhysiNode *)pNode;
41,262✔
1658
      EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_SORT_FORMAT);
41,262✔
1659
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
41,262✔
1660
      if (pResNode->pExecInfo) {
41,262✔
1661
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1662
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1663
      }
1664

1665
      SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
41,262✔
1666
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
41,262✔
1667
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
41,262✔
1668
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
41,262✔
1669
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
41,262✔
1670
      EXPLAIN_ROW_END();
41,262✔
1671
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
41,262✔
1672

1673
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
41,262✔
1674
        // sort key
1675
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
×
1676
        if (pResNode->pExecInfo) {
×
1677
          for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
×
1678
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
×
1679
            EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
×
1680
          }
1681
        }
1682

1683
        EXPLAIN_ROW_END();
×
1684
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1685

1686
        // sort method
1687
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
×
1688

1689
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
×
1690
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
×
1691
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
×
1692
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
×
1693
        if (pExecInfo->sortBuffer > 1024 * 1024) {
×
1694
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
×
1695
        } else if (pExecInfo->sortBuffer > 1024) {
×
1696
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
1697
        } else {
1698
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
×
1699
        }
1700

1701
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
×
1702
        EXPLAIN_ROW_END();
×
1703
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1704
      }
1705

1706
      if (verbose) {
41,262✔
1707
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1708
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1709
                           nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
1710
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1711
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
×
1712
        EXPLAIN_ROW_APPEND_LIMIT(pSortNode->node.pLimit);
×
1713
        EXPLAIN_ROW_APPEND_SLIMIT(pSortNode->node.pSlimit);
×
1714
        EXPLAIN_ROW_END();
×
1715
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1716

1717
        if (pSortNode->node.pConditions) {
×
1718
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1719
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1720
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1721
          EXPLAIN_ROW_END();
×
1722
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1723
        }
1724
      }
1725
      break;
41,262✔
1726
    }
1727
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL: {
×
1728
      SMergeIntervalPhysiNode *pIntNode = (SMergeIntervalPhysiNode *)pNode;
×
1729
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
×
1730
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1731
      if (pResNode->pExecInfo) {
×
1732
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1733
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1734
      }
1735
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pIntNode->window.pFuncs));
×
1736
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1737
      EXPLAIN_ROW_END();
×
1738
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1739

1740
      if (verbose) {
×
1741
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1742
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1743
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1744
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1745
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
×
1746
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
×
1747
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
×
1748
        EXPLAIN_ROW_END();
×
1749
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1750
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
×
1751
        int64_t time1 = -1;
×
1752
        int64_t time2 = -1;
×
1753
        int32_t code = TSDB_CODE_SUCCESS;
×
1754
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
×
1755
        QRY_ERR_RET(code);
×
1756
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
×
1757
        QRY_ERR_RET(code);
×
1758
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
×
1759
                        time1,
1760
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1761
                        time2,
1762
                        pIntNode->slidingUnit);
1763
        EXPLAIN_ROW_END();
×
1764
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1765

1766
        if (pIntNode->window.node.pConditions) {
×
1767
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1768
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1769
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1770
          EXPLAIN_ROW_END();
×
1771
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1772
        }
1773
      }
1774
      break;
×
1775
    }
1776
    case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC: {
156,268✔
1777
      SInterpFuncPhysiNode *pInterpNode = (SInterpFuncPhysiNode *)pNode;
156,268✔
1778
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERP_FORMAT);
156,268✔
1779
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
156,268✔
1780
      if (pResNode->pExecInfo) {
156,268✔
1781
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
518✔
1782
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
518✔
1783
      }
1784
      if (pInterpNode->pFuncs) {
156,268✔
1785
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pInterpNode->pFuncs->length);
156,268✔
1786
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
156,268✔
1787
      }
1788

1789
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pInterpNode->fillMode));
156,268✔
1790
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
156,268✔
1791

1792
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
156,268✔
1793
      EXPLAIN_ROW_END();
156,268✔
1794
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
156,268✔
1795

1796
      if (verbose) {
156,268✔
1797
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
156,268✔
1798
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
156,268✔
1799
                           nodesGetOutputNumFromSlotList(pInterpNode->node.pOutputDataBlockDesc->pSlots));
1800
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
156,268✔
1801
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pInterpNode->node.pOutputDataBlockDesc->outputRowSize);
156,268✔
1802
        EXPLAIN_ROW_APPEND_LIMIT(pInterpNode->node.pLimit);
156,268✔
1803
        EXPLAIN_ROW_APPEND_SLIMIT(pInterpNode->node.pSlimit);
156,268✔
1804
        EXPLAIN_ROW_END();
156,268✔
1805
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
156,268✔
1806
        if (pInterpNode->pFillValues) {
156,268✔
1807
          SNodeListNode *pValues = (SNodeListNode *)pInterpNode->pFillValues;
36,960✔
1808
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
36,960✔
1809
          SNode  *tNode = NULL;
36,960✔
1810
          int32_t i = 0;
36,960✔
1811
          FOREACH(tNode, pValues->pNodeList) {
73,920✔
1812
            if (i) {
36,960✔
1813
              EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1814
            }
1815
            SValueNode *tValue = (SValueNode *)tNode;
36,960✔
1816
            char       *value = nodesGetStrValueFromNode(tValue);
36,960✔
1817
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
36,960✔
1818
            taosMemoryFree(value);
36,960✔
1819
            ++i;
36,960✔
1820
          }
1821

1822
          EXPLAIN_ROW_END();
36,960✔
1823
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
36,960✔
1824
        }
1825

1826
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_INTERVAL_VALUE_FORMAT, pInterpNode->interval, pInterpNode->intervalUnit);
156,268✔
1827
        EXPLAIN_ROW_END();
156,268✔
1828

1829
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pInterpNode->timeRange.skey, pInterpNode->timeRange.ekey);
156,268✔
1830
        EXPLAIN_ROW_END();
156,268✔
1831
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
156,268✔
1832

1833
        if (pInterpNode->node.pConditions) {
156,268✔
1834
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1835
          QRY_ERR_RET(nodesNodeToSQL(pInterpNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1836
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1837
          EXPLAIN_ROW_END();
×
1838
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1839
        }
1840
      }
1841
      break;
156,268✔
1842
    }
1843
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_EVENT: {
1,558,847✔
1844
      SEventWinodwPhysiNode *pEventNode = (SEventWinodwPhysiNode *)pNode;
1,558,847✔
1845
      EXPLAIN_ROW_NEW(level, EXPLAIN_EVENT_FORMAT);
1,558,847✔
1846
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,559,176✔
1847
      if (pResNode->pExecInfo) {
1,558,853✔
1848
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
518✔
1849
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
518✔
1850
      }
1851
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pEventNode->window.pFuncs));
1,558,853✔
1852
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,559,176✔
1853
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pEventNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,559,086✔
1854
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,559,176✔
1855
      EXPLAIN_ROW_END();
1,559,176✔
1856
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,559,176✔
1857

1858
      if (verbose) {
1,558,783✔
1859
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_START_FORMAT);
841,254✔
1860
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pStartCond, tbuf + VARSTR_HEADER_SIZE,
841,344✔
1861
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1862
        EXPLAIN_ROW_END();
841,254✔
1863
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
841,254✔
1864

1865
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_END_FORMAT);
841,344✔
1866
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pEndCond, tbuf + VARSTR_HEADER_SIZE,
841,344✔
1867
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1868
        EXPLAIN_ROW_END();
841,344✔
1869
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
841,344✔
1870
      }
1871
      break;
1,559,002✔
1872
    }
1873
    case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN:{
731,197✔
1874
      SHashJoinPhysiNode *pJoinNode = (SHashJoinPhysiNode *)pNode;
731,197✔
1875
      EXPLAIN_ROW_NEW(level, EXPLAIN_JOIN_FORMAT, gJoinTypeStr[pJoinNode->joinType][pJoinNode->subType]);
731,197✔
1876
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
731,197✔
1877
      if (pResNode->pExecInfo) {
731,197✔
1878
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
782✔
1879
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
782✔
1880
      }
1881
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pJoinNode->pTargets->length);
731,197✔
1882
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
1883
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->totalRowSize);
731,197✔
1884
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
1885
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pJoinNode->node.inputTsOrder));
731,197✔
1886
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
1887
      EXPLAIN_ROW_APPEND(EXPLAIN_JOIN_ALGO, "Hash");
731,197✔
1888
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
731,197✔
1889
      EXPLAIN_ROW_END();
731,197✔
1890
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
731,197✔
1891

1892
      if (verbose) {
731,197✔
1893
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
782✔
1894
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
782✔
1895
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
1896
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
782✔
1897
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
782✔
1898
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
782✔
1899
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
782✔
1900
        EXPLAIN_ROW_END();
782✔
1901
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
782✔
1902

1903
        if (pJoinNode->node.pConditions) {
782✔
1904
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1905
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1906
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1907

1908
          EXPLAIN_ROW_END();
×
1909
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1910
        }
1911

1912
        bool conditionsGot = false;
782✔
1913
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
782✔
1914
        if (pJoinNode->pPrimKeyCond) {
782✔
1915
          QRY_ERR_RET(
×
1916
              nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1917
          conditionsGot = true;
×
1918
        }
1919
        if (pJoinNode->pColEqCond) {
782✔
1920
          if (conditionsGot) {
×
1921
            EXPLAIN_ROW_APPEND(" AND ");
×
1922
          }
1923
          QRY_ERR_RET(
×
1924
              nodesNodeToSQL(pJoinNode->pColEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1925
          conditionsGot = true;
×
1926
        }
1927
        if (pJoinNode->pTagEqCond) {
782✔
1928
          if (conditionsGot) {
782✔
1929
            EXPLAIN_ROW_APPEND(" AND ");
×
1930
          }
1931
          QRY_ERR_RET(
782✔
1932
              nodesNodeToSQL(pJoinNode->pTagEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1933
          conditionsGot = true;
782✔
1934
        }
1935
        if (pJoinNode->pFullOnCond) {
782✔
1936
          if (conditionsGot) {
×
1937
            EXPLAIN_ROW_APPEND(" AND ");
×
1938
          }
1939
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE,
×
1940
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1941
        }
1942
        EXPLAIN_ROW_END();
782✔
1943
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
782✔
1944

1945
        if (pJoinNode->timeRangeTarget) {
782✔
1946
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TABLE_TIMERANGE_FORMAT, qExplainGetTimerangeTargetStr(pJoinNode->timeRangeTarget), pJoinNode->timeRange.skey, pJoinNode->timeRange.ekey);
×
1947
          EXPLAIN_ROW_END();
×
1948
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1949
        }
1950
      }
1951
      break;
731,197✔
1952
    }
1953
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE:{
731,197✔
1954
      SGroupCachePhysiNode *pGroupCache = (SGroupCachePhysiNode *)pNode;
731,197✔
1955
      EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_CACHE_FORMAT);
731,197✔
1956
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
731,197✔
1957
      if (pResNode->pExecInfo) {
731,197✔
1958
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
782✔
1959
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
782✔
1960
      }
1961
      EXPLAIN_ROW_APPEND(EXPLAIN_GLOBAL_GROUP_FORMAT, pGroupCache->globalGrp);
731,197✔
1962
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
1963
      EXPLAIN_ROW_APPEND(EXPLAIN_GROUP_BY_UID_FORMAT, pGroupCache->grpByUid);
731,197✔
1964
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
1965
      EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pGroupCache->batchFetch);
731,197✔
1966
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
1967
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pGroupCache->node.pOutputDataBlockDesc->totalRowSize);
731,197✔
1968
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
1969
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pGroupCache->node.inputTsOrder));
731,197✔
1970
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
1971
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
731,197✔
1972
      EXPLAIN_ROW_END();
731,197✔
1973
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
731,197✔
1974

1975
      if (verbose) {
731,197✔
1976
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
782✔
1977
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
782✔
1978
                           nodesGetOutputNumFromSlotList(pGroupCache->node.pOutputDataBlockDesc->pSlots));
1979
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
782✔
1980
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pGroupCache->node.pOutputDataBlockDesc->outputRowSize);
782✔
1981
        EXPLAIN_ROW_APPEND_LIMIT(pGroupCache->node.pLimit);
782✔
1982
        EXPLAIN_ROW_APPEND_SLIMIT(pGroupCache->node.pSlimit);
782✔
1983
        EXPLAIN_ROW_END();
782✔
1984
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
782✔
1985

1986
        if (pGroupCache->node.pConditions) {
782✔
1987
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1988
          QRY_ERR_RET(nodesNodeToSQL(pGroupCache->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1989
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1990
          EXPLAIN_ROW_END();
×
1991
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1992
        }
1993
      }
1994
      break;
731,197✔
1995
    }
1996
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL:{
1,023,168✔
1997
      SDynQueryCtrlPhysiNode *pDyn = (SDynQueryCtrlPhysiNode *)pNode;
1,023,168✔
1998
      EXPLAIN_ROW_NEW(level, EXPLAIN_DYN_QRY_CTRL_FORMAT, qExplainGetDynQryCtrlType(pDyn));
1,023,168✔
1999
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,023,168✔
2000
      if (pResNode->pExecInfo) {
1,023,168✔
2001
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
782✔
2002
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
782✔
2003
      }
2004
      switch (pDyn->qType) {
1,023,168✔
2005
        case DYN_QTYPE_STB_HASH: {
731,197✔
2006
          EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pDyn->stbJoin.batchFetch);
731,197✔
2007
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
2008
          EXPLAIN_ROW_APPEND(EXPLAIN_VGROUP_SLOT_FORMAT, pDyn->stbJoin.vgSlot[0], pDyn->stbJoin.vgSlot[1]);
731,197✔
2009
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
2010
          EXPLAIN_ROW_APPEND(EXPLAIN_UID_SLOT_FORMAT, pDyn->stbJoin.uidSlot[0], pDyn->stbJoin.uidSlot[1]);
731,197✔
2011
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
2012
          EXPLAIN_ROW_APPEND(EXPLAIN_SRC_SCAN_FORMAT, pDyn->stbJoin.srcScan[0], pDyn->stbJoin.srcScan[1]);
731,197✔
2013
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
2014
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
731,197✔
2015
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
2016
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
731,197✔
2017
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
731,197✔
2018
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
731,197✔
2019
          break;
731,197✔
2020
        }
2021
        case DYN_QTYPE_VTB_INTERVAL:
114,810✔
2022
        case DYN_QTYPE_VTB_AGG: {
2023
          EXPLAIN_ROW_APPEND(EXPLAIN_HAS_PARTITION_FORMAT, pDyn->vtbScan.hasPartition);
114,810✔
2024
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
114,810✔
2025
          EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_PROCESS_CHILD_FORMAT, pDyn->vtbScan.batchProcessChild);
114,810✔
2026
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
114,810✔
2027
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
114,810✔
2028
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
114,810✔
2029

2030
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
114,810✔
2031
          break;
114,810✔
2032
        }
2033
        case DYN_QTYPE_VTB_TS_SCAN:
112,933✔
2034
        case DYN_QTYPE_VTB_SCAN: {
2035
          EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDyn->vtbScan.pScanCols->length);
112,933✔
2036
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
112,933✔
2037
          EXPLAIN_ROW_APPEND(EXPLAIN_ORIGIN_VGROUP_NUM_FORMAT, pDyn->vtbScan.pOrgVgIds->length);
112,933✔
2038
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
112,933✔
2039
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
112,933✔
2040
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
112,933✔
2041
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
112,933✔
2042
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
112,933✔
2043
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
112,933✔
2044
          break;
112,933✔
2045
        }
2046
        case DYN_QTYPE_VTB_WINDOW: {
64,228✔
2047
          EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDyn->vtbWindow.pTargets->length);
64,228✔
2048
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,228✔
2049
          EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
64,228✔
2050
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,228✔
2051
          EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
64,228✔
2052
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,228✔
2053
          EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
64,228✔
2054
          break;
64,228✔
2055
        }
2056
        default:
×
2057
          break;
×
2058
      }
2059

2060
      EXPLAIN_ROW_END();
1,023,168✔
2061
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,023,168✔
2062

2063
      if (verbose) {
1,023,168✔
2064
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
151,729✔
2065
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
151,729✔
2066
                           nodesGetOutputNumFromSlotList(pDyn->node.pOutputDataBlockDesc->pSlots));
2067
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
151,729✔
2068
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->outputRowSize);
151,729✔
2069
        EXPLAIN_ROW_APPEND_LIMIT(pDyn->node.pLimit);
151,729✔
2070
        EXPLAIN_ROW_APPEND_SLIMIT(pDyn->node.pSlimit);
151,729✔
2071
        EXPLAIN_ROW_END();
151,729✔
2072
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
151,729✔
2073

2074
        if (pDyn->node.pConditions) {
151,729✔
2075
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2076
          QRY_ERR_RET(nodesNodeToSQL(pDyn->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2077
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2078
          EXPLAIN_ROW_END();
×
2079
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2080
        }
2081
      }
2082
      break;
1,023,168✔
2083
    }
2084
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT: {
1,368,274✔
2085
      SCountWindowPhysiNode *pCountNode = (SCountWindowPhysiNode *)pNode;
1,368,274✔
2086
      EXPLAIN_ROW_NEW(level, EXPLAIN_COUNT_FORMAT);
1,368,274✔
2087
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,368,454✔
2088
      if (pResNode->pExecInfo) {
1,368,102✔
2089
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2090
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2091
      }
2092
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pCountNode->window.pFuncs));
1,368,102✔
2093
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,368,608✔
2094
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pCountNode->window.node.pOutputDataBlockDesc->totalRowSize);
1,368,608✔
2095
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,368,608✔
2096
      EXPLAIN_ROW_END();
1,368,282✔
2097
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,368,282✔
2098

2099
      if (verbose) {
1,368,428✔
2100
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_NUM_FORMAT, pCountNode->windowCount);
729,616✔
2101
        EXPLAIN_ROW_END();
729,526✔
2102
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
729,526✔
2103
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_SLIDING_FORMAT, pCountNode->windowSliding);
729,616✔
2104
        EXPLAIN_ROW_END();
729,616✔
2105
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
729,616✔
2106
      }
2107
      break;
1,368,436✔
2108
    }
2109
    case QUERY_NODE_PHYSICAL_PLAN_EXTERNAL_WINDOW: {
×
2110
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
×
2111
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
×
2112
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
2113
      if (pResNode->pExecInfo) {
×
2114
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2115
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2116
      }
2117
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pExternal->window.pFuncs));
×
2118
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2119
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
×
2120
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2121
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
×
2122
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2123
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
×
2124
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2125
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2126
      EXPLAIN_ROW_END();
×
2127
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
2128

2129
      if (verbose) {
×
2130
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
2131
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
2132
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2133
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2134
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
×
2135
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
×
2136
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
×
2137
        EXPLAIN_ROW_END();
×
2138
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2139
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pExternal->timeRange.skey, pExternal->timeRange.ekey);
×
2140
        EXPLAIN_ROW_END();
×
2141
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2142

2143
        if (pExternal->window.node.pConditions) {
×
2144
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2145
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2146
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2147
          EXPLAIN_ROW_END();
×
2148
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2149
        }
2150

2151
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
×
2152
        EXPLAIN_ROW_END();
×
2153
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2154
      }
2155
      break;
×
2156
    }
2157
    case QUERY_NODE_PHYSICAL_PLAN_HASH_EXTERNAL: {
64,228✔
2158
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
64,228✔
2159
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
64,228✔
2160
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
64,228✔
2161
      if (pResNode->pExecInfo) {
64,228✔
2162
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2163
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2164
      }
2165
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pExternal->window.pFuncs));
64,228✔
2166
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,228✔
2167
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
64,228✔
2168
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,228✔
2169
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
64,228✔
2170
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,228✔
2171
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
64,228✔
2172
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,228✔
2173
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
64,228✔
2174
      EXPLAIN_ROW_END();
64,228✔
2175
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
64,228✔
2176

2177
      if (verbose) {
64,228✔
2178
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
64,228✔
2179
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
64,228✔
2180
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2181
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
64,228✔
2182
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
64,228✔
2183
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
64,228✔
2184
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
64,228✔
2185
        EXPLAIN_ROW_END();
64,228✔
2186
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
64,228✔
2187
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pExternal->timeRange.skey, pExternal->timeRange.ekey);
64,228✔
2188
        EXPLAIN_ROW_END();
64,228✔
2189
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
64,228✔
2190

2191
        if (pExternal->window.node.pConditions) {
64,228✔
2192
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2193
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2194
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2195
          EXPLAIN_ROW_END();
×
2196
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2197
        }
2198

2199
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
64,228✔
2200
        EXPLAIN_ROW_END();
64,228✔
2201
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
64,228✔
2202
      }
2203
      break;
64,228✔
2204
    }
2205
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_EXTERNAL: {
×
2206
      SExternalWindowPhysiNode *pExternal = (SExternalWindowPhysiNode *)pNode;
×
2207
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_ALIGNED_EXTERNAL_FORMAT, nodesGetNameFromColumnNode(pExternal->window.pTspk));
×
2208
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
2209
      if (pResNode->pExecInfo) {
×
2210
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
2211
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2212
      }
2213
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, LIST_LENGTH(pExternal->window.pFuncs));
×
2214
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2215
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->totalRowSize);
×
2216
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2217
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.inputTsOrder));
×
2218
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2219
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pExternal->window.node.outputTsOrder));
×
2220
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
2221
      EXPLAIN_ROW_END();
×
2222
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
2223

2224
      if (verbose) {
×
2225
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
2226
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
2227
                           nodesGetOutputNumFromSlotList(pExternal->window.node.pOutputDataBlockDesc->pSlots));
2228
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
2229
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExternal->window.node.pOutputDataBlockDesc->outputRowSize);
×
2230
        EXPLAIN_ROW_APPEND_LIMIT(pExternal->window.node.pLimit);
×
2231
        EXPLAIN_ROW_APPEND_SLIMIT(pExternal->window.node.pSlimit);
×
2232
        EXPLAIN_ROW_END();
×
2233
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2234

2235
        if (pExternal->window.node.pConditions) {
×
2236
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
2237
          QRY_ERR_RET(nodesNodeToSQL(pExternal->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
2238
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
2239
          EXPLAIN_ROW_END();
×
2240
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2241
        }
2242

2243
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pExternal->window.mergeDataBlock? "True":"False");
×
2244
        EXPLAIN_ROW_END();
×
2245
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
2246
      }
2247
      break;
×
2248
    }
2249
    default:
×
2250
      qError("not supported physical node type %d", pNode->type);
×
2251
      return TSDB_CODE_APP_ERROR;
×
2252
  }
2253

2254
  return TSDB_CODE_SUCCESS;
334,566,131✔
2255
}
2256

2257
static int32_t qExplainResNodeToRows(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t *level) {
334,538,813✔
2258
  if (NULL == pResNode) {
334,538,813✔
2259
    qError("explain res node is NULL");
×
2260
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2261
  }
2262

2263
  int32_t code = 0;
334,538,813✔
2264
  QRY_ERR_RET(qExplainResNodeToRowsImpl(pResNode, ctx, level));
334,538,813✔
2265

2266
  SNode *pNode = NULL;
334,558,865✔
2267
  FOREACH(pNode, pResNode->pChildren) { 
517,998,481✔
2268
    int32_t nlevel = *level + 1;
183,437,903✔
2269
    QRY_ERR_RET(qExplainResNodeToRows((SExplainResNode *)pNode, ctx, &nlevel)); 
183,437,903✔
2270
  }
2271

2272
  return TSDB_CODE_SUCCESS;
334,560,578✔
2273
}
2274

2275
static int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t *level, bool grpSingleChannel) {
151,119,057✔
2276
  SExplainResNode *node = NULL;
151,119,057✔
2277
  int32_t          code = 0;
151,119,057✔
2278
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
151,119,057✔
2279

2280
  SExplainGroup *group = taosHashGet(ctx->pCurrPlanCtx->groupHash, &groupId, sizeof(groupId));
151,119,057✔
2281
  if (NULL == group) {
151,130,930✔
2282
    qError("group %d not in groupHash", groupId);
×
2283
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2284
  }
2285

2286
  group->singleChannel = grpSingleChannel;
151,130,930✔
2287
  group->physiPlanExecIdx = 0;
151,130,930✔
2288

2289
  QRY_ERR_RET(qExplainGenerateResNode(group->plan, group->plan->pNode, group, &node));
151,130,930✔
2290

2291
  QRY_ERR_JRET(qExplainResNodeToRows(node, ctx, level));
151,126,511✔
2292

2293
_return:
151,121,810✔
2294

2295
  qExplainFreeResNode(node);
151,121,810✔
2296

2297
  QRY_RET(code);
151,130,346✔
2298
}
2299

2300
static int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
31,185,045✔
2301
  int32_t      code = 0;
31,185,045✔
2302
  SSDataBlock *pBlock = NULL;
31,185,045✔
2303
  SExplainCtx *pCtx = (SExplainCtx *)ctx;
31,185,045✔
2304
  int32_t      rowNum = taosArrayGetSize(pCtx->rows);
31,185,045✔
2305
  if (rowNum <= 0) {
31,185,441✔
2306
    qError("empty explain res rows");
×
2307
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2308
  }
2309

2310
  code = createDataBlock(&pBlock);
31,185,441✔
2311
  QRY_ERR_JRET(code);
31,184,552✔
2312

2313
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, TSDB_EXPLAIN_RESULT_ROW_SIZE, 1);
31,184,552✔
2314
  QRY_ERR_JRET(blockDataAppendColInfo(pBlock, &infoData));
31,184,395✔
2315
  QRY_ERR_JRET(blockDataEnsureCapacity(pBlock, rowNum));
31,183,776✔
2316

2317
  SColumnInfoData *pInfoData = taosArrayGet(pBlock->pDataBlock, 0);
31,182,440✔
2318

2319
  for (int32_t i = 0; i < rowNum; ++i) {
731,126,089✔
2320
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
699,945,997✔
2321
    QRY_ERR_JRET(colDataSetVal(pInfoData, i, row->buf, false));
699,947,555✔
2322
  }
2323

2324
  pBlock->info.rows = rowNum;
31,180,092✔
2325

2326
  size_t dataEncodeBufSize = blockGetEncodeSize(pBlock);
31,180,092✔
2327
  int32_t rspSize = sizeof(SRetrieveTableRsp) + dataEncodeBufSize + PAYLOAD_PREFIX_LEN;
31,181,883✔
2328

2329
  SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, rspSize);
31,181,883✔
2330
  if (NULL == rsp) {
31,183,401✔
2331
    qError("malloc SRetrieveTableRsp failed, size:%d", rspSize);
×
2332
    QRY_ERR_JRET(terrno);
×
2333
  }
2334

2335
  rsp->completed = 1;
31,183,401✔
2336
  rsp->numOfRows = htobe64((int64_t)rowNum);
31,183,401✔
2337

2338
  int32_t len = blockEncode(pBlock, rsp->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, taosArrayGetSize(pBlock->pDataBlock));
31,184,013✔
2339
  if(len < 0) {
31,182,006✔
2340
    qError("qExplainGetRspFromCtx: blockEncode failed");
×
2341
    QRY_ERR_JRET(terrno);
×
2342
  }
2343

2344
  rsp->compLen = htonl(len);
31,182,451✔
2345
  rsp->payloadLen = htonl(len);
31,182,451✔
2346
  rsp->compressed = 0;
31,182,451✔
2347

2348
  SET_PAYLOAD_LEN(rsp->data, len, len);
31,182,451✔
2349

2350
_return:
31,182,451✔
2351
  blockDataDestroy(pBlock);
31,182,451✔
2352

2353
  *pRsp = rsp;
31,181,654✔
2354
  QRY_RET(code);
31,181,654✔
2355
}
2356

2357
static int32_t qExplainBuildPlanCtx(SQueryPlan *pDag, SExplainPlanCtx *pCtx) {
137,842,665✔
2358
  int32_t        code = 0;
137,842,665✔
2359
  SNodeListNode *plans = NULL;
137,842,665✔
2360
  int32_t        taskNum = 0;
137,842,665✔
2361
  SExplainGroup *pGroup = NULL;
137,842,665✔
2362

2363
  if (pDag->numOfSubplans <= 0) {
137,842,665✔
2364
    qError("invalid subplan num:%d", pDag->numOfSubplans);
×
2365
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
2,604✔
2366
  }
2367

2368
  int32_t levelNum = (int32_t)LIST_LENGTH(pDag->pSubplans);
137,845,269✔
2369
  if (levelNum <= 0) {
137,845,269✔
2370
    qError("invalid level num:%d", levelNum);
×
2371
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2372
  }
2373

2374
  pCtx->groupHash =
137,849,902✔
2375
      taosHashInit(EXPLAIN_MAX_GROUP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
137,845,269✔
2376
  if (NULL == pCtx->groupHash) {
137,849,902✔
2377
    qError("groupHash %d failed", EXPLAIN_MAX_GROUP_NUM);
×
2378
    QRY_ERR_RET(terrno);
×
2379
  }
2380

2381
  int32_t i = 0;
137,848,938✔
2382
  SNode*  levelNode = NULL;
137,848,938✔
2383
  FOREACH(levelNode, pDag->pSubplans) {
331,213,714✔
2384
    plans = (SNodeListNode *)levelNode;
193,360,732✔
2385
    if (NULL == plans) {
193,360,732✔
2386
      qError("empty level plan, level:%d", i);
×
2387
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2388
    }
2389

2390
    taskNum = (int32_t)LIST_LENGTH(plans->pNodeList);
193,356,122✔
2391
    if (taskNum <= 0) {
193,356,122✔
2392
      qError("invalid level plan number:%d, level:%d", taskNum, i);
×
2393
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
576✔
2394
    }
2395

2396
    SSubplan *plan = NULL;
193,356,698✔
2397
    int32_t   n = 0;
193,356,698✔
2398
    SNode*    taskNode = NULL;
193,356,698✔
2399
    FOREACH(taskNode, plans->pNodeList) {
460,893,779✔
2400
      plan = (SSubplan *)taskNode;
267,514,800✔
2401
      pGroup = taosHashGet(pCtx->groupHash, &plan->id.groupId, sizeof(plan->id.groupId));
267,514,800✔
2402
      if (pGroup) {
267,522,232✔
2403
        ++pGroup->nodeNum;
50,682,453✔
2404
        ++n;
50,682,453✔
2405
        continue;
50,682,453✔
2406
      }
2407

2408
      SExplainGroup group = {0};
216,839,779✔
2409
      group.nodeNum = 1;
216,839,779✔
2410
      group.plan = plan;
216,839,779✔
2411

2412
      if (0 != taosHashPut(pCtx->groupHash, &plan->id.groupId, sizeof(plan->id.groupId), &group, sizeof(group))) {
216,839,779✔
2413
        qError("taosHashPut to explainGroupHash failed, taskIdx:%d", n);
×
2414
        QRY_ERR_JRET(terrno);
×
2415
      }
2416
      ++n;
216,854,628✔
2417
    }
2418

2419
    if (0 == i) {
193,378,979✔
2420
      if (taskNum > 1) {
137,851,800✔
2421
        qError("invalid taskNum %d for level 0", taskNum);
×
UNCOV
2422
        QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2423
      }
2424

2425
      pCtx->rootGroupId = plan->id.groupId;
137,850,553✔
2426
    }
2427

2428
    qDebug("level %d group handled, taskNum:%d", i, taskNum);
193,377,732✔
2429
    ++i;
193,364,776✔
2430
  }
2431

2432
  pCtx->groupNum = taosHashGetSize(pCtx->groupHash);
137,852,982✔
2433

2434
  return TSDB_CODE_SUCCESS;
137,849,443✔
2435

2436
_return:
×
2437

2438
  if (code) {
×
2439
    qError("QID:0x%" PRIx64 " %s failed since %s", pDag->queryId, __func__, tstrerror(code));
×
2440
  }
2441
  
2442
  QRY_RET(code);
×
2443
}
2444

2445
static int32_t qExplainBuildCtx(SQueryPlan *pDag, SExplainCtx **pCtx) {
44,474,682✔
2446
  int32_t        code = 0;
44,474,682✔
2447
  SNodeListNode *plans = NULL;
44,474,682✔
2448
  int32_t        taskNum = 0;
44,474,682✔
2449
  SExplainGroup *pGroup = NULL;
44,474,682✔
2450
  SExplainCtx   *ctx = NULL;
44,474,682✔
2451

2452
  if (pDag->numOfSubplans <= 0) {
44,474,682✔
2453
    qError("invalid subplan num:%d", pDag->numOfSubplans);
×
UNCOV
2454
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2455
  }
2456

2457
  int32_t levelNum = (int32_t)LIST_LENGTH(pDag->pSubplans);
44,473,896✔
2458
  if (levelNum <= 0) {
44,473,896✔
2459
    qError("invalid level num:%d", levelNum);
×
2460
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2461
  }
2462

2463
  QRY_ERR_JRET(qExplainInitCtx(&ctx, pDag->explainInfo.verbose, pDag->explainInfo.ratio, pDag->explainInfo.mode));
44,473,896✔
2464

2465
  QRY_ERR_JRET(qExplainBuildPlanCtx(pDag, &ctx->planCtx));
44,486,048✔
2466
  ctx->groupNum = ctx->planCtx.groupNum;
44,486,870✔
2467

2468
  if (pDag->pChildren && pDag->pChildren->length > 0) {
44,486,870✔
2469
    ctx->subPlanCtxs = taosArrayInit_s(sizeof(SExplainPlanCtx), pDag->pChildren->length);
31,125,092✔
2470
    if (NULL == ctx->subPlanCtxs) {
31,132,970✔
2471
      qError("taosArrayInit %d explainPlanCtx failed, error:%s", pDag->pChildren->length, tstrerror(terrno));
×
2472
      QRY_ERR_JRET(terrno);
×
2473
    }
2474
    
2475
    SNode* pNode = NULL;
31,125,087✔
2476
    int32_t i = 0;
31,125,087✔
2477
    FOREACH(pNode, pDag->pChildren) {
124,489,555✔
2478
      SExplainPlanCtx* pSub = taosArrayGet(ctx->subPlanCtxs, i);
93,360,956✔
2479
      QRY_ERR_JRET(qExplainBuildPlanCtx((SQueryPlan*)pNode, pSub));
93,360,349✔
2480
      ctx->groupNum += pSub->groupNum;
93,364,468✔
2481
      i++;
93,364,468✔
2482
    }
2483
  }
2484

2485
  *pCtx = ctx;
44,490,377✔
2486

2487
  return TSDB_CODE_SUCCESS;
44,490,377✔
2488

2489
_return:
×
2490

2491
  qExplainFreeCtx(ctx);
×
2492

2493
  QRY_RET(code);
×
2494
}
2495

2496
static int32_t qExplainAppendPlanRows(SExplainCtx *pCtx) {
31,184,808✔
2497
  if (EXPLAIN_MODE_ANALYZE != pCtx->mode) {
31,184,808✔
2498
    return TSDB_CODE_SUCCESS;
29,457,986✔
2499
  }
2500

2501
  int32_t tlen = 0;
1,726,822✔
2502
  char   *tbuf = pCtx->tbuf;
1,726,822✔
2503

2504
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_RATIO_TIME_FORMAT, pCtx->ratio);
1,726,822✔
2505
  EXPLAIN_SUM_ROW_END();
1,727,522✔
2506
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
1,727,522✔
2507

2508
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_PLANNING_TIME_FORMAT, (double)(pCtx->jobStartTs - pCtx->reqStartTs) / 1000.0);
1,727,522✔
2509
  EXPLAIN_SUM_ROW_END();
1,727,522✔
2510
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
1,727,522✔
2511

2512
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_EXEC_TIME_FORMAT, (double)(pCtx->jobDoneTs - pCtx->jobStartTs) / 1000.0);
1,727,522✔
2513
  EXPLAIN_SUM_ROW_END();
1,727,522✔
2514
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
1,727,522✔
2515

2516
  return TSDB_CODE_SUCCESS;
1,727,522✔
2517
}
2518

2519
static int32_t qExplainGenerateRsp(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
31,183,366✔
2520
  int32_t level = 0;
31,183,366✔
2521
  
2522
  pCtx->currPlanId = -1;
31,183,366✔
2523
  pCtx->pCurrPlanCtx = &pCtx->planCtx;
31,183,366✔
2524
  QRY_ERR_RET(qExplainAppendGroupResRows(pCtx, pCtx->pCurrPlanCtx->rootGroupId, &level, false));
31,183,366✔
2525
  
2526
  if (pCtx->subPlanCtxs) {
31,183,756✔
2527
    int32_t subNum = taosArrayGetSize(pCtx->subPlanCtxs);
17,831,851✔
2528
    for (pCtx->currPlanId = subNum - 1; pCtx->currPlanId >= 0; --pCtx->currPlanId) {
71,130,691✔
2529
      pCtx->pCurrPlanCtx = taosArrayGet(pCtx->subPlanCtxs, pCtx->currPlanId);
53,295,336✔
2530
      level = 0;
53,295,758✔
2531
      QRY_ERR_RET(qExplainAppendGroupResRows(pCtx, pCtx->pCurrPlanCtx->rootGroupId, &level, false));
53,295,758✔
2532
    }
2533
  }
2534
  QRY_ERR_RET(qExplainAppendPlanRows(pCtx));
31,187,260✔
2535
  QRY_ERR_RET(qExplainGetRspFromCtx(pCtx, pRsp));
31,185,508✔
2536

2537
  return TSDB_CODE_SUCCESS;
31,181,844✔
2538
}
2539

2540
int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainPlanCtx *pCurrPlanCtx, SExplainRsp *pRspMsg, int32_t groupId, SRetrieveTableRsp **pRsp) {
69,086,224✔
2541
  if (!pCtx || !pCurrPlanCtx || !pRspMsg || !pRsp) return TSDB_CODE_INVALID_PARA;
69,086,224✔
2542
  SExplainResNode *node = NULL;
69,094,402✔
2543
  int32_t          code = 0;
69,094,402✔
2544
  bool             groupDone = false;
69,094,402✔
2545

2546
  SExplainGroup *group = taosHashGet(pCurrPlanCtx->groupHash, &groupId, sizeof(groupId));
69,094,402✔
2547
  if (NULL == group) {
69,097,356✔
2548
    qError("group %d not in groupHash", groupId);
×
2549
    tFreeSExplainRsp(pRspMsg);
×
2550
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2551
  }
2552

2553
  taosWLockLatch(&group->lock);
69,097,356✔
2554
  if (NULL == group->nodeExecInfo) {
69,098,145✔
2555
    group->nodeExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainRsp));
59,834,422✔
2556
    if (NULL == group->nodeExecInfo) {
59,832,797✔
2557
      qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
×
2558
      code = terrno;
×
2559
      TAOS_CHECK_ERRNO(code);
×
2560
    }
2561

2562
    group->physiPlanExecNum = pRspMsg->numOfPlans;
59,832,443✔
2563
  } else if (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum) {
9,263,332✔
2564
    qError("group execInfo already full, size:%d, nodeNum:%d", (int32_t)taosArrayGetSize(group->nodeExecInfo),
×
2565
           group->nodeNum);
2566
    code = TSDB_CODE_APP_ERROR;
×
2567
    TAOS_CHECK_ERRNO(code);
×
2568
  }
2569

2570
  if (group->physiPlanExecNum != pRspMsg->numOfPlans) {
69,096,384✔
2571
    qError("physiPlanExecNum %d mismatch with others %d in group %d", pRspMsg->numOfPlans, group->physiPlanExecNum,
×
2572
           groupId);
2573
    code = TSDB_CODE_APP_ERROR;
×
2574
    TAOS_CHECK_ERRNO(code);
×
2575
  }
2576

2577
  if(taosArrayPush(group->nodeExecInfo, pRspMsg) == NULL)
138,190,501✔
2578
  {
2579
    code = terrno;
×
2580
    TAOS_CHECK_ERRNO(code);
×
2581
  }
2582

2583
  groupDone = (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum);
69,094,117✔
2584

2585
  taosWUnLockLatch(&group->lock);
69,092,286✔
2586

2587
  if (groupDone && (pCtx->groupNum == atomic_add_fetch_32(&pCtx->groupDoneNum, 1))) {
69,098,025✔
2588
    if (atomic_load_8((int8_t *)&pCtx->execDone)) {
9,007,352✔
2589
      if (0 == taosWTryLockLatch(&pCtx->lock)) {
3,245✔
2590
        QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
3,245✔
2591
        // LEAVE LOCK THERE
2592
      }
2593
    }
2594
  }
2595

2596
  return TSDB_CODE_SUCCESS;
69,094,607✔
2597

2598
_exit:
×
2599
  tFreeSExplainRsp(pRspMsg);
×
2600
  taosWUnLockLatch(&group->lock);
×
2601
  return code;
×
2602
}
2603

2604
int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp) {
29,445,173✔
2605
  if (!pDag || !pRsp) return TSDB_CODE_INVALID_PARA;
29,445,173✔
2606
  int32_t      code = 0;
29,453,667✔
2607
  SExplainCtx *pCtx = NULL;
29,453,667✔
2608

2609
  QRY_ERR_RET(qExplainBuildCtx(pDag, &pCtx));
29,453,667✔
2610
  QRY_ERR_JRET(qExplainGenerateRsp(pCtx, pRsp));
29,458,169✔
2611

2612
_return:
29,453,730✔
2613
  qExplainFreeCtx(pCtx);
29,453,730✔
2614
  QRY_RET(code);
29,458,207✔
2615
}
2616

2617
int32_t qExecExplainBegin(SQueryPlan *pDag, SExplainCtx **pCtx, int64_t startTs) {
15,028,894✔
2618
  if(!pDag || !pCtx) return TSDB_CODE_INVALID_PARA;
15,028,894✔
2619
  QRY_ERR_RET(qExplainBuildCtx(pDag, pCtx));
15,031,125✔
2620

2621
  (*pCtx)->reqStartTs = startTs;
15,032,080✔
2622
  (*pCtx)->jobStartTs = taosGetTimestampUs();
16,761,274✔
2623

2624
  return TSDB_CODE_SUCCESS;
15,030,875✔
2625
}
2626

2627
int32_t qExecExplainEnd(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
1,727,522✔
2628
  if(!pCtx || !pRsp) {
1,727,522✔
2629
    return TSDB_CODE_INVALID_PARA;
×
2630
  }
2631
  
2632
  int32_t code = 0;
1,727,522✔
2633
  pCtx->jobDoneTs = taosGetTimestampUs();
1,727,522✔
2634

2635
  atomic_store_8((int8_t *)&pCtx->execDone, true);
1,727,522✔
2636

2637
  if (pCtx->groupNum == atomic_load_32(&pCtx->groupDoneNum)) {
1,727,522✔
2638
    if (0 == taosWTryLockLatch(&pCtx->lock)) {
1,724,277✔
2639
      QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
1,724,277✔
2640
      // LEAVE LOCK THERE
2641
    }
2642
  }
2643

2644
  return TSDB_CODE_SUCCESS;
1,727,522✔
2645
}
2646

2647
SExplainPlanCtx* qExplainGetCurrPlan(SExplainCtx *pCtx, int32_t subJobId) {
69,083,494✔
2648
  return EXPLAIN_GET_CUR_PLAN_CTX(pCtx, subJobId);
69,083,494✔
2649
}
2650

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